turn to freebsd-update binary
自前でビルドしたバイナリを security/freebsd-update が受け付けるツリーに戻す方法。開発元の資料を参考にした。
- シェルは sh。
- 参考にする場合は自己責任で。
security/freebsd-update をインストールして設定ファイルを作る。
cd /usr/ports/security/freebsd-update make install clean cd /usr/local/etc cp freebsd-update.conf.sample freebsd-update.conf
下準備。
export FU=/var/tmp/fu for dir in iso release work; do mkdir -p ${FU}/${dir} done cd ${FU}
公式リリースを用意する。
fetch -o iso/disc1.iso ftp://ftp.jp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/6.1/6.1-RELEASE-i386-disc1.iso mdconfig -a -t vnode -f ${FU}/iso/disc1.iso -u 9 mount -t cd9660 -o ro /dev/md9 /mnt
cd /mnt/6.1-RELEASE/kernels ./install.sh generic cd /boot mv kernel kernel.old mv GENERIC kernel cd ${FU}
ローカルで変更されたファイルリストを作る。
freebsd-update -v IDS | tail +8 | grep . | cut -c 2- - > work/base-modified
etc の下の戻されては困るもの(master.passwd, pwd.db 等)とか戻さなくてもいいもの(catman 等)を削除する。
vi work/base-modified
変更リストから公式リリースのファイルを展開してみる。games とか catpages とか proflibs とかはお好みでどうぞ。
for dist in base dict doc manpages; do cat /mnt/6.1-RELEASE/${dist}/${dist}.?? | tar -xpzf - -I work/base-modified -C ${FU}/release done 2>/dev/null
展開したファイルのリストと変更リストの差分を取って確認。カーネルとカーネルモジュールが入ってないのは展開してないから。
find release -type f | cut -d / -f 2- - | uniq | sort > work/base-release diff -u work/base-modified work/base-release
実際にファイルを展開。お祈りは忘れずに。
sed s/^/\\\// work/base-release | xargs chflags noschg for dist in base dict doc manpages; do /mnt/rescue/cat /mnt/6.1-RELEASE/${dist}/${dist}.?? | /mnt/rescue/tar -Uxpzf - -I work/base-release -C / done 2>/dev/null
後始末。
umount /mnt mdconfig -d -u 9 cd ~ rm -rf ${FU}
お祈りしながら再起動。
shutdown -r now
ちゃんと更新されたか確認。
freebsd-update -v IDS | more
freebsd-update で更新。
freebsd-update fetch freebsd-update install
結論。
- コンソールに触れるなら再インストールするか Upgrade インストールの方が早くて確実。
- 1度 SEGV の嵐になって再起動された。ld-elf.so とか更新するしなあ。
- ネットワーク越しにやるならバックアップと失敗したときの復旧手段は必要かも。