分页: 1 / 1

跟踪NetBSD-current版

发表于 : 2010-09-22 19:40
lionux
来源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变量

发表于 : 2010-09-23 17:55
woodelf
这个……是官方手册的翻译版本?我之前尝试了一下,按照官方手册编译CURRENT的源代码树会失败,而且不知道官方手册怎么维护的,前后内容都有不一致。不知道NetBSD源代码树能不能像OpenBSD那样编译。

发表于 : 2010-09-23 21:09
leo
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的。所以,如果使用发行版或稳定版时系统的硬件有问题,可以试试当前版。

发表于 : 2010-09-23 21:29
lionux
woodelf 写了:这个……是官方手册的翻译版本?我之前尝试了一下,按照官方手册编译CURRENT的源代码树会失败,而且不知道官方手册怎么维护的,前后内容都有不一致。不知道NetBSD源代码树能不能像OpenBSD那样编译。

具体怎么做的,到那步出的错?我编译过很多次,出过错但都能解决的,而且变动不大的话编译还很快,不是所有的都重新编译,需要重新编译会有提示,总的来说比较好维护的。
leo说的快照可能是NetBSD现在提倡的,官网的doc写的就是装快照,以前记得是介绍编译。

发表于 : 2010-09-23 21:31
woodelf
很悲剧的没找到i386安装内核……罢了罢了,暂时先不折腾,等新版本出来看看,之前用的5.1RC3也是无法识别网卡。

发表于 : 2010-09-23 21:37
leo
这不用着急吧,没有就是暂时没有更新,你可以用前几天的,http://nyftp.netbsd.org/pub/NetBSD-dail ... 000Z/i386/
这种方法,不用刻盘,你试试也无妨。——我是没有在这台机器上试过5.1RC,所以不知道驱动程序库与当前版是否一致。

发表于 : 2010-09-23 21:55
lionux
woodelf 写了:很悲剧的没找到i386安装内核……罢了罢了,暂时先不折腾,等新版本出来看看,之前用的5.1RC3也是无法识别网卡。

对NetBSD的ftp结构不是很了解吧,直接给你:D
http://nyftp.netbsd.org/pub/NetBSD-dail ... _FLOPPY.gz

发表于 : 2010-09-23 22:06
leo
你不用最简单的方法出一个升级为当前版的教程,还从外面转载一些更复杂的方法来“迷惑”人。;)

发表于 : 2010-09-23 22:35
lionux
我也是根据这个方法做的,分三步
$./build.sh -O ../obj -T ../tools -U -u tools
$./build.sh -O ../obj -T ../tools -U -u kernel=GENERIC
$./build.sh -O ../obj -T ../tools -U -u distribution
这是以前官网doc的翻译。那位作者是高手,在pda上装过NetBSD。
内核用上面前两步方法编译成功率高,比如发行版升级到当前。内核有修改的话GENERIC换成自己的名字。