aio bootを使っているマシンでubuntuのupdateを行うと、kernelが更新されたりする毎にefiパーティションの更新を行い、その結果cloverが起動しなくなってしまいます。
以前は、USB memoryからaio bootしてclover legacyを再インストールすれば回復していたのですが、先日、aio bootのバージョンアップを行ったら、これをやってもMBRを回復しなくなってしまったので、ubuntuをshutdown/rebootする際にefi partitionのMBRをチェックして書き換えられていたら戻すようにしてみました。
手順は以下の通り。
(1) dd if=/dev/sda1 of=/aio-boot/sda1 bs=512 count=1でefiパーティション(sda1)のMBRの先頭512Bを予め退避しておく。
(2) aio-boot-checkというshell scriptを作り、手動でもefi partitionのMBRをcheck/restoreできるようにした。aio-boot-checkの内容は以下の通り。
#!/bin/bash
if [ "`parted -l /dev/sda | sed -En 's/^\s*1\s+.*\sfat32\s+EFI system partition\s+boot, esp.*/efi/p'`" != "efi" ]; then
echo /dev/sda1 is not efi
exit 255
fi
dd if=/dev/sda1 of=/tmp/sda1 bs=512 count=1 2>/dev/null
cmp -s /aio-boot/sda1 /tmp/sda1
if [ $? -eq 0 ]; then
echo aio-boot-check OK
elif [ "$1" = "correct" ]; then
dd if=/aio-boot/sda1 of=/dev/sda1 2>/dev/null
echo aio-boot corrected.
$0
elif [ -z $1 ]; then
echo aio-boot-check NG
else
echo Usage: $0 [correct]
fi
(3) /etc/init.d/に以下のaio-bootを作成
#!/bin/sh
lock_file="/var/lock/subsys/aio-boot"
start()
{
touch ${lock_file}
}
stop()
{
rm -r ${lock_file}
/root/bin/aio-boot-check correct
}
case "$1" in
start)
start
;;
stop)
stop
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
exit 0
(4) /etc/rc?.d/から/etc/init.d/aio-bootへsymbolic linkを作成
cd /etc/rc0.d && ln -s ../init.d/aio-boot K00aio-boot
cd /etc/rc6.d && ln -s ../init.d/aio-boot K00aio-boot
cd /etc/rc1.d && ln -s ../init.d/aio-boot S01aio-boot
cd /etc/rc2.d && ln -s ../init.d/aio-boot S01aio-boot
cd /etc/rc3.d && ln -s ../init.d/aio-boot S01aio-boot
cd /etc/rc4.d && ln -s ../init.d/aio-boot S01aio-boot
cd /etc/rc5.d && ln -s ../init.d/aio-boot S01aio-boot
cd /etc/rcS.d && ln -s ../init.d/aio-boot S01aio-boot