川の流れのように‥(Eiji Ota's Weblog)

火曜日 9 06, 2005

OpenSolaris事始め(その2:カーネルビルド)

OpenSolaris事始め(その2:カーネルビルド)

OpenSolaris事始め(その2:カーネルビルド)


前回、OpenSolarisを僕のToshibaのノートにインストールしてLinuxを吹っ飛ばしてしまっったお話をしましたが、それを会社の人に話をしたら色々と反応が返ってきました。

たとえば、「Windowsの代わりにOpenSolarisをインストールしようとしたんだって? それはWindowsのたたりに決まってるだろう? Windowsっていうのはそれができるんだ。」
 (どうやってできるの...って結局聞けませんでしたけれど(^^;))

また、「それはよい経験だったね。バグだったら、こいつは貴重な体験だろう?、まずは再現させてみることだ。是非もう一度トライするべきだ、そう思うだろう?」
(だから、それは僕のパーソナルユースなので...と思いましたが、言っても無駄そうでした(^.^))

人それぞれですねぇ。。。僕のLinuxなんて、そう、誰も気にしていませんでした。(^-^;)

今はディストリビューションが様々あるLinuxくんですけど、以前はYggdrasilぐらいしかなかったんですよねぇ。もちろんRed Hatの前のディストリビューションですけれど、秋葉原のガード下に輸入もののYggdrasilを売っていて、それを買いにいったものでした。(追記(09/06): そういえば、slackwareもあった気もします。でも、Yggdrasilの方が好きでした...^-^)

その当時のLinuxは、アプリケーションをインストールするには、ソースからコンパイルするのが当たり前のような感覚でしたけれど、OpenSolarisくんをいじっていると、そんな頃のLinuxくんを思い出すようで、不思議と懐かしい気分が....ということで、ついつい、今までLinuxくんでやっていたのをOpenSolarisくんで....と思うようになりました。(^v^)

それでもって今日は前回の続きで、OpenSolarisのソースビルドの話です。kernelの実装の方もちょっとやりたいんですけど、乗りかかった船、ある程度までいってしまいましょう。(^.^;)

ここでは、ReleaseNotesにあるやり方ではなくて、カーネルとドライバのビルドに絞ったやり方を紹介します。
えーと、前回は確かソースとコンパイラ一式をダウンロードしたところでしたよね。
  1. 1.SUNWonbld-yyyymmdd.i386.tar.bz2
  2. 2.opensolaris-bfu-yyyymmdd.i386.tar.bz2
  3. 3.opensolaris-closed-bins-yyyymmdd.i386.tar.bz2
  4. 4.opensolaris-src-yyyymmdd.tar.bz2

  5. (yyyy=年, mm=月, dd=日)
それでは、今回はその続きから....
  1. 1. アーカイブを展開する これらを適当なディレクトリの下に展開してもらうのが第一歩です。一応ここでは、 /opensolarisの下に展開する...ということにしましょう。
    bz2でtarが圧縮されているファイルは、次のようにbzip2とtarをパイプでつないでも いいですし、

    • # bzip2 -dc xxxxx.bz2 | tar xvf -

    gtarが入っていれば、直接実行してもかまいません。gtarはSUNWgtarをインストール すればおとされます。フルでインストールしていれば、gtarはあるはずです。

    • # gtar -xvfj xxxxx.bz2

    SUNWonbld-yyyymmdd.i386.tar.bz2の方は、SVR4パッケージ形式なので、改めて pkgaddする必要があります。

    • # pkgadd -d onbld SUNWonbld

    pkgaddしたら、onbldはもう要らないので消してしまいましょう。

    • # \rm -rf onbld

  2. 2. パスを設定する
    展開が終わったら、/opt/onbld/binと/opt/SUNWspro/binをPATH環境変数に加えます。
    /opt/SUNWspro/binはコンパイラをインストールするとできるディレクトリです。
    (コンパイラは、http://opensolaris.org/os/community/tools/sun_studio_tools/からダウンロードします)
    {t}cshであれば、.cshrcに

    • set path = (/opt/onbld/bin /opt/SUNWspro/bin ... (残り))

    {ba}shであれば、.profileに

    • PATH=/opt/onbld/bin:/opt/SUNWspro/bin:(残り); export PATH

    などとやるわけですね。(皆さんご承知だとは思うのでくどかったですね(^-^;))

    ※/usr/ucbはPATHから削るか一番最後に指定するようにという注意があります。

  3. 3. opensolaris.shを準備する
    opensolaris.shを今展開してできたusr/src/tools/envからもってきます。
    • # cp usr/src/tools/env/opensolaris.sh .
    そして、この中にある変数をいくつか修正しないといけません。

    必須なのは、GATE,CODEMGR_WSです。STAFFERやVERSIONは必要に応じて設定します。(STAFFERは、ビルドが終わったら(またはアボートしたら)メールするo送付先で、VERSIONは作ったカーネルでブートしたときにuname -vすると出てくる名前です)
    上の例の場合は、こんな感じになるかな。
    • GATE=opensolaris; export GATE
    • CODEMGR_WS="/$GATE"; export CODEMGR_WS
    • STAFFER=<自分のアカウント>; export STAFFER
    VERSIONはデフォルトで$GATE名になるので(この場合"opensolaris")、 特に変更しなくても良さそうですね。

    さて、ここまでは、ReleaseNotesに載っているのですが、以降はちょっと異なります。(^0^)

  4. 4. ソースのタグを用意する ソースを読むのに必要なのは、まずはタグファイルでしょうか?
    cscopeとctagsはやっぱり何はともあれ作ってしまいたいもの。
    ところが、何もせずにタグファイルを作ろうとすると次のように怒られてしまいます。何が足りないのでしょうか?

    • # bldenv -d opensolaris.sh
    • # cd /opensolaris/usr/src/uts
    • # make cscope.out /opensolaris/usr/src/tools/proto/opt/onbld/bin/xref -x cscope.out
      sh: /opensolaris/usr/src/tools/proto/opt/onbld/bin/xref: not found
      *** Error code 1
      make: Fatal error: Command failed for target `cscope.out'
      Current working directory /opensolaris/usr/src/uts

    どうやら、xrefというツールがないらしいですね。まずこれを"作る"必要があります。 それには、

    • # cd /opensolaris/usr/src/tools
    • # make

    としてやるだけです。これが終われば、必要なツールができていますので、改めて

    • # cd /opensolaris/usr/src/uts
    • # make cscope.out

    としてやりましょう。

    ctagsは、同じディレクトリで、

    • # make tags

    としてやるだけです。簡単ですね。

    ※ makeの代わりにdmakeとすると4つ(デフォルト)のmakeを起動します。

  5. 5. カーネルとドライバのビルド
    さていよいよ待ちにまった?カーネルとドライバのビルドです。^-^
    全ソースをビルドするには、次のようにnightlyコマンドを起動してやればいいのですが、何せコマンド、ライブラリーまでビルドするので時間がかかります。

    (追記 (09/09))
    nightlyの使用例が抜けていました。(^^)

    # nightly ./opensolaris.sh & (nightlyの起動)
    # tail -f log/nightly.log (logの表示)

    Defaultのnightlyは、clobber (make clobber)ビルドですが、-iオプションを使うことで回避が可能です。
    # nightly -i ./opensolaris.sh & (-iオプション付き)
    また、上のログファイルはnightly終了後にlog/log. (mm=月, dd=日)に移されます。実行中は上のように
    logの下に直接置かれます。
    (追記終わり)

    そこまでやる必要はないので、ここでは時間を節約したカーネルとドライバのみのビルドについて説明したいと思います。

    その前に、AMD64向けでなければ、32bitカーネルとドライバだけ必要ですから、64bitのビルドははしょることにしましょう。デフォルトでは、64bitと32bitの双方をビルドしていしまいます。

    そのために、Makefileを2ついじることにします。

    • # cd usr/src
    • # vi Makefile.master
      i386_BUILD64=
      ↓ (次のように変更
      i386_BUILD64= $(POUND_SIGN)

    • # cd usr/src/uts
    • # vi Makefile.uts
      $(NOT_RELEASE_BUILD)DEF_BUILDS64 = debug64
      ↓ (次のように変更
      $(NOT_RELEASE_BUILD)DEF_BUILDS64 =

      LINT64_BUILDS = debug64
      ↓ (次のように変更
      LINT64_BUILDS =

      OBJS_DIR_DBG64 = debug64
      ↓ (次のように変更
      OBJS_DIR_DBG64 =

    次にヘッダーファイルをprotoツリーにコピーさせます。

    • # cd usr/src/uts
    • # dmake -e install_h

    これでビルドの準備は終了です。カーネルとドライバをビルドするには、

    • # cd usr/src/uts
    • # dmake -e
    • # dmake install

    としてやれば、カーネルと全ドライバをビルドしてくれます。

  6. 6. 作成したカーネルとドライバをシステムにインストールする
    無事にカーネルとドライバがビルドできたら、これをシステムにインストールします。
    それには、やっぱりbfuコマンドを使うのがよいでしょう。でもそのためには、bfuで 使用するアーカイブを作成する必要があります。それには、makebfuコマンドを使って やります。

    (追記(09/07))
    makebfuコマンドを起動するには、/opt/onbld/bin/i386にPATHが通っている ことが必要です。そうしないと、
    /opt/onbld/bin/mkbfu[5]: cpiotranslate: not found
    と怒られてしまいます。次のように起動前にパスを通してくださいね。

    # setenv PATH /opt/onbld/bin/i386:$PATH ({t}csh)
    # PATH=/opt/onbld/bin/i386:$PATH; export PATH ({k}sh)

    また、makebfuの第一引数には、xxxxx/proto/root_i386とprotoディレクトリの下の root_i386まで指定する必要があります。
    当初はタイポがあり、protoまでしか記述されていませんでした。ご注意ください。
    (追記終わり)

    • # cd /opensolaris
    • # makebfu -b /opensolaris/proto /opensolaris/opensolaris.sh
    • # makebfu -b /opensolaris/proto/root_i386 /opensolaris/opensolaris.sh
      すると、コマンドやライブラリがないので次のように怒られますが、無視してしまい ましょう。(^.^;)

      Copying /opensolaris/proto/root_i386 to /tmp/bfu101682...
      Copying /opensolaris/proto/root_i386 to /tmp/bfu101682...
      Making compressed archives from /tmp/bfu101682 in /opensolaris/archives/i386/nightly.
      Creating generic kernel archive: 33920 blocks
      Creating generic lib archive: 10 blocks
      Creating generic root archive: 100 blocks
      Failed to create generic sbin archive: 10 blocks
      find: illegal option -- d
      find: [-H | -L] path-list predicate-list
      Creating generic usr archive: 2640 blocks
      Creating i86pc boot archive: 660 blocks
      Creating i86pc root archive: 2500 blocks
      Creating i86pc usr archive: 10 blocks
      Creating conflict resolution archive: 590 blocks

    アーカイブはarchiveディレクトリの下に置かれるはずです。一応、確かめておき ましょうね。

    % find archives/i386/
    archives/i386/
    archives/i386/nightly
    archives/i386/nightly/conflict_resolution.gz
    archives/i386/nightly/generic.root.gz
    archives/i386/nightly/generic.usr.gz
    archives/i386/nightly/generic.lib.gz
    archives/i386/nightly/i86pc.usr.gz
    archives/i386/nightly/generic.sbin.gz
    archives/i386/nightly/i86pc.boot.gz
    archives/i386/nightly/generic.kernel.gz
    archives/i386/nightly/i86pc.root.gz

    後はこのアーカイブをbfuでインストールするだけ....なんですが、ここでちょっと 待った。

    ソースは最新版(08/18日版)ですよね? Solaris Expressはその版のもの ですか? それが異なると、不整合がおきて立ち上がりませんね。(--;)

    そこで、ダウンロードしたbfuアーカイブをまずシステムに適用しておきます。
    最新のもの(8/18日版)であれば、archives-20050818というディレクトリに置かれて いるはずです。これをまずbfuでシステムに適用しましょう。

    archives-20050818/i386/
    archives-20050818/i386/conflict_resolution.gz
    archives-20050818/i386/generic.usr
    archives-20050818/i386/generic.root
    archives-20050818/i386/generic.lib
    archives-20050818/i386/generic.sbin
    archives-20050818/i386/i86pc.root
    archives-20050818/i386/i86pc.usr
    archives-20050818/i386/generic.kernel
    archives-20050818/i386/i86pc.boot
    archives-20050818/BINARYLICENSE.BFU-ARCHIVES.txt
    archives-20050818/README.BFU-ARCHIVES.i386
    archives-20050818/THIRDPARTYLICENSE.BFU-ARCHIVES

    • # bfu /opensolaris/archives-20050818/i386
      注意としては、bfuの引数は絶対パスであること。
      そして、bfuする前に、 bldenv -d /opensolaris/opensolaris.shを実行していることでしょうか?

    bfuが終わったら、念のためacrを実行します。そしてリブートです。

    • # acr
      No conflicts to resolve.
    • # reboot

    ※ このacrコマンドは、僕はopensolarisがリリースされるまで知りませんでした。
    こんな便利なコマンドがあったとは...と絶句したのですが(それまでは、マニュアルでconflictを解決していたので)、このコマンドはNevadaリリース(opensolarisのベース)で誕生したコマンドのようです。以前のSolaris10, Solaris9などでは存在していなかったニューフェースでした。^-^

    さて、無事リブートが終わったら(配布されているアーカイブなので、問題はないはず)、先ほど作ったカーネルとドライバをインストールします。

    • # bldenv -d /opensolaris/opensolaris.sh
    • # bfu /opensolaris/archives/i386/nightly
    • # acr

    そしてリブートです。ソースに何か変なことをしていなければ、すんなりと立ち上がるはずです。(^^)

    • # reboot

※ 万が一ブートしなかったら、grubメニューでfail safeを選び、配布されているアーカイブをもう一度適用しましょう。基本的には、
  1. 1. fail safeで立ち上げる
  2. 2. ルートをmountする
  3. 3. swapを追加する ← 仮想メモリが足りなくなると困るから...
  4. 4. bfuをマウントしたディレクトリに適用する (-Rオプションで指定します-Rオプションはbootadmの方でした。ルートディレクトリは第二引数に指定します(^-^;))
  5. 5. rebootする
という作業になります。(まず、必要ないと思いますけど、念のため)

(追記(09/08))
上(↑)でさらって書いてしまっていますが、老婆心からもう少し詳細な手順を書いておくことにします。
  1. 1. grubのメニューでfail safeを選ぶ
  2. 2. パーティッションをマウントする
    fail safeで立ち上げると、次のようなメッセージが出力され応答を促されます。
    Searching for installed OS...
    /dev/dsk/c0d0s0 -- Solaris11 nv_17 x86
    Do you wish to automatically uupdate boot archives? [y,n,?]n
    目的はシステムの復旧なので、ここでは"n"と応えておきましょう。
    ここで表示されるパーティッションの論理パス名を使ってマウントします。ここの例だと、
    /dev/dsk/c0d0s0がシステムボリュームなので、
    # mount /dev/dsk/c0d0s0 /mnt
    とします。
  3. 3. swapを追加します
    # swap -a /dev/dsk/c0d0s1などとします。swap -lでちゃんとスワップが追加されているか確認できます。
    # swap -l (確認)
  4. 4. bldenvを実行します (bfuを実行するため)
    # /mnt/opt/onbld/bin/bldenv -d /mnt/xxxxx/opensolaris.sh
    (全て、マウントしたシステムボリュームにあることに注意してください)
  5. 5. PATHを通します
    # PATH=/mnt/opt/onbld/bin:$PATH; export PATH
  6. 6. FASTFS, BFULD環境変数を設定します
    # FASTFS=/mnt/opt/onbld/bin/i386/fastfs; export FASTFS
    # BFULD=/mnt/opt/onbld/bin/i386/bfuld; export BFULD
  7. 7. bfuを配布されたbfuアーカイブに適用します
    # bfu /mnt/xxxxx/archives-20050818/i386 /mnt
    ワーニングが色々とでますが、非常事態のオペレーションなので目をつぶりましょう...(^-^)
acrなどがちゃんと動作せず、全て上書きされてしまうことを想定して、予め更新したシステムファイルの
バックアップを取っておく
ことをお奨めします。
何かあった時に上書きされてしまうファイルの例としては、/boot/grub/menu.lst, /etc/hosts, /etc/passwd,
/etc/shadow, /etc/default/login, /etc/system, /etc/vfstabなどがあります。
ブートに必要なもので変更されているものは、システムボリュームのどこかに保存しておくといいと思います。

また、fail safeが動作しない場合(って本当に想定外ですが...-_-)、インストールCD (CD1)で立ち上げて、
ここで説明した手順を行うこともできます。

まず必要ないと思う手順ですが、もしもの時に必要かも知れません。開発作業中は、想定しないことが
まま起こるものです(こういう時は、開発者は持てる力を出して復旧するのですが....結構大変っ ていうのが実感です...特に時間がない状況だと... ^.^;)
そんなこともあり、こういう手順を知っておいて 損はしないと思います。ただ、力業であることはご承知おき下さい。^-^
(追記終わり)

画像(↓)は、gvimとcscopeを使ってソースを見ているところです。これでOpenSolarisをハックするのに必要な環境ができあがったことになりますね。(^^)


Technorati Tag: OpenSolaris
Technorati Tag: Kernel Build
Technorati Tag: Solaris

Calendar

Feeds

Search

Links

Navigation

Referrers