OpenBSD 3.6がリリースされた。

3.5 ->3.6 移行手順の概要

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

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に収録されている追加アプリも使用可能になった。

あとは、

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

Tips

/etc, /dev対策

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

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

古い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


Front page   New Page list Search Recent changes   Help   RSS of recent changes