OpenBSD 3.6がリリースされた。

3.5 ->3.6 移行手順の概要

詳細を書いているときりがないので、ざっくりと。
詳細はリンク先を参照のこと

  • 一般的な手順 ... Upgrade Mini-FAQ参照
  • 3.5 -> 3.6に固有の手順 ... Upgrade Mini-FAQもしくは Upgrade Guide参照
  • 適用順序
    • ソースツリーの更新
    • 各サービス固有のuid, gid登録
      沢山あるので、まとめてやっとくと楽。
      diff -u /etc/master.passwd /usr/src/etc/master.passwd > passwd.diff
      duff -u /etc/group /usr/src/etc/group > group.diff
      で、差分作っといて、vipwやvi groupで取り込んだ。
    • カーネルのコンパイル、リブート
      カーネルが3.6、ユーザランドが3.5の状態にするとpfが効かなくなるので、 ファイアウォール等はこの間の運用に注意。
    • libcライブラリの再構築
    • ユーザランドのコンパイル
    • /etc, /dev以下の修正
    • ptyデバイスのマイナー番号変更
    • 古い/usr/bin/cksumの消去
    • pfアンカーの変更 ... /etc/pf.conf中に該当箇所がないので、実施せず。

OpenBSD 3.7がリリースされた

今回はgccがバージョンアップしてたりして面倒臭いので、バイナリアップグレードした。http://www.openbsd.org/faq/upgrade37.html を参照のこと。

Tips (というか今回もハマッた...)
運用を続けて行くと、ディスクの容量が足りなくなったりしてディレクトリをシンボリックリンクに置き換えてしまう場合がある;
$ ls -l /home
lrwxr-xr-x  1 root  wheel  9 May 22 03:51 /home -> /opt/home
こういうことをやっていると、バイナリアップグレード後、シンボリックリンクが本当のディレクトリに置き換えられている場合があるので注意が必要(そのようになっていた場合もリンク先の実体は残っているので、新しく作られたディレクトリを消去し、シンボリックリンクを張り直せばよい)。

気づかないでいると、アップグレード後にログインできなくなったり、コマンドが実行できなくなったりして焦ることになる。

OpenBSD 3.8がリリースされた。

通常のアップグレード作業と大きく変わっているところはないようだ。 _hostapdのUID/GIDを追加するくらいか。

参考までに、3.7 -> 3.8で削除したファイルの一覧。

OpenBSD 3.9がリリースされた。

仕事が忙しい+LiveCDの製作にかまけてた所為でまだ完全にアップグレード終ってないんだけど、とりあえず書いてみる。

今回は、自作した OpenBSD 3.9 LiveCD の内容を使ってやってみた。 正規の方法とはちょっと違っていて、まぁかなりの変化球だけど、以下手順;

既存のports/packagesを消す。

# pkg_delete -q /var/db/pkg/*

3.9のリリースパッケージで上書き
リリースパッケージが /root/dist以下にあるとして;

# cd /
# for tgz in /root/dist/!(etc)39.tgz      ... 「etc39.tgz以外」を展開する
# do
#     tar xvzpf $tgz
# done

これにさらにLive CDの中身を上書きする。

# vnconfig svnd0 CD-OpenBSD-3.9.iso
# mount /dev/svnd0 /mnt
# cd /mnt
# pax -rwvpe usr /         ... /usr以下をLiveCDの中身で上書き
# cd /mnt/var/db
# pax -rwvpe pkg /var/db   ... /var/db/pkg 以下をLiveCDの中身で上書き

これで、LiveCDに収録されている追加アプリも使用可能になった。

あとは、

  • カーネルの再生成
  • /etcのアップグレード
  • rebuild device files
  • 不要なshlibの整理、古いshlibに依存した実行バイナリの再コンパイル
  • その他不要なファイルの削除

などがあるが、従来通りなので省略。

Tips

/etc, /dev対策

Upgrade Mini-FAQとか見ると/etcの変更は「手でやれ」って書いてある。
たしかにその通りなのだが、何も考えずにやると作業大変だわ、訳分からなくなるわで、絶対失敗(とまではいかなくても何かしらの漏れがでたり)すると思う。

その対策としては、portsにあるmergemasterというツールを使うのが 定番なようだが、私は以下のような方法でやっている。

  • 新しいetcの中身をソースツリーから/altrootの下に展開
    • cd /usr/src/etc && DESTDIR=/altroot make distribution-etc-root-var
  • この/altroot/etcと現在使用している/etcとの中身の差分を取る
    • diff -ru /etc /altroot/etc > /etc.diff
  • このetc.diffの内容を見ながら、各ファイルについて次の3つのうちのどれかを行う。
    • 古いファイルをそのまま使う
    • 新しいファイルをそのまま使う
    • 新しいファイルと古いファイルの内容を編集してマージする
  • 各ファイルの差分を見ながら、コピーや編集を行うことになるので、screenなどを入れておくと便利。

