Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14761
  • 博文数量: 3
  • 博客积分: 374
  • 博客等级: 二等列兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-19 16:49
文章分类

全部博文(3)

文章存档

2011年(1)

2009年(2)

最近访客

分类: BSD

2009-11-30 12:15:28

# 此文章欢迎转载、修改,但请注明出处

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)之后,可以很方便的进行这一步骤。
  1. 修改“standard-supfile”文件。“standard-supfile”在/usr/share/examples/cvsup/目录有一份样本,我们可以将之复制一份到用户主目录。默认的“standard-supfile”文件只需修改host和tag就行了,host根据自己实际情况修改为速度最快的cvsup源,tag必需修改为8.0-Release的 RELENG_8_0
  2. 在“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

操作方法与第一次无异,只不过这次真的要更新很多配置文件(花了我一个小时),顺便看看系统各配置文件的位置吧!

配置完之后,系统已经完全更新了,可以重启了!
阅读(1625) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~