FreeBSD 5.3 RELEASE amd64 发行公告(2004 年 11 月 6 日)
FreeBSD 项目
版权 © 2000, 2001, 2002, 2003, 2004 FreeBSD 文档项目
FreeBSD 5.3-RELEASE 的发布说明包含自 5.2.1-RELEASE 以来对 FreeBSD 基本系统所做变更的摘要。本文件列出了自上一个版本发布以来发布的相关安全公告,以及对 FreeBSD 内核和用户空间的重大变更。还提供了一些关于升级的简要说明。
1 介绍
本文档包含了 FreeBSD 5.3-RELEASE 在 AMD64 硬件平台上的发布说明。它介绍了 FreeBSD 最近新增、修改或删除的功能。还提供了一些关于从先前版本升级的说明。
该版本的 FreeBSD 5.3-RELEASE 是一个发布版,你可以在 ftp://ftp.FreeBSD.org/ 或任何镜像站点找到它。有关获取此版本(或其他版本)发布的更多信息,请参阅 FreeBSD 手册 中的 “获取 FreeBSD” 附录。
建议所有用户在安装 FreeBSD 之前查阅发布说明的勘误。勘误 文档会更新在发布周期结束或发布后发现的“突发”信息。通常,它包含已知的错误、安全公告和文档修正。FreeBSD 5.3-RELEASE 的最新勘误副本可以在 FreeBSD 网站上找到。
2 新特性
本节描述自 5.2.1-RELEASE 以来 FreeBSD 中最明显的新增或变更的功能。通常,这里描述的变更是独特的,属于 5-STABLE 分支,除非特别标注为 [已合并] 特性。
典型的发布说明项目包括发布后发布的安全公告、新驱动程序或硬件支持、新命令或选项、主要 bug 修复或第三方软件升级。它们还可能列出主要 Port/包或发布工程实践的变更。显然,发布说明不能列出每个版本之间对 FreeBSD 所做的所有变更;本文档主要关注安全公告、用户可见的变更以及主要的架构改进。
2.1 安全公告
修复了 mksnap_ffs(8) 中的一个 bug,该 bug 会导致创建文件系统快照时重置文件系统的参数为默认值。这个问题的后果取决于本地使用情况,但可能包括禁用扩展访问控制列表或启用存储在不受信任文件系统上的 setuid 可执行文件。此 bug 还影响了使用 mksnap_ffs(8) 的 dump(8) -L
选项。请注意,mksnap_ffs(8) 通常仅对超级用户和操作员组成员可用。更多信息请参见安全公告 FreeBSD-SA-04:01。
修复了 System V 共享内存接口(特别是 shmat(2) 系统调用)中的一个 bug。此 bug 可能导致共享内存段引用未分配的内核内存,从而允许本地攻击者未经授权访问内核内存的某些部分,可能导致敏感信息泄露、绕过访问控制机制或特权提升。更多详细信息请参见安全公告 FreeBSD-SA-04:02。[已合并]
修复了 jail_attach(2) 系统调用中的编程错误。此错误可能允许在 jail(8) 环境中具有超级用户权限的进程将其根目录变更为另一个 jail 的根目录,从而获得对目标 jail 中的文件和目录的完全读写访问权限。更多信息请参见安全公告 FreeBSD-SA-04:03。
通过限制一次可以保持的乱序 TCP 数据段数量,防止了对 FreeBSD TCP 堆栈的潜在低带宽拒绝服务攻击。更多详细信息请参见安全公告 FreeBSD-SA-04:04。[已合并]
修复了 OpenSSL SSL/TLS ChangeCipherSpec 消息处理中的一个 bug,该问题可能导致空指针解引用。攻击者可以利用该漏洞使使用 OpenSSL 的应用程序崩溃,从而导致系统的拒绝服务。更多信息请参见安全公告 FreeBSD-SA-04:05。[已合并]
修复了处理某些 IPv6 套接字选项时 setsockopt(2) 系统调用中的编程错误。此错误允许本地攻击者导致系统崩溃,并可能允许未经授权访问内核内存的某些部分,可能导致敏感信息泄露、绕过访问控制机制或特权提升。更多信息请参见安全公告 FreeBSD-SA-04:06。
修复了 CVS 中的两个编程错误。它们允许服务器覆盖客户端上的任意文件,以及客户端在访问远程 CVS 仓库时读取服务器上的任意文件。更多详细信息请参见安全公告 FreeBSD-SA-04:07。[已合并]
修复了 Heimdal 中的一个 bug,该 bug 会导致它未能充分检查跨自治领域的身份验证。更多信息请参见安全公告 FreeBSD-SA-04:08。[已合并]
修复了 CVS 中的一个编程错误,该错误可能允许恶意客户端覆盖服务器内存的任意部分。更多信息请参见安全公告 FreeBSD-SA-04:10。[已合并]
修复了实现 msync(2) 系统调用时可能导致的缓存一致性问题,涉及 MS_INVALIDATE
操作。然而,作为关闭此安全问题的副作用,MS_INVALIDATE
参数不再保证范围内的所有页面都被使无效。需要 MS_INVALIDATE
旧语义并且不关心已修复的安全问题的用户可以将 sysctl vm.old_msync
设置为 1
,以恢复旧的(不安全的)行为。更多信息请参见安全公告 FreeBSD-SA-04:11。[已合并]
修复了 jail(2) 系统调用中的编程错误,该错误导致未能验证是否有尝试操作路由表的进程来自非 jail 进程。更多信息请参见安全公告 FreeBSD-SA-04:12。[已合并]
修复了处理某些 Linux 系统调用时可能导致内存位置在未经适当验证的情况下被访问的编程错误。更多信息请参见安全公告 FreeBSD-SA-04:13。[已合并]
修复了多个 CVS 中的编程错误,这些错误可能导致信息泄露、拒绝服务或可能的任意代码执行,并通过升级到 CVS 1.11.17 进行修复。更多信息请参见安全公告 FreeBSD-SA-04:14。
修复了 CONS_SCRSHOT
ioctl(2) 中的一个 bug,该 bug 可能允许未经授权访问内核内存的某些部分,可能导致敏感信息泄露、绕过访问控制机制或特权提升。更多信息请参见安全公告 FreeBSD-SA-04:15。
2.2 内核变更
新增并默认启用 ADAPTIVE_MUTEXES
。此变更使阻塞的互斥锁在当前拥有锁的线程执行在其他 CPU 上时,会转换为自旋锁。如果需要,可以通过设置内核选项 NO_ADAPTIVE_MUTEXES
显式禁用此功能。
新增了内核选项 ADAPTIVE_GIAN
T,该选项使得在启用自适应互斥锁时,Giant 锁也以自适应方式处理。这改善了 SMP 机器的性能,并且在 i386 上默认启用。
bus_dma(9) 接口现在支持在加载缓冲区时透明地遵循 DMA 标签中的对齐和边界约束,bus_dmamap_load()
会在需要时自动使用跳跃缓冲区。此外,还新增一组 sysctl hw.busdma.*
用于 bus_dma(9) 统计信息。
contigmalloc(9) 函数已重新实现,采用了一种新算法,大大提高了在运行程序压力下成功的概率。如果需要,仍然可以使用旧算法,通过设置 sysctl vm.old_contigmalloc
。更多细节请参见 contigmalloc(9) 手册页面。
devfs(5) 路径规则现在在目录上正确工作。
getvfsent(3) API 已被移除。
已移除加载器可调选项 hw.pci.allow_unsupported_io_range
。
jail(2) 现在支持在 jail 内使用原始套接字。此功能默认禁用,可以通过使用 sysctl security.jail.allow_raw_sockets
来控制。
kqueue(2) 现在支持一个新过滤器 EVFILT_FS
,用于将通用文件系统事件信号传递给用户空间。目前,挂载、卸载和 NFS 的上下状态已通过此过滤器发出信号。
新增了 KDB,这是一个新的调试框架。它包含一个新的 GDB 后端,该后端已重写以支持线程、行程长度编码压缩等,以及一个前端,提供一个框架,允许配置多个不同的调试后端,并为这些后端提供基本服务。以下选项已变更:
默认通过内核选项启用 KDB,选项为 KDB、GDB 和 DDB。DDB 和 GDB 指定包含哪些 KDB 后端。
WITNESS_DDB
已重命名为WITNESS_KDB
。DDB_TRACE
已重命名为KDB_TRACE
。DDB_UNATTENDED
已重命名为KDB_UNATTENDED
。SC_HISTORY_DDBKEY
已重命名为SC_HISTORY_KDBKEY
。DDB_NOKLDSYM
已移除。新的 DDB 后端同时支持预链接符号查找和 KLD 符号查找。GDB_REMOTE_CHAT
已移除。允许该功能的 GDB 协议黑客是 FreeBSD 特有的。同时,GDB 协议现在为控制台输出提供数据包。
KDB 还作为所有希望使用调试功能的代码的唯一接触点,例如进入调试器或处理备用中断序列。为此,前端已被设置为非可选。所有调试请求将转发或交给当前的后端(如果适用)。当前后端的选择由 sysctl debug.kdb.current
控制。可以通过 sysctl debug.kdb.available
获取已配置的后端列表。可以通过向 sysctl debug.kdb.enter
写入数据来进入调试器。
新增了 sysctl debug.kdb.stop_cpus
。它控制是否在进入调试器时向其他 CPU 发送 IPI(处理器间中断),以便在调试器中停止它们。
现在,加载的内核模块在 amd64 构建中能够正常工作并已启用。
已增加对在 amd64 上运行 32 位 Linux 二进制文件的初步支持。此功能通过启用 COMPAT_LINUX32 内核选项来启用。
新增内核选项 MAC_STATIC
,该选项禁用内部 MAC 框架同步,以防止 MAC 策略的动态加载和卸载。
mac_bsdextended(4) 策略现在可以仅应用第一个匹配规则,而不是所有匹配规则。此功能可以通过设置新的 sysctl mac_bsdextended_firstmatch_enabled
来启用。
mac_bsdextended(4) 策略现在可以将失败的尝试记录到 syslog 的 AUTHPRIV 功能中。此功能可以通过设置新的 sysctl mac_bsdextended_logging
来启用。
mballoc 已被 mbuma 替代,mbuma 是基于 UMA 框架扩展构建的 Mbuf 和 Cluster 分配器。由于这一变更,NMBCLUSTERS 内核选项不再使用。集群的最大数量仍然根据 maxusers
限制,但可以通过将 kern.ipc.nmbclusters
加载器可调选项设置为零来解除限制。
现在 /dev/kmem
、/dev/mem
和 /dev/io
也作为内核加载模块提供。
已修复 mmap(2) 中的一个错误,某些情况下可能会导致标记为 PROT_NONE
的页面变为可读。[已合并]
新增了加载器可调选项 debug.mpsafenet
,默认启用。它使 FreeBSD 网络栈在没有 Giant 锁的情况下运行,从而通过增加并行性和减少网络处理延迟来提高性能。请注意,启用 ng_tty(4) Netgraph 节点类型、KAME IPsec 和 IPX/SPX 子系统会导致在启动时恢复启用 Giant 锁的网络操作,或者在动态加载时发出警告,因为这些组件需要 Giant 锁才能正常工作。
新增了内核选项 NET_WITH_GIANT
。该选项将 debug.mpsafenet
的默认值恢复为 0
,适用于编译时包含已知不安全组件的系统,或需要更保守配置的系统。
新增了加载器可调选项 debug.mpsafevm
。当前它导致几乎无 Giant 锁的零填充页面故障执行。
新增了内核选项 PREEMPTION
。此选项允许内核中的线程被更高优先级的线程抢占,有助于提高交互性并使中断线程尽早运行,而不是等待。
在 sysctl dev 树中新增了 devclass
层级,以支持每类设备的变量,除了每个设备的变量外。这意味着 dev.foo0.bar
现在称为 dev.foo.0.bar
,并且可以有 dev.foo.bar
。
新增了 sysctl kern.always_console_output
,它使得即使使用 TIOCCONS
,来自内核的输出也会转到控制台。
新增了 sysctl kern.sched.name
,它显示当前使用的调度器名称,同时将 sysctl kern.quantum
移动到 kern.sched.quantum
,以保持一致性。 ` pci(4) 总线资源和电源管理已更新。
注意
虽然 pci(4) 总线电源状态管理默认启用,但它可能会在某些系统上引发问题。可以通过将可调参数
hw.pci.do_powerstate
设置为0
来禁用它。
ULE 调度器已添加为附加调度器。请注意,传统调度器 4BSD 仍然是 GENERIC 内核中的默认调度器。对于大多数用户来说,交互性在许多情况下得到了改善。这意味着在机器非常忙时,交互式应用程序中的“跳跃”和“卡顿”现象会减少。虽然它不能防止因磁盘子系统过载导致的问题,但确实有助于缓解 CPU 过载。在 SMP 机器上,ULE 有每个 CPU 的运行队列,可以支持 CPU 亲和性、CPU 绑定和高级超线程支持,并为未来的更多优化提供框架。随着细粒度内核锁的继续,调度器将能够更有效地利用可用的并行资源。
在 vm_map_findspace(9) 中使用的线性查找算法已被替换为基于映射条目跳跃树的 O(log n) 算法。这显著减少了 vm_map_findspace(9) 中的开销,特别是对于需要 mmap(2) 数百或数千个区域的应用程序。
加载器可调选项 debug.witness_*
已重命名为 debug.witness.*
。
FreeBSD 动态和静态链接器现在支持线程局部存储(TLS),这是一种 GCC 特性,支持为全局和静态变量的声明新增修饰符 __thread
。此额外的修饰符意味着该变量的值是线程局部的,一个线程变更其值不会影响其他线程中该变量的值。
内核的文件描述符分配代码已更新,并且现在源自 OpenBSD 中类似的代码。
2.2.1 启动加载器变更
2.2.2 硬件支持
新增驱动 acpi_video(4) ,用于通过 ACPI 视频扩展控制显示切换和背光亮度。
驱动 agp(4) 现已支持 AMD64 图形光栅表(GART)。
已重写驱动 nmdm(4) ,以提高其可靠性。
驱动 raid(4)(来自 NetBSD 的 RAIDframe 磁盘驱动)已被移除。目前该驱动无法使用,并且需要一定的工作才能在 geom(4) API 下使其正常工作。
设备 pcic(4) 不再维护,已从 GENERIC 内核配置文件中移除。该条目实际上已经很长时间未使用。
对于设备 uart(4) ,新增了内核环境变量 hw.uart.console
和 hw.uart.dbgport
。这些变量可分别用于选择串行控制台和调试端口,并设置相应的属性。
新增了设备驱动 ubser(4) ,以支持 BWCT 控制台管理串行适配器。
新增了驱动 ucycom(4) ,支持 Cypress CY7C637xx 和 CY7C640/1xx 系列的 USB 到 RS232 桥接器,如 DeLorme Earthmate USB GPS 接收器(当前仅支持此设备)。该驱动尚不完整,因为尚未支持流控和输出。
设备驱动基础设施和许多驱动已更新。变更包括:更多的驱动现已使用自动分配的主设备号(而不是旧的静态主设备号);已增强功能,支持伪设备的克隆;驱动 API 进行了多项变更,包括在 struct cdevsw
中新增新的 d_version
字段。请注意,第三方设备驱动在此变更后需要重新编译。
2.2.2.1 多媒体支持
由于损坏和缺乏维护,已移除驱动 meteor(视频捕获) 。
Direct Rendering Manager(DRM)代码已从 DRI 项目 CVS 树(截至 2004 年 5 月 26 日)进行更新。此更新包括新的 PCI ID 和 Radeon 的新数据包。
各种声卡的驱动程序已重新组织;设备声音是通用声音驱动,设备 snd_*
是特定设备的声音驱动程序。已移除支持串口和若干声卡的驱动 midi 。更多详细信息可参见相关手册页:sound(4)、snd_ad1816(4)、snd_als4000(4)、snd_cmi(4)、snd_cs4281(4)、snd_csa(4)、snd_ds1(4)、snd_emu10k1(4)、snd_es137x(4)、snd_gusc(4)、snd_maestro3(4)、snd_sbc(4)、snd_solo(4)、snd_uaudio(4)。
驱动 sound(4)(之前称为 pcm(4))已被修改,以便在启动时读取 /boot/device.hints
文件,从而允许设置默认的混音器通道值。请注意,当前在 /boot/device.hints
中使用的设备驱动程序名称仍为 pcm
。更多详细信息和示例可以在 sound(4) 手册页中找到。
2.2.2.2 网络接口支持
在驱动程序 em(4) 中修复了一个在参数重新配置时的短暂中断问题。[已合并]
新增驱动程序 fwip(4),它支持通过 FireWire 传输 IP。需要注意的是,目前广播通道号是硬编码的,且不支持用于多播通道分配的 MCAP。该驱动程序旨在符合 IP over FireWire 的 RFC 2734 和 RFC 3146 标准,最终将替代驱动程序 fwe(4) 。
fxp(4) 现在使用设备 sysctl 树,例如 dev.fxp0
,可以基于每个设备设置这些 sysctl。
fxp(4) 现在可以实际控制接收扩展以太网帧的能力,这由 VLAN_MTU
接口能力指示。可以通过 ifconfig(8) 中的 vlanmtu
和 -vlanmtu
选项从用户空间切换此设置。
驱动程序 hme(4) 现在本地支持长帧,因此可以用于 vlan(4),支持完整的以太网 MTU 大小。
驱动程序 hme(4) 现在支持 TCP/UDP 的发送/接收校验和卸载。由于 hme(4) 未对 UDP 数据报进行校验和补偿,这可能会导致校验和为 0x0
,因此 UDP 发送校验和卸载默认是禁用的。可以通过ifconfig(8) 中的特殊链接选项 link0
重新启用。
已新增驱动程序 ixgb(4)(支持 Intel PRO/10GBE 10 千兆以太网卡)。[已合并]
已修复一个 BUG,该 BUG 会导致驱动程序 nge(4) 中的 VLAN 支持无法正常工作。[已合并]
已修复多个与 polling(4) 支持相关的 BUG,这些 BUG 出现在驱动程序 rl(4)中。[已合并]
修复了驱动程序 sk(4) 中与多播和混杂模式处理相关的多个 BUG。
驱动程序 ste(4) 现在支持 polling(4)。[已合并]
新增驱动程序 udav(4),它支持基于 Davicom DM9601 芯片组的 USB 以太网适配器。
新增驱动程序 vge(4),它支持 VIA Networking Technologies VT6122 千兆以太网芯片及集成的 10/100/1000 铜 PHY。
驱动程序 vr(4) 现在支持 polling(4)。[已合并]
驱动程序 xl(4) 中的硬件 TX 校验和支持已被禁用,因为它不能正常工作并且会降低传输速率。[已合并]
现在可以基于每个接口启用 polling(4) 支持。以下网络驱动程序支持 polling(4):dc(4),fxp(4),em(4),ixgb(4),nge(4),re(4),rl(4),sis(4),ste(4),vge(4),和 vr(4)。它们现在也支持该功能,并且可以通过 ifconfig(8)进行控制,除了ixgb(4)。[已合并]
2.2.3 网络协议
隧道驱动程序 gre(4) 现在支持 WCCP 版本 2。
ipfw(4) 规则现在支持选项 versrcreach
,用于验证路由表中是否存在有效的源地址路由。这个选项对于具有完整互联网视图(BGP)的路由器非常有用,可以拒绝源地址伪造或无法路由的数据包。例如:
这等同于以下 Cisco IOS 语法:
ipfw(4) 规则现在支持选项 antispoof
,用于验证传入数据包的源地址是否属于直接连接的网络。如果网络是直接连接的,那么接收数据包的接口将与网络连接的接口进行比较。当传入接口和直接连接的接口不同时,数据包不匹配。例如:
ipfw(4) 规则现在支持选项 jail
,用于将规则与特定的 Jail ID 关联。例如:
请注意,此规则当前仅适用于 TCP 和 UDP 数据包。
ipfw(4) 现在支持查找表。这个功能对于处理大规模稀疏地址集非常有用。[已合并]
ipfw(4) 转发规则必须通过内核选项 IPFIREWALL_FORWARD
编译到内核中才能启用。
新增一个新的 sysctl net.inet.ip.process_options
,用于控制 IP 选项的处理。当该 sysctl 设置为 0
时,IP 选项会被忽略并且未修改地传递;设置为 1
时,所有 IP 选项都将被处理(默认);设置为 2
时,所有带有 IP 选项的包将被拒绝,并返回 ICMP 过滤禁止消息。
修复了 KAME 项目中 IPsec 实现的一些 BUG。这些 BUG 与在删除所有引用之前释放内存对象有关,可能会导致在刷新安全策略数据库(SPD)后出现不稳定行为或内核 Panic 。
natd(8) 现在支持通过新选项 globalports
运行多个实例。这允许 natd(8) 绑定到不同的网络接口并共享负载。
已新增 Netgraph 节点类型 ng_atmllc(4) ,处理 RFC 1483 ATM LLC 封装。
已新增 Netgraph 节点类型 ng_hub(4) ,支持类似以太网集线器的简单数据包分发。[已合并]
Netgraph 节点类型 ng_rfc1490(4) 现在支持 Cisco 风格的封装,通常与 RFC 1490 一起用于帧中继链路。
已新增 Netgraph 节点类型 ng_sppp(4) ,是原始 sppp(4)网络模块(用于同步线路)的netgraph(4)接口。
新增一种新的 Netgraph 方法,以恢复从 4.X 风格 ng_tee(4) Netgraph 节点变更中丧失的部分行为。
已新增 Netgraph 节点类型 ng_vlan(4) ,支持 IEEE 802.1Q VLAN 标记。[已合并]
PFIL_HOOKS
支持现在始终编译进内核,相关的内核编译选项已被删除。FreeBSD 支持的所有数据包过滤子系统现在都使用 PFIL_HOOKS
框架。
以太网媒体支持的链路状态变更通知已新增到路由套接字。
ppp(8) 中的链路质量监控(LQM)支持已重新实现。LQM(在 RFC 1989 中描述)允许 PPP 跟踪正在运行的连接的质量。[已合并]
伪接口克隆已更新,并且匹配功能已允许创建名为 stf0、stf 或 6to4 的 stf(4) 接口。请注意,这破坏了向后兼容性;例如,ifconfig stf
现在创建名为 stf
的接口,而不是 stf0
,并且不再将 stf0
打印到标准输出。
以下 TCP 功能现在默认启用:RFC 3042(有限重传)、RFC 3390(增加初始拥塞窗口大小)、TCP 带宽-延迟积限制。这些功能的 sysctl 变量包括 net.inet.tcp.rfc3042
、net.inet.tcp.rfc3390
和 net.inet.tcp.inflight.enable
。更多信息请参见 tcp(4)。
FreeBSD 的 TCP 实现现在支持最小 MSS(通过 sysctl 变量 net.inet.tcp.minmss
设置)和对在短时间内发送许多小 TCP 段的连接的速率限制(通过 sysctl 变量 net.inet.tcp.minmssoverload
)。超过此限制的连接可能会被重置和丢弃。此功能提供了对资源耗尽攻击的一种保护。
TCP 实现现在包括对 RFC 2385(TCP-MD5)摘要支持的部分(仅输出)支持。此功能通过内核选项 TCP_SIGNATURE
和 FAST_IPSEC
启用,是一种用于验证 TCP 会话的 TCP 选项。setkey(8) 现在包括对 TCP-MD5 安全关联类的支持。[已合并]
TCP 连接重置处理已得到改进,以使几种重置攻击尽可能困难,同时保持与最广泛范围的 TCP 栈的兼容性。
RFC 1948 的实现已得到改进。初始序列号(ISN)的时间偏移组件现在包括时钟滴答之间的随机正增量,因此无论端口回收多快,ISN 总是会增加。
已实现 OpenBSD 的随机临时端口分配。默认启用,用户可以通过使用 sysctl net.inet.ip.portrange.randomized
禁用。[已合并]
已新增 RFC 2018 中描述的 TCP 选择性确认(SACK)。这改善了在丢包严重的连接上的 TCP 性能。可以通过 sysctl net.inet.tcp.sack.enable
启用 SACK。
2.2.4 磁盘与存储
驱动 ata(4) 现在支持 cardbus(4) ATA/SATA 控制器。
驱动 ata(4) 中的一些错误已被修复,特别是主/从设备检测应该能更好地工作,并且一些超时问题已得到解决。
驱动 ata(4) 现在支持所有现代 Promise 控制器(PDC203** PDC206**)上的 Promise 命令序列器。
注意: '
这也为 Promise SX4/SX4000 作为“普通”Promise ATA 控制器新增初步支持;ATA RAID 被支持,但仅支持 RAID0、RAID1 和 RAID0+1。
已移除用于 CAM SCSI 磁盘驱动程序(cam(4))的内核选项 DA_OLD_QUIRKS
。[已合并]
修复了 geom(4) 中的一个错误,该错误可能会在一些罕见情况下导致 I/O 挂起。
新增新的 geom(4) 类 GEOM_CONCAT
,用于将多个磁盘连接成一个更大的单一磁盘。
新增新的 geom(4) 类 GEOM_NOP
,用于各种测试目的。
新增新的 geom(4) 类 GEOM_RAID3
,用于 RAID3 转换,以及用户空间实用工具 graid3(8)。
新增新的 geom(4) 类 GEOM_STRIPE
,实现 RAID0 转换。此类有两种模式:“快速”和“经济”。在快速模式下,当使用非常小的条带大小时,将向每个磁盘发送一个 I/O 请求;对于小条带大小,快速模式比经济模式和其他 RAID0 实现快大约 10 倍。虽然默认使用快速模式,但它消耗的内存比经济模式多,经济模式每次发送请求时使用。可以通过将加载器可调 kern.geom.stripe.fast
设置为 0
来启用经济模式。还可以通过设置加载器可调 kern.geom.stripe.maxmem
来指定快速模式可以消耗的最大内存。
已新增 GEOM Gate ,包含一个新的 geom(4) 类 GEOM_GATE
和多个 GEOM Gate 用户空间实用工具(ggatel(8)、ggatec(8)、ggated(8))。它支持通过网络导出设备,包括非 geom(4)-感知设备。
新增新的 geom(4) 类 GEOM_LABEL
,用于检测各种文件系统上的卷标签,如 UFS、MSDOSFS(FAT12、FAT16、FAT32)和 ISO9660。
新增新的 geom(4) 类 GEOM_GPT
,支持 GUID 分区表(GPT)分区,并允许在单个磁盘上拥有大量分区,默认已加入 GENERIC。
新增新的 geom(4) 类 GEOM_MIRROR
,支持 RAID1 功能。可以使用实用工具 gmirror(8) 来控制此类。
新增新的 geom(4) 类 GEOM_UZIP
,实现只读压缩磁盘。当前支持 cloop V2.0 磁盘压缩格式。
新增新的 geom(4) 类 GEOM_VINUM
,支持 vinum(4) 和 geom(4) 之间的合作。
驱动 ips(4) 现在支持最近的 Adaptec ServeRAID 系列 SCSI 控制器卡。
驱动 umass(4) 现在支持缺失的 ATAPI MMC 命令并正确处理超时。[已合并]
已更新卷管理器 vinum(4) ,使用 geom(4) 磁盘 I/O 请求转换框架。已新增 gvinum 用户空间实用工具。
已新增对 LSI 类型软件 RAID 的支持。
2.3 用户空间变化
acpidump(8) 现在支持 SSDT 表。在转储或反汇编 DSDT 时,如果存在 SSDT 表,也会包含其内容。
bsdlabel(8) 现在支持 -f
选项,用于操作文件而不是磁盘分区。
bsdtar(1) 现在是 FreeBSD 基本系统中的默认 tar(1) 工具。/usr/bin/tar
默认是一个指向 /usr/bin/bsdtar
的符号链接。要恢复默认使用 /usr/bin/gtar
,可以使用 make 变量 WITH_GTAR
。
已新增支持蓝牙 HIDs(人机接口设备)的命令 bthidcontrol
和 bthidd
。
col(1)、colcrt(1)、colrm(1)、column(1)、fmt(1)、join(1)、rev(1)、tr(1) 和 ul(1) 现在支持多字节字符。
conscontrol(8) 现在支持命令 set
和 unset
,用于设置/取消设置虚拟控制台。unset
会让来自系统的输出(如内核 printf(9))始终转向真实的主控制台。这是 tty ioctl TIOCCONS 的接口。
cron(8) 守护进程接受两个新选项 -j
和 -J
,分别启用为普通用户和超级用户运行作业时的时间抖动。时间抖动意味着 cron(8) 会在执行作业前睡眠一小段随机时间,时间范围在指定值内。此功能旨在平滑当许多作业在特定时刻被调度时出现的负载峰值。[已合并]
cut(1) 的 -c
、-d
和 -f
选项现在在具有多字节字符的区域中正确工作。
cvs(1) 现在支持选项关键字 iso8601
,以 ISO 8601 格式打印日期。
daemon(8) 现在支持 -p
选项,用于创建 PID 文件。
dd(1) 现在支持 fillchar
选项,用于指定转换模式时的替代填充字符,或者在使用 noerror 与 sync 时输入错误发生时使用。
df(1) 现在支持 -c
选项,显示文件系统统计信息的总计。
已修复 df(1) 中的一个错误,该错误在指定 -t
选项且挂载点不可访问时,会打印无效信息。
已从 FreeBSD 基本系统中删除工具 doscmd,现在可以通过 FreeBSD Ports 中的 Port emulators/doscmd 获取。
dump(8) 和 restore(8) 现在支持 -P
选项,以指定除文件和磁带之外的备份方法。该参数传递给正常的 sh(1) 管道,分别定义了环境变量 $DUMP_VOLUME
或 $RESTORE_VOLUME
。有关更多信息,请参见 dump(8) 和 restore(8)。
已新增工具 eeprom(8) ,用于显示和修改存储在 EEPROM 或 NVRAM 中的系统配置。当前实现支持配备 Open Firmware 的系统。
作为 fgetln(3) 的宽字符版本,已新增函数 fgetwln(3) 。
find(1) 工具现在支持主选项 -acl
,用于查找具有 acl(3) 的文件。
find(1) 工具现在支持一个新的主选项 -depth n
,该选项测试当前文件相对于遍历起始点的深度是否为 n
。[已合并]
ftpd(8) 现在在主动模式下使用当前用户的有效 UID 来打开用于数据传输的套接字,而不是使用 root。这对于使用 uid 匹配匿名 FTP 数据流量与单一的 ipfw(8) 规则非常有用。
已实现函数 ftw(3) 和 nftw(3) ,用于遍历目录层次,。
工具 geom(8) ,用于操作 geom(4) 类,已新增至用户空间。
gpt(8),一个 GUID 分区表维护工具,现支持 remove
命令。其 add
命令现在支持 -i
选项,允许用户指定新分区的分区号。
id(1) 现在支持 -M
选项,打印当前进程的 MAC 标签。
ifconfig(8) 现在支持在运行时使用 name
参数重命名网络接口。
ifconfig(8) 现在打印 polling(4) 状态。[已合并]
ifconfig(8) 现在提供选项 vlanmtu
和 -vlanmtu
,用于控制某些以太网接口接收扩展帧的能力(即包含超过 1500 字节有效载荷的帧)。
ifconfig(8) 现在提供选项 vlanhwtag
和 -vlanhwtag
,用于控制某些以太网接口在硬件中处理 VLAN 标签的能力。
indent(1) 现在支持 -ldi
选项来控制局部变量的缩进。此工具进行了多个其他调优。
indent(1) 现在支持 -fbs
和 -ut
选项,用于函数声明,要求将左大括号与参数声明放在同一行,所有空格而非制表符,以解决使用非 8 空格制表符时的问题。
ip6fw(8) 现在支持 -n
参数,防止其对内核中的规则进行任何变更。
ipcs(1) 现在支持 -u
选项,用于显示属于指定用户的 IPC 机制信息。
ipfw(8) 现在支持 -b
参数,只打印每条规则的动作和注释,省略规则体。
jail(8) 现在支持 -U
选项,以用户身份运行命令,该用户仅存在于 jail(2) 环境中。
jail(8) 现在支持 -l
选项来清理环境。运行被监禁的程序之前,所有环境变量都会被丢弃,只有 HOME、SHELL、PATH、TERM 和 USER 会被保留。这与 su(1) -l 选项提供的行为类似。
已添加 kgdb(1),一个内核调试工具,使用 libgdb 并理解内核线程、内核模块以及 kvm(3)。
killall(1) 现在支持 -e
参数,使得 -u
操作对有效用户 ID,而非真实用户 ID。[已合并]
libalias(3) 现在支持(并提供了一个新的 API)在单个进程中使用多个别名实例。现有 API 已根据新 API 重新实现,以保持兼容性。
已新增 libarchive 库,用于压缩和解压缩归档文件的操作。更多细节可以查看 libarchive(3)。
libdisk 现在使用 d_addr_t
来表示磁盘地址,这使得 sysinstall(8) 可以正确处理超过 1 TB 的磁盘和文件系统。
曾经称为 libkse 的库现在被重命名为 libpthread,并且在 i386、amd64 和 ia64 平台上成为默认的线程库。GCC 的 -pthread
选项已变更为使用 libpthread,而不是 libc_r。
注意:
使用旧二进制文件的用户(例如,在做此变更之前编译的 Port)应使用 libmap.conf(5) 来将 libc_r 和/或 libkse 映射到 libpthread。
注意:
使用 NVIDIA 提供的驱动程序和库的用户可能需要使用一个 libmap.conf(5),将 libpthread 的引用映射到较旧的 libc_r,因为这些驱动程序和实用程序不与 libpthread 一起工作。
libpthread 现在支持环境变量 LIBPTHREAD_SYSTEM_SCOPE
,用于强制使用 1:1 模式(使用系统范围的线程)。请注意,使用 -DSYSTEM_SCOPE_ONLY
参数构建 libpthread 也会强制使用 1:1 模式,并且此选项是针对尚不支持 M:N 模式的架构的默认设置。此外,可以使用环境变量 LIBPTHREAD_PROCESS_SCOPE
来强制使用 M:N 模式(使用进程范围的线程)。例如:
这会强制应用程序 threaded_app
使用系统范围的线程,另外:
则强制它使用进程范围的线程。
已修复 look(1) 的 -d
选项中的一个错误。此外, look(1) 现在能够在包含多字节字符的区域设置中正确工作。
ls(1) 现在根据当前的 LC_CTYPE
将文件名视为多字节字符字符串,以确定哪些字符是可打印的。
make(1) 现在支持新的 .warning
指令。
make(1) 现在支持 POSIX 兼容的 +
参数,在 Makefile 命令行中指定该参数会在指定 -n
时执行该行。这对于调用子 make 非常有用。
make(1) 现在将命令行中的变量赋值放入变量 MAKEFLAGS
中,符合 POSIX 要求。这使得这些变量被推送到所有由 make(1) 调用的子 make 中(除非在子 make 的环境中显式变更了变量 MAKEFLAGS
)。这使得它们在子 make 中几乎不能被覆盖,除非在子 make 的命令行中。
nearbyint(3) 和 nearbyintf(3) C99 函数已实现。
tgmath.h
C99 头文件已实现。该头文件提供了函数 math.h
和 complex.h
的类型通用宏,这些函数具有 float、double 和 long double 实现。
mbsnrtowcs(3) 和 wcsnrtombs(3) 的 GNU 扩展已实现。
newsyslog(8) 现在允许用户通过文件设置调试选项 newsyslog.conf
。
newsyslog(8) 在处理文件进行轮换时使用了新的顺序。它首先轮换所有需要轮换的文件,然后发送一个信号给每个需要被信号通知的进程,最后压缩所有已轮换的文件。
新增了函数 nextwctype(3) ,用于遍历特定字符类中的所有字符。
已为当前支持的所有系统区域设置新增初步的 UTF-8 版本支持。这主要是为了方便 Port misc/utf8locale 。
已新增以色列希伯来语区域设置 he_IL.UTF-8
。
已新增工具 logins(1) ,用于显示有关用户和系统帐户的信息。
mountd(8) 现在支持 -p
选项,允许用户指定已知的端口,用于防火墙规则集。
netstat(1) 现在显示系统中的组播组成员信息。
newfs(8) 和 mdmfs(8) 现在支持 -l
参数,允许它们在创建新文件系统时设置 MAC 多标签参数,而无需使用 tunefs(8)。
nologin(8) 现在通过 syslogd(8) 报告登录尝试。
nologin(8) 已从 /sbin/nologin
移动到 /usr/sbin/nologin
。/sbin/nologin
仍作为符号链接,确保向后兼容。
已应用修复,解决了使用第三方 NSS 模块(如 net/nss_ldap)和具有大成员列表的组时的 NSS 问题。
od(1) 现在支持 POSIX 风格的多字节字符。
patch(1) 已被 OpenBSD 的 BSD 许可证版本替代。这包括选项 --posix
,用于严格的 POSIX 兼容性。
新增了 pgrep(1) 和 pkill(1) 命令,这些命令来自 NetBSD。它们还支持 -M
选项,用于从指定的 core 中提取与名称列表相关的值,而不是默认的 /dev/kmem
,以及 -N
选项,用于从指定的系统中提取名称列表,而不是默认的内核。
ppp(8) 现在支持 set rad_alive N
命令,用于启用定期将 RADIUS 计费信息发送到 RADIUS 服务器。
ppp(8) 现在支持 set pppoe [standard|3Com]
命令,用于配置底层 Netgraph 节点 ng_pppoe(4) 的操作模式。
ps(1) 现在与 POSIX/SUSv3 更加兼容。变更包括:-p
用于列出进程 ID,-t
用于列出终端名称,-A
等效于 -ax
,-G
用于列出组 ID,-X
为 -x
的反义操作,及一些小的改进。更多信息,请参见 ps(1)。
ps(1) 现在支持格式选项 -O emul
,用于打印进程所在的系统调用模拟环境的名称。
pw(8) 现在支持 -H
选项,可通过文件描述符接受加密密码。
修复了 rarpd(8) 中的一个错误,该错误导致在接口有多个 IP 地址时无法正常工作。
regex(3) 现在支持识别多字节字符的正则表达式匹配。
resolver(3) 使用的配置文件现在支持 timeout:
和 attempts:
关键字。
resolver(3) 及相关接口现在更具可重入性和线程安全性。可以同时运行多个 DNS 查询,大幅提高了一些多线程应用程序的性能。一些多线程程序需要重新编译,例如 Ports 中的 www/mozilla 及其变体、mail/evolution、devel/gnomevfs 和 devel/gnomevfs2。
rmdir(1) 现在支持 -v
参数,用于显示详细信息。
savecore(8) 现在可正确处理超过 2GB 的转储文件。
修复了 script(1) 的一个错误,使其在标准输入关闭的情况下可以正常工作。这一修复避免了与 sysutils/portupgrade 包可能存在的危险交互;如果以非交互方式运行,该包可能会在未重新安装的情况下删除所有过时的 Port。
新增蓝牙服务发现协议守护进程 sdpd(8) 。
sed(1) 的 y
(转换)命令现在支持多字节字符。
新增工具 sha1(1) 和 rmd160(1) ,功能类似于 md5(1),用于计算输入的消息摘要。
新增了 smbmsg(8),一个用于发送/接收 SMBus 消息的小工具。
talk(1) 现在在目标和来源都是本地时,默认在 talkd(8) 请求数据包中使用 localhost
作为机器名称。这使 talk(1) 依赖于 /etc/hosts
或 DNS 中有效的 localhost
主机条目。
tftpd(8) 现在支持两个新选项:-w
选项允许创建新文件,-U
选项允许设置 umask。
top(1) 现在可以显示当前的 I/O 量。可以通过按下 m
键或传递命令行选项 -m io
来启用此功能。
truss(1) 现在包括对 FreeBSD/amd64 的初步支持。
基本系统中的许多用户态工具(主要是 GNU 提供的工具)现在使用系统版本的 getopt_long(3),而不是 GNU 版本。
2.3.1 /etc/rc.d 脚本
diskless 脚本已拆分为脚本 hostname、resolve、tmp 和 var。
新增了 gbde_swap 脚本,用于支持启用了 GBDE(GEOM Based Disk Encryption)的交换设备。当在 rc.conf(5) 中指定了 gbde_swap_enable
变量时,fstab(5) 文件中名为 /dev/foo.bde
的交换设备会在启动时自动使用设备 /dev/foo
和随机密钥附加。该随机密钥通过对从 /dev/random
读取的 512 字节数据计算 MD5 校验生成。请注意,这会阻止内核转储的恢复。
新增变量 ip6addrctl_enable 和 ip6addrctl_verbose。当 ip6addrctl_enable
设置为 YES
时,地址选择策略会被安装到内核中。如果存在 /etc/ip6addrctl.conf
文件,则会使用该文件;否则,将安装默认策略。当 ipv6_enable
设置为 YES
时,默认策略是 RFC 3484 中描述的策略。否则,将使用针对 IPv4 地址的优先级策略作为默认策略。
新增了 mixer 脚本。在系统关闭时,它会保存系统中所有音频混音器的当前设置,并在启动时恢复这些设置。
named 脚本已更新,以支持基本系统中的 BIND 9。变更包括:
named(8) 默认运行在 chroot(2) 目录
/var/named
中。可以使用named_chrootdir
变量禁用此行为或变更 chroot(2) 目录。当
named_chroot_autoupdate
变量设置为YES
(默认值)时,chroot 目录会在启动时自动配置。一个指向/var/named/etc/namedb
的符号链接会被创建为/etc/namedb
,另一个指向/var/named/var/run/named/pid
的符号链接会被创建为/var/run/named/pid
。后者可以通过在rc.conf
中使用named_symlink_enable
变量来禁用。如果
rndc.key
文件不存在,会自动创建该文件。
新增了适用于 pf(4) 的脚本 pf 和 pflog。
2.4 提供的软件
ACPI-CA 代码已从 20030619 快照更新至 20040527 快照。
AMD (am-utils) 已从版本 6.0.9 更新至 6.0.10p1。
来自 Bell Labs 的 awk 已从 2003 年 7 月 29 日的版本更新至 2004 年 2 月 7 日的版本。
BIND 已从版本 8.3.1-REL 更新至 9.3.0。
CVS 已从版本 1.11.15 更新至 1.11.17。[合并完成]
FILE 已从版本 3.41 更新至 4.10。
gdtoa(一个用于在二进制与十进制之间转换数字的库)已从版本 20030324 更新至 20040118。
GDB 已更新至版本 6.1.1。
GNU Binutils 已更新为 2004 年 5 月 23 日的 FSF 2.15 分支快照。
GNU GCC 已从 2003 年 11 月 6 日的 3.3.3-prerelease 版本更新至 2004 年 7 月 28 日的 3.4.2-prerelease 版本。
GNU grep 已从版本 2.4d 更新至 2.5.1。
GNU less 已从版本 371 更新至 381。
GNU readline 4.3 已应用官方补丁 001 至 005。
GNU regex 库已更新至 GNU grep 2.5.1 所包含的版本。
GNU sort 已从 textutils 2.1 更新至 2004 年 8 月 12 日的 coreutils 快照。
基本系统中的 GNU tar 实现现称为 gtar。
Heimdal Kerberos 已从版本 0.6 更新至 0.6.1。
ISC DHCP 客户端已从版本 3.0.1 RC10 更新至 3.0.1。
libpcap 已从版本 0.7.1 更新至 0.8.3。
lukemftpd 已从 2003 年 11 月 3 日的快照更新至 2004 年 8 月 9 日的快照。
NTP 已从版本 4.1.1a 更新至 4.2.0。
OpenPAM 已从 Dogwood 版本更新至 Eelgrass 版本。
OpenSSH 已从版本 3.6.1p1 更新至 3.8.1p1。
注意:
sshd(8) 的配置默认值已变更。默认情况下不再启用 SSH 协议版本 1。此外,如果启用了 PAM,则默认禁用通过 SSH 的密码验证。
OpenSSL 已从版本 0.9.7c 更新至 0.9.7d。[合并完成]
OpenSSL 中已导入支持 VIA C3 Nehemiah PadLock ACE(高级加密引擎)的加密功能,该功能提供高级加密标准(AES)加密支持。
pf(OpenBSD 3.5-stable 的数据包过滤器)已导入 FreeBSD 源代码树,并默认安装。pf 需要的两个新用户(
proxy
和_pflogd
)和三个新组(authpf
、proxy
和_pflogd
)也已新增。
注意:
在从源代码升级时,必须提前新增这些用户账户。可以使用
mergemaster -p
协助在 passwd(5) 和 group(5) 文件中创建适当的条目。可以通过make.conf
中的变量NO_PF
阻止构建 pf。
routed 已从 rhyolite.com 的版本 2.22 更新至 2.27。
注意:
对于依赖于 RIP 的 MD5 身份验证功能的用户,在新版本中的 routed(8) 与之前的 FreeBSD 版本不兼容,但现在与 Sun、Cisco 和其他厂商的实现了兼容。
sendmail 已从版本 8.12.10 更新至 8.13.1。[合并完成]
tcpdump 已从版本 3.7.1 更新至 3.8.3。
tcsh 已从版本 6.11 更新至 6.13.00。
时区数据库已从 tzdata2003a 更新至 tzdata2004e。
zlib 已从版本 1.1.4 更新至 1.2.1。
2.5 Ports/软件包
为 distfiles 新增 SIZE 属性,该属性可用于在下载文件前检查文件大小,并默认启用。用户可以通过
DISABLE_SIZE
来禁用distfile
的大小检查功能。这对于某些较旧版本的 FreeBSD(不支持 fetch(1) 的大小检查)以及一些始终返回错误或虚假大小的 FTP 代理特别有用。ports 树中新增了两个文件用于跟踪重要变更:
ports/CHANGES
:记录 Ports 及其基础设施的主要变更。ports/UPDATING
:描述在更新某些 port 时可能遇到的潜在问题,与基本系统的src/UPDATING
类似。
已重写系统工具
pkg_*
中的版本号解析代码,恢复了对 FreeBSD 4.x 和 sysutils/portupgrade 的兼容性。软件包工具现在支持使用关系运算符和类 csh 风格的
{...}
选择来匹配软件包。例如:
该命令会列出所有版本至少为 3.0 的 docbook DTD。此外,还新增额外的命令行选项来辅助模式匹配。
软件包工具在处理损坏的包数据库时的表现得到了改进。
pkg_create(1) 现在支持
-S
选项,在创建包时为所有@cwd
路径新增前缀。pkg_info(1) 现在支持
-j
选项,用于显示每个软件包的 requirements 脚本。
2.6 发布工程与集成
FreeBSD 的加密支持现已成为发布版本的默认组件,
crypto
发布分发包现已整合进基本系统。需要注意的是,-DNOCRYPT
构建选项仍然存在,供确实需要构建非加密二进制文件的用户使用。GNOME 的受支持版本已从 2.4 更新至 2.6.2。
注意: 如果你正在使用较旧的 GNOME 桌面环境(x11/gnome2),直接通过 FreeBSD Ports 使用 portupgrade(1)(sysutils/portupgrade)进行升级会引发严重问题。如果你是 GNOME 桌面用户,请仔细阅读 http://www.FreeBSD.org/gnome/docs/faq26.html 中的说明,并使用
gnome_upgrade.sh
脚本正确升级到 GNOME 2.6。如果你只是偶尔使用一些 GNOME 库,则使用 portupgrade(1) 即可完成 Port 升级。
KDE 的受支持版本已从 3.1.4 更新至 3.3.0。
security/portaudit 实用程序已新增到 FreeBSD Ports 中。该工具会读取包含已知 Port 漏洞的数据库,并将其报告给管理员。
FreeBSD 现在默认使用 Xorg 作为 X 窗口系统,支持的版本为 Xorg X11R6.7.0。请注意,XFree86 仍然可通过 FreeBSD Ports 获取(x11/XFree86-4)。
2.7 文档
3 从旧版本 FreeBSD 升级
建议现有 FreeBSD 系统用户 强烈 阅读《FreeBSD 5.3-RELEASE 迁移指南》。此文档通常在发行介质中以 MIGRATE5.TXT
文件名提供,或者可以在任何包含发布说明的地方找到。文档中包含从 FreeBSD 4.X 迁移的相关说明,更重要的是,它讨论了升级到 FreeBSD 5.X 与继续运行 FreeBSD 4.X 的相对优点。
重要提示:
仅在备份 所有 数据和配置文件后才尝试升级 FreeBSD。
可从 ftp://ftp.FreeBSD.org/ 下载此文件及其他与发布相关的文档。
如果对 FreeBSD 有疑问,请在联系 questions@FreeBSD.org 之前阅读 文档。
如果对本文档有疑问,请发送电子邮件至 doc@FreeBSD.org。
最后更新于