Ubuntu:mdデバイスは起動時にどのように組み立てられますか?


8

mdUbuntuの起動時にデバイスはどのように組み立てられますか?で/etc/mdadm/mdadm.conf、本当にここでは関係要因?

mdadm.confは健全で、レスキューCD環境にいる間に確認しました。実行mdadm -A --scanすると、必要に応じてデバイス名が検出され、割り当てられます。にmdadm.confAUTO -all、配列の組み立てからすべての自動性を取り出すためのものが含まれています。

私がする必要があるのは、起動時にmd概説さmdadm.confれているようにデバイスを自動組み立てできるようにすること、または組み立てるときにsuper-minor0.9アレイの値と1.2アレイのname(どうやら<hostname>:<super-minor>)を尊重し、なしで正しいことを行うことmdadm.confです。私はどのパズルのピースが欠けていますか?


次の問題があります。mdRAID1(md0md1)を備えた2つのデバイスとRAID6(md2)を備えた1 つのデバイスがあります。目的のデバイス名でそれらを参照しています。md0メタデータバージョン0.9があり、他の2つはバージョン1.2です。md0へのマップ/と他の2つは、ブートには関係ありません。

ブートドライブは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_gptraidmdraid09およびext2GRUB2にプリロードをモジュールに。

まだレスキュー環境にルートボリュームが残っているので、すべてをマウントして、そこにchroot編集しました。

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-minoron md0(メタデータ0.9を使用)とnameon md1およびをリセットしmd2ます。また、を使用して動作することを確認しましたmdadm --detail ...。それ以外は調整/etc/default/grub、走りupdate-grubgrub-install --no-floppy /dev/sdaそしてgrub-install --no-floppy /dev/sdb

その後、起動するとinitramfs、ルートファイルシステムをマウントできなかったため、常にレスキューシェルに移動しました。チェックした後の理由は/proc/mdstat、それぞれのmdデバイスが組み立てられて実行されないことです。他の2つの(メタデータバージョン1.2)ドライブが125..127の範囲のどこかにデバイス番号を受け取ることは言うまでもありません。

注: GRUB2はブートディスクから起動します。したがって、少なくとも、正しく埋め込まれています。問題は、初期rootfsから適切なルートファイルシステムへの移行です。


1
/dev/mdXまさにこの理由で使用しないでください。/dev/md/NAME代わりに使用してください。それは決して変わることはありません。
Patrick

@パトリック:私はあなたが言おうとしていることを理解していません。問題は名前そのものではありません。それは多かれ少なかれ化粧品です。問題、ルートボリュームがアセンブルされないため、起動に使用できず、起動できなかったことです。私はUUIDを使用してGRUB2にどのデバイスがどのデバイスであるかを伝え、UUIDをで使用してい/etc/fstabます。設定は名前に依存していません。それでもそのようにしたいのですが;)
0xC0000022L

明確にすべきだった。それはあなたのコメントへの解決策としてのみ助言されましたNot to mention that the other two (meta-data version 1.2) drives receive a device number somewhere in the 125..127 range。より大きな問題に答えるために、ubuntuがどのようにRAIDボリュームを組み立てるかについては、よくわかりません。
Patrick

回答:


17

基本的な起動プロセス

グラブ

  1. Grubは、ディスク、md、ファイルシステムなどのコードをMBRから読み取ります。
  2. Grubは/ bootパーティションを見つけて、残りの部分を読み取ります。構成と、構成が指定するすべてのモジュールには、読み込みが必要です。
  3. Grubは、通常、カーネルとinitramfsをメモリにロードしてカーネルを実行するように指示するconfigの指示に従います。

フォールバックモードがあり、Grubが実際にファイルシステムを読み取ることができない場合に備えて—ブートレコードにそのすべてのコードを埋め込むための十分なスペースがないか、ファイルシステムまたはその下のレイヤーを認識していないためです。この場合、GRUBはセクターのリストを埋め込み、セクターからコードを読み取ります。これははるかに堅牢性が低く、回避するのが最善です。そのようにカーネルとinitramfsを実行することさえできるかもしれません(不明)。

カーネル

その後、カーネルが制御を取り、基本的なハードウェアの初期化を行います。この段階はかなり早いです。次に、カーネルはinitramfsをtmpfsに解凍し、そのtmpfsでを探し/initます。次に、それが実行されます(通常の意味では、カーネルはこの時点で実行されます)/init。ちなみに、これは単純な古いシェルスクリプトです。

initramfs

次のような方法でinitramfsを手動で抽出できmkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmvます。

initramfsは、すべてのドライバのロード、udevの起動、ルートファイルシステムの検索を担当します。これは失敗しているステップです。ルートファイルシステムが見つからないため、エラーが発生します。

initramfsが完了すると、ルートファイルシステムがマウントされ、/ sbin / initに制御が渡されます。

システム起動

この時点で、initが引き継ぎます。現在、Ubuntuはupstartを使用していると思います。

壊れたもの

何が壊れているのかは完全にはわかりませんが(一部、告白します。これは、UbuntuよりもDebianでの動作に詳しいので、似ていますが)、いくつかの提案があります。

  • initramfsには独自ののコピーがありmdadm.confます。あなたはupdate-initramfs -uそれを修正するために実行する必要があるかもしれません。
  • ブートメッセージを確認します。エラーの可能性があります。'quiet'と 'splash'を取り除き、カーネルラインに 'verbose'を追加して実際にそれらを確認します。
  • 使用するストレージによっては、rootdelayパラメータの設定が必要になる場合があります。
  • シェルプロンプトにダンプされたら、コマンドは多くありませんが、mdadmはあります。何が問題だったかを理解してみてください。問題を修正すると、ブートを続行できます。

2
あなたの最初の提案は的確でした。あなたの答えは私が自分で書いているときに入って来ました。お時間を割いていただきありがとうございます。とても有難い。あなたの質問は追加の洞察を提供すると思います。+1プラス。
0xC0000022L 2013

2

さて、私はただ一つのピースが欠けていることがわかりました。を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

ナノ

文字通りダム端末のせいで頭痛の種となったので使ってnanovimます。あなたは使用することができます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

これは、デバイスとそのUUID の現在の名前を使用し、GRUB2の閲覧用にmdを作成します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て再起動します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.