23.5. 从源码更新FreeBSD

从编译源码来更新FreeBSD比起用Binary更新有几项优点,在编译代码时可以自定义选项来充分运用特定硬件,部份基础系统可以使用非预设的设定值编译,或是在不需要或不想要的时候跳过编译。使用编译的程序来更新系统比起安装Binary来更新会耗时许多,但能够完整自定义一个量身定做版本的FreeBSD。

23.5.1. 快速开始

这是从源码编译来更新FreeBSD的标准步骤快速的参考,稍后的章节会更详细的说明这个程序。

  • 更新并编译

    # svnlite update /usr/src  1
    check /usr/src/UPDATING  2
    # cd /usr/src          3
    # make -j4 buildworld  4
    # make -j4 kernel      5
    # shutdown -r now      6
    # cd /usr/src          7
    # make installworld    8
    # mergemaster -Ui      9
    # shutdown -r now      10

    1

    取得最新版本的源码,请参考第 23.5.3 节 “更新源码”来了解更多取得与更新源码的信息。

    2

    检查/usr/src/UPDATING看是否有任后在源码编译之前或之后需要手动操作的步骤。

    3

    前往源码目录。

    4

    编译世界(World),即除了核心(Kernel)外的所有东西。

    5

    编译并安装核心,此动作等同于make buildkernel installkernel

    6

    重新启动系统以使用新的核心。

    7

    前往源码目录。

    8

    安装世界。

    9

    更新与合并在/etc/中的配置文件案。

    10

    重新启动系统以使用新编译好的世界与核心。

23.5.2. 准备源码更新

阅读/usr/src/UPDATING,从源码编译之前与之后任何需要手动操作步骤会在此档案中说明。

23.5.3. 更新源码

FreeBSD的源码位于/usr/src/,较建议透过Subversion版本控制系统来更新这份源码,要确认源码已在版本控制系统的管控下可:

# svnlite info /usr/src
Path: /usr/src
Working Copy Root Path: /usr/src
...

这表明/usr/src/处于版本控制之下,可以使用svnlite(1)进行更新:

# svnlite update /usr/src

若该目录最近没有更新过,可能会需要一些时间来完成更新动作。在更新完成之后,源码便为最新版本,并可开始依下一章节的说明来编译程序。

取得源码:

若输出结果显示'/usr/src' is not a working copy代表有缺少档案或源码是采用其他方式安装,若是如此,便需重新取出(checkout)源码。

表 23.1. FreeBSD版本与档案库路径
uname -r的输出结果档案库路径描述
X.Y-RELEASEbase/releng/X.Y发布版本加上关键的安全性与错误修正,较建议大多数使用者使用这个分支。
X.Y-STABLEbase/stable/X

发布版本加上所有在该分支上其他开发中的程序,STABLE代表不会更改应用程序Binary界面(Applications Binary Interface,ABI),所以在先前版本所编译的软件仍可以正常运作,举例来说,被编译在FreeBSD 10.1可执行的软件在编译完FreeBSD 10-STABLE之后仍可以执行。

STABLE分支偶尔也会有错误或无法兼容的问题会影响使用者,虽然这些问题通常会很快的被修正。

X-CURRENTbase/head/最新未发布的FreeBSD开发版本,CURRENT分支可能会有重大错误或不兼容的问题,只建议进阶的使用者使用。

查看FreeBSD目前使用的版本可使用uname(1)

# uname -r
10.3-RELEASE

根据表 23.1 “FreeBSD版本与档案库路径”,要更新10.3-RELEASE需使用的源码档案库路径为base/releng/10.3,在取出(checkout)源码时便要使用这个路径:

# mv /usr/src /usr/src.bak  1
# svnlite checkout https://svn.freebsd.org/base/releng/10.3 /usr/src  2

1

将旧的目录移到其他地方,若没有在这个目录做过任何本地修改,可直接删除这个目录。

2

将从表 23.1 “FreeBSD版本与档案库路径”查到的路径加到档案库URL之后。第三个参数用来存放本地系统源码的目标目录。

23.5.4. 从源码编译

编译世界(world)即编译整个操作系统除了核心(Kernel),要先做这个动作以便提供最新的工具来编译核心,接着便可编译核心:

# cd /usr/src
# make buildworld
# make buildkernel

编译完的程序会写入至/usr/obj

以上这些均为基本的步骤,用来控制编译的其他选项在以下章节会说明。

23.5.4.1. 执行清除编译

