[分享]5.4升级到6.0笔记

6.0出来了,听介绍说有不少的改进,心痒痒的想把自已的5.4的系统给升级一下。不过,说起来容易,做起来难。
我的FreeBSD系统已经用了好几年了,中间除了有一次硬盘坏了,重装过一次系统外,每次都是用cvsup来更新系统的。从4.5到现在系统中的各个角落都留下了我自己的一些设置,可能有一些连我自己都忘记了为什么要这么设置。此外,系统还有150多个ports,如果升级的后不能用了,那就将是一个灾难。那次硬盘坏了,我折腾了将近一个星期才把系统恢复到原来的状态,而且还把我已经积累了好长时间的财务数据给弄丢了。那次的惨痛经历让我
对系统的备份充分重视。现在想想,原来在网上一篇介绍unix的文章中看到的那句话真是非常有道理,那篇文章是写windows和unix的对比的,其中写到:用一个windows系统的时间越长,你就越想把系统重装一下;而用unix的时间越长,你就越不想重装系统。
想到这次是更新到6.0,应该不会造成什么毁灭性的灾难,只要做到升级到6.0发现在不可克服的问题时,还能还原到原来的系统就可以了。因此,我先用5.4的最新源码编译了系统(包括kernel和world),然后再把编译的成果保存起来,如果升级有问题,我还可以用这些成果把系统恢复到5.4。此外,配置文件是重要的,这也是自己花了最多心血的地方,也需要备份一个。其实,从升级的角度来说,最容易出现的问题就是配置文件被覆盖,导致原有的一些ADSL拨号、sshd、sysctl等设置的丢失。
代码:

cd /usr/src
make buildkernel KERNCONF=FreeBSD
make buildworld
cd /usr/
mv obj obj.bak
cd /
tar czf etc.tar.gz etc

备份完了,自然是就同步源代码了。
代码:

cd /root
vi stand-supfile (把tag更改为RELENG_6_0)
cvsup -g -L stand-supfile

同步源代码后,第一步是到/usr/src目录下,看一看UPDATING文件。在这个文件中记有对于升级极其重要的信息。一定要看看。6.0的UPDATING文件没有提到什么特殊的东西,接下来就按常规编译系统了。
然而,就在我以为没有什么问题的时候,我已经犯下了一个错误,直接导致编译内核失败。为了避免原有内核配置文件不适用于现在的源代码,我用系统升级来的GENERIC文件编译开始编译内核(如果内核选项有变动,UPDATING文件一定会提到的)。但是,在编译的过程中出现了问题。
代码:

cc -c -O -pipe  -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes  -Wmi
ssing-prototypes -Wpointer-arith -Winline -Wcast-qual  -fformat-extensions -std=c9
9 -g -nostdinc -I-  -I. -I/usr/src/sys -I/usr/src/sys/contrib/dev/acpica -I/usr/sr
c/sys/contrib/altq -I/usr/src/sys/contrib/ipfilter -I/usr/src/sys/contrib/pf -I/us
r/src/sys/contrib/dev/ath -I/usr/src/sys/contrib/dev/ath/freebsd -I/usr/src/sys/co
ntrib/ngatm -I/usr/src/sys/dev/twa -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include
 opt_global.h -fno-common -finline-limit=8000 --param inline-unit-growth=100 --par
am large-function-growth=1000  -mno-align-long-strings -mpreferred-stack-boundary=
2  -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -ffreestanding -Werror  /usr/src/sys/fs/devfs/devfs_vnops.c
/usr/src/sys/fs/devfs/devfs_vnops.c:1148: warning: redundant redeclaration of 'dev
fs_ops_f'
/usr/src/sys/fs/devfs/devfs_vnops.c:70: warning: previous declaration of 'devfs_op
s_f' was here
/usr/src/sys/fs/devfs/devfs_vnops.c:1159: warning: redundant redeclaration of 'dev
fs_vnodeops'
/usr/src/sys/fs/devfs/devfs_vnops.c:68: warning: previous declaration of 'devfs_vn
odeops' was here
/usr/src/sys/fs/devfs/devfs_vnops.c:1181: warning: redundant redeclaration of 'dev
fs_specops'
/usr/src/sys/fs/devfs/devfs_vnops.c:69: warning: previous declaration of 'devfs_sp
ecops' was here
*** Error code 1

Stop in /usr/obj/usr/src/sys/GENERIC.
*** Error code 1

Stop in /usr/src.
*** Error code 1

Stop in /usr/src.

自己百思不得其解,照说源码刚同步完,内核配置文件也是用默认的,如果这样都有问题的话,6.0就不会release了。可能是我的某一步有问题,但是我又找不出来。后来,只好到freebsdchina求助。delphij果然利害,指出我应该先buildworld,然后再buildkernel。虽
然到现在为止我也不知道为什么要用这种顺序,虽然我以前从来都是先buildkernel的,一直没有问题,但是我先buildworld后,还真是就能行。可能这只有熟悉源代码的人才能知道为什么。接下来编译安装部分就没有什么问题了。
代码:

cd /usr/src
make buildworld
make buildkernel KERNCONF=FreeBSD
make installkernel KERNCONF=FreeBSD
reboot
mergemaster -p
make installworld
mergemaster -i
reboot

重新启动后,ADSL拨号、Apache、mysql、sshd、usbd等都没有问题。但是进入X后,
发现fcitx不能用了,运行mlterm会出现一行错误信息。
代码:

locale sets fail(大概是这样)

firefox运行时也会出现一个信息说C库不支持现有的locale设置。这是一个与mlterm相同的错误。以此来看,这应该是升级直接造成的。而且,原来看网上介绍6.0新功能的时候,有提到说6.0中的locale改成与平台无关的格式了(我不知道这是什么意思),因此我更加断定是升级造成的。于是我到www.freebsd.org中查看“FreeBSD 6.0-RELEASE Errata”文件。
代码:

http://www.freebsd.org/releases/6.0R/errata.html

果然在这个文件中有提到这个问题。
代码:

(2005/11/5) Changes of on-disk format of /usr/share/locale/*/LC_* files in 6.0-REL
EASE prevent third-party software which uses setlocale(3) for its localization fro
m working after a 5.x system upgraded. The software includes ones installed into t
he 5.x system by using FreeBSD Ports Collection and so on. To solve this problem,
perform one of the following:

        * Install misc/compat5x package into the upgraded 6.0 system. This package
 installs a library lib/compat/libc.so.5 which makes the software complied in a 5.
x system use the old locale files to keep compatibility. Note that you need to rem
ove /lib/libc.so.5 after upgrading.
        This package is available only for Tier-1 platforms.

    * Recompile the software on the 6.0 system.

于是,按照第二种方法,重新编译了mlterm和firefox。问题全部解决。升级成功!
代码:

portupgrade -Rf mlterm-2.9.3
portupgrade -Rf firefox-1.7.1_1

感谢delphij,虽然话不多,但是一话中的。

_________________
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值