用cvsup同步源代码并更新系统
(以FREEBSD5_3 STABLE版为例)
我们随时都可以用cvsup与中央cvsup服务器,或它的某个镜像同步自己FreeBSD机器上的全部源代码。cvsup允许您一次获取整个源码集合,以后就只取更改过的部分。许多人从cron运行cvsup,以保持他们的源码自动更新。源代码更新包含两个部分,一是系统源代码,二是ports树的源代码。
对于系统源代码,CVS(并行版本控制系统)包含CURRENT版和STABLE版两个树。FreeBSD STABLE版系统源代码的cvsup配置文件是/usr/share/examples/cvsup/stable-supfile,该文件默认是升级所有的系统源代码,一般情况只需改*default host项,让cvsup到离我们最近的cvsup镜像服务器下载源代码。ports树的源代码的cvsup配置文件是/usr/share/examples/cvsup/ports-supfile,可根据自己的需要指定更新那些分支的源代码。ports树只有一个版本,不象系统源代码有CURRENT版和STABLE版之分。为了保证源码之间的依赖性最好采用src-all和ports-all方式更新所有源码。
1. 复制配置文件到/etc目录(便于管理)
# cp /usr/share/examples/cvsup/ports-supfile /etc
# cp /usr/share/examples/cvsup/stable-supfile /etc
# chmod 755 /etc/ports-supfile
# chmod 755 /etc/stable-supfile
注:chmod 数字前加0代表目录,不加0代表文件
2. 编辑配置文件
# vi /etc/stable-supfile
-------------------------------------------------
*default host=cvsup.FreeBSDchina.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_5_3
*default delete use-rel-suffix
*default compress
src-all
-------------------------------------------------
# vi /etc/ports-supfile
-------------------------------------------------
*default host=cvsup.FreeBSDChina.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
*default compress
ports-all
-------------------------------------------------
注:
①default host=
用来指定离我们最近的cvsup镜像服务器
②prefix=告诉 cvsup
把接收的文件放在哪里,一般在/usr/src目录里。
③*default base=/var/dbCVSup
客户端在被叫做 “base” 的目录里维护了几个状态文件。这些文件帮助 CVSup 更有效的工作,通过跟踪您已经接收到哪些更新的方式。如果 base 目录不存在,cvsup 客户端会拒绝工作。
④tag=用来指定版本含义如下:
tag=RELENG_3指定版本为:FreeBSD 3-STABLE
tag=RELENG_4指定版本为:FreeBSD 4-STABLE
tag=RELENG_5_3指定版本为:FreeBSD 5_3-STABLE
⑤*default release=cvs delete use-rel-suffix compress
release=cvs 显示服务器应该从 FreeBSD 的主 CVS 仓库中获取信ⅰ?
delete 给 CVSup 权限删除文件。您应该总是指定它,这样 CVSup 可以保证您的源代码树完全更新。CVSup 很小心的只删除那些不再依赖的文件。您拥有的任何额外的文件会被严格的保留。
use-rel-suffix 是 ... 不可思议的。 如果您真的想了解它,查看 cvsup(1) 手册页。否则,就指定而不用担心这个。
compress 启用 gzip 风格的信道压缩。
⑥CVSup 文件 collection
CVSup 可用的文件 collection 是分级组织的。有几个大的 collection,然后它们有分成更小的子 collection。接收一个大的 collection 等同于接收它的每一个子 collection。 collection 的等级关系在下面列表中通过缩进的使用反映出来。最常用的 collection 是 src-all,和 ports-all。其它的 collection 只被有着特定目的的小部分人使用,有些站点可能不全部支持。
cvs-all release=cvs (FreeBSD 主 CVS 仓库,包含密码系统的代码)
distrib release=cvs (FreeBSD 发行版本和镜像相关的文件)
doc-all release=cvs (FreeBSD 使用手册和其它文档的源代码。其中不包含 FreeBSD web 站点的文件)
ports-all release=cvs (FreeBSD Ports Collection)
如果您不想升级全部的 ports-all(整个 ports 树),而只是使用下面列出的一个子集,请确保您总是升级了 ports-base子collection!无论何时在 ports 构建下层构造有所改变的时候都会通过 ports-base 表现出来,因此,如果您只升级了“实际的”ports 而他们使用了一些新的特性,就有极大的可能会因一些神秘的错误信息而编译失败。 这种情况下,首先要做的事情就是确保您的 ports-base 子 collection 更新到最新。
ports-archivers release=cvs (存档工具)
ports-astro release=cvs (天文相关的 ports)
ports-audio release=cvs (声音支持)
ports-base release=cvs (Ports Collection 构建下部构造)
位于 /usr/ports 的 Mk/ 和 Tools/ 子目录的各种各样的文件。无论您更新 Ports Collection 的任何部分的时候,您都应该同时更新这个子 collection。
ports-benchmarks release=cvs (基准)
ports-biology release=cvs (生物学)
ports-cad release=cvs (计算机辅助设计工具)
ports-chinese release=cvs (中文语言支持)
ports-comms release=cvs (通信软件)
ports-converters release=cvs (字符编码转换)
ports-databases release=cvs (数据库)
ports-deskutils release=cvs (计算机发明前常出现在桌面上的东西)
ports-devel release=cvs (开发工具)
ports-dns release=cvs (DNS 相关软件)
ports-editors release=cvs (编辑器)
ports-emulators release=cvs (其它操作系统的模拟器)
ports-finance release=cvs (货币,金融相关应用程序)
ports-ftp release=cvs (FTP 客户端和服务器端工具)
ports-games release=cvs (游戏)
ports-german release=cvs (德语支持)
ports-graphics release=cvs (图形图像工具)
ports-hungarian release=cvs (匈牙利语言支持)
ports-irc release=cvs (Internet 多线交谈(IRC)工具)
ports-japanese release=cvs (日语支持)
ports-java release=cvs (Java 工具)
ports-korean release=cvs (韩国语言支持)
ports-lang release=cvs (编程语言)
ports-mail release=cvs (邮件软件)
ports-math release=cvs (数值计算软件)
ports-mbone release=cvs (MBone 应用程序)
ports-misc release=cvs (杂样工具)
ports-multimedia release=cvs (多媒体软件)
ports-net release=cvs (网络软件)
ports-news release=cvs (USENET 新闻软件)
ports-palm release=cvs (Palm? 系列软件支持)
ports-polish release=cvs (波兰语支持)
ports-portuguese release=cvs (葡萄牙语支持)
ports-print release=cvs (打印软件)
ports-russian release=cvs (俄语支持)
ports-security release=cvs (安全工具)
ports-shells release=cvs (命令行 shell)
ports-sysutils release=cvs (系统实用工具)
ports-textproc release=cvs (文本处理工具(不包含桌面出版)。
ports-vietnamese release=cvs (越南语支持)
ports-www release=cvs (万维网(WWW)相关软件)
ports-x11 release=cvs (支持 X window 系统的 ports)
ports-x11-clocks release=cvs (X11 时钟)
ports-x11-fm release=cvs (X11 文件管理器)
ports-x11-fonts release=cvs (X11 字体和字体工具)
ports-x11-toolkits release=cvs (X11 工具包)
ports-x11-servers (X11 服务器)
ports-x11-wm X11 (窗口管理器)
src-all release=cvs (FreeBSD 主代码,包含密码系统的代码)
src-base release=cvs (/usr/src 顶层的各式各样的文件)
src-bin release=cvs (单用户模式下可能用到的用户工具 (/usr/src/bin))
src-contrib release=cvs (FreeBSD 项目之外的工具和库,通常在 FreeBSD 中不作修改 (/usr/src/contrib))
src-crypto release=cvs (FreeBSD 项目之外的 密码系统工具和库,通常在 FreeBSD 中不作修改 (/usr/src/crypto))
src-eBones release=cvs (Kerberos 和 DES (/usr/src/eBones)。 没有在当前的 FreeBSD 发行中使用)
src-etc release=cvs (系统配置文件 (/usr/src/etc))
src-games release=cvs (游戏 (/usr/src/games))
src-gnu release=cvs (GNU 公共许可协议的工具 (/usr/src/gnu))
src-include release=cvs (头文件 (/usr/src/include))
src-kerberos5 release=cvs (Kerberos5 安全包 (/usr/src/kerberos5))
src-kerberosIV release=cvs (KerberosIV 安全包 (/usr/src/kerberosIV))
src-lib release=cvs (库文件 (/usr/src/lib))
src-libexec release=cvs (通常被其它程序调用的系统程序 (/usr/src/libexec))
src-release release=cvs (生成 FreeBSD 版本必需的文件 (/usr/src/release))
src-sbin release=cvs (但用户模式的系统工具 (/usr/src/sbin))
src-secure release=cvs (密码相关库和命令 (/usr/src/secure))
src-share release=cvs (跨多个平台的共享的文件 (/usr/src/share))
src-sys release=cvs (内核 (/usr/src/sys))
src-sys-crypto release=cvs (内核密码系统代码 (/usr/src/sys/crypto))
src-tools release=cvs (维护 FreeBSD 的各种各样的工具 (/usr/src/tools))
src-usrbin release=cvs (用户工具 (/usr/src/usr.bin))
src-usrsbin release=cvs (系统工具 (/usr/src/usr.sbin))
www release=cvs (FreeBSD WWW 站点的源代码)
distrib release=self (CVSup 服务器的配置文件,用于 CVSup 镜像站点)
gnats release=current (GNATS bug 跟踪数据库)
mail-archive release=current (FreeBSD 邮件列表存档)
www release=current (预处理过的 FreeBSD WWW 站点文件(不是源文件),用于WWW 镜像站点。)
如果你很清楚安装软件的依赖性,可注释掉ports-all行,不让cvsup整个ports树,并指定下载ports分支代码。如下,一个WEBSERVER的实例:
#ports-all
ports-base
#ports-arabic
ports-archivers
#ports-astro
#ports-audio
#ports-benchmarks
#ports-biology
#ports-cad
#ports-chinese
ports-comms
ports-converters
ports-databases
ports-deskutils
ports-devel
ports-dns
ports-editors
ports-emulators
#ports-finance
#ports-french
ports-ftp
#ports-games
#ports-german
#ports-graphics
#ports-hebrew
#ports-hungarian
#ports-irc
#ports-japanese
ports-java
#ports-korean
ports-lang
ports-mail
ports-math
#ports-mbone
ports-misc
#ports-multimedia
ports-net
#ports-news
#ports-palm
#ports-picobsd
#ports-polish
#ports-portuguese
ports-print
#ports-russian
#ports-science
ports-security
ports-shells
ports-sysutils
ports-textproc
#ports-ukrainian
#ports-vietnamese
ports-www
#ports-x11
#ports-x11-clocks
#ports-x11-fm
#ports-x11-fonts
#ports-x11-servers
#ports-x11-toolkits
#ports-x11-wm
3. 同步源代码
# /usr/local/bin/cvsup -g -L 2 /etc/ports-supfile
# /usr/local/bin/cvsup -g -L 2 /etc/stable-supfile
注:
-g:告诉 CVSup 不要使用 GUI。如果您没在运行 X11 这个是自动的,否则您必须指定它。
-L 2:告诉 CVSup 输出所有正在升级的文件的细节。有三个等级可以选择,从 -L 0 到 -L 2。默认是 0,意味着除了错误消息什么都不输出。
4. 更新系统
4.1 阅读 /usr/src/UPDATING
这个文件要包含有关于您可能遇到的问题的重要信息,或指定了您可能使用到的命令的执行顺序。
4.2 检查 /etc/make.conf
一般的通常会从 /usr/share/examples/etc/make.conf (或者 FreeBSD 4.X 中的 /etc/defaults/make.conf) 复制 CFLAGS 和 NOPROFILE 这样的设置到 /etc/make.conf 中并令它们生效。请注意在 /etc/make.conf 中的任何设置同时也会影响每次运行 make 的结果,因此设置一些适合自己系统的选项是一个好习惯:
#指定下载源码的服务器
MASTER_SITE_BACKUP?= \
ftp://202.113.12.9/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/\
ftp://ftp.freebsd.org.cn/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/\
ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}
#编译器选项
CPUTYPE=athlon-xp
##本人使用AthlonXP 2500+,不同的CPU请参考man make.conf##
CFLAGS+= -mfpmath=sse -mmmx -msse -m3dnow -maccumulate-outgoing-args -minline-all-stringops
## 不建议使用O2、O3、Os的优化,因为不是全部应用程序可以稳定工作于O2、O3、Os。况且最多仅获得7%的额外性能。CFLAGS的默认为"-O1 -pipe",不需要覆盖,所以使用+=。不建议使用-f...系列优化,因为不是全部应用程序可以对此稳定工作。
##-mfpmath=sse: PentiumIII兼容的CPU可以打开-mfpmath=sse来代替传统i387的浮点运算,加快速度。参阅CPU产品手册来确定CPU是否含有SSE功能。
## -mfpmath=pni: Pentium4 Prescott兼容的CPU可以打开-mfpmath=pni来代替传统i387的浮点运算,加快速度。参阅CPU产品手册来确定CPU是否含有PNI功能。
## -mmmx: 打开mmx指令来增加代码性能。适用于PentiumMMX兼容CPU。
## -msse: 打开sse指令来增加代码性能。适用于PentiumIII兼容CPU。
## -msse2: 打开sse2指令来增加代码性能。适用于Pentium4兼容CPU。
## -mpni: 打开pni指令来增加代码性能。适用于Pentium4 Prescott兼容CPU。
## -m3dnow: 打开3DNow!指令来增加代码性能。适用于K6、Athlon兼容CPU。
## -maccumulate-outgoing-args -minline-all-stringops :通过减少某些动作来实现加速,经作者实验,比较稳定。
CXXFLAGS+= -fmemoize-lookups -fsave-memoized
## make.conf提到的C++代码优化。
#系统编译选项
KERNCONF=(FILENAME)
## 内核配置文件名,将(FILENAME)更改为自己的内核文件名。
NOINET6=true
## 尽量不使用用IPV6协议。
NOATM=true
## 尽量不使用ATM,本选项仅适用于非ADSL用户。
NO_SENDMAIL=true
## 尽量不使用SENDMAIL。
NOGAMES=true
## 不安装所有游戏
NO_I4B=true
## 尽量不使用ISDN For BSD。
NO_IPFILTER=true
## 尽量不使用IP Filter。
BATCH=yes
## 安静编译,编译时跳过所有提问。适用于某些隔夜一次性编译程序的用户。
#X-Window编译选项
XFREE86_VERSION=4
## 尽量使用4.3版本的X-Window
WITH_SETUID_LUIT=yes
## 不使用本项的话,运行xterm会出现luit错误的问题.
WITH_GTK2=yes
## 尽量使用GTK2为gtk应用程序的运行库
USE_MMX_ASM=yes
## 编译Xfree86时,尽量使用MMX代码,仅适用于PentiumMMX兼容CPU.
USE_3DNOW_ASM=yes
## 编译Xfree86时,尽量使用3DNOW代码,仅适用于K6、Athlon兼容CPU.
WITHOUT_KDE_MENUS=yes
## 使用GNOME时,不添加KDE程序在菜单上。
#多媒体编码选项
WITH_CDPARANOIA=yes
WITH_AALIB=yes
WITH_ESOUND=yes
WITH_FAAD=yes
WITH_FLAC=yes
WITH_FREETYPE=yes
WITH_GDKPIXBUF=yes
WITH_GSM=yes
WITH_HERMES=yes
WITH_JPEG=yes
WITH_LADSPA=yes
WITH_LAME=yes
WITH_LIBA52=yes
WITH_LIBAUDIOFILE=yes
WITH_LIBCACA=yes
WITH_LIBFAME=yes
WITH_LIBMIKMOD=yes
WITH_LIBMPEG2=yes
WITH_LIBMUSICBRAINZ=yes
WITH_LIBSHOUT=yes
WITH_LIBSIDPLAY=yes
WITH_LIBSNDFILE=yes
WITH_LIBTHEORA=yes
WITH_MAD=yes
WITH_NAS=yes
WITH_PANGO=yes
WITH_PNG=yes
WITH_SDL=yes
WITH_SMOOTHWAVE=yes
WITH_SPEEX=yes
WITH_SWFDEC=yes
WITH_VORBIS=yes
WITH_VORBISIDEC=yes
WITH_XINE=yes
WITH_XVID=yes
## 以上所有多媒体选项仅在应用程序支持时打开。
#应用程序编译选项
WANT_HUGE_STACK_SIZE=yes
## 为Python代码的应用程序提供巨大的Stack。
WITH_GDM=yes
## 为某些窗口管理器提供GDM链接。
WITHOUT_MAILNEWS=yes
## 取消Mozilla的邮件新闻功能,加快编译时间。
WITHOUT_COMPOSER=yes
## 取消Mozilla的网页编辑功能,加快编译时间。
WITHOUT_LDAP=yes
## 取消Mozilla的LDAP功能,加快编译时间。
WITHOUT_CHATZILLA=yes
## 取消Mozilla的IRC聊天功能,加快编译时间。
WITHOUT_XMLTERM=yes
## 取消Mozilla的XML终端功能,加快编译时间。
#WITH_RTC=yes
## 为某些应用程序提供实时时钟支持,但可能会造成某些多媒体程序不稳定。
WITH_GLX=yes
## 为某些应用程序提供GLX加速绘图支持。
WITH_TTF_BYTECODE_ENABLED=yes
## 为某些应用程序提供双字节支持。
WITH_OPTIMIZED_CFLAGS=yes
WITH_OPTIMIZED_CXXFLAGS=yes
WITH_OPTIMIZE=yes
## 尽量使用更高级编译优化
4.3 更新 /etc 里边的文件
某些“make installworld”的安装需要特定的用户名或用户组存在。在升级时,有可能这些用户或组不存在,就会在升级过程中出错。解决办法是检查 /usr/src/etc/group 并把它的组列表与您的进行比较。如果在新文件里有而您的文件里没有的,就把它们复制过来。同样地,您把 /etc/group 里的任何这样的组进行更名---与 /usr/src/etc/group 中有相同 GID,但不同名的那些。
4.3.1备份 /etc里的文件
将该目录备份到其他目录如/home/root,以便升级遇到问题时恢复系统配置。
4.3.2 用mergemaster 比较、合并、编辑配置文件
mergemaster就是升级你的配置文件用的,它帮助你把新系统的配置文件与你原来的(旧的)配置文件合并,或替换,或不改变原配置文件。升级完系统后应该用mergemaster升级配置文件的,要不然可能会引发问题。当然你可以不用mergemaster,自己手工搞定这些配子文件。 在第一次使用时,如果早期的 mergemaster 版本不支持 -p 的话,就使用源码树中的新版本:
# cd /usr/src/usr.sbin/mergemaster
# ./mergemaster.sh -p
mergemaster的用法:
#mergemaster -p
#make installworld
#mergemaster -i
-i是安装新文件而不询问。是说如果旧系统中没有该文件话的,就直接安装而不询问。跨RELEASE升级的时候非常有用。
-p检测 /etc 和 /usr/src/etc 源码树里边的配置文件的不同点。通过 -p 选项以预建 (pre-buildworld) 模式运行 mergemaster(。 这样只是比较那些对于成功执行 buildworld 或installworld 起关键作用的文件。
?----就是全部更新。
merge就是文件合并,将为您打开一个文本编辑器,里边是两个文件的内容。您现在就可以一边合并它们,一边在屏幕里查看,同时从两者中选取部分生成最终文件。当两个文件一起比较时,l 键会选择左边的内容, r 会选择右边的。最终的输出是由两个部分组成的一个文件,用它就可以安装了。这个选项通常用于用户修改了设置的文件。merge之后需要选左、右的内容(l, r),最后按i安装,当然如果搞错了可以按r重来,但如果i错了后果就比较悲惨了。
操作实例:
原来存在文件1,现在升级后有一个新版本是文件2,问你如何操作?有三个选择:安装(i),删除(d),合并(m)。
文件1的内容:
第1 行
第2 行
第3 行
文件2的内容:
第2 行
第3 行
第4 行
按i键即安装,就是不要文件1了,用新文件2覆盖文件1;
按d键即删除,是说删除新的文件2,保留旧的文件1;
按m键即合并,合并是自己整合两个文件,得到文件3。
文件3的内容:
第1 行(直接取文件一)
第2 行(由用户选取文件一或文件二中对应的行)
第3 行(由用户选取文件一或文件二中对应的行)
第4 行(直接取文件二)
4.4 在单用户模式下编译安装系统
在单用户模式下能处理的更快,并保证编译重要的系统文件时不出错。从运行的系统里,以超级用户方式执行:
# shutdown now
这样就会转换到单用户模式。
另外也可以,重启系统,在启动提示符处,输入 -s 标识。系统就会启动单用户。再在 shell 提示符处执行:
# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a
这会检查文件系统,重新装载 / 为读/写,参考 /etc/fstab 装载其它所有的 UFS 文件系统,然后打开交换 (swapping) 开关。
Note: 如果您的 CMOS 时钟是设置为本地时间,而不是 GMT (如果 date(1) 命令输出不能显示正确的时间和地区也有确有其事), 您可能也需要执行下边的命令:
# adjkerntz -i
这样可以确定您正确的本地时区设置--不这样做,您以后可能会碰到一些问题。
4.5 删除先前 build 留下的残余(如果以前build过系统)
# chflags -R noschg /usr/obj/usr
# rm -rf /usr/obj/usr
删除/usr/obj这个目录,可以加快“make buildworld”的过程,并且省下与依赖关系有关的许多头痛的事情。/usr/obj 下的有些文件可能设置了不可改 (immutable) 属性(查看 chflags(1) 了解更多), 您必须用这个命令: # chflags -R noschg /usr/obj/usr 把这些标志去掉。
# cd /usr/src
# make cleandir
# make cleandir
不错,make cleandir 要执行两次。
4.6 保存编译输出
把执行 make(1) 后得到的输出存成一个文件。如果什么地方出了错,您就会有个错误信息的备份。最简单的办法是使用 script(1) 命令,同是带上参数指定存放输出的文件名。您应在重建系统之前立即这样做,然后在过程完成时输入 exit。
# script /var/tmp/mw.out
Script started, output file is /var/tmp/mw.out
# make TARGET
... compile, compile, compile ...
# exit
Script done, ...
4.7 编译基本系统
在/usr/src目录里边
# cd /usr/src
# make -j4 buildworld
注:
-j4:有至多4个进程在同一时刻执行,加快编译速度。多CPU机器可用6到10之间的值。
buildworld:编译源码,在 /usr/obj 下边建立了一个全新的树。
4.8 编译和安装新内核
如果您想建立一个定制内核,而且已经有了配置文件,只需象这样使用 KERNCONF=MYKERNEL:
# cd /usr/src
# make -j4 buildkernel KERNCONF=MYKERNEL
# make -j4 installkernel KERNCONF=MYKERNEL
4.9 重启动系统
#shutdown -r now
4.10 安装新系统
# make -j4 installworld
4.11 编译安装系统流程:(建议在单用户模式下进行)
# make -j4 buildworld
# make -j4 buildkernel
# make -j4 installkernel
#mergemaster -p
#make -j4 installworld
#mergemaster -i
# reboot
启动到单用户模式可用# shutdown now命令或重新启动系统,在提示符处使用 boot -s,进入单用户模式。
将该目录备份到其他目录如/home/root,以便升级遇到问题时恢复系统配置。
4.3.2 用mergemaster 比较、合并、编辑配置文件
mergemaster就是升级你的配置文件用的,它帮助你把新系统的配置文件与你原来的(旧的)配置文件合并,或替换,或不改变原配置文件。升级完系统后应该用mergemaster升级配置文件的,要不然可能会引发问题。当然你可以不用mergemaster,自己手工搞定这些配子文件。 在第一次使用时,如果早期的 mergemaster 版本不支持 -p 的话,就使用源码树中的新版本:
# cd /usr/src/usr.sbin/mergemaster
# ./mergemaster.sh -p
mergemaster的用法:
#mergemaster -p
#make installworld
#mergemaster -i
-i是安装新文件而不询问。是说如果旧系统中没有该文件话的,就直接安装而不询问。跨RELEASE升级的时候非常有用。
-p检测 /etc 和 /usr/src/etc 源码树里边的配置文件的不同点。通过 -p 选项以预建 (pre-buildworld) 模式运行 mergemaster(。 这样只是比较那些对于成功执行 buildworld 或installworld 起关键作用的文件。
?----就是全部更新。
merge就是文件合并,将为您打开一个文本编辑器,里边是两个文件的内容。您现在就可以一边合并它们,一边在屏幕里查看,同时从两者中选取部分生成最终文件。当两个文件一起比较时,l 键会选择左边的内容, r 会选择右边的。最终的输出是由两个部分组成的一个文件,用它就可以安装了。这个选项通常用于用户修改了设置的文件。merge之后需要选左、右的内容(l, r),最后按i安装,当然如果搞错了可以按r重来,但如果i错了后果就比较悲惨了。
操作实例:
原来存在文件1,现在升级后有一个新版本是文件2,问你如何操作?有三个选择:安装(i),删除(d),合并(m)。
文件1的内容:
第1 行
第2 行
第3 行
文件2的内容:
第2 行
第3 行
第4 行
按i键即安装,就是不要文件1了,用新文件2覆盖文件1;
按d键即删除,是说删除新的文件2,保留旧的文件1;
按m键即合并,合并是自己整合两个文件,得到文件3。
文件3的内容:
第1 行(直接取文件一)
第2 行(由用户选取文件一或文件二中对应的行)
第3 行(由用户选取文件一或文件二中对应的行)
第4 行(直接取文件二)
4.4 在单用户模式下编译安装系统
在单用户模式下能处理的更快,并保证编译重要的系统文件时不出错。从运行的系统里,以超级用户方式执行:
# shutdown now
这样就会转换到单用户模式。
另外也可以,重启系统,在启动提示符处,输入 -s 标识。系统就会启动单用户。再在 shell 提示符处执行:
# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a
这会检查文件系统,重新装载 / 为读/写,参考 /etc/fstab 装载其它所有的 UFS 文件系统,然后打开交换 (swapping) 开关。
Note: 如果您的 CMOS 时钟是设置为本地时间,而不是 GMT (如果 date(1) 命令输出不能显示正确的时间和地区也有确有其事), 您可能也需要执行下边的命令:
# adjkerntz -i
这样可以确定您正确的本地时区设置--不这样做,您以后可能会碰到一些问题。
4.5 删除先前 build 留下的残余(如果以前build过系统)
# chflags -R noschg /usr/obj/usr
# rm -rf /usr/obj/usr
删除/usr/obj这个目录,可以加快“make buildworld”的过程,并且省下与依赖关系有关的许多头痛的事情。/usr/obj 下的有些文件可能设置了不可改 (immutable) 属性(查看 chflags(1) 了解更多), 您必须用这个命令: # chflags -R noschg /usr/obj/usr 把这些标志去掉。
# cd /usr/src
# make cleandir
# make cleandir
不错,make cleandir 要执行两次。
4.6 保存编译输出
把执行 make(1) 后得到的输出存成一个文件。如果什么地方出了错,您就会有个错误信息的备份。最简单的办法是使用 script(1) 命令,同是带上参数指定存放输出的文件名。您应在重建系统之前立即这样做,然后在过程完成时输入 exit。
# script /var/tmp/mw.out
Script started, output file is /var/tmp/mw.out
# make TARGET
... compile, compile, compile ...
# exit
Script done, ...
4.7 编译基本系统
在/usr/src目录里边
# cd /usr/src
# make -j4 buildworld
注:
-j4:有至多4个进程在同一时刻执行,加快编译速度。多CPU机器可用6到10之间的值。
buildworld:编译源码,在 /usr/obj 下边建立了一个全新的树。
4.8 编译和安装新内核
如果您想建立一个定制内核,而且已经有了配置文件,只需象这样使用 KERNCONF=MYKERNEL:
# cd /usr/src
# make -j4 buildkernel KERNCONF=MYKERNEL
# make -j4 installkernel KERNCONF=MYKERNEL
4.9 重启动系统
#shutdown -r now
4.10 安装新系统
# make -j4 installworld
4.11 编译安装系统流程:(建议在单用户模式下进行)
# make -j4 buildworld
# make -j4 buildkernel
# make -j4 installkernel
#mergemaster -p
#make -j4 installworld
#mergemaster -i
# reboot
启动到单用户模式可用# shutdown now命令或重新启动系统,在提示符处使用 boot -s,进入单用户模式。