詳細を書いているときりがないので、ざっくりと。
詳細はリンク先を参照のこと
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で取り込んだ。
今回はgccがバージョンアップしてたりして面倒臭いので、バイナリアップグレードした。http://www.openbsd.org/faq/upgrade37.html を参照のこと。
$ ls -l /home lrwxr-xr-x 1 root wheel 9 May 22 03:51 /home -> /opt/homeこういうことをやっていると、バイナリアップグレード後、シンボリックリンクが本当のディレクトリに置き換えられている場合があるので注意が必要(そのようになっていた場合もリンク先の実体は残っているので、新しく作られたディレクトリを消去し、シンボリックリンクを張り直せばよい)。
通常のアップグレード作業と大きく変わっているところはないようだ。 _hostapdのUID/GIDを追加するくらいか。
参考までに、3.7$,1vr(B3.8で削除したファイルの一覧。
仕事が忙しい+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に収録されている追加アプリも使用可能になった。
あとは、
Upgrade Mini-FAQとか見ると/etcの変更は「手でやれ」って書いてある。
たしかにその通りなのだが、何も考えずにやると作業大変だわ、訳分からなくなるわで、絶対失敗(とまではいかなくても何かしらの漏れがでたり)すると思う。
その対策としては、portsにあるmergemasterというツールを使うのが 定番なようだが、私は以下のような方法でやっている。
Upgrade後に、以前使ってた共有ライブラリが残っていて、
消していいものかどうか悩むことがある。
あと、ports/packagesとかについては、最初に全部消しとけってことになってるが、
常時稼働してるサーバでは、最初に全部消しといて、Upgrade後に
マターリ置き換え、ってのもなかなか難しい。
なので、OS本体のrebuild後に、運用しながらports/packagesとかを少しずつ再rebuild
していくということになるが、
その間はやっぱり古い共有ライブラリが必要だったりする。
ls -lt /usr/lib mv /usr/lib/libhoge.so.X.Y ... /usr/local/lib shutdown -r now
#!/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した一覧が得られる。アップグレードを重ねると、不要なファイルができてゆく。 前述の共有ライブラリの問題もそうだが、他にも例えば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`
とかやって、ファイルサイズの総量が大したことなければ放置しててもいいかも。