Ubuntuの起動時にmd
デバイスはどのように組み立てられますか? /etc/mdadm/mdadm.conf
は本当にここで関連する要素ですか?
私のmdadm.conf
は正常です。レスキューCD環境にいるときに確認しました。 mdadm -A --scan
を実行すると、必要に応じてデバイス名を見つけて割り当てます。 mdadm.conf
にはAUTO -all
が含まれており、配列の組み立てからすべての自動化を排除します。
私がする必要があるのは、ブート時にmdadm.conf
で概説されているようにmd
デバイスを自動アセンブルできるようにすること、またはアセンブル時に0.9アレイのsuper-minor
値を尊重し、 1.2配列のname
(どうやら<hostname>:<super-minor>
)であり、mdadm.conf
なしで正しいことを行います。私はどのパズルのピースが欠けていますか?
次の問題があります。 RAID1を備えた2つのmd
デバイス(md0
およびmd1
)とRAID6を備えた1つ(md2
)があります。 必要なデバイス名でそれらを参照しています。 md0
にはメタデータバージョン0.9があり、他の2つにはバージョン1.2があります。 md0
は/
にマップされ、他の2つはbootingには関係ありません。
ブートドライブはGPTパーティションです。その上に接着剤「BIOSブートパーティション」(sda1
)があります。 grub-install --no-floppy /dev/sda
は成功を報告します。
md0 == sda3 + sdb3
md1 == sda2 + sdb2
md2 == sdc + sdd + sde + sdf + sdg + sdh
sda1
およびsdb1
は、それぞれ「BIOSブートパーティション」ですGRUB2は/boot/grub/devicemap
に満足しています。私はそれを提供し、part_gpt
、raid
、mdraid09
およびext2
をモジュールに追加してGRUB2にプリロードしました。
まだレスキュー環境にルートボリュームが残っているので、すべてをマウントしてからchroot
edしました。
mkdir /target
mount /dev/md0 /target
mount -o bind /dev /target/dev
mount -o bind /dev/pts /target/dev/pts
mount -o bind /sys /target/sys
mount -o bind /proc /target/proc
chroot /target /bin/bash
そこから、super-minor
のmd0
をリセットし(メタデータ0.9を使用)、md1
とmd2
のname
をリセットします。また、mdadm --detail ...
を使用して動作することを確認しました。それ以外に/etc/default/grub
を調整し、update-grub
とgrub-install --no-floppy /dev/sda
とgrub-install --no-floppy /dev/sdb
も実行しました。
その後、起動すると、ルートファイルシステムをマウントできなかったため、常にinitramfs
レスキューシェルに移動しました。 /proc/mdstat
を確認した後の理由は、それぞれのmd
デバイスがアセンブルも実行もされていないためです。他の2つの(メタデータバージョン1.2)ドライブは、125..127の範囲のどこかにデバイス番号を受け取ることは言うまでもありません。
注: GRUB2がブートディスクから起動します。したがって、少なくとも、正しく埋め込まれています。問題は、最初のrootfs
から適切なルートファイルシステムへの移行です。
フォールバックモードがあり、Grubが実際にファイルシステムを読み取ることができない場合に備えて—ブートレコードにそのすべてのコードを埋め込むための十分なスペースがないか、またはファイルシステムまたはその下のレイヤーを認識していないためです。この場合、GRUBはセクターのリストを埋め込み、それらからコードを読み取ります。これはmuch堅牢性が低く、回避するのが最も良い方法です。カーネルとそのようなinitramfs(わからない)。
その後、カーネルが制御を取り、基本的なハードウェアの初期化を行います。この段階はかなり早いです。次に、カーネルはinitramfsをtmpfsに解凍し、そのtmpfsで/init
を探します。次に、それが実行されます(通常の意味では、カーネルはこの時点でフル稼働しています)/init
。ちなみに、これは昔ながらのシェルスクリプトです。
mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-AMD64 | cpio -idmv
のようなことを行うことにより、initramfsを手動で抽出できます。
Initramfsは、すべてのドライバのロード、udevの起動、ルートファイルシステムの検索を担当します。これは失敗しているステップです。ルートファイルシステムが見つからないため、エラーが発生します。
Initramfsが完了すると、ルートファイルシステムがマウントされ、制御が/ sbin/initに渡されます。
この時点で、あなたのinitが引き継ぎます— Ubuntuは現在upstartを使用していると思います。
何が壊れているのかは完全にはわかりませんが(一部、告白します。これは、UbuntuよりもDebianでの動作がよく似ているためですが、似ていますが)、いくつかの提案があります。
mdadm.conf
のコピーがあります。修正するには、update-initramfs -u
を実行する必要があるだけかもしれません。さて、私はただ一つのピースが欠けていたことがわかりました。 initrd
画像はmdadm.conf
をいじった後に更新されていませんでした。
それで私は何をしましたか?
Ubuntu ServerのインストールCDのレスキューシステムを起動しました。インストーラー環境からシェルを実行することを選択し、ルートファイルシステムを使用することをしないことを選択しました。次に(#
が前に付いたコメント):
cat /proc/mdstat
# It showed me md125, md126 and md127
# Stop those:
mdadm -S /dev/md125
mdadm -S /dev/md126
mdadm -S /dev/md127
# Assemble the root volume (meta-data version 0.9)
mdadm -Av --update=super-minor --run /dev/md0 /dev/sda3 /dev/sdb3
# Assemble the other two arrays, updating the names (meta-data version 1.2)
mdadm -Av --update=name --run /dev/md1 /dev/sda2 /dev/sdb2
mdadm -Av --update=name --run /dev/md2 /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh
# Check the outcome:
cat /proc/mdstat
# See preferred minor and names:
mdadm --detail /dev/md0
mdadm --detail /dev/md1
mdadm --detail /dev/md2
# All is fine, so proceed ...
# Create directory for the chroot:
mkdir /target
# Mount root volume on it
mount /dev/md0 /target
mount -o bind /dev /target/dev
mount -o bind /proc /target/proc
mount -o bind /sys /target/sys
mount -o bind /dev/pts /target/dev/pts
# Now chroot into it:
chroot /target /bin/bash
# Fix up the GRUB device map to match what 'mdadm --detail' gives as UUID:
nano /boot/grub/devicemap
ナノ
nano
を使用しているのは、vim
が文字どおりダム端末のために頭痛の種となったためです。使用できます Ctrl+x 終了する(保存するように求められます、 Ctrl+k 現在の行をカットするには、 Ctrl+u カットラインを貼り付けるには、 Ctrl+o バッファを保存します。
これは複雑に聞こえますが、bash
ワンライナー(長いものでも)でも実行できます。
for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap
これは、md
デバイスとそのUUIDのcurrent名を使用し、GRUB2の閲覧用にdevicemap
を作成します。したがって、上記が正しく行われたと仮定すると、正しいデバイス名がすでにあるはずです。
これより先:
# Edit the grub config
nano /etc/default/grub
それが含まれていることを確認してください:
GRUB_PRELOAD_MODULES="part_gpt raid mdraid09 ext2"
/
または/boot
パーティションをメタデータバージョン1.2に構成している場合は、mdraid1x
ではなくmdraid09
を使用してください。
さらに:
# Update the initrd images
update-initramfs -c -k all
この上のステップはミッシングリンクでした。これにより、mdadm.conf
が起動時に有効になるようです。
# Install GRUB2 on the two drives eligible for booting, just to be sure
grub-install --no-floppy /dev/sda
grub-install --no-floppy /dev/sdb
# Make the latest config take effect
update-grub
その後、chroot
を終了して再起動します。