CVSup で最新の STABLE を追いかける


多くのオープンソースソフトウェアと同様、FreeBSD も開発バージョンと安定バージョンという 2 系統の枝に分かれて開発が進められています。 開発バージョンの最先端を CURRENT、安定バージョンの最先端を STABLE と呼びます。 現時点での CURRENT は 5-CURRENT、STABLE は 4.6-STABLE です。

FreeBSD ユーザは RELEASE 版をインストールするだけではなく、 CVSup という仕組みを利用して、任意のバージョンのソースコードを簡単に取り寄せることができます。 また、そのソースコードを元にカーネル、ユーザランドを全 make することで、 任意のバージョンの FreeBSD 環境を構築することが可能です。

最新の安定性を求めるなら、定期的に STABLE のソースコードを CVSup で取り寄せ、 全 make を行うことで、システムを常に最新の STABLE に保つことが可能です。

ここでは CVSup を利用して、システムを最新の STABLE にアップデートする手順を紹介します。 FreeBSD 4.6-RELEASE をベースに説明を進めますが、他のバージョンにおいても大した差分は無いでしょう。

基本的に付属のハンドブックにしたがって作業を進めるのが確実です。 FreeBSD には日本語化されたハンドブックが付属するので、 必要に応じてハンドブックを参照すると良いでしょう。 日本語版のハンドブックは /usr/share/doc/ja/books/handbook 配下に格納されています。 index.html から辿れるので w3m 等テキストベースのブラウザを使ってハンドブックを参照しながら作業を進めるのが確実です。


  # cd /usr/share/doc/ja/books/handbook
  # w3m ./index.html

CVSup の使い方に関しては『III.付録』の『A.6. CVSup を使う』を参照してください。 取り寄せたソースから先端の FreeBSD 環境を構築 (build) する手順に関しては 『19. 開発の最前線』の『19.4. make world の利用』を参照してください。

なお、最新のハンドブックの日本語役が以下の Web で参照できますので、 こちらも活用してください。

  FreeBSD ハンドブック
  http://www.jp.FreeBSD.org/www.FreeBSD.org/ja/handbook/

以下、僕の作業手順を紹介します。

1. cvsup をインストールする

まず cvsup を使えるようにしなければなりません。ports/packages を利用してインストールします。 ports を使う場合は net/cvsup で make install します。


  # cd /usr/ports/net/cvsup
  # make install

packages を使う場合は net/cvsup をインストールしてください。 現時点での最新版は cvsup-16.1f のようです。 cvsup を ports から make するの比較的時間がかかりますので、packages でバイナリをインストールしてしまった方が手軽でしょう。

以下のようにインストールされていることを確認できます。


  # pkg_info |fgrep cvsup
  cvsup-16.1f         General network file distribution system optimized for CVS

2. supfile を用意する

cvsup のインストールが完了したら、cvsup を使う際の supfile を用意します。 supfile とは cvsup を実行する際の設定を記述したファイル。 /usr/share/examples/cvsup/4.x-stable-supfile というサンプルが用意されているので、 これをベースに自分用に修正すると良いでしょう。

注) 4.5-RELEASE までは上記サンプルが存在したのですが、 4.6-RELEASE では用意されていないようです。これが僕の環境のみの問題なのかはまだ調べていません。

2002/07/11 追記 ソースを展開している場合は /usr/src/share/examples/cvsup の下にサンプルがあるのでそちらを参考にしてください。

cvsup の作業用ディレクトリを作成し、そこに supfile を作成します。 ハンドブックの例にしたがって /usr/local/etc/cvsup を作業ディレクトリにします。


  # mkdir /usr/local/etc/cvsup
  # cd /usr/local/etc/cvsup
  # vi src-supfile

supfile の書き方に付いてはハンドブックの『A.6.3 CVSup のコンフィグレーション』 に詳しく記述されているので、そちらを参照してください。

僕の supfile は以下のようになっています。


  *default host=cvsup.xxx.xxx.jp
  *default base=/usr/local/etc/cvsup
  *default prefix=/usr
  *default release=cvs tag=RELENG_4
  *default delete use-rel-suffix
  *default compress
  src-all

注) 上記はコメント文を省いた有効な行のみを抜粋してあります。

*default host には CVSup サーバを指定します。 日本国内の場合は cvsup.jp.freebsd.org などからソースを取り寄せられます。 僕の場合は、社内にボランティアで CVSup サーバを立ててくださっている方がいるので、 そこを指定しています。

*default prefix はソースを展開するディレクトリを指定します。 FreeBSD インストール時にソースを展開した場合 /usr/src 配下にソースが展開されていますが、 *default prefix/usr を指定した場合は、これを上書きする形になります。 CVSup サーバから取り寄せたソースが /usr/src に展開されます。

*default release には取り寄せたい cvs のタグを指定します。 4.x の先端を取り寄せるには cvs tag=RELENG_4 を指定します。

