TX120 S3pにpreseedでRAID1構成なUbuntu 18.04.2を導入してみた

# はじめに

[以前に構成したUbuntu 16.04](https://qiita.com/YasuhiroABE/items/ff233459035d8187263d)とほぼ同じ構成でPreseedを設定して、Ubuntu 18.04を上書きインストールしようとしたところsoftware raid (raid1)を構成するところで停止してしまいました。

問題はいくつかあったものの、手動でLVMとMD構成を停止する必要があったので、その顛末をまとめています。

# 参考文献

1. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=740271
2. 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の構成によって変化しましたが、概ね以下のようなものでした。

1. /boot用の/dev/sd{ab}1に全容量が割り当てられてしまう。
2. インストーラーが動いた時点で/dev/md127が認識されていて、新しく/dev/md*を作成しようとして作れないとエラーになる

似たような問題はdebian側でも指摘されていて、同じ名前でVGを作成するなら手動で削除してあげないといけないとか、ddでMBRなパーティションテーブルを削除してあげたらどう?とか、でも同じディレクトリ構成だとmdadmでは引き続き/dev/md127が最初から認識されてしまうとか、いろいろ問題があるようでした。

そこで、preseedの**partman**/early_commandを使って次のような動作をするようにしました。

1. mdadmを利用して認識されている/dev/md*デバイスを削除(--stop)する

## 失敗例

LVMを利用しない単純なSoftware RAID1構成でも、次のようにすると最初に/dev/md0, /dev/md1が構成されて、"partman-auto-raid/recipe"を実行する段階で、**md2**を構成しようとして失敗しています。

```text
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デバイスを解除すれば問題ないように思えますが、実際にはデバイスが解除できませんでした。

```text
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の情報を削除しています。

```text
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
```

この点についていろいろ調べていく中で、次のような点が気になりました。

1. /bootを別パーティションにする必要はなさそう
2. partman-auto/expert_recipeでデバイス名を記述したくない

そのためexpert_recipe, partman-auto-raid/recipeの内容は次のようになりました。

```text
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
```

以上