LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1150|回复: 2

追踪NetBSD-current

[复制链接]
发表于 2008-3-29 09:50:56 | 显示全部楼层 |阅读模式
追踪NetBSD-current
译者:祁人不开花
E-mail:yixiu0001@gmail.com

  为什么要追踪NetBSD当前版本?
   基于若干原因,NetBSD的开发者已经把NetBSD当前版的源代码向公众提供。总的说来,提供NetBSD-current帮助我们创建稳定,可使用的系统。
    它使得人们使用开发中的NetBSD变得容易。发布当前版的开发代码使得人们看到系统的发展趋势,并且能够联系到他们所实现的特性。
    它也使得用户所做的更改更容易整合。如果用户对当前开发的源码做了修改,那么几乎不需要整合就可放到主源码树。
   它也允许广泛的测试所开发的软件。(开发者)鼓励NetBSD-current的用户提交当前源码的bug报告(http://www.tw.netbsd.org/support ... 发现和清除。
  安装当前快照
   为了快速使用当前版本,从版本引擎产生的快照开始。每个平台的当前状态都可在NetBSD自动编译(http://releng.netbsd.org/cgi-bin ... 和平台查看。
    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/gu ... uild.sh时,包含 -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/ke ... ng_a_current_kernel)
   当内核运行起来时,你应当看一下源码树里的BUILDING文件(ftp://ftp.netbsd.org/pub/NetBSD/ ... 户应用程序。
    当编译一个当前内核,总是记得要包含COMPAT_<lastrelease>选项(例如,COMPAT_16)。因为当前分支来源于最新稳定版,包含了兼容代码,但是仅当这个选项存在时是允许的。作为最低需求,在引导心内核和使用build.sh完成编译之间,你需要这个兼容代码。
   强烈建议使用NetBSD当前版的用户到当前用户邮件列表注册(http://www.tw.netbsd.org/mailing ... /#source-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:anoncvs@anoncvs.NetBSD.org:/cvsroot
    对于sh和ksh或bash2用户
    $CVSROOT=:pserver:anoncvs@anoncvs.NetBSD.org:/cvsroot; export CVSROOT
    3.
    $cd /usr
    $ cvs login    (密码是anoncvs)
   你对于初始化检查的目录必须有写权限;然后你可以改变源码树的所有者。其中一个可能的方法是以root作初始化检查,然后把源码树给别的用户以后使用。
  通过ssh使用anoncvs
    上一块所说的使用anoncvs方法可以使用ssh来确保你所获得源码的完整性。然而这增加了cvs服务器的负担。
    支持ssh连接的镜像服务器显示了所需要的信息。
    一般来说,在cvsroot里移除':pserver:',并设置CVS_RSH为ssh就可以了。
 楼主| 发表于 2008-3-29 09:51:53 | 显示全部楼层
使用anoncvs追踪NetBSD当前

开始

1.只获取内核源码

$ cd /usr

    $ cvs checkout -P src/sys

这给你/usr/src/sys下的内核源码。这里有个如何编译内核的信息http://www.tw.netbsd.org/docs/kernel/#how_to_build_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的部分没有翻译,跟前面的差不多,不必逐一翻译,可自行参见原文。

...............................................
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-29 09:52:50 | 显示全部楼层
为什么会出错?

如果你尝试编译当前版,或是从快照或是早些的当前版,它们无法工作,别荒,试试下列步骤。

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变量
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表