古いshlib対策

Upgrade後に、以前使ってた共有ライブラリが残っていて、 消していいものかどうか悩むことがある。
あと、ports/packagesとかについては、最初に全部消しとけってことになってるが、 常時稼働してるサーバでは、最初に全部消しといて、Upgrade後に マターリ置き換え、ってのもなかなか難しい。 なので、OS本体のrebuild後に、運用しながらports/packagesとかを少しずつ再rebuild していくということになるが、 その間はやっぱり古い共有ライブラリが必要だったりする。

  1. 古くて、消してもよさげなライブラリは、とりあえず/usr/local/libに移動し、 reboot。
    ls -lt /usr/lib
    mv /usr/lib/libhoge.so.X.Y ... /usr/local/lib
    shutdown -r now
  2. ports/packagesとか俺buildの作りなおしや整理
  3. どこからも使われていない共有ライブラリの検出
    例えばこんなスクリプトを使う
    #!/bin/sh
    if [ X$1 = X ]
    then
      set /
    fi
    
    find "$@" \
        \! -fstype local -prune \
        -o \
        -type f \
        \( -perm -100 -o -perm -010 -o -perm -001 \) \
        -print \
    | xargs file \
    | awk '
        BEGIN {FS=":"}
        /ELF 32-bit LSB executable.*dynamically linked/ {print $1}' \
    | xargs ldd \
    | awk '
        /^\/.*:$/ {fname = $1; sub(/:/, "", fname)}
        $3 == "rlib" {print fname, $5}'
    ファイルシステム全体の実行ファイルに対してlddした一覧が得られる。
    で、「このファイル一覧中にはないけど、実際のファイルシステム中に 存在する共有ライブラリ」っていうのが、どこからも使われてないやつなので、 消してもOK。

不要なファイルを検出する。

アップグレードを重ねると、不要なファイルができてゆく。 前述の共有ライブラリの問題もそうだが、他にも例えばPerlのバージョンが あがってたりすると、*.phが古いのが残ったままになってたり。

そういうのを検出するMakefileファイル;

VER = 37
TARBALLS = \
        /root/dist/base$(VER).tgz \
        /root/dist/comp$(VER).tgz \
        /root/dist/game$(VER).tgz \
        /root/dist/man$(VER).tgz  \
        /root/dist/misc$(VER).tgz

all: removable_candidates

removable_candidates: tarfiles realfiles
        comm -23 realfiles tarfiles > removable_candidates

tarfiles: $(TARBALLS)
        for tgz in $(TARBALLS) ;\
        do \
                echo Extracting $$tgz ... >&2 ;\
                tar tvzf $$tgz ;\
        done \
        | awk '/^-/ { fname = $$9; sub(/^\.\//, "/", fname); print fname }' \
        | sort > tarfiles

realfiles:
        find / -type f -print | grep -v -f excepts | sort > realfiles

clean:
        rm -f removable_candidates realfiles tarfiles *~ *.bak *.BAK

Makefileなので、もちろん行頭の空白はスペースではなくTABなのでコピペして使用の際は注意。

あと、excepts ファイルというのをMakefileと同じディレクトリ上に作っておく。これは検索の対象からはずすディレクトリやファイルを記述する。以下のように;

^/\.cshrc
^/\.profile
^/boot
^/bsd
^/bsd\.rd
^/etc/
^/home/
^/kern/
^/obsd
^/proc/
^/root/
^/usr/local/
^/usr/obj/
^/usr/ports/
^/usr/src/
^/var/backups/
^/var/cron/
^/var/db/
^/var/empty/etc/localtime
^/var/log/
^/var/mail/
^/var/named/
^/var/run/
^/var/www/conf/
^/var/www/htdocs/
^/var/www/logs/

MakefileのTARBALLSで指定した位置に、インストールに使用したインストールパッケージを用意し、make allで実行。結果はremovable_candidates(削除可能な候補)というファイルに出力される。

やってることは単純で、インストールパッケージに含まれていないが実際に存在する通常ファイルで、exceptファイルに記述されたものを除いたものの一覧を表示しているだけ。

なので、もちろん自分で作成したファイルや、独自にインストールしたソフトなどは(exceptファイルで記述していない限り)必要であってもリストアップされるので注意。逆に、不必要であっても、exceptリストに該当するファイルはリストアップされない。消し忘れてるファイルの検出用くらいに考えておいた方がいいかもしれない。

wc -c `cat removable_candidates`

とかやって、ファイルサイズの総量が大したことなければ放置しててもいいかも。


FrontPage


Attach file: filermfiles_37_38.txt 1097 download [Information]
Reload  New Edit Freeze Diff Attach Copy Rename  Top Index Search Recent Backups  Help  RSS
Last-modified: 2006-06-13 (Tue) 03:25:02 (4394d)