升级服务器可能是系统管理员日常工作中最烦人的任务。升级后,我可以在桌面上管理无法解释的行为,但当我的整个组织或数百名客户依赖于一台服务器时,即使想到触摸该系统,我的肠道也会翻腾。任何操作系统升级都可以扩展您迅速增长的白发收藏。即使是非常有经验的系统管理员,在升级关键系统和将炽热的针头刺入自己的眼睛之间做出选择时,也经常不得不坐下来考虑他们的选择。虚拟化和精心编排的云系统可能看起来不那么麻烦,但即使有了这些,为升级做准备也会让人彻夜难眠。记住,尽管自动化有很多好处,但它是大规模出错的好方法。
FreeBSD最大的优势之一是它的升级过程。FreeBSD被设计为一个单片(monolithic)操作系统,而不是一组软件包。(即使FreeBSD迁移到以包的形式提供基本系统,它仍将被设计和构建为一个整体实体。)我让主机运行了五个不同的FreeBSD主要版本,以及其间的无数补丁级别,而无需重新安装系统。只有当FreeBSD系统太旧,硬件故障的风险让我彻夜难眠时,我才会停用它们。虽然我可能会担心在操作系统上运行的应用程序,但即使在主要的FreeBSD版本之间进行升级,我也不再担心了。
为什么升级FreeBSD是一件相对简单的事情?关键在于FreeBSD的开发方法。FreeBSD是一个不断发展的操作系统。如果你在下午下载FreeBSD的当前版本,它将与上午的版本略有不同。来自世界各地的开发人员不断添加更改和改进,这使得不太开放的软件使用的传统严格版本编号不切实际。在任何时候,你都可以得到几个不同版本的FreeBSD:releases、-stable、-current和snapshot。
FreeBSD发布主要(major)和次要(minor)版本。主要版本有11.0、12.0、13.0等版本号。每个主要版本都包含早期主要版本中没有的大型功能。全面的更改仅出现在主要版本中。
次要版本是主要版本的更新版本。您将看到12.1-RELEASE、12.2-RELEASE和12.3-RELEASE等次要版本。(大多数人会从这些名称中删除release一词。)这些次要版本为主要版本添加了一些小功能和错误修复。你可能会得到新的函数或程序,但前提是它们不会干扰现有的函数。避免了意外的、破坏性的变化。
您还将看到 patch levels 。得益于 freebsd-update(8)
,修补版本既快速又简单。补丁编号在发布后以数字形式给出。这意味着您将看到FreeBSD版本,如12.1-RELEASE-p20、11.4-RELEASE-p9、13.0-RELEASE-71等。
用户应该像其他操作系统一样,通过连续的次版本升级来密切跟踪他们的主要版本。
FreeBSD-current,也称为 -current 或 HEAD ,是FreeBSD的最新版本,其中包含首次公开亮相的代码。虽然开发人员在应用之前有测试服务器和发布补丁供审查,但这仍然比FreeBSD当前的广泛用户群少得多。FreeBSD-current是进行许多初步同行评审的地方;有时,current会发生根本性的变化,让经验丰富的系统管理员头疼不已。
FreeBSD-current可供开发人员、测试人员和感兴趣的各方使用,但并不打算用于一般用途。对用户关于-current的问题的支持非常有限,因为开发人员根本没有时间帮助用户修复他的网络浏览器,而还有数千个关键问题需要关注。用户应该帮助解决这些问题,或者耐心地忍受它们,直到别人解决它们。
更糟糕的是,-current的默认设置包括各种调试代码、特殊警告和相关的开发人员功能。这些使当前运行速度比任何其他版本的FreeBSD都慢。你可以禁用所有这些调试,但如果你这样做,当你遇到问题时,你将无法提交正确的故障报告。这意味着你更加孤立。有关调试的详细信息,请查看当前系统上的 /usr/src/UPDATING 文件。
如果你不会阅读C和shell代码,不想调试你的操作系统,不喜欢计算机功能随意失败,或者只是不喜欢被挂着,直到你的问题惹恼了能解决它的人,那么-current不适合你。勇敢的人当然欢迎尝试-current,任何愿意花大量时间学习和调试FreeBSD的人,或者任何需要谦逊教训的人。您没有被禁止使用-current;你只能靠自己了。FreeBSD的最新版本并不总是最前沿的,但有时这可能是为什么我的手指突然变得很小?边缘。你已经被警告了。
要运行-current,你真的必须阅读FreeBSD-current@FreeBSD.org以及svn-src-head@FreeBSD.org邮件列表。这些是高流量列表,每天有数百条警告、警报和评论。如果你正在读这本书,你可能不应该在这些列表上发帖;只要阅读和学习。如果有人发现最新的文件系统补丁程序将硬盘驱动器转换为Cthulhu的僵尸小黄人,那么这就是信息可用的地方。
每12到18个月,FreeBSD-current就会经历一个月的代码冻结期,在此期间不允许进行非关键性更改,所有已知的关键问题都会得到修复。目标是稳定FreeBSD的最新和最伟大的版本,并打磨掉粗糙的角落。在代码冻结结束时(或之后不久),-current将成为新FreeBSD主要版本的.0版本。例如,FreeBSD 12.0曾一度是最新版本,FreeBSD 13.0也是如此。当新的主要版本发布时,当前版本号会递增。FreeBSD 17.0的发布意味着-current将被称为FreeBSD 18。 一旦.0主要版本被广泛使用,开发工作就会分为两行:FreeBSD-current和FreeBSD-stable。
FreeBSD-stable(或只是 -stable )是“普通用户的前沿”,包含一些最新的同行评审代码。熟悉Linux的系统管理员知道稳定版是一个“滚动版本(rolling release)”。你会发现每个主要版本都有一个FreeBSD-stable。
一旦一段代码在-current中经过彻底测试,它可能会被合并回-stable。-stable版本是几乎任何时候都可以安全升级到的版本;你可能会认为它是FreeBSD-beta。
每年有三到四次,发布工程团队要求开发人员专注于解决-stable的突出问题,而不是进行重大更改。发布工程团队从该代码中删除了几个候选版本,并将每个候选版本都提供给公众测试。当FreeBSD团队对自己和社区的测试结果感到满意时,会给出一个版本号。然后,开发团队将注意力转移到他们的常规项目上。
这在实践中是如何运作的?以FreeBSD 13为例。一旦13.0发布,开发人员将开始合并13-stable版本的错误修复和添加。想要帮助测试新FreeBSD版本的用户可以运行13-stable。经过几个月的功能合并和一些测试,13-stable将变为13.1。13.1发布后,发展轨道恢复到13-stable。FreeBSD 13.1、13.2和13.3只是FreeBSD 13-stable连续体上的几个点。
FreeBSD-stable预计将是冷静可靠的,几乎不需要用户关注。
随着-stable年龄的增长,-stable和-current之间的差异越来越大,以至于有必要从-current中分出一个新的-stable。老-stable被积极维护了几个月,而新-stable则被锤打成型。一些用户立即升级到新版本的-stable,另一些则更加谨慎。在一两个新-stable版本发布后,旧-stable版本将被淘汰,开发人员鼓励用户迁移到新版本。一段时间后,旧的stable版本将只收到关键的错误修复,最终将被完全放弃。您可以在图18-1中看到这是如何工作的。
对于补丁级别,每个版本都应该在侧面有一个悬挂的尾巴,但这会使图表变得非常混乱。
FreeBSD-stable的用户必须阅读FreeBSD-stable@FreeBSD.org邮件列表。虽然这个邮件列表的流量适中,而且有相当多的问答交流,这些交流确实应该是在 -questions@ 之上,但开发人员的重要消息通常以“HEADS UP”开头。寻找这些信息;它们通常意味着,如果你不知道,系统的变化可能会毁了你的一天。
-stable的稳定性 stable 这个词描述的是代码库,而不是FreeBSD本身。从稳定分支的随机点运行代码并不能保证你的系统是稳定的,只能保证底层代码不会发生根本性的变化。API和ABI预计将保持不变。虽然开发人员努力确保稳定,但错误确实会发生。如果你担心这种风险,请坚持使用补丁版本。
短语 merged from -current(MFC)意味着一个函数或子系统已经从FreeBSD-current向后移植到FreeBSD-stabel(或者,很少,到勘误表分支)。然而,并非所有功能都是MFC的。FreeBSD-current的要点是,它是发生重大变化的地方,其中许多变化需要数月的测试和调试。这些巨大的变化不能被移植,因为它们会严重影响那些期望稳定代码库的-stable用户。
有时,看起来“明显的MFC候选者”的功能无法合并。有时内核基础架构会更改以支持新的驱动程序和功能,并且该基础架构无法安全地合并。需要这种基础设施的新驱动程序不可能是MFC的。这在视频和无线网络驱动程序中最为常见。
选择新的驱动程序、错误修复和微小的增强可以是MFC的——但仅此而已。FreeBSD项目强调,MFC的大型更改不会破坏用户应用程序。
大约每个月,FreeBSD发布工程团队都会发布-current和-stable的快照,并将其发布在FTP站点上。快照只是开发分支中的点;它们没有经过特殊的包装或测试。快照并没有像版本那样受到质量方面的关注,但对于那些对运行-current或-stable运行感兴趣的人来说,它们是一个很好的起点。只有适度的质量控制,许多开发人员在FTP服务器上出现快照之前都不知道快照已经出来。你会发现bug的。你会发现错误。假设你还没有对这个可怜的女人这样做,你会遇到让你母亲头发变白的问题。
随着FreeBSD 11.0的发布,该项目的支持模式发生了变化,与其他商业和非商业操作系统所使用的模式更加相似。
每个主要版本在首次发布后五年内都支持安全和稳定性补丁。如果FreeBSD 13于2021年1月1日发布,支持将于2026年1月2日结束。
每个次要版本在下一个次要版本发布后支持三个月。FreeBSD 12.3的支持将在FreeBSD 12.4发布三个月后终止。这给了你三个月的时间来安排升级。
失去官方支持并不意味着你不能继续运行不受支持的版本。但是,您需要检查每个安全公告,确定它是否影响您的环境,并创建自己的补丁。你最好运行升级。
FreeBSD次要版本的全部意义在于它们的侵入性最小。从FreeBSD 12.3升级到12.4应该会产生与应用Windows更新或从Centos 8.1升级到8.2类似的影响。应用程序应该继续正常运行。
一个版本的最后一个FreeBSD次要版本将获得支持并修补到五年。如果FreeBSD 12.5是FreeBSD 12的最后一次发布,它将获得安全补丁,直到FreeBSD 12.0发布五年后。
FreeBSD的每个版本和发行版都以各种方式进行测试。个人开发人员在自己的硬件上检查他们的工作,并要求对方仔细检查他们的作品。如果作品足够复杂,他们可能会使用官方的FreeBSD Phabricator系统(https://reviews.FreeBSD.org/)或者甚至是一个私有的源代码库,在将其提交给-current之前,将其工作提供给更广泛的社区。分析公司已经向FreeBSD团队捐赠了分析软件,以便对源代码进行持续的自动审核、测试和调试,在错误有机会影响现实世界的用户之前发现许多错误。Sentex、EMC、Netflix和iX Systems等公司为该项目提供测试。几位备受推崇的FreeBSD开发人员将测试作为该项目的一个主要问题。他们现在有一个自动化的Kyua测试框架。
然而,最终,一个由几百名开发人员组成的志愿者项目无法购买所有制造的计算机硬件,也无法在所有可能的负载下运行这些硬件。FreeBSD项目作为一个整体依赖于使用FreeBSD测试软件的公司和个人。
最有用的测试来自拥有真实世界设备和具有真实世界工作负载的真实世界测试台的用户。遗憾的是,这些用户中的大多数在将发行CD放入计算机、运行安装并启动系统时都会进行测试。在这一点上,要从发布中获益已经太晚了。你发现的任何错误都可能对下一个版本有所帮助,但与此同时,补丁可能会解决你的问题。
这里的解决方案是显而易见的——在发布之前,在你的实际工作负载上测试FreeBSD。测试新稳定版本的请求出现在FreeBSD-stable@FreeBSD.org.通过测试-stable或-current,您将从FreeBSD获得更好的价值。
-current,-stable,releases,snapshots——头部旋转。是的,这似乎很复杂,但它确保了特定的质量水平。用户可以放心,release尽可能可靠,并且经过了广泛的测试和同行评审。这些用户知道,如果他们愿意承担每个版本固有的风险,-stable和-current中的漂亮新功能都是可用的。那么,你应该使用哪个版本呢?以下是我的建议:
如果你在生产环境中使用FreeBSD,请安装最新的次要(minor)版本。当下一个次要版本发布时,升级到它。
如果你需要知道下一个FreeBSD次要版本的内容以及它将如何影响你的生产环境,请在你的测试环境中使用-stable。
这里的问题是你想测试什么。该项目推荐对-current和-stable进行测试。如果你有疑问,从运行-stable开始。
操作系统开发人员、业余时间太多、兴奋感太低的人和彻头彻尾的傻瓜应该与时俱进。当-current破坏你的MP3收藏时,调试问题并提交补丁来修复它。
如果你是一个爱好者,运行任何版本!只要记住你选择的分支的局限性。如果你只是在学习Unix,我建议你使用-release。一旦你站稳了脚跟,升级到-stable。虽然-current比20年前稳定得多,但如果你认为肾上腺素刺激系统故障的可能性会让你的一天更加激动人心,那么这就是你要去的地方。高风险赌徒运行-current,欢迎志同道合的公司。
FreeBSD提供了两种升级方式:二进制更新和从源代码构建。
FreeBSD通过 freebsd-update(8)
支持二进制更新。这与为Windows、Firefox和其他商业软件提供的二进制更新服务非常相似。(软件作者表示,freebsd-update(8)
是以Windows update命名的。)您可以使用FreeBSD Update跨主要版本、次要版本和补丁级别进行升级。
从源代码升级意味着下载FreeBSD源代码,构建组成FreeBSD的程序,并将其安装到硬盘上。例如,如果你有FreeBSD 13.1的源代码,你可以升级到那个版本。这需要更多的努力来设置和使用,但它给了你更大的灵活性。跟踪时从源代码升级-stable或-current。
保护您的数据! 第5章叫做“在你打破其他东西之前读这个!”是有充分理由的。升级可能会破坏您的数据。在尝试任何升级之前,请备份您的系统!我大约每周都会升级我的桌面,只是为了好玩(见我之前关于肾上腺素瘾君子运行 -current 的评论)。但在升级之前,我会确保所有重要数据都安全地缓存在另一台机器上。将数据复制到磁带、文件或其他任何地方,但在没有新备份的情况下不要运行升级。你已经被警告了。
许多操作系统都提供二进制更新,用户可以在其中为其操作系统下载新的二进制文件。FreeBSD通过 freebsd-update(8)
提供了一个类似的程序,允许您轻松升级系统。您无法使用freebsd-update(8)
跟踪-stable或-current,只能跟踪发布版本。例如,如果你安装了FreeBSD 12.0,freebsd-update(8)
可以将你升级到12.0-p9、12.1或13.0,但不能升级到12-stable或14-current。
如果你有一个自定义内核,你必须从源代码构建内核的更新,而不是依赖更新服务。同样,如果您从源代码升级了主机(本章稍后讨论),运行freebsd-update(8)
会用默认二进制文件覆盖您的自定义二进制文件。
在 /etc/freebsd-update.conf 中配置更新。
使用freebsd-update(8)
进行更新旨在为普通用户提供无缝的体验,很少建议更改其配置。然而,您可能会遇到异常情况,因此以下是您在此文件中可以找到的最有用的选项:
KeyPrint
列出了更新服务的加密签名。如果FreeBSD Update服务遭遇安全漏洞,FreeBSD项目将需要修复漏洞并发布新的加密密钥。在这种情况下,违规行为将在安全公告邮件列表上公布(这也是IT界的大新闻)。换句话说,在正常使用中没有理由改变这一点。(构建自己的定制FreeBSD并通过freebsd-update(8)
分发,虽然既可能又实用,但被认为是不正常的使用。)
ServerName
告诉freebsd-update(8)
从何处获取更新。虽然FreeBSD项目确实提供了构建自己更新的工具,但真的没有必要这样做。如果你有足够的服务器来考虑构建自己的更新服务器,你可能还有一个可以缓存官方更新的代理服务器。
默认情况下,FreeBSD Update为 /usr/src 、userland(world)和GENERIC内核中的源代码提供最新补丁。但是,您可能不需要所有这些组件。虽然用户区是强制性的,但您可能有一个自定义内核。删除内核语句以使freebsd-update(8)
忽略内核。自定义内核用户还可以将GENERIC内核复制到 /boot/GGENERIC 。此次更新将更新GENERIC内核,但不会影响您的自定义内核。或者,您可以删除 kernel
条目并保存警告。如果您的计算机上没有安装源代码,freebsd-update会意识到这一点,并且不会尝试对其进行修补,但您可以消除 src
条目,为软件省去麻烦。您还可以选择只接收部分源代码更新,如 freebsd-update.conf(5)
中所述。
更新包括对 /etc 中的配置文件的更改。但是,如果您修改了这些文件,您可能不希望 freebsd-update(8)
覆盖它们。同样,/var 非常流畅,专为系统管理员定制而设计;你不希望FreeBSD Update破坏你的设置。FreeBSD Update仅在 UpdateIfUnmodified
中列出的目录中的文件与默认值相比没有变化时,才会对这些文件应用补丁。
更新到新版本可能会更改配置文件。更新过程将使您有机会将更改合并到 MergeChanges
位置中显示的文件中。
如果您计划运行FreeBSD Update(如本章稍后所述),freebsd-update(8)
会将结果的电子邮件发送到 MailTo
中列出的帐户。
也许您修改了系统文件或命令的权限或所有者。您可能不希望 freebsd-update(8)
将这些权限更改回来。如果 KeepModifiedMatadata
设置为 yes
,freebsd-update(8)
将保持您的自定义权限和所有权不变。
有关更多可能性,请参阅 freebsd-update.conf(5)
。
用二进制更新更新系统有两个阶段:下载更新和应用更新。如果你正在应用补丁,与跨越主要版本相比,这个过程看起来略有不同。
如果你使用的是ZFS,在升级或打补丁之前,一定要创建一个新的启动环境!
【14版会自动创建新的启动环境】
要下载所选版本的最新补丁,请运行 freebsd-update fetch
。在这里,我将FreeBSD 11.0主机更新到最新补丁级别:
xxxxxxxxxx
# freebsd-update fetch
您将看到程序查找补丁的下载源,比较这些下载源的加密密钥,并最终将补丁下载到 /var/db/freebsd-update 中。检查系统可能需要几分钟,具体取决于您的存储速度。
偶尔,你会看到类似这样的消息:
xxxxxxxxxx
The following files will be removed as part of updating to 11.0-RELEASE-p12:
➊ /boot/kernel/hv_ata_pci_disengage.ko
➋ /usr/share/zoneinfo/America/Santa_Isabel
➌ /usr/share/zoneinfo/Asia/Rangoon
我们正在更新一个.0版本,这是FreeBSD主要版本的第一个版本,直接更新到11.0-release-p12,所以有一些累积的补丁。为什么这样的补丁集会从删除文件开始?
时区文件非常简单。从FreeBSD 11.0发布到现在,Santa Isabel➋和Rangoon➌更改了时区。遗憾的是,各国并未将其时区与FreeBSD版本进行协调。从系统中删除这些时区简化了这些国家的系统管理员的生活,也不会伤害我们其他人。
但他们也在删除一个内核模块➊。为什么会发生这种情况?对FreeBSD邮件列表的一点研究表明,这个模块不应该随11.0一起发布,你真的不应该使用它。这种变化很少见,但可能会在主要版本发布后立即发生。
然后,您将看到作为此补丁集的一部分添加的文件(如果有的话)。
xxxxxxxxxx
The following files will be added as part of updating to 11.0-RELEASE-p12:
/usr/share/zoneinfo/Asia/Barnaul
/usr/share/zoneinfo/Asia/Famagusta
/usr/share/zoneinfo/Asia/Tomsk
--snip--
仰光的系统管理员今年夏天似乎很忙。
几乎所有的补丁都会改变系统上的现有文件。接下来你会看到这些。
xxxxxxxxxx
The following files will be updated as part of updating to 11.0-RELEASE-p12:
/bin/freebsd-version
/boot/gptboot
/boot/gptzfsboot
/boot/kernel/cam.ko
/boot/kernel/hv_storvsc.ko
--snip--
如果你的发布即将结束,你会收到这样的通知:
xxxxxxxxxx
WARNING: FreeBSD 11.0-RELEASE-p1 is approaching its End-of-Life date.
It is strongly recommended that you upgrade to a newer
release within the next 1 month.
如果发布时间已经过了生命周期的尽头,通知会越来越多。强调。
要安装下载的文件,请运行 freebsd-update install
:
xxxxxxxxxx
# freebsd-update install
Installing updates... done.
如果更新需要更多步骤,您将在此处看到它们。重新启动系统,您将看到您正在运行最新的补丁级别。
这台FreeBSD 11.0-p12机器距离生命周期结束还有一个月吗?让我们用 freebsd-update upgrade
来更新它。使用 -r
标志指定目标版本。
xxxxxxxxxx
# freebsd-update -r 11.1-RELEASE upgrade
最难的部分是记住-RELEASE是版本名称的一部分。
升级将检查您的系统并给出结论。
xxxxxxxxxx
The following components of FreeBSD seem to be installed:
kernel/generic world/base world/lib32
The following components of FreeBSD do not seem to be installed:
kernel/generic-dbg world/base-dbg world/doc world/lib32-dbg
Does this look reasonable (y/n)? y
还记得在新主机上选择FreeBSD组件进行安装时的安装过程吗?这就是freebsd-update正在检查的内容。不过,您本可以添加或删除组件,所以请查看列表。如果看起来正确,点击 y
继续。
更新将更仔细地检查系统,将所有现有文件与新版本进行比较,然后开始下载。
xxxxxxxxxx
Fetching 10697 patches.....10....20....30....40....50....60....70....80....90
去泡杯茶。根据主机的带宽,您应该返回查看:
xxxxxxxxxx
Applying patches...
你的茶可能太热了。让它冷却一点。
xxxxxxxxxx
Fetching 236 files...
更多下载?好吧,享受你的茶,看节目。
xxxxxxxxxx
Attempting to automatically merge changes in files... done.
The following files will be removed as part of updating to 11.1-RELEASE-p1:
/usr/include/c++/v1/__undef___deallocate
/usr/include/c++/v1/tr1/__undef___deallocate
/usr/include/netinet/ip_ipsec.h
--snip--
您可以搜索邮件列表存档和FreeBSD源代码树,了解为什么这些文件都被删除了。
次要版本将包括从-current向后移植的新功能。这些可能涉及向系统添加文件。
xxxxxxxxxx
The following files will be added as part of updating to 11.1-RELEASE-p1:
/boot/kernel/amd_ecc_inject.ko
/boot/kernel/bytgpio.ko
/boot/kernel/cfiscsi.ko
/boot/kernel/cfumass.ko
--snip--
这些新功能都不应干扰现有功能,但仔细阅读列表可能会给你一些有趣的阅读。
升级应该会改变系统上的几乎每个文件,我们接下来会看到。
xxxxxxxxxx
The following files will be updated as part of updating to 11.1-RELEASE-p1:
/.cshrc
/.profile
/COPYRIGHT
/bin/[
/bin/cat
--snip--
最终你会得到:
xxxxxxxxxx
To install the downloaded upgrades, run "/usr/sbin/freebsd-update install".
你凭什么无视指示?
到目前为止,更新过程只下载了文件,并在临时暂存区进行了比较。操作系统尚未被触碰。如果您觉得继续操作很舒服,请运行安装程序。
xxxxxxxxxx
# freebsd-update install
src component not installed, skipped
Installing updates...
Kernel updates have been installed. Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.
为什么在更新的各个部分之间重新启动?新的用户区程序可能需要新的内核功能。安装一个非功能版本的 reboot
命令会导致需要重启主机,这会让你在极客卡上受到尴尬的打击。
xxxxxxxxxx
# reboot
机器恢复后,完成用户区升级。
xxxxxxxxxx
# freebsd-update install
src component not installed, skipped
Installing updates...
Completing this upgrade requires removing old shared object files.
Please rebuild all installed 3rd party software (e.g., programs
installed from the ports tree) and then run "/usr/sbin/freebsd-update
install" again to finish installing updates.
这是什么疯狂?
更新过程很努力,不会让你的系统损坏或软件功能失调。如果freebsd-update删除了您的附加软件所需的共享库的旧版本,它将无法运行。更新暂停,以便您有机会升级软件。我们将在本章稍后讨论升级包和端口。沿着稳定分支的升级通常不需要删除旧的积垢。
最后一次运行freebsd-update会删除旧的共享库等。
xxxxxxxxxx
# freebsd-update install
您的升级现已完成。与任何时候执行广泛的系统维护一样,最后一次重新启动以验证一切是否干净启动。
你以为升级会很容易。他们以前总是这样。但这一次,你错了。新补丁和你的软件之间的一些微妙的互动让你感到沮丧。如果您使用的是引导环境,那么现在是恢复到以前安装的时候了。如果没有,请使用freebsd-update的 rollback
命令删除最近安装的升级。
xxxxxxxxxx
# freebsd-update rollback
Uninstalling updates... done.
回滚比安装补丁快得多。无需检查系统;freebsd-update只读取其先前操作的日志并撤消所有操作。
最佳做法是定期在一致的时间下载和应用更新,例如在每月的维护日。freebsd更新程序包括对此的特定支持,以避免每小时都有大量请求涌入下载服务器。freebsd-update cron
命令告诉系统在下一个小时的随机点下载更新。将此命令放在 /etc/crontab 中,在一个小时的窗口内下载更新。这有助于减少下载服务器的负载。当系统有更新时,您将收到一封电子邮件,因此您可以在方便的时候安排重新启动。
关于FreeBSD更新的两个常见问题涉及FreeBSD的自定义版本和在本地分发更新。
许多人构建自己的FreeBSD版本供内部使用。通常,这只是FreeBSD的一个版本,其中删除了多个部分,但一些公司会进行大量修改。如果你从FreeBSD安装中删除了文件,freebsd-update(8)
不会尝试修补它们。
同样,许多公司喜欢拥有内部更新服务器来进行补丁管理。FreeBSD Update系统是专门为缓存web代理而设计的。虽然所有文件都经过加密签名和验证,但它们是通过普通HTTP传输的,这样你的代理就可以缓存它们。
更新系统的另一种方法是从源代码构建它。FreeBSD是自托管的(self-hosting),这意味着它包括构建FreeBSD所需的所有工具。您不需要安装任何编译器或开发工具包。从源代码构建新的FreeBSD只需要更新的源代码。
当开发人员发布FreeBSD的改进时,这些更改会在几分钟内在全球范围内提供。FreeBSD主源代码服务器跟踪源代码、对该代码所做的所有更改以及这些更改的作者。开发人员可以签入新代码,用户可以通过 Subversion(SVN)签出最新版本。FreeBSD有一个简单的SVN客户端 svnlite(1)
,足以进行所有源代码操作。这是一个标准的Subversion客户端,没有 svn(1)
支持的任何复杂选项。许多人认为 svnlite(1)
完全适合他们所有的非FreeBSD Subversion需求。
CSUP、CVSUP、CVS、SUP和CTM? 不幸的是,互联网上的文档早已过时,并在最糟糕的时候引发了混乱。Undead FreeBSD文档和第三方教程可能会提到使用CVS或CVSup工具进行源代码更新。这些工具在2013年被替换。任何提到这些程序都表明你正在阅读旧文档。如果你看到提到CTM,那么你正在阅读CVS之前的文档。
从源升级需要控制台访问权限。你并不总是需要它,但从糟糕的构建中恢复可能需要在键盘上进行干预。在安装自制操作系统版本之前,测试您的串行控制台、Java应用程序或IPMI控制台。根据我的经验,唯一需要控制台访问的升级是那些我没有控制台访问权限的升级。
每个FreeBSD版本都附带了用于构建您正在安装的系统的源代码。如果在安装系统时没有选择安装源代码,您可以在 /usr/fibebsd-dist/src.txz 的安装介质上找到它。如果您确实安装了源代码,您可以在 /usr/src 中找到它。
遗憾的是,此版本的源代码缺少构建FreeBSD所需的版本控制标签。仅供参考。您需要使用 svnlite(1)
下载一个包含这些标签的代码版本。
/usr/src 中的源代码副本是否适合构建FreeBSD?问 svnlite(1)
。
xxxxxxxxxx
# svnlite info /usr/src
svn: E155007: '/usr/src' is not a working copy
“not a working copy” 错误意味着这里的任何源代码都不能与Subversion一起使用。
获取源代码的 svnlite(1)
命令如下。
xxxxxxxxxx
# svnlite checkout ➊svn.freebsd.org/➋repository/➌branch ➍localdir
镜像➊是FreeBSD Subversion镜像。镜像 svn.freebsd.org 是最近的颠覆镜像的地理路由别名。 存储库➋是您正在使用的代码组。您可以在以下网址获得当前存储库的完整列表https://svnweb.FreeBSD.org/.主要的Project存储库包括用于操作系统的base;doc,用于文件编制;以及用于ports Collection的 port。
分支➌是您想要的FreeBSD版本。对于最新的短指水流,使用 head。要获得稳定版本,请使用 stable/ 分支,然后使用主版本。FreeBSD 12稳定版将是 stable/12 。要获得一个版本以及所有当前补丁,请使用 releng/ 和版本号。完全修补的FreeBSD 12.2将在 releng/12.2 上发布。
如果你很难弄清楚你需要哪个分支,那就四处逛逛https://svnweb.freebsd.org/.分支从字面上告诉 svnlite(1)
从这个站点抓取哪个子目录。
最后,localdir➍是我想放源代码的本地目录。
此主机运行的是FreeBSD 11.1。我想冒险,升级到FreeBSD 11-stable。我会这样做:
xxxxxxxxxx
# svnlite checkout https://svn0.us-east.FreeBSD.org/base/stable/11 /usr/src/
Error validating server certificate for 'https://svn0.us-east.freebsd.org:443':
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
Certificate information:
- Hostname: svnmir.ysv.FreeBSD.org
- Valid: from Jul 29 22:01:21 2013 GMT until Dec 13 22:01:21 2040 GMT
- Issuer: svnmir.ysv.FreeBSD.org, clusteradm, FreeBSD.org, CA, US(clusteradm@FreeBSD.org)
- Fingerprint: 1C:BD:85:95:11:9F:EB:75:A5:4B:C8:A3:FE:08:E4:02:73:06:1E:61
(R)eject, accept (t)emporarily or accept (p)ermanently? p
这是什么新鲜的疯狂?我们试图获取FreeBSD源代码,却遇到了证书错误?
将显示的证书指纹与FreeBSD.org网站上的服务器指纹进行比较。如果匹配,请通过输入p.永久接受证书。源代码文件的文件名将通过您的终端流式传输。
svnlite(1)
完成后,请查看 /usr/src 。
xxxxxxxxxx
# ls /usr/src/
COPYRIGHT cddl sbin
LOCKS contrib secure
MAINTAINERS crypto share
Makefile etc sys
Makefile.inc1 gnu targets
Makefile.libcompat include tests
ObsoleteFiles.inc kerberos5 tools
README lib usr.bin
README.md libexec usr.sbin
UPDATING release
bin rescue
这是FreeBSD源代码树的顶部目录,其中包含构建所选FreeBSD版本所需的所有代码。
你昨天创建了FreeBSD?太酷了!但现在你想构建今天的版本。
好消息是,Subversion只需要更新你下载的代码,而不需要下载整个源代码树。更好的消息是,源代码记录了你从哪里得到它,以及它应该来自 .svn 目录中的哪个分支。这使得更新比初始下载简单得多。
FreeBSD已将Subversion命令集成到源代码中。您需要做的就是通过在 /etc/src.conf 中设置SVN_UPDATE来告诉系统它可能会调用 svnlite(1)
进行更新。
xxxxxxxxxx
# echo 'SVN_UPDATE=yes' >> /etc/src.conf
现在运行 make update
以获取最新的源代码。
xxxxxxxxxx
# cd /usr/src
# make update
你会看到同样的更新流过去。不过,这些更新将比原始下载快得多。
获取最新源代码后,请查看 /usr/src/UPDATING 。此文件的开头按逆时间顺序列出了从源代码构建的人特别感兴趣的有关FreeBSD更改的任何警告和特别通知。这些注释告诉您在重建系统之前是否必须采取任何特定操作,或者是否更改了任何主要系统功能。如果您希望系统在升级后正常工作,请严格遵循以下说明。
UPDATING 文件的末尾给出了从源代码构建FreeBSD的官方说明。本书中描述的程序自FreeBSD 6-current以来一直在使用,与5-current相比仅略有变化,但我仍然建议仔细检查本文中的说明与 UPDATING 中的说明。
如果您使用自定义内核,请检查新的GENERIC或NOTES内核配置文件,以了解任何新选项或有趣的内核更改。
自定义FREEBSD版本 还记得我们在第16章讨论 /etc/make.conf 吗?FreeBSD使用一个单独的文件来处理构建FreeBSD本身的自定义。虽然 /etc/make.conf 中的设置会影响系统上构建的所有软件,但 /etc/src.conf 中的任何内容都只会影响从源代码构建FreeBSD。
如果你在FreeBSD社区呆上一段时间,你会听到人们用来构建FreeBSD的各种特殊方法的故事。你会听到轶事证据,表明一种方法比标准更快、更高效,或者神秘地“更好”。虽然你当然可以自由地使用任何你喜欢的构建方法,但FreeBSD项目支持的唯一方法是 /usr/src/UPDATING 末尾记录的方法。如果您遵循其他程序并遇到问题,您将被转介到记录的程序。
首先,构建新的用户空间:
xxxxxxxxxx
# cd /usr/src
# make buildworld
make buildworld
命令从源代码构建构建系统编译器所需的基本工具,然后构建编译器和相关库。最后,它使用新的工具、编译器和库来构建FreeBSD核心安装中包含的所有软件。(这很像从指令“从地下挖铁矿石”开始建造汽车。)buildworld
将其输出放在 /usr/obj 下。根据您的硬件,这可能需要一到几个小时。如果您的硬件足够强大,您可以在构建世界运行时继续正常工作;虽然构建会消耗系统资源,但它不会占用您的任何注意力。
当构建世界完成时,确认它没有错误地完成。如果构建以一堆消息结束,就像你在内核编译失败时看到的那样,不要继续升级。如果你不明白构建失败的原因,请参阅第1章,了解如何获得帮助。切勿尝试安装损坏或不完整的升级。
平行制造世界
经验丰富的系统管理员可能使用 make(1)
的 -j
标志来提高构建速度。这将启动多个构建过程,并允许系统利用多个CPU。如果你有一个多CPU系统,或者你的CPU有多个内核,在构建FreeBSD时 -j
可以工作。开始的合理构建次数比你拥有的CPU数量多一个。例如,如果你有一个八核处理器,你可以通过运行 make -j9 buildworld && make -j9 kernel
来合理地使用九个构建进程。
FreeBSD项目并不正式支持 -j
进行升级,尽管许多开发人员都使用它。如果你的构建在使用 -j
时失败了,在抱怨之前先尝试不使用 -j
。
测试升级的最佳方法是构建一个新的GENERIC内核。这将自定义内核中的问题与FreeBSD的一般问题区分开来。冲动的人当然欢迎直接升级到他们的自定义内核配置,但如果你的内核失败了,你需要尝试一个GENERIC内核。但是,一定要将自定义内核与新的GENERIC配置进行比较,以捕捉自定义设置所需的任何更改。您可以在以下位置使用Subversion历史记录https://svnweb.FreeBSD.org/比较不同版本的内核配置。
默认情况下,内核升级过程会构建一个GENERIC内核。如果你想直接升级到自定义内核,可以使用变量 KERNCONF
告诉 make(1)
内核名称。您可以在命令行、/etc/make.conf 或 /etc/src.conf 中设置 KERNCONF
。
您可以通过以下两种方式之一构建新内核。make buildkernel
命令会构建一个新的内核,但不会安装它。在 make buildkernel
后面加上 make installkernel
来安装内核。make kernel
命令紧接着运行这两个命令。使用最符合你日程安排的那一个。例如,如果我在周日维护窗口期间在工作中进行系统升级,我可能会在前一周运行 make buildworld
和 make buildkernel
,以节省我宝贵的周末时间。然而,我不想在维护日之前安装该内核——如果机器在周五出现问题需要重新启动,我想启动旧的生产内核,而不是新的升级内核。周日早上,当我准备好实际升级时,我运行 make installkernel
。另一方面,在升级桌面时使用 make kernel
是有意义的。因此,要使用我的自定义内核进行升级,我会运行:
xxxxxxxxxx
# make KERNCONF=THUD kernel
同样,不要尝试安装未成功编译的内核。如果你的 make buildkernel
错误并死亡,请在继续之前修复该问题。
安装新内核后,将计算机重新启动到单用户模式。为什么是单用户模式?用户区可能期望不同于新内核提供的内核接口。虽然 /usr/src/UPDATING 应该列出所有这些,但没有任何文档可以涵盖所有可能的更改及其对第三方软件的影响。这种变化很少在 -stable下发生,但在-current下是不可预测的。如果你每周更新一次主机,你的用户区可能会在新内核上出现问题。如果你一年没有更新主机,你会同时收到一年的更改。虽然许多人可以在全多用户模式下安装升级,但单用户模式是最安全的。
如果您的系统在新内核的单用户模式下正常运行,请继续。否则,请完整记录问题,并在解决问题时启动旧内核以恢复服务。
小心,蚱蜢!这是不归路。你可以很容易地退出一个坏的内核——只需启动一个已知好的旧内核。一旦你安装了一个新构建的世界,如果不从备份中恢复或使用ZFS引导环境,你就无法将其还原出来。在继续之前,请确认您有一个良好的备份,或者至少要认识到第一个不可撤销的步骤正在进行中。
如果您的新内核正常工作,请继续安装新构建的用户区。首先,确认您的系统可以安装新的二进制文件。FreeBSD的每个新版本都希望旧系统支持新版本所需的所有必要用户、组和权限。如果程序必须由特定用户拥有,而该用户在系统上不存在,则升级将失败。这就是 mergemaster(8)
发挥作用的地方。
mergemaster(8)
mergemaster程序将 /etc 下的现有配置文件与 /usr/src/etc 中的新文件进行比较,突出显示它们之间的差异,并为您安装它们,将它们放在一边进行评估,甚至允许您将两个不同的配置文件合并为一个。这在升级过程中非常有用。在安装新世界之前运行一次mergemaster,以确保您的系统可以安装新的二进制文件,在安装新的世界之后运行一次,以将 /etc 的其余部分与新世界同步。
从 mergemaster(8)
的预构建世界模式开始,使用 -Fp
标志。-F
标志会自动安装仅在版本控制信息上不同的任何文件。-p
标志比较 /etc/master.passwd 和 /etc/group ,并突出显示 installworld
成功所必须存在的任何帐户或组。
xxxxxxxxxx
# mergemaster -Fp
➊ *** Creating the temporary root environment in /var/tmp/temproot
*** /var/tmp/temproot ready for use
➋ *** Creating and populating directory structure in /var/tmp/temproot
*** Beginning comparison
这些最初的消息,前面都有三个星号,是解释它正在做什么的mergemaster。我们从 /var/tmp/tepmroot 中的一个临时根目录➊开始,这样mergemaster就可以安装一组原始的配置文件➋与安装的文件进行比较。随后,mergemaster展示了其首次对比。
xxxxxxxxxx
➊ *** Displaying differences between ./etc/group and installed version:
--- /etc/group 2017-09-01 11:12:49.693484000 -0400
+++ ./etc/group 2017-09-01 13:22:15.849816000 -0400
@@ -1,6 +1,6 @@
➋ -# $FreeBSD: releng/11.1/etc/group 294896 2016-01-27 06:28:56Z araujo $
➌ +# $FreeBSD: stable/11/etc/group 294896 2016-01-27 06:28:56Z araujo $
#
➍ -wheel:*:0:root,mwlucas
➎ +wheel:*:0:root
daemon:*:1:
kmem:*:2:
sys:*:3:
@@ -33,4 +33,3 @@
hast:*:845:
nogroup:*:65533:
nobody:*:65534:
➏ -mwlucas:*:1001:
一个重要的信息是正在比较的文件,mergemaster会在前面显示文件名➊。我们正在检查已安装系统上的 /etc/group ,并将其与新的 /etc/group 进行比较。
然后,我们看到正在比较文件的两个不同版本,首先是安装的文件➋,其次是文件的升级版本➌。请注意这些行开头的减号和加号。减号表示一行来自当前安装的文件,而加号表示一行来源于 /usr/src 中的版本。
接下来的两行mergemaster显示很好地说明了这一点。列出的第一组用减号标记,用于当前车轮组➍。第二行是用于开箱即用(out-of-the-box)升级的密码输入➎。此主机的控制盘组有一个不在默认安装中的用户。我想把我的账户留在那里。
在列表末尾,有一个前面有负号的组➏。该组存在于本地系统中,但不在源代码中。这完全是意料之中的。
这一次,这里的变化都不相关。
一旦mergemaster显示此文件中的所有更改,它就会显示我的选项。
xxxxxxxxxx
Use 'd' to delete the temporary ./etc/group
Use 'i' to install the temporary ./etc/group
Use 'm' to merge the temporary and installed versions
Use 'v' to view the diff results again
Default is to leave the temporary file to deal with by hand
How should I deal with this? [Leave it for later] d
我有四个选择。我可以用 d
删除临时 /etc/group 。如果我想扔掉当前的配置,直接从源代码中安装一个,我可以用 i
安装。如果我需要新旧版本中的一些,我可以使用 m
。如果我没有注意,我可以用 v
再次查看比较。
新的 /etc/group 没有我需要的更改。我删除了它,让mergemaster转到下一个文件 /etc/passwd 。
密码文件的合并主显示与组文件非常相似。是的,根密码已经更改——我希望如此!我的账户有一个额外的条目。但是在显示的中间,有一个条目是这样的:
xxxxxxxxxx
_pflogd:*:64:64::0:0:pflogd privsep user:/var/empty:/usr/sbin/nologin
➊ +_dhcp:*:65:65::0:0:dhcp programs:/var/empty:/usr/sbin/nologin
uucp:*:66:66::0:0:UUCP pseudo-user
用户 _dhcp➊的行前面有一个加号,没有相应的带减号的 _dhcp条目。用户 _dhcp存在于下载的源代码中,但不存在于当前运行的系统中。如果一个新用户出现在默认的FreeBSD配置中,那是因为新系统中的程序或文件希望归该用户所有。
如果此用户不在场,安装新世界将失败。
我无法替换当前的 /etc/passwd ,因为它包含活动用户帐户。我不能扔掉新的 /etc/passwd ,因为它有我需要的用户。我想我必须把这两个文件合并在一起。
xxxxxxxxxx
How should I deal with this? [Leave it for later] m
合并文件时,mergemaster使用 sdiff(1)
将命令窗口一分为二。左侧显示当前安装文件的开头,右侧显示新版本。仅显示不同的部分。在新的 master.passwd 文件中选择您想要的一面。
xxxxxxxxxx
# $FreeBSD: releng/11.1/etc/master.passwd 299 | # $FreeBSD: stable/11/etc/master.passwd 29936
此行显示来自 /etc/passwd 两个副本的版本控制信息。在左边,我们有releng/11.1分支的这个文件的版本,即11.1。在右边,我们有stable/11或11-stable的版本。未来的mergemaster运行将使用版本信息(以及其他工具)来确定文件是否需要更新,因此我们的合并文件需要正确的版本号。在左侧(l
)和右侧(r
)列之间进行选择。我想要右边的条目,所以我输入了 r
。
Mergemaster显示下一个差异。
xxxxxxxxxx
root:$6$fD7a5caQtkZbG93E$wGfw5G2zNORLq8qxlT8z | root::0:0::0:0:Charlie &:/root:/bin/csh
我更改了我的根密码,我想保留它。输入 l
保留左侧版本。
xxxxxxxxxx
> _dhcp:*:65:65::0:0:dhcp programs:/var/empty:/
在以上示例中,当前文件中没有条目,新用户 _dhcp在新文件中。我们需要用户_dhcp来完成 installworld
,因此输入 r
以选择右侧条目并获得下一个差异。
xxxxxxxxxx
mwlucas:$1$zxU7ddkN$9GUEEVJH0r.owyAwU0NFX1:10 <
这是我的账户。如果升级后我想以自己的身份登录,我最好输入l
。
一旦我们遍历了文件中的每一个差异,mergemaster就会给出我们的下一个选择:
xxxxxxxxxx
Use 'i' to install merged file
Use 'r' to re-do the merge
Use 'v' to view the merged file
Default is to leave the temporary file to deal with by hand
*** How should I deal with the merged file? [Leave it for later]
查看合并的文件总是一个好主意,除非你已经知道你搞砸了,想重新做一遍。使用v检查合并的文件,如果您认为正确,请使用 i
安装。
xxxxxxxxxx
*** You installed a new master.passwd file, so make sure that you run
'/usr/sbin/pwd_mkdb -p /etc/master.passwd'
to rebuild your password files
Would you like to run it now? y or n [n]y
只有当您希望新用户帐户正常工作时,才需要重建密码数据库。输入 y
。
现在,您可以安装新的用户区。
仍然在单用户模式下,您可以使用 make installworld
安装全新的FreeBSD。您将看到许多消息在屏幕上滚动,其中大部分包括单词 install 。
xxxxxxxxxx
# cd /usr/src
# make installworld
现在,您有了一个新的用户区来配合您闪亮的新内核。恭喜!
不过,安装所有新程序还不够。更新可以从基本系统中删除程序和文件。要查看哪些内容已过时,请运行 make check-old
。
xxxxxxxxxx
# make check-old
>>> Checking for old files
/usr/include/sys/ksyms.h
/usr/lib/clang/4.0.0/include/sanitizer/allocator_interface.h
/usr/lib/clang/4.0.0/include/sanitizer/asan_interface.h
/usr/lib/clang/4.0.0/include/sanitizer/common_interface_defs.h
--snip--
这列出了系统中曾经安装在您的系统上但不再需要的每个部分。确认您不再使用这些程序;如果是,请保留现有的不受支持的程序或找到替代方案。
稍后在输出中,您将看到现已过时的共享库:
xxxxxxxxxx
>>> Checking for old libraries
/lib/libzfs.so.2
/usr/lib/debug/lib/libzfs.so.2.debug
/usr/lib/libarchive.so.6
/usr/lib/debug/usr/lib/libarchive.so.6.debug
/usr/lib/libmilter.so.5
--snip--
最后,您可能会看到不再需要的目录列表。与删除文件相比,删除目录的情况相当罕见。
如果您没有特别使用任何旧程序或目录,请使用 make delete-old
删除它们。make(1)
会提示您输入每个文件的名称,并要求您确认是否要删除该文件。
xxxxxxxxxx
# make delete-old
>>> Removing old files (only deletes safe to delete libs)
remove /usr/include/sys/ksyms.h? y
remove /usr/lib/clang/4.0.0/include/sanitizer/allocator_interface.h? y
remove /usr/lib/clang/4.0.0/include/sanitizer/asan_interface.h?
这太愚蠢了。有几十个这样的文件。我要删除每一个。幸运的是,每个真正的Unix都包含自动化愚蠢的工具。
xxxxxxxxxx
# yes | make delete-old
所有这些文件都消失了。或者,如果你想使用FreeBSD的内置选项,请使用 BATCH_DELETE_OLD_FILES
标志。
xxxxxxxxxx
# make -DBATCH_DELETE_OLD_FILES delete-old
不过,我觉得 yes(1)
更容易。
过时的共享库需要更多的关注。许多第三方程序链接到共享库。如果删除共享库,程序将无法运行。如果你删除了关键任务应用程序所需的库,这可能会非常非常烦人。恢复服务的唯一方法是重新编译程序或替换共享库。我们将在第17章讨论共享库。如果你的程序都不需要库,你可以删除它。然而,识别每个需要库的程序是一件非常痛苦的事情。
例如,检查上面过时的共享库列表。其中一个条目是libzfs.so.2。在 /lib 中,我看到我们现在有libzfs.so.3。也许我不需要两个不同版本的ZFS库。不过,这个主机使用ZFS,我安装了一大堆ZFS实用程序。如果我删除旧版本的libzfs,其中一个程序可能无法再工作。这些过时的库版本的存在在短期内不会造成任何损害;除了新库之外,您还可以使用旧库使系统重新上线,并以更悠闲的方式重新安装附加软件。我们将在本章稍后更新您的ports。
如果您认为列出的旧库都不重要,并且可以安全地删除它们,请在删除之前备份每个库。只需将库复制到某个 old-libs 目录中,当您发现关键任务软件不再工作时,恢复会变得更简单。
您还可以将旧库复制到 /usr/lib/compat 中,这样您的程序将继续运行,但旧库将安全地退出。这里的问题是,我们都很清楚,你永远不会去清理那些图书馆。
我更喜欢备份库,然后将其从实时系统中删除。当我发现程序不起作用时,我会将丢失的库从备份临时复制到compat目录中。增加的烦恼足以让我解决真正的问题,所以我可以删除compat库。
xxxxxxxxxx
# make check-old-libs | grep '^/' | tar zcv -T - -f /root/old-libs.tgz
备份完库后,将其全部删除。您可以在此处使用 BATCH_DELETE_OLD_FILES
选项,但我再次发现 yes(1)
更容易键入。
xxxxxxxxxx
# yes | make delete-old-libs
如果删除这些库会破坏 pkg(8)
,请运行 pkg-static install -f pkg
修复 pkg(8)
本身,或运行 pkg-statist upgrade -f
重新安装所有软件包。
另一种选择是使用libchk包来识别与旧库链接的程序。
我们快到了!虽然我们已经更新了 /etc 中的密码和组信息,但我们必须更新其余的文件。mergemaster有许多特殊功能,都记录在其手册页中。我将特别推荐我认为特别有用的两个。
当一个文件被添加到FreeBSD的基本安装中时,不需要将其与任何东西进行比较。-i
选项使mergemaster自动在 /etc 中安装新文件。我将在mergemaster运行结束时获得自动安装的文件列表。
另一组我并不真正关心的文件是我没有编辑过的文件。例如,FreeBSD在 /etc/rc.d 中有几十个启动脚本。如果我没有编辑过启动脚本,我只想安装最新版本的脚本。-U
标志告诉合并主管自动更新我尚未编辑的任何基本系统文件。
xxxxxxxxxx
# mergemaster -iU
mergemaster程序检查 /etc 中的每个文件,并将其与FreeBSD基本发行版中的文件进行比较。这与预安装mergemaster运行的方式完全相同,所以我们不在这里详细介绍。您应该熟悉您对系统所做的自定义,所以没有什么会让您感到惊讶。如果有什么不熟悉的地方,请参阅第14章。
重新启动,您的基础系统就完全升级了!
一旦你运行了几次mergemaster,你就会意识到某些文件总是让你很恼火。Mergemaster总是会抱怨你定制的 /etc/motd 和 /etc/printcap 。你可能每次都会输入 -F
或 -U
。您可以在 $HOME/.mergemasterrc 中设置首选选项,如 mergemaster(8)
中所述。虽然您应该阅读手册页以获取完整列表,但以下是我最常用的选项。
您甚至不希望mergemaster费心检查某些文件。您所在组织的 /etc/motd 永远不会与FreeBSD发行版中的 /etc/motd 相匹配。您的自定义打印机配置、snmpd.conf 或定制的 sshd_config 也不会。要让mergemaster跳过这些文件,请在 IGNORE_FILE
中列出它们。
xxxxxxxxxx
IGNORE_FILES='/etc/motd /etc/printcap'
我在这里没有列出密码或组文件,因为FreeBSD有时会引入新用户。
如果你想让mergemaster自动安装新版本FreeBSD中存在的文件,但还没有安装到系统上,请设置 AUTO_INSTALL
。
xxxxxxxxxx
AUTO_INSTALL=yes
这相当于 -i
标志。
FreeBSD的不同版本有类似的文件。有些文件几乎完全相同,只有包含版本控制信息的行不同。您可以使用 FREEBSD_ID
选项告诉mergemaster自动更新仅在版本控制信息上不同的文件。
xxxxxxxxxx
FREEBSD_ID=yes
这与 -F
标志相同。
您可以告诉mergemaster更新自安装以来未编辑的文件。FreeBSD团队在想要更改系统行为时会更改 /etc/files 。虽然这些变化中的许多可能与你无关,但也有一些可能会给你带来麻烦。如果你想盲目地更新你没有触及的所有内容,请设置 AUTO_UPGRADE
。
xxxxxxxxxx
AUTO_UPGRADE=yes
这与 -U
标志相同。
FreeBSD从 /etc/master.passwd 、/etc/services 等构建数据库。如果你更新这些文件,你也需要更新相应的数据库。Mergemaster会在每次运行结束时询问您是否要运行这些更新。通过设置 RUN_UPDATES
,告诉mergemaster始终运行更新。
xxxxxxxxxx
RUN_UPDATES=yes
您可以在 mergemaster(8)
中找到其他选项。
根据说明,升级的几个部分必须在单用户模式下完成。许多用户认为这是一种烦恼,甚至是一种障碍。FreeBSD程序只是磁盘上的文件,不是吗?常识告诉你,你可以把它们复制到磁盘上,重新启动,然后就完成了。
这是另一个例子,你的常识试图毁掉你的一个月。在极少数情况下,FreeBSD团队需要对系统进行一些低级更改,这些更改需要在单用户模式下运行安装。在多用户模式下安装时,重要程序无法运行,这可能会产生冲突。这种情况很少见,但如果它发生在 /bin/sh 上,你就会陷入一个痛苦的世界。如果发生这种情况,您有一个非常简单的恢复路线:从服务器中删除硬盘,将其装载到另一台机器中,启动另一台计算机,并在格式化和重新安装之前从损坏的系统中复制数据。或者,您可以从安装介质启动并展示您出色的系统管理员技能。
在多用户模式下运行可能会导致其他升级问题,例如微妙的竞争、符号问题和无数其他令人头疼的问题。您可以选择在多用户模式下升级,但如果您的系统有问题,请不要抱怨。
在多用户模式下构建新世界是完全安全的。您甚至可以在多用户模式下构建和安装新内核。然而,一旦你开始安装用户区,你必须处于单用户模式,并在升级后的内核上运行。
NFS和升级
有很多机器需要更新吗?看看NFS,我们在第13章中讨论过。在一台中央快速机器上构建世界和所有内核,然后将 /usr/src 和 /usr/obj 从该系统导出到其他客户端。从这些NFS导出运行 make installkernel
和 make installworld
可以节省所有其他机器上的构建时间,并保证您在所有FreeBSD机器上都有相同的二进制文件。
如果你不能自定义你的操作系统,那么拥有所有这些源代码有什么意义呢?FreeBSD不仅提供源代码;它提供了现成的旋钮,可以轻松定制您的FreeBSD构建。
这些选项可以在 /etc/make.conf(见第16章)或 /etc/src.conf 中设置。src.conf 中的设置仅适用于构建FreeBSD源代码,而 make.conf 的设置适用于所有源代码构建。src.conf(5)
中记录了 src.conf 选项的完整列表,但它们都遵循标准模式。
这些选项中的每一个都以WITHOUT_
开头,或者在少数情况下以 WITH_
开头,然后命名一个特定的子系统。例如,WITHOUT_BHYVE
选项关闭构建或安装 BHYVE(8)
管理程序。WITHOUT_INETD
选项关闭构建 INETD(8)
守护进程(见第20章)。WITHOUT_INET6
选项关闭IPv6。如果你想缩小FreeBSD的安装规模,就砍掉所有不需要的东西。
构建系统会检查这些变量中是否有任何一个被定义为任何值。这意味着,即使您将其中一个设置为 NO
,该选项的存在也会激活该选项。不要将所有这些复制到 src.conf 并将其全部设置为 NO
,因为您将禁用构建大量系统。
在大多数情况下,添加这些 WITHOUT_
选项包括在 make delete-old
复选框中删除的系统。例如,如果您决定您的系统不需要 bhyve(8)
,则升级不仅不会构建新的bhyve二进制文件,而且还可以从已安装的系统中删除现有的二进制文件。如果你没有构建一个软件,你最好完全删除它,而不是让旧版本留在系统上。
操作系统升级很棒,除了没人关心的部分。基本操作系统更新是必要的,但大多数人并不真正关心使用基本系统。他们关心使用在基础系统上运行的软件。而且该软件与其他程序一样容易出现同样的缺陷。你需要升级它。第15章讨论了升级包的一般情况,但让我们谈谈升级包下的操作系统时会发生什么。
包和系统升级的常见问题通常归结为共享库。如果你要升级FreeBSD的主要版本,比如从FreeBSD 12升级到FreeBSD 13,你需要重新安装所有的软件包。
首先升级 pkg(8)
本身,使用 -f
标志进行 pkg upgrade
。如果升级破坏了 pkg(8)
本身,则需要使用 pkg-static(8)
。它包含关键的 pkg(8)
函数,但它是一个静态二进制文件。
xxxxxxxxxx
# pkg-static upgrade -f pkg
这将引导您进入当前的软件包工具。现在,您可以强制重新下载并重新安装所有软件包。
xxxxxxxxxx
# pkg upgrade -f
一旦你升级了从包构建的所有内容,就可以重建从ports构建的任何内容。不过,我真的希望你能通过poudrier安装端口。
如果您使用portsnap更新ports tree,则从现在开始安装的任何内容都将是最新版本。但是,您之前安装的应用程序呢?FreeBSD跟踪插件包之间的各种依赖信息,通常更新一个程序会影响其他几十个程序。这是一个非常痛苦的管理。如果说“更新我的Apache安装”,让FreeBSD为你管理依赖关系,那岂不是很好?有几种方法可以解决这个问题。
最好的方法是不要在生产主机上使用ports tree。使用poudriere构建一个私有存储库(见第16章),并让所有主机从中提取。这是对传统FreeBSD系统管理员做法的改变。
也许你在本地安装了ports tree,并在一堆包上使用一两个自定义ports。如果您安装了单个port,请重新构建它,卸载软件包,然后安装新port。这对于具有许多依赖关系的复杂port来说很糟糕,但对于具有一个或两个ports的主机来说效果很好。
然而,我们中的一些人已经存在了很长时间,感觉我们生活在这些解决方案之间。我们的主机感觉太小,无法运行家禽,但我们需要定制ports。FreeBSD不包括一个官方工具来更新主要由端口管理的系统,但人们已经编写了附加工具,如portupgrade和portmaster。这些工具的问题在于,它们是在FreeBSD之外维护的。如果它们无法升级port,但正常的构建过程正常,则工具用户有责任修复问题。FreeBSD的所有部分都是如此,但基础系统的用户基础比任何附加工具都要广泛。
然而,在我写这篇文章的时候,FreeBSD的ports基础设施正在发生变化,以支持单个软件包的多个版本。这些工具尚未更新以适应新的基础设施。我预计其中一个会是,但我不能说是哪个。第16章建议在生产中只使用包。这就是原因。
现在你可以更新你的系统和安装的软件了,让我们来看看FreeBSD的一些更有趣的安全功能。