詳細を書いているときりがないので、ざっくりと。
詳細はリンク先を参照のこと
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がバージョンアップしてたりして面倒臭いので、バイナリアップデートした。
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した一覧が得られる。
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
excepts
^/\.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/