最後の src-all は全てのソースを取り寄せることを意味します。 ソースコードはいくつかのカテゴリに分類されていて、必要な物を個別に指定可能ですが (src-base, src-bin, src-sys 等) src-all を指定しておけば全ソースを取り寄せます。

3. cvsup を実行しソースを取り寄せる

supfile が用意できたら、cvsup コマンドを実行し、CVSup サーバから最新のソースを取り寄せます。 コマンドは supfile を作成したディレクトリで実行します。 僕の場合は /usr/local/etc/cvsup になります。 引数で作成した supfile を指定します。この例では src-supfile です。


  # cd /usr/local/etc/cvsup
  # cvsup src-supfile

上記のように cvsup を実行すると GUI ベースのツールが起動しますので、 『GO』と書かれたボタンを押すことでソースの更新が開始されます。

X を利用しない場合は


  # cvsup -g -L 2 src-supfile
と実行します。この場合はその時点でソースの更新が開始されます。 僕はいつもこちらを利用しています。

CVSup によるソースの取得にかかる時間は、その時点のソースの状況、 ネットワークの状況によって変わります。気長に待ちましょう。

4. /etc/make.conf の作成

ソースの更新が完了したら、全 make を行う準備をします。 まずは /usr/src/UPDATING を読んで、取り寄せたソースによってどのような更新が成されているかを確認しておきましょう。

続いて /etc/make.conf を作成します。/etc/make.conf はデフォルトでは用意されていませんので、 /etc/defaults/make.conf を参考に、自分の必要なオプションを記述しておきます。

僕の場合は以下のようになっています。


  CPUTYPE=i686
  CFLAGS=     -O -pipe
  NO_BIND=    true
  NO_FORTRAN= true
  NO_SENDMAIL=true
  NOGAMES=    true
  NOINFO=     true
  NOUUCP=     true
  USA_RESIDENT=    NO

DNS サーバを動かさないので NO_BIND=true にしています。 また、SMTP サーバは Postfix を使っているので、sendmail を作成し直す必要がないため NO_SENDMAIL=true にしています。

通常は CPUTYPE と CFLAGS ぐらいを指定しておけば良いでしょう。

注) 上記は STABLE を構築するための部分のみを抜粋したもので、 実際には ports を make するための定義も記述してあります。 XFREE86_VERSION とか MASTER_SITE_BACKUP? とか FETCH_ENV などを ports のために記述しています。

5. ユーザランドの構築

いよいよコンパイルを開始します。 出来るだけ時間を短縮するためにシングルユーザモードで作業を進めます。

シングルユーザモードに移行するには


  # shutdown now

を実行します。

シングルユーザモードに移行したら、まずは、 ユーザランド(ユーザ空間)のみを全 make します。make を実行するディレクトリは /usr/src です。


  # cd /usr/src
  # make -j4 buildworld

-j オプションによって、同時にいくつのプロセスを起動するかを指定します。 マルチ CPU マシンの場合に効果を発揮しますが、シングル CPU の場合にも効果があるようです。 ハンドブックによると、シングル CPU では -j4 を指定するのが最も効率が良い (コンパイルが短時間で完了する)という報告があるそうです。 これを信じて -j4 を指定しています。マルチ CPU なマシンを使える幸せな方は、 CPU の数に合わせて調整してみてください。

後は CPU とディスクが頑張ってユーザランドを build してくれますので、 気長に完了を待ちます。

6. kernel の構築

ユーザランドの構築が完了したら(make buildworkd が完了したら)、 次は kernel を構築します。buildworld の場合と同様に -j4 オプションを付けて以下のように事項します。 作業ディレクトリは同じく /usr/src です。


  # make -j4 buildkernel

これにより GENERIC カーネルが作成されます。

7. 新しい kernel のインストール

ユーザランド、kernel の build が完了したら、まずは kernel からインストールします。


  # make installkernel

8. シングルユーザモードでリブート

ここまで作業したら、一旦、シングルユーザモードで再起動します。


  # cd /
  # shutdown -r now

で再起動し、kernel のロードが終わった時点で

  Hit [Enter] to boot immediataly, or any other key for command prompt.
  Booting [Kernel] in 10 second ...

という表示が出てしばらく待つところがあるので、そこで Einter キー以外を押します。 僕はいつもスペースバーを押すクセがあります。

そうすると

  ok

というプロンプトが表示されるので、それに対して

  ok boot -s

と入力します。これで、ロードされた kernel がシングルユーザモードで起動します。

/etc/ttys で console に secure を設定していれば(デフォルト設定)、 ここで shell を聞いてくるので利用したい shell を入力します。 そのまま Enter を押せば /bin/sh が起動します。

無事、シングルユーザモードで起動したら、全てのパーティションをマウントします。


  # /sbin/mount -a

