cvsupを使ったFreeBSDのアップデート手順。

以下は、黒柳の個人的な方法であり、他にも選択肢が複数存在する手順がたくさんあります。
さらに黒柳が実行する際に問題とならない手順については記述していない恐れがあります。
よって、この内容に関していっさい責任を持ちません(持てません)。own risk でどうぞ。

[2003.3.6]作成。基本的にFreeBSD4.*を想定。アップデート前も4.*。
[2003.3.7]ちょっと修正
[2003.3.10]ちょっと修正
[2004.4.5]ちょっと修正
[2006.1.6]ちょっと修正(MATH_EMULATE)
[2006.6.9]ちょっと修正(acpi_ppc)
[2008.6.2]ちょっと修正(delete acpi_ppc)
[2008.9.5]ちょっと修正(DEBUG=-g)
[2009.1.14]ちょっと修正("通常のカーネル再構築"を削除)


ディスクの空き容量が/usr/src 用に 500M、/usr/obj 用に 400M くらい必要。(と思う)

現在環境のバックアップ

同じコンピュータの別のスライスに(出来れば別のハードディスクに)現在の環境をバックアップしておきましょう。
ネットワーク越しのディスクの場合、こけた場合にネットワークを復活させないとバックアップが戻せないと言うリスクがあります。ネットワークの設定がバックアップファイルの中にしかなかったりすると泣くに泣けない。
もし、同じスライス内の別パーティションにコピーしたのであれば、そのパーティションをフォーマットしないように注意しましょう。 これくらいとっておけば大丈夫じゃないかと。
加えて、デジカメで /etc/fstab の内容, df の出力を写真にとっておくと、後々便利だったりします。
デジカメが無くても、紙にメモしておくと最悪再インストール時に非常に便利です。

直接アップデートか最新版にリインストールしてからのアップデートか

あまりに古いバージョンからのアップデートは更新する設定ファイルも多くなるし、 途中でミスをする可能性が増えて行きます。
その場合はすなおに現在ある最新のリリースから再インストールして、アップデート後 自分で/etcなどを修正した方が早いかも知れません。
4.3-R から stable へのアップデートを計画したときはいったんその時点で最新の 4.7-R をインストールしなおしてそこからアップデートしました。
メジャーバージョンがあがる場合は /usr/obj が残っていないか確かめた方が吉かもしれません。あったら消しておきましょう。

ソースコードのアップデート。

  1. もしソースをいれてないのならリリースCDからsrc一式を/usr/srcの下に展開しておく。
    (rootで)/stand/sysinstallを使ってConfigureのDistributionsからsrcを選択すればオッケ。
    どのソースコードをインストールするか選択できるけど、ALLでやっておけばいいでしょう。
  2. /usr/ports/net/cvsup または cvsup-without-gui をインストール
  3. /usr/share/example/cvsup から supfile を選んで、(例えば)/usr/srcにコピーしておく。
    standardなら今インストールしているリリースの最新パッチ版へあげてくれる。
    stableなら STABLE の最新版へ
    たとえば4.6.2が入っているとして、standardならtag=RELENG_4_6でアップデート後は4.6の最新版になるし、stableなら tag=RELENG_4 で ver.4 の最新版、たとえば4.8-RC1などになる。
  4. supfileの中の *default host を変更する。cvsup.FreeBSD.org もミラーサイトの一つに過ぎないそうなので、 ここは日本国内のミラーサイトから近いところを選ぼう。ここからなら *.ac.jp がいいかな。例えば cvsup4.jp.FreeBSD.org(阪大)。
  5. % su
  6. # cd /usr/src
  7. UPDATINGファイルを確認して現状を見ておこう。
    # cp UPDATING UPDATING.org などとコピーしておくとグッド。
    # cvsup sup-file
    Xバージョンの場合はウィンドウが立ち上がって来るので左下のプレイボタンを押す。
    cvsup-without-guiじゃないけどX使わない場合は cvsup -g -L 2 つまりノングラフィカルで、かつlogをguiなし用に設定(supfileより)
    ちなみに下で説明する/etc/make.confでsupfileとcvsサイトをちゃんと設定をしておけば/usr/srcにて
    # make update
    でもcvsupを実行してくれます。
  8. UPDATING ファイルを確認してバージョンが上がっていることを確認。
ここで /usr/src の下をtarで固めて自宅などに持って行けば、 ネットワークにつながっていないコンピュータのアップデートに便利です。