部份FreeBSD编译系统版本会保留先前编译的程序于暂存的物件目录/usr/obj,避免重新编译那些尚未更动过的代码可加速后续的编译动作,若要强制重新编译所有东西可在开始编译前使用cleanworld

# make cleanworld

23.5.4.2. 设定工作数量

在多核处理器上增加编译工作的数量可增加编译速度,可使用sysctl hw.ncpu来查看有多少核心,不同处理器使用不同版本的FreeBSD编译系统,所以唯一能了解不同工作数量对编译速度影响的方式便是测试。在一开始可考虑选择一个介于1/2到2倍核心数之间的数值,工作的数量可使用-j来指定。

例 23.1. 增加编译工作数

使用四个工作来编译世界与核心:

# make -j4 buildworld buildkernel

23.5.4.3. 只编译内核

若源码有更动,便须执行buildworld,完成之后,便可随时执行 buildkernel来编译核心,若要只编译核心可:

# cd /usr/src
# make buildkernel

23.5.4.4. 编译自定义核心

标准的FreeBSD核心是以一个名为GENERIC核心配置文件(Kernel config file)为基础,GENERIC核心中内含了所有最常用的装置驱动程序与选项,有时这个档案对编译自定义核心也非常有用,可根据其来加入或移除装置驱动程序或选项来满足特定需求。

例如,要开发一个RAM受到严重限制的小型嵌入式电脑,便可移除不需要的装置驱动程序或选项来缩小核心。

核心配置文件位于/usr/src/sys/arch/conf/,其中使用的arch即为uname -m输出的结果,大部份的电脑为amd64,那其配置文件目录则为/usr/src/sys/amd64/conf/

提示:

/usr/src可以被删除或重建,所以较建议将自定义核心配置文件放在另一个目录,如/root,并将核心配置文件以连接放至conf目录,若该目录被删除或复写,便可重新建立一个新的核心设定的连接。

自定义配置文件可由复制GENERIC配置文件来建立,在此示例,新的自定义核心要用在储存服务器,所以将其命名为STORAGESERVER

# cp /usr/src/sys/amd64/conf/GENERIC /root/STORAGESERVER
# cd /usr/src/sys/amd64/conf
# ln -s /root/STORAGESERVER .

接着编译/root/STORAGESERVER,要加入或移除装置或选项可见config(5)

自定义核心要在指令列设定KERNCONF为核心配置文件来编译:

# make buildkernel KERNCONF=STORAGESERVER

23.5.5. 安装编译好的程序

在完成buildworldbuildkernel两个步骤之后,便可安装新的核心与世界:

# cd /usr/src
# make installkernel
# shutdown -r now
# cd /usr/src
# make installworld
# shutdown -r now

若使用自定义核心,则同样须设定KERNCONF来使用新的自定义核心:

# cd /usr/src
# make installkernel KERNCONF=STORAGESERVER
# shutdown -r now
# cd /usr/src
# make installworld
# shutdown -r now

23.5.6. 完成更新

还有最后一些的工作要做来完成更新,任何修改过的配置文件要与新版本的配置文件合并、移除找到的过时程序库,然后重新启动系统。

23.5.6.1. 使用mergemaster(8)合并配置文件案

mergemaster(8)可简单的将修改过的系统配置文件与新版配置文件合并。

使用-Uimergemaster(8)会自动更新那些未被使用者修改过的配置文件并安装尚不存在的档案:

# mergemaster -Ui

若档案需要手动合并,会有互动式界面可让使用者选择要保留那一边的档案,请参考mergemaster(8)取得更多资讯。

23.5.6.2. 检查过时的档案与程序库

部份废弃的档案或目录可以在更新之后保留,可使用以下指令找出这些档案:

# make check-old

并用以下指令删除:

# make delete-old

部份废弃的程序库也可以保留下来,可使用以下指令来侦测这些程序库:

# make check-old-libs

并使用以下指令删除

# make delete-old-libs

那些仍使用旧程序库的程序将在删除程序库之后无法正常运作,而这些程序须要在删除旧程序库之后重新编译或更换。

提示:

当确认所有旧档案或目录可安全的删除时,要避免删除每一个档案时均需按下yEnter键可在指令设定BATCH_DELETE_OLD_FILES,例如:

# make BATCH_DELETE_OLD_FILES=yes delete-old-libs

23.5.6.3. 更新后重新启动

更新之后的最后一个步骤便是重新启动电脑,来让所有的变更生效:

# shutdown -r now

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.