はじめに
以前に構成したUbuntu 16.04とほぼ同じ構成でPreseedを設定して、Ubuntu 18.04を上書きインストールしようとしたところsoftware raid (raid1)を構成するところで停止してしまいました。
問題はいくつかあったものの、手動でLVMとMD構成を停止する必要があったので、その顛末をまとめています。
参考文献
- https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=740271
- https://serverfault.com/questions/684684/hard-drive-is-not-detected-at-early-stage-of-unattended-installation
対応方針
既にHDDx2構成のTX120 s3pでUbuntu 16.04が動いていて、software raidでraid1を構成しています。
- /dev/sd{ab}1 → /dev/md0 → /boot
- /dev/sd{ab}2 → /dev/md1 → /
元々Preseedで導入しているので、同様にubuntu-18.04.2-server-amd64.isoをベースにpreseed設定を有効にしたイメージから、上書きインストールしようとしたところraid1を構成するところでエラーになっています。
問題はいくつかあって、preseedの構成によって変化しましたが、概ね以下のようなものでした。
- /boot用の/dev/sd{ab}1に全容量が割り当てられてしまう。
- インストーラーが動いた時点で/dev/md127が認識されていて、新しく/dev/md*を作成しようとして作れないとエラーになる
似たような問題はdebian側でも指摘されていて、同じ名前でVGを作成するなら手動で削除してあげないといけないとか、ddでMBRなパーティションテーブルを削除してあげたらどう?とか、でも同じディレクトリ構成だとmdadmでは引き続き/dev/md127が最初から認識されてしまうとか、いろいろ問題があるようでした。
そこで、preseedのpartman/early_commandを使って次のような動作をするようにしました。
- mdadmを利用して認識されている/dev/md*デバイスを削除(--stop)する
失敗例
LVMを利用しない単純なSoftware RAID1構成でも、次のようにすると最初に/dev/md0, /dev/md1が構成されて、"partman-auto-raid/recipe"を実行する段階で、md2を構成しようとして失敗しています。
d-i partman-auto/expert_recipe string \
boot-root :: \
500 10 600 raid \
$primary{ } \
method{ raid } \
format{ } \
. \
12000 100 -1 raid \
$primary{ } \
method{ raid } \
format{ } \
.
d-i partman-auto-raid/recipe string \
1 2 0 ext2 /boot \
/dev/sda1#/dev/sdb1 \
. \
1 2 0 ext4 / \
/dev/sda2#/dev/sdb2 \
.
新規にディスクを準備すれば、この状態でも問題なくインストールができていますが、そのまま繰り返すと失敗します。
対応策の実装
参考文献に上げたドキュメントなどをみると、early_commandを実行してmdデバイスを解除すれば問題ないように思えますが、実際にはデバイスが解除できませんでした。
d-i preseed/early_command string /bin/sh -c 'for dev in /dev/md*; do mdadm --stop $dev ; done' || true
この原因は、私が勝手にpartmanの部分をpreseedにしていたためで、このために、mdadmパッケージが導入される前に実行されるpreseed/early_commandを実行してしまいました。
この点を修正して、mdadmを利用してsuperblockの情報を削除しています。
d-i preseed/early_command string umount /media || true
d-i partman/early_command string /bin/sh -c 'for mdev in /dev/md[0-9]* ; do mdadm --stop $mdev ; done ; mdadm --misc --zero-superblock /dev/sd[a-z][1-9]' || true
この点についていろいろ調べていく中で、次のような点が気になりました。
- /bootを別パーティションにする必要はなさそう
- partman-auto/expert_recipeでデバイス名を記述したくない
そのためexpert_recipe, partman-auto-raid/recipeの内容は次のようになりました。
d-i partman-auto/expert_recipe string \
bootroot :: \
10240 20 -1 raid \
$primary{ } \
$bootable{ } \
raidid{ 1 } \
method{ raid } \
.
d-i partman-auto-raid/recipe string \
1 2 0 ext4 / \
raidid=1 \
.
d-i partman-auto/choose_recipe select bootroot
以上