新しい環境の構築。

  1. /usr/objの下にコンパイルされたファイル群が一旦インストールされる。/usr の下に充分の空き容量(400Mくらい?)があることを確認。途中で空き容量が無いと言われるととっても悲しい。
  2. /etc/make.confの編集
    もしなければ /etc/defaults/make.confを/etcにコピー(もしくは必要部分だけ/etc/make.confに記述)
    defaultsファイルは5.0からは /usr/share/example/etc の下に移動した模様。
  3. # cd /usr/src
  4. # make -j2 buildworld
    -jに与える数字はCPUとハードディスクなどのI/O関係の速度比を考慮にいれて決めましょう。
    handbookなどでは -j4 くらいがいいと書いてあります。今回は心配だったので -j2 としました。
    [今のコンピュータなら 1時間 から 2時間 くらいで終了するはず。]
  5. カーネルのconfファイルを作成する。
    2回目以降の再構築でもconfファイルの中身が変わっている場合があるので、 diffで確認するか、新たにつくり直した方がいいかも。
    # cd /usr/src/sys/i386/conf
    # cp GENERIC HOGEHOGE
  6. HOGEHOGE を編集。詳しくは LINT ファイルを読もう。
  7. # cd /usr/src
  8. # make buildkernel KERNCONF=HOGEHOGE

新しい環境のインストール。

ここまでなら現在のシステムに何の変更も行われていない。
次のカーネルのインストールを始めたら、後戻りは...
(cvsupで元のバージョンに戻せば多分大丈夫だとは思う、けどいっそ再インストールした方が楽かも)。
覚悟は良いか?
  1. cd /usr/src (念のため)
  2. make installkernel KERNCONF=HOGEHOGE
    この途中で失敗したら、 /boot/kernel.old に動くカーネルがのこっているので、これを /boot/kernel に 置き換えること。これをせずに再度 installkernel すると...泣ける。
  3. kernelモジュールを後から追加している場合、この段階で消えている可能生大。
    (たとえば Cool'n'Quiet (acpi_ppc) 今は別手法でkernelに埋め込んでコンパイルしている)。
    改めてインストールする必要があると思われるので注意。
  4. コンピュータを single-user mode で再起動。(safe modeだとpanicおこします)
    1. reboot
    2. kernelオプションを入力するところで[ENTER]以外を押してストップ。
    3. boot -s (single userモードで起動)
      shell は /bin/sh でおっけ。
    4. fsck -p (ディスクチェック)
    5. mount -u / ('/'をマウント)
    6. mount -a -t ufs ('/usr'などをマウント)
    7. swapon -a (swapファイルをマウント)
    8. adjkerntz -i (タイムゾーンの設定)
  5. ここでpanicになった場合kernelのconfigに間違えがある可能性あり。(CPUが一つしかないのにACPI有効にしちゃだめ!)
    この場合はkernelオプションを入れるところで kernel を unload してから boot kernel.old で復旧して、 慌ててkernelを再コンパイルしましょう。 ちなみに私はkernel.prevなんてのをキープしていたりすることもあります。
  6. cd /usr/src
  7. make installworld
    [気長に待つ。buildworldほどはかからない]
  8. cp -Rp /etc /etc.bak (念のため)
  9. /usr/sbin/mergemaster -svia
    こうすると新規ファイルは自動的にインストールされ、それ以外については /var/tmp/temproot の下に最新版の設定ファイルが作成される。
    これを手動で/etcなどに反映させて行けばいいんだけど面倒なので自動化ツールを使う。
  10. /usr/sbin/mergemaster -svir
    1. 各ファイルごとに diff の結果を表示してくれるので確認
      1画面で表示しきれない場合はmoreになっているので注意。
    2. 新しいのを使うなら'i'(基本的にこっちですね)。古いのを残すなら'd'(あまり使わないでしょう)。
      新しいのに自分の書いた情報をmergeするなら'm'。
    3. 'm'にすると、部分毎に左に古いもの、右に新しいものが出て来るので、'l','r'でどちらを採用するかを決めて行く。最後にmergeしたものをインストールするために'i'
    4. もし、失敗したなと思ったら'q'で停止して最後に[ENTER]を押せば上書きされない。 あとでもう一度 -svir してもいいし(たぶん)、自分で修正してもおっけ。
    5. MAKEDEV,aliases,login.conf,master.passwdに関する更新をするかとそれぞれ聞かれる(聞かれない場合もある)ので、すべて'y'と返答。
    変更部分としてはファイル先頭のヘッダ情報だけだったりするときもあるのでちょっとめんどくさいけど、 自分の書いたファイルもmergeしたいので仕方無いですね。どれくらい設定ファイルが新しくなったかを 実感するためにここはひとつひとつやっていきましょう。
    当然、アップデートによるバージョンアップの度合が少なければそれだけココの処理も楽になります。
  11. リブート
  12. uname -sr でバージョンを確認。
  13. 他のマシンに同じ環境でアップデートを敢行するのであれば /usr/obj(,/usr/src) の下をマウントしてやればおっけ(と思う)。
    そうでなければ、/usr/obj の下は消してしまいましょう。
    メジャーバージョンがあがる場合は/usr/objが残っていると悪さをする場合があります。
  14. めでたしめでたし。