FreeBSD 7.2-Release升级到8.0-Release(源代码方式)
# 此文章欢迎转载、修改,但请注明出处
FreeBSD 8.0-Release终于发布,于是决定亲手做个系统升级实验。经过很长时间的折腾,终于是升级完成,目前也还没发现什么问题,Apache,MySQL等在旧系统中安装的程序也正常工作。
环境:VMware 7.0中的FreeBSD 7.2-Release
一、同步系统源代码在升级系统之前必须先把本地系统的world和kernel的源代码同步至8.0-Release,安装好cvsup(没有使用图形界面,因此我是到cvsup-without-gui这个port底下进行的make install clean)之后,可以很方便的进行这一步骤。
[*]修改“standard-supfile”文件。“standard-supfile”在/usr/share/examples/cvsup/目录有一份样本,我们可以将之复制一份到用户主目录。默认的“standard-supfile”文件只需修改host和tag就行了,host根据自己实际情况修改为速度最快的cvsup源,tag必需修改为8.0-Release的 RELENG_8_0[*]在“standard-supfile”所在目录下执行以下命令,即可将world和kernel的源代码都更新完毕。# cvsup -g -L 2 standard-supfile
二、编译和安装world与kernel切换到源码主目录(编译和安装工作主要在此进行)
# cd /usr/src
为了以防万一,在遵循Handbook里的步骤实施之前一定要阅读一下UPDATING和README文件,看看是否有特别要注意的地方。Handbook有提到加上-j 参数(并行编译)可以缩短编译时间,但UPDATING文件中指出加上-j 参数之后可能会导致编译失败,因此以下步骤都没加-j 参数。确定没有其它特殊操作后,我开始按照Handbook的推荐步骤进行编译和安装。
按照Handbook里的解释:
[*]旧的编译器可能无法编译新的内核。 (另一方面, 旧的编译器很可能有 bug。) 因此,
新的内核应该以新的编译器编译。 更具体地说,
新的编译器应在新内核开始联编之前已经完成了联编步骤。 请注意,
新的编译器并不一定需要在联编新内核之前 安装 到系统中。[*]新的 world 有可能依赖一些新的内核特性。 因此, 新内核必须在新的 world 之前安装。编译步骤必须按如下进行:
编译world
# make buildworld
这步操作会联编新的编译器, 以及少量相关工具, 并在随后使用新的编译器来联编 world。
联编的结果会存放在 /usr/obj。
这个步骤很花时间,等着吧!
编译kernel编译好world之后,我并没有按照Handbook的编译GENERIC内核,而是定制了一个内核。如果你打算快捷的按照默认配置编译一个GENERIC内核,只需
# make buildkernel
完成后,即可跳至“安装kernel”步
定制内核步骤:
# cd /usr/src/sys/amd64/conf/
进入内核配置文件的目录(/usr/src/sys/是内核源码主目录),我的FreeBSD 7.2-Release是64位版,因此进入的是amd64/目录底下的conf/,如果你是32位版本则应“cd /usr/src/sys/i386/conf/”。以此类推。
# mkdir ~/kernconf/ && cp GENERIC ~/kernconf/MYKERNEL
# ln -s ~/kernconf/MYKERNEL
直接修改当前目录的GENERIC文件(GENERIC内核的配置文件)并不是一个好主意,为了给自己一条后路,必须保存好GENERIC文件。将配置文件放到用户主目录里面去,再在当前目录创建一个符号连接到~/kernconf/MYKERNEL即可。
接着应该编辑“MYKERNEL”文件,按照自己的需求进行,不再赘述。
编辑好之后即可回到/usr/src目录进行编译步骤
# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
KERNCONF=MYKERNEL参数指定了配置文件为MYKERNEL。
等吧,等待编译完成。。。。。
安装kernel若你是编译的GENERIC内核,即“make buildkernel”不带KERNCONF参数,执行
# make installkernel
我定制了内核,所以要执行
# make installkernel KERNCONF=MYKERNEL
仍然要带上“KERNCONF=MYKERNEL”参数。
kernel安装完成后,可以重启系统了。
重启系统,进入单用户模式在启动菜单那里选择“4”,或者输入“boot -s”即可进入由新内核引导的单用户模式。
系统初始化完成后会提示你选择哪种shell,直接Enter即可(选择了/bin/sh)
执行
# adjkerntz -i
对于这一步,Handbook上的解释是:
[*]如果您的 CMOS 时钟是设置为本地时间,而不是 GMT (如果 date(1) 命令输出不能显示正确的时间和地区也确有其事), 您可能也需要执行下边的命令:“adjkerntz -i”,这样可以确定您正确的本地时区设置──不这样做, 您以后可能会碰到一些问题。
# mount -a -t ufs
将/etc/fstab所描述的所有文件系统挂载为UFS。
第一次安装、修改系统里面的配置文件# mergemaster -p
mergemaster 工具是个 Bourne 脚本,用于检测 /etc 和 /usr/src/etc 源码树里边的配置文件的不同点。这是保持系统配置文件同源码树里的一起更新的推荐方式。敲入上述命令后,会显示将要对某个配置文件将要进行的操作,+ 符号标识增加或修改的行,- 标识将完全删除的行或将被替换成新行(其实就是diff命令的结果)。此时会有四个选项:
[*]按“i”会安装新的配置文件[*]按“d”会保留旧的配置文件[*]按“m”会让你手动进行配置[*]按“v”可以查看修改结果一般来说,使用“m”与“i”的机会更多。
在执行“mergemaster -p”后,第一个配要更新的置文件即与系统的用户组相关:/etc/group(也许第一个要配置的并不是这个文件,但这个文件很重要,所以必修重视一下),此时应该选择“m”,手动进行更新。
选择“m”之后,分成了左右两栏,左边的是老的配置文件的一行,右边则是新的配置文件的一行。按下“L”(Left)并回车会选择左边的一行到新的文件,按下“R”(Right)则选择右边的一行。因此,当你想保留旧文件的一行就按“L”,想以新的配置文件覆盖掉旧的某一行则选择“R”。对于/etc/group这样的文件,你可能想升级文件版本(第一行信息),则选择“R”。但由于旧系统已经产生了许多新系统默认没有的用户组(比如安装了MySQL产生的mysql组),这时千万不能选R(会删除mysql等组),选L保留吧!
其它如/etc/passwd文件也必需万分小心。
很多配置文件只有一行版本信息的变化而已,这时就可以选择“i”,直接安装新版本。
安装新的world
# cd /usr/src
# make installworld
将会安装好新的world。
第二次更新配置文件
# mergemaster
操作方法与第一次无异,只不过这次真的要更新很多配置文件(花了我一个小时),顺便看看系统各配置文件的位置吧!
配置完之后,系统已经完全更新了,可以重启了!
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104203/showart_2107191.html 多谢分享,我想知道 7.2 怎么升级到 9.0 。。
页:
[1]