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

カーネルの展開。SMP カーネルなら smp を指定。

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 とか更新するしなあ。
  • ネットワーク越しにやるならバックアップと失敗したときの復旧手段は必要かも。