来源http://bbs.chinaunix.net/viewthread.php?tid=1072231
追踪NetBSD-current
译者:祁人不开花
E-mail:[email protected]
为什么要追踪NetBSD当前版本?
基于若干原因,NetBSD的开发者已经把NetBSD当前版的源代码向公众提供。总的说来,提供NetBSD-current帮助我们创建稳定,可使用的系统。
它使得人们使用开发中的NetBSD变得容易。发布当前版的开发代码使得人们看到系统的发展趋势,并且能够联系到他们所实现的特性。
它也使得用户所做的更改更容易整合。如果用户对当前开发的源码做了修改,那么几乎不需要整合就可放到主源码树。
它也允许广泛的测试所开发的软件。(开发者)鼓励NetBSD-current的用户提交当前源码的bug报告http://www.tw.netbsd.org/support/send-pr.html,这帮助寻找和修正bug。因为人们自阿软件写完之后开始测试,更多的bug可以被发现和清除。
安装当前快照
为了快速使用当前版本,从版本引擎产生的快照开始。每个平台的当前状态都可在NetBSD自动编译http://releng.netbsd.org/cgi-bin/builds.cgi而相应版本可在ftp://ftp.netbsd.org/pub/NetBSD-daily/HEAD/以日期和平台查看。
1.进到binary/sets目录,mget*.tgz文件到你最常用的管理员目录(例如$HOME/current);如果受限于磁盘空间和/或时间,只有kern-GENERIC,etc, base, and comp(如果你想要编译器)是必需的。
2.获取期望的/etc和内核
$su
$cd /root
$ tar -zxpf ~/etc.tgz
$ tar -zxpf ~/kern-GENERIC.tgz
$ ln -fh /netbsd /netbsd.old
$ mv netbsd /netbsd
$ shutdown -r now 3.获取相应的base,和别的所需的
$su
# cd /
# tar -zxpf ~/comp.tgz
# ...
# tar -zxpf ~/base.tgz 4.最后升级/etc:postinstall首先检验和确保大部分事情可以自动化,在接下来的几步里,etc升级会问如何更新。
#/usr/sbin/postinstall -s /root check
# /usr/sbin/postinstall -s /root fix
# /usr/sbin/etcupdate -s /root
# shutdown -r now 在这里,你已接近当前版并准备编译你自己的当前源码了。
下载当前源码
传统上,系统源码文件是在/usr/src,但这通常要求root权限。当前build.sh过程可完全以无特权运行,尽管安装仍然要求root权限。本文档假定在/usr/src,可以使用别的目录(例如$HOME/current)。
1.为源码树选择个目录
$cd/usr
$su
2.从离你最近的NetBSD镜像下载当前源码http://www.tw.netbsd.org/mirrors/
通过ftpftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/tar_files/src/,或使用sup ftp://ftp.netbsd.org/pub/NetBSD/README.sup
这些文件刷新源码树快照,对于大多数的升级文件使用anoncvs(http://www.tw.netbsd.org/docs/current/index.html#using-anoncvs)
$cd /usr/src
$ cvs -q -d $CVSROOT update -dP -d$CVSROOT只在第一次升级是时需要,为了使用你所选择的CVS镜像,记得总是使用-p标志或写入你的.cvsrc文件。
3.修改权限,如果你希望源码树可被无特权的传统wsrc组的用户管理,如下这么做(以root):
$chown -R user:wsrc/usr/src
$ chmod -R u=rwX,g=rwX,o=rX /usr/src 从源码编译发行版
对于最近的更改记得检查src/BUILDING。
通常,系统目标文件放在/usr/obj,但是这通常要求root权限。作为一种选择,把目标文件放在别的文件系统可以可观的加快编译。本文假定在/usr/src,可以使用别的目录(例如$HOME/current)。
1.为目标文件选择一个目录,它对于一个发布版本的压缩包和一个完全安装要有足够的空间。
$cd /usr/src
$ su
# mkdir ../tools
# mkdir ../obj 2.从源码树的根
$cd /usr/src
$ ./build.sh -O ../obj -T ../tools -u -U release 在这个例子里,-u选项表示在编译之前不运行makeclean操作。对于一个先前和全新的编译来说,这是很有用的。(注:
ccache起的就是这个作用,关于在NetBSD里使用ccache请参见《usingccache with build.sh》一文)
-u选项允许整个编译以非root用户进行。
当完成后,你会获得build.sh所选择的(会显示出来)你需要安装到目录里的所有东西,包括安装媒介和注意文件。
如果你想为不同架构交叉编译http://www.tw.netbsd.org/docs/guide/en/chap-build.html ,运行build.sh时,包含'-mMACHINE-a ARCH'
关于更多细节,运行./build.sh-h,或参见/usr/src/BUILDING
升级存在的系统
请记得为最近升级检查src/UPDATING。
1.从源码根目录
$cd/usr /src
2.编译工具链
$./build.sh -O ../obj -T ../tools -U -u tools
3.编译发行版
$./build.sh -O ../obj -T ../tools -U -u distribution
4.编译内核
$./build.sh -O ../obj -T ../tools -U -u kernel=GENERIC
5.安装内核
$cd ../obj/sys/arch/<ARCH>/compile/GENERIC
$ su
# mv /netbsd /netbsd.old
# cp netbsd /netbsd 6.重启进入新内核
#shutdown -r now
7.安装新应用程序
$cd /usr/src
$ su
# ./build.sh -O ../obj -T ../tools -U install=/ 8.按照输出的指令修正过时的文件爱你,例如:
#/usr/src/usr.sbin/postinstall/postinstall -s /usr/src -d // fixdefaults mtree obsolete
9.升级/etc
#/usr/sbin/etcupdate -s /usr/src
10.重启以确保所有运行的服务使用新的程序
#shutdown-r now
在这个例子中,-u选项表明升级过程,-U选项允许真个过程以非root用户进行,然后以root安装。
这个编译顺序(工具,发行版,内核)用于当出问题时优化升级时间。为了确保正确,当errors/cvs升级时,这个过程应当重做。
更多信息参见/usr/UPDATING
你需要记住的事情
当升级到很新的当前版时,你需要在安装新的库前总是编译和引导一个新的内核。通常最好的方法是在任何事情前尝试新内核,如果你遇到一些问题请参见内核FAQ(http://www.tw.netbsd.org/docs/kernel/#p ... ent_kernel)
当内核运行起来时,你应当看一下源码树里的BUILDING文件,ftp://ftp.netbsd.org/pub/NetBSD/NetBSD- ... 译新的用户应用程序。
当编译一个当前内核,总是记得要包含COMPAT_<lastrelease>选项(例如,COMPAT_16)。因为当前分支来源于最新稳定版,包含了兼容代码,但是仅当这个选项存在时是允许的。作为最低需求,在引导心内核和使用build.sh完成编译之间,你需要这个兼容代码。
强烈建议使用NetBSD当前版的用户到当前用户邮件列表注册(http://www.tw.netbsd.org/mailinglists/# ... e-changes)
*除非你确信没有添加任何新的系统调用,随便怎么做;这是安全的。
Makefile目标变量是什么样的?
对于进一步解释使用build.sh脚本,运行./build.sh-h,并参见/usr/BUILDING。
警告:升级的工具链已经不使用makebuild,强烈建议不这么做。
当你第一次使用build.sh编译你的系统,一批用于编译的工具也会编译。任何编译请求会重用已经编译的工具,这样会减少时间。
当然,不要./build.shinstall=/ ,除非./build.sh之前已经成功完成否则很肯能最终产生一个不工作的系统。
使用anoncvs(匿名CVS)
这些指令包括未加密的anoncvs连接。如果你想使用加密协议,参见这里
1.安装devel/scmcvs。
2.设置CVSROOT环境变量来指出所用的cvs服务器
对于csh或tcsh用户
#setenv CVSROOT :pserver:[email protected]:/cvsroot
对于sh和ksh或bash2用户
$CVSROOT=:pserver:[email protected]:/cvsroot; export CVSROOT
3.
$cd /usr
$ cvs login (密码是anoncvs)
你对于初始化检查的目录必须有写权限;然后你可以改变源码树的所有者。其中一个可能的方法是以root作初始化检查,然后把源码树给别的用户以后使用。
通过ssh使用anoncvs
上一块所说的使用anoncvs方法可以使用ssh来确保你所获得源码的完整性。然而这增加了cvs服务器的负担。
支持ssh连接的镜像服务器显示了所需要的信息。
一般来说,在cvsroot里移除':pserver:',并设置CVS_RSH为ssh就可以了。
使用anoncvs追踪NetBSD当前
开始
1.只获取内核源码
$ cd /usr
$ cvs checkout -P src/sys
这给你/usr/src/sys下的内核源码。这里有个如何编译内核的信息http://www.tw.netbsd.org/docs/kernel/#h ... d_a_kernel
2.获取整个源码树(包括内核)
$ cd /usr
$ cvs checkout -P src
到这里,在/usr/src下你得到了NetBSD的完整源码。
3.修改权限
# chown -R user /usr/src
升级源码
1.仅升级内核源码
$ cd /usr/src/sys
$ cvs update -dP
2.升级整个源码树
$ cd /usr/src
$ cvs update -dP
注意:运行cvs checkout -d dir src并没有作用。你会获得一个错误信息说"existing repository ... does not match ...; ignoring module _gnusrc-cmp" 等。
获取某个日期的源码
$ cvs checkout -D 20020501-UTC src
获取某个分支的源码
$ cvs checkout -rnetbsd-1-6 src
有用提示
不要使用cvs -z选项。数据流会同步混乱,导致客户端坏掉,或是导致客户端完全挂掉。额外的负载在服务器上艰难。
如果你想获取一个分支,你也许想希望不覆盖你已有的目录,而是创建新的目录:
$ cd /parent/dir/to/checkout/into
$ mkdir NewName-temp
$ cd NewName-temp
$ cvs checkout ... src
$ mv src ../NewName
$ cd ..
$ rmdir NewName-temp
你需要使用目标目录来使cvs升级正确工作。如果你得到如下的错误:
cvs [update aborted]: could not chdir to gnu/usr.bin/gdb/gdb: Not a directory
你需要做make cleandir并再试一次。确保在cvs升级运行make obj
你可以在你的主目录的.cvsrc文件加上特定的命令,这样将会自动使用它们,一个简单的例子是 .cvsrc
update -dP
checkout -P
diff -u
从源码编译NetBSD
假定在你的机器上有升级的NetBSD二进制快照,并且在/usr/src/有源码。进一步既定你的BSDOBJDIR是/usr/obj。
首先编译应用程序
# mkdir /usr/obj
# cd /usr/src
# ./build.sh -O /usr/obj -D /usr/NetBSD-new-build -T /usr/tools build
# ./build.sh -O /usr/obj -D /usr/NetBSD-new-build -T /usr/tools install=/
当你使用build.sh第一次编译你的系统,会产生一批编译所用的工具。任何编译请求会重用已经编译的工具,就减少了时间。
当然,不要./build.sh install=/ ,除非./build.sh之前已经成功完成否则很肯能最终产生一个不工作的系统。
在CVS升级之后升级应用程序
# cd /usr/src
# ./build.sh -D /usr/NetBSD-new-build -O /usr/obj -T /usr/tools -u build
# ./build.sh -D /usr/NetBSD-new-build -O /usr/obj -T /usr/tools -u install=/
这会在运行系统上安装新的程序-重启以确保它们有效。
如果你频繁的升级你的系统并想直接升级你的运行系统,你可以使用专家模式使用DESTDIR=/编译,例如
# ./build.sh -E -O /usr/obj -T /usr/tools -u build
注意这仅适于专家用户并且你很容易导致的系统不能编译任何东西。仅当你确信编译会成功完成时使用。
以下使用sup的部分没有翻译,跟前面的差不多,不必逐一翻译,可自行参见原文。
为什么会出错?
如果你尝试编译当前版,或是从快照或是早些的当前版,它们无法工作,别荒,试试下列步骤。
1.查阅你所编译版本的UPDATING文件
2.查阅当前用户文档http://mail-index.netbsd.org/current-users/
3.再次升级。有可能问题已经解决,而你的还处于旧的内容。
4.如果上面都失败了,给当前用户列表发封邮件。包括数据,时间,以及你获取当前版所用的方法,还有你所做的一些修改。放进包含出错信息的脚本。
使用etcupdate升级配置和初始文件
etcupdate是个帮助用户比较,升级和安装操作系统升级后新配置/dev,/etc和/root下初始文件的脚本。操作系统升级通过编译源码或是获取发行的二进制文件。
在源码里使用etcupdate
在/etc/src目录下
#etcupdate
如果你的NetBSD源码在别的目录,别担心,使用-s告诉你的源码树目录
# etcupdate -s /home/jdoe/netbsd/src
使用etcupdate升级二进制套件集合
有时候不可能获取源码但是你想升级配置和初始文件。解决办法是获取所需的发行文件并使用-b srcdir选择告诉etcupdate我们不需要源码而只需要官方发行套件。
# mkdir /tmp/temproot
# cd /tmp/temproot
# tar xpzf /some/where/etc.tgz
# etcupdate -s /tmp/temproot
特殊问题
升级到wscons后控制台死掉了
你需要从src/etc相应的etc.port目录复制当前的MAKEDEV到/dev,以单用户引导,然后键入:
# fsck -p
# mount -vt nonfs
# cd /dev
# ./MAKEDEV wscons
为什么build.sh总是重新首先重新编译nbmake?
即使在运行./build.sh tools和使用-u标识或是在etc/mk.conf里指定TOOLDIR,nbmake总是被重新编译。这是正常的。原因就在build.sh里面,在rebuildmake函数里:
# Note that we do NOT try to grovel "mk.conf" here to find out if
# TOOLDIR is set there, because it can contain make variable
# expansions and other stuff only parsable *after* we have a working
# ${toolprefix}make. So this logic can only work if the user has
# pre-set TOOLDIR in the environment or used the -T option to
# build.sh.
#
因此,如果你不想重新编译nbmake,你需要通过-T tooldir或是在环境里设置TOOLDIR变量
跟踪NetBSD-current版
版主: lionux
NetBSD的手册估计是由很多人编写的,是没有OpenBSD的简洁。
尽管你的这个问题由lionux回答可能比较好,不过我的意见是倾向于不去编译当前版,因为源代码总是在变化,你完全有可能编译失败,而且你编译前还需要先升级config——这点很不爽,此外即使你想将当前版的系统组件释放到系统内,可能还会发现你的tar或bzip的版本也需要先升级才行,这个就更令人费解了。
我目前的做法(也是lionux推荐的):
根据NetBSD的手册http://www.netbsd.org/docs/current/,当前版在http://nyftp.NetBSD.org/pub/NetBSD-daily/HEAD/,所以你可以直接下载一个当前版的安装内核,并释放在根目录下,然后用这个安装内核启动,选择升级系统——这里注意,升级选择通过http, 安装路径要选择为安装内核所对应的系统组件路径,升级完成后,重新启动系统就可以了,我这里升级后版本号从5.02变成了5.99.39,我的Geforce 8800GT显卡也是在升级为当前版后才可以正确驱动X的。所以,如果使用发行版或稳定版时系统的硬件有问题,可以试试当前版。
尽管你的这个问题由lionux回答可能比较好,不过我的意见是倾向于不去编译当前版,因为源代码总是在变化,你完全有可能编译失败,而且你编译前还需要先升级config——这点很不爽,此外即使你想将当前版的系统组件释放到系统内,可能还会发现你的tar或bzip的版本也需要先升级才行,这个就更令人费解了。
我目前的做法(也是lionux推荐的):
根据NetBSD的手册http://www.netbsd.org/docs/current/,当前版在http://nyftp.NetBSD.org/pub/NetBSD-daily/HEAD/,所以你可以直接下载一个当前版的安装内核,并释放在根目录下,然后用这个安装内核启动,选择升级系统——这里注意,升级选择通过http, 安装路径要选择为安装内核所对应的系统组件路径,升级完成后,重新启动系统就可以了,我这里升级后版本号从5.02变成了5.99.39,我的Geforce 8800GT显卡也是在升级为当前版后才可以正确驱动X的。所以,如果使用发行版或稳定版时系统的硬件有问题,可以试试当前版。
这不用着急吧,没有就是暂时没有更新,你可以用前几天的,http://nyftp.netbsd.org/pub/NetBSD-dail ... 000Z/i386/
这种方法,不用刻盘,你试试也无妨。——我是没有在这台机器上试过5.1RC,所以不知道驱动程序库与当前版是否一致。
这种方法,不用刻盘,你试试也无妨。——我是没有在这台机器上试过5.1RC,所以不知道驱动程序库与当前版是否一致。
woodelf 写了:很悲剧的没找到i386安装内核……罢了罢了,暂时先不折腾,等新版本出来看看,之前用的5.1RC3也是无法识别网卡。
对NetBSD的ftp结构不是很了解吧,直接给你:D
http://nyftp.netbsd.org/pub/NetBSD-dail ... _FLOPPY.gz
在线用户
正浏览此版面之用户: Ahrefs [Bot] 和 0 访客