9. ユーザランドのインストール

新しい kernel に合った新しいユーザランドをインストールします。


  # cd /usr/src
  # make installworld

10. mergemaster(8) を使って /etc 配下をマージする

後は /etc 配下のファイルを更新して完了です。 /etc 配下のマージには mergemaster(8) を使うと便利です。あらかじめ、 mergemaster(8) の man に目を通しておいてください。jman が用意されているので、 日本語で読めます。

まず古い /etc をバックアップしておきます。 これを忘れると悲惨なことになる場合があります。


  # cp -Rp /etc /etc.old

/etc 配下をバックアップしたら、mergemaster を実行し /etc を更新します。 以下のように、2 段階で実行すると便利です。


  # /usr/sbin/mergemaster -svia
  # /usr/sbin/mergemaster -svir

2 回目の mergemaster 実行時に、差分のあるファイルをチェックし、 更新するのか、古い方を採用するのか、あるいはマージするのか、を聞いてきます。 自分が修正していないファイルに関しては、更新(新しいのを採用)すれば良いので、 diff の結果を参照した後で i を押します。 master.passwd のように、古い物を採用しなければならないファイルに関しては、 diff の結果を参照した後で d を押します。ただし、 バージョンアップのタイミングによっては、デフォルトのユーザが追加されているような場合もあります。 このような場合に d (古い物を採用)してしまうと、古いファイルが採用されてしまい、 新規に追加されたデフォルトユーザが反映されなくなってしまいます。 この様な場合は、b ではなく、m を選択し、マージしていくことになります。 したがって、mergemaster の仮定で表示される diff の結果をしっかり見ることが非常に重要です。

m を押してマージする場合は、画面を左右 2 分割して、差分のある行が新旧わけて表示されます。 左側 (古い方) を採用するのか、右側 (新しい方) を採用するのかを選択します。 ここで押すキーは l(eft) と r(ight) です。

この作業は慣れが必要ですが、m (マージ) をしなければならないファイルというのは、 基本的に自分が変更したことのあるファイルなので、理解できると思います。

一通りのマージ作業が終わると、更新されたファイルに応じて、 以下のように mergemaster が聞いてくることがあります。

  • /dev/MAKEDEV が更新された場合

    /dev/MAKEDEV が更新された場合、以下のように聞かれます。

    
      *** You installed a new /dev/MAKEDEV script, so make sure that you run
          'cd /dev && /bin/sh MAKEDEV all' to rebuild your devices
    
          Would you like to run it now? y or n [n]
    

    書いてある通り、MAKEDEV all を実行してデバイスファイルを再作成するか? ということなので、y を入力して、デバイスファイルを再作成します。

  • aliases ファイルが更新された場合

    /etc/mail/aliases が更新された場合、以下のように聞かれます。

    
      *** You installed a new aliases file, so make sure that you run
          '/usr/bin/newaliases' to rebuild your aliases database
    
          Whold you like to run it now? y or n [n]
    

    newaliases を実行してデータベースを更新するか? ということなので、 y を入力して、newaliases を実行します。

  • login.conf が更新された場合

    /etc/login.conf が更新された場合、以下のように聞かれます。

    
      *** You installed a new login.conf file, so make sure that you run
          '/usr/bin/cap_mkdb /etc/login.conf' to rebuild your login.conf database
    
          Would you like to run it now? y or n [n]
    

    ここでも y を入力します。

  • master.passwd が更新された場合

    /etc/master.passwd が更新された場合、以下のように聞かれます。

    
      *** You installed a new master.passwd file, so make sure that you run
          '/usr/sbin/pwd_mkdb -p /etc/master.passwd'
          to rebuild your password files
    
          Would you like tu run it now? y or n [n]
    

    ここでも y を入力します。

11. 最後にリブート

ここまでで作業は完了です。後はリブートして、無事起動することを確認しましょう。 リブートしたら、システムは 4-STABLE となっているはずです。 uname -rs で確認してみましょう。


  # uname -rs
  FreeBSD 4.6-STABLE

この時点では kernel が GENERIC kernel になっているので、 自分の環境に合わせて kernel の再構築を行ってください。

12. コンパイル環境を消す

ここまでの作業で /usr/obj 配下に生成されたオブジェクトが残っています。 結構な容量になるので、特に理由が無ければ以下のようにして消しておきます。


  # cd /usr/obj
  # chflags -R noschg *
  # rm -rf *

では、どういう場合に消さずに取っておくか、というと、 この /usr/obj を NFS で他のホストに share して、他のホストもアップデートしたい場合です。 周囲の FreeBSD マシンがスペック的に貧弱な場合、このように、 高速なマシンで新しい STABLE を build し、そのオブジェクトを NFS を通じてインストールする、 という手法をとったりします。


TetsuoSTREAMS > FreeBSD > CVSup で最新の STABLE を追いかける