和所有的开源软件一样,你可以从网络上下载OpenSolaris的源代码,然后根据自己的需求对源代码进行修改,并使用编译工具将源代码编译成可以update系统的archive文件,然后对系统进行update。下面介绍如何下载源代码,建立编译环境,以及如何编译和更新系统。本文认为读者已经安装了最新的Neveda(onnv_b71)。具体安装过程,参见“Solaris系统安装指南”
可以从下面的website下载各种版本的OpenSolaris源代码。
http://dlc.sun.com/osol/on/downloads/
对于在x86平台上的编译,需要下载如下文件:
ON Source – OpenSolaris系统的源代码文件包
ON Specific Build Tools - 编译OpenSolaris系统的一些辅助工具
ON Binary-Only Components - OpenSolaris中尚未开源的部分,通过二进制文件的方式进行发布,这里包含debug或none-debug两种,可以根据实际情况选择其一。
OpenSolaris使用Mercurial(http://www.genunix.org/wiki/index.php/Mercurial)作为源代码的管理工具,所以可以通过hg命令,从OpenSolaris的源代码库里面获得最新的源代码。
首先,需要建立Socks Tunnel:
# cat ~/.ssh/config
Host *.opensolaris.org
ProxyCommand /usr/lib/ssh/ssh-socks5-proxy-connect -h proxy02.xx.xxxxx.com %h %p
Compression yes
从OpenSolaris的源代码库中获取源代码:
bash-3.00# hg clone ssh://[email protected]/hg/onnv/onnv-gate
bash-3.00# cd onnv-gate
bash-3.00# hg tip
changeset: 4896:ff3edba9ce8c
tag: tip
user: jw149990
date: Sun Aug 19 18:53:09 2007 -0700
summary: 6594084 fixing of 6591973 could cause system panic.
bash-3.00# hg tags
tip 4896:ff3edba9ce8c
onnv_71 4814:57cc010c0779
onnv_70 4709:dc10a713d1a0
onnv_69 4621:77407f8b6bb2
onnv_68 4541:62ca1e3cb5d3
...lots of display...
bash-3.00# hg update -C onnv_71
544 files updated, 0 files merged, 2011 files removed, 0 files unresolved
hug update只是针对本地的数据库,要使本地使用最新的源代码目录树,使用如下命令:
bash-3.00# hg pull -u
Hg仅仅下载或更新了OpenSolaris的源代码,仍然需要到上面的网站上下载closed binary和onbld工具。
在x86平台上推荐使用SunStudio作为OpenSolaris的编译器。OpenSolaris上最新的SunStudio的版本为12,但OpenSolaris的编译暂时并未很好的支持12,所以需要使用SunStudio 11。OpenSolaris Express Develop Edition默认安装了SunStudio 12,可以将SunStudio12卸载掉,然后重新安装SunStudio11,但笔者经过几次试验后,发现卸载SunStudio 12并不能完全卸干净,所以暂时推荐不要安装Develop Edition,而是安装Solaris Express。Solaris Express没有默认安装SunStudio,需要到网站上下载SunStudio 11。下载SunStudio 11的入口地址为:
http://www.opensolaris.org/os/community/tools/sun_studio_tools/sun_studio_11_tools/
目前该网站上只提供binary形式的SunStudio,package形式将在以后release。安装binary形式的SunStudio:
l 下载sunstudio11-ii-20070202-sol-x86.tar.bz2文件到本地,比如/var/tmp
l bash-3.00# cd /opt
l bash-3.00# bzcat /var/tmp/ sunstudio11-ii-20070202-sol-x86.tar.bz2 | /bin/tar -xf –
l 设置shell的环境变量,如何使用csh
% setenv PATH [installpath]/bin:$PATH
% setenv MANPATH [installpath]/man:$MANPATH
如果使用sh,bash,ksh
$ PATH=[installpath]/bin:$PATH ; export PATH
$ MANPATH=[installpath]/man:$MANPATH ; export MANPATH
当然你可以将环境变量的设置放在~/.bash_profile中,这样每次用户登陆时,环境变量的设置都自动完成。
Onbld的安装文件已经在上面的步骤中下载了,也可以直接到http://dlc.sun.com/osol/on/downloads/current/ 下载。下面安装该工具:
# cd /export/home/fs1
# bzcat SUNWonbld.i386.tar.bz2 | tar xf –
# pkgadd –d onbld
Onbld工具安装在/opt/onbld目录下。更改PATH变量,使/opt/onbld/bin包含其中:
# export PATH=$PATH:/opt/onbld/bin
如前所说,OpenSolaris系统中没有开源的部分通过close binary的方式发布,可以在http://dlc.sun.com/osol/on/downloads/current/上下载最新的close binary文件。close binary文件分为debug和non-debug两种版本,默认我们安装debug版本,使用不同版本的close binary文件,编译参数会有所不同,详细内容在下面会有描述。
# cd /export/onnv-gate
# bzcat /export/home/fs1/on-closed-bins.i386.tar.bz2 | tar xf –
Close binary被解压缩在closed目录下。
# cd onnv-gate
# cp usr/src/tools/env/opensolaris.sh .
# vi opensolaris.sh
绝大部分的环境变量的设置是不需要改变的,除了下面这些:
GATE=onnv-gate; export GATE
CODEMGR_WS="/export/home/araj/work/b59/$GATE"; export CODEMGR_WS
STAFFER="my_idsid"; export STAFFER
VERSION="$GATE-$STAFFER";export VERSION
对于每个环境变量,opensolaris.sh文件中都做了详细的注释。默认的环境变量设置为编译debug版本的系统,对于non-debug版本(对应的close binary文件为on-closed-bins-nd.i386.tar.bz2),需要去除-F, -D标志。详细参见opensolaris.sh中的注释。
变量MAKEFLAGS=k,表明nightly将尽可能的做(编译)更多,直到遇到比较致命的错误导致编译无法进行;而如果没有k这个参数,则make一旦遇到问题,就会停止下来。一般在开发过程中,我们不需要k选项,这样可以很快定位到发生问题的地方。
Nightly会编译整个OpenSolaris系统,并生成可以BFU系统的archives文件。一般刚刚check out完源码或在check in源码之前,都需要使用nightly进行一次编译,以保证源码的统一性。Nightly需要很长时间来完成编译,在笔者的core 2 3.0G系统上(2G内存)大概需要2个多小时。
# cd onnv-gate
# nightly opensolaris.sh &
# tail –f log/nightly.log
Nightly的输出文件被定向到log/nightly.log中,通过tail命令可以查看nightly的输出。
上面我们直接从网上下载并安装了onbld工具,下面我们用最新的源代码来编译和安装该工具:
[osol@onnv-gate] bldenv -d opensolaris.sh
Build type is DEBUG
RELEASE is
VERSION is onnv-gate
RELEASE_DATE is
The top-level 'setup' target is available to build headers and tools.
Using /bin/bash as shell.
[osol@onnv-gate] cd usr/src/tools
[osol@onnv-gate] dmake install
.... lots of spew...
[osol@onnv-gate] exit
[osol@onnv-gate] bldenv -t -d opensolaris.sh
运行bldenv后,一个新的shell会被fork出来,并在新的shell中应用opensolaris.sh中的环境变量,所以需要先通过exit退出,然后重新使用bldenv生成一个新的shell,然后编译其他部分的代码。编译完的onbld存放在usr/src/tools/proto/opt/onbld目录下。
编译完后,也可以更改opensolaris.sh中的环境变量ONBLD_TOOLS,使onbld的目录指向usr/src/tools/proto/opt/onbld/目录。
Bldenv有几个重要的参数:
-d: 建立可debug builds,默认的为non-debug builds。
-t: 创建使用usr/src/tools目录下工具的环境,上面的命令中就是使用该参数使新编译的onbld生效。
OpenSolaris内核源代码存放在usr/src/uts目录下,和编译onbld tools一样,首先需要使用bldenv创建一个使用适当参数的shell:
# cd /export/onnv-gate
# bldenv –d opensolaris.sh
# cd usr/src/uts
# dmake all
内核编译的make有很多有用的target:
def:default编译
all:编译所有
install:安装内核
install_h:安装内核头文件
clean:删除编译产生的obj文件
clobber:相当于Linux内核编译的mrprober,让内核源代码回到最初状态
modlist:list modules
lint:查看代码中是否有危险性的代码,比如指针没有赋值就使用,等等。
有两种方法来安装刚才编译好的内核,其一:
# dmake install
这种方法将生成的所有内核所需要的文件存放在onnv-gate/proto/root_i386下:
另一种方法:
bash-3.00# Install -G kernel.foo -k i86pc
或
bash-3.00# Install -G kernel.foo -k i86pc –o obj
来编译一个non-debug版本的内核。该命令在/tmp/Install.root/下创建一个Install.i86pc.tar文件,包含了编译结果。在根目录下解压缩Install.i86pc.tar文件,并修改/boot/grub/menu.list,加上新编译的内核的boot项:
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris Express Community Edition snv_69 X86
kernel$ /platform/i86pc/kernel/$ISADIR/unix
module$ /platform/i86pc/$ISADIR/boot_archive
#---------------------END BOOTADM--------------------
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris failsafe
kernel /boot/platform/i86pc/kernel/unix -s
module /boot/x86.miniroot-safe
#---------------------END BOOTADM--------------------
#---------- ADDED BY Cap-Eye-Install------- ----------
title kernel.foo
kernel$ /platform/i86pc/kernel.foo/$ISADIR/unix
module$ /platform/i86pc/$ISADIR/boot_archive
#---------------------END BOOTADM--------------------
运行:
# bootadm update-archive
# reboot
Reboot会自动运行bootadm,如果bootadm没有被运行的话。
$ cd
$ bldenv opensolaris.sh
$ cd usr/src
$ make setup #setup the development environment
$ make uts #build kernel
$ cd pkgdefs; make all #pkgdefs
$ cd lib; make install #lib
$ cd cmd; make all #cmd
$ cd ucblib; make install #ucblib
$ cd ucbcmd; make all #ucbcmd
待续。。。 。。。