web-dev-qa-db-ja.com

Ubuntuサーバー、gptパーティションテーブル、mdadm、grubブートが失敗する

基本的な作業システムの詳細:

Ubuntu 12.04サーバーCDを使用してサーバーをインストールしました。

4つのディスクがあります。すべてのディスクで、 this howto と同様に、次のことを行いました。

  • 2GBのスワップパーティションを作成しました
  • 256 GBの/ bootパーティションを作成
  • 64 GBのRAID10パーティションを作成しました(ルート用)
  • 残りのスペースを取って大きなRAID10パーティションを作成

ブートをext3としてフォーマットしました。ルートと大きなパーティションにRAID10をセットアップしました。ルート1をext4にフォーマットしました。私は大きなボリューム上に論理ボリュームを作成し、ext4でフォーマットしました。

結果のシステムは正常に動作し、正常に起動します。

問題の詳細:

次に、失敗の手順を文書化することにしました。最初のステップとして、grubを再インストールすることにしました。

# grub-install /dev/sda
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
# grub-install /dev/sdb
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..

そのため、失敗したようですが、あきらめて変更を加えなかったようです。だから私は再起動しました。起動に失敗しました。約4行下のカーソルが点滅している黒い画面でハングします。 「Shift」キーを押しながら起動すると、カーソルの左側に「GRUB」という単語が表示されますが、インタラクティブなプロンプトは表示されません。

この時点で、私は boot-repair-disk を使用してこのレポートを生成しました: http://paste.ubuntu.com/966531/

上記のレポートでは、ブートローダーがcore.imgの正しいセクターを指していないと記載されています。 (sdaは仮想CDです。sdbはブートディスクです。sdcはsdbのミラーですが、ブートはミラーリングされていません。独立した無関係なパーティションがあり、フォーマットされたext3です。sddとsdeにはブート用のスペースがありますが、フォーマットされていません)

次に、UbuntuサーバーのCDから起動し、レスキューシステムを起動して、エラーなしで完了した次のコマンドを発行しました(sdaは仮想CD、b、c、d、eはa、b、cのディスクです) 、前のgrubコマンドのd):

# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc

この時点で、私は boot-repair-disk を使用してこのレポートを生成しました: http://paste.ubuntu.com/966561/

上記のレポートでは、core.imgに関する問題は解消されています。正しいセクターを指しているようです。

起動しようとすると、grubプロンプトが表示されます。 「set」を実行すると、ルートが見つかり、設定されていることがわかります。 「ls /」を実行すると、raidボリュームのルートディレクトリがvmlinuzカーネルファイルを含めて表示されます。 「ls/vmlinuz」と入力すると、「エラー:ファイルが見つかりません」と表示されます。 「linux」コマンドを使用してカーネルをロードしようとすると、同じエラーが表示されます。 「ls -l /」を使用すると、vmlinuzファイルがリストされません。

フォローしたい場合に備えて、非常に詳細な説明:

/boot/grub/grub.cfgもないことに気付いたので、実行しました

# grub-mkconfig -o /boot/grub/grub.cfg

しかし、問題は残っています。

「gptsync」ツールを使用しても、この動作に変更はありません。

EFIが有効なBIOSで起動するように要求するため、boot-repair-diskはシステムを修復しません。私はこれを簡単に調べましたが、それがどのように機能するのかわかりません。ブートオプションでUEFIシェルを見つけましたが、それについて何も知りません。そこからスタートアップを変更する方法がわかりません(たとえば、そのEFIシェルからCDをブートするなど)。

このページ も読みましたが、Ubuntuには「grub」コマンドが付属していないため、正確にフォローすることはできません。そのコマンドを単にインストールすることもできますが、別のセットアップをするのではなく、Ubuntuインストーラーがコマンドをインストールする方法を知りたいと思っています。ブロックリストを使用しましたか?

boot-repair-disk で起動したときのpartedの出力は次のとおりです(ここでsdbは最初のハードディスクで、ディスクから起動した場合はsdaで、 "boot"は "bios_grub"に変わります2番目の貼り付けリンク):

Model: ATA Hitachi HUA72303 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system     Name   Flags
1      17.4kB  2000MB  2000MB  linux-swap(v1)  swap1
2      2000MB  2256MB  256MB   ext3            boot1  boot (this says bios_grub in 2nd link)
3      2256MB  66.3GB  64.0GB                  root1  raid
4      66.3GB  3001GB  2934GB                  data1  raid

ここに、比較のための無関係な超古い仮想マシンがあります( boot-repair-disk に不慣れな人向け): http://paste.ubuntu.com/966799/

上記のgrub-mkconfigを実行し、「bios_grub」を「boot」に戻した後の、問題のあるシステムからの最新の貼り付けは次のとおりです。 http://paste.ubuntu.com/966808/

2つを比較すると、これは興味深いように見えます。

sdb2: __________________________________________________________________________

File system:       
Boot sector type:  Grub2's core.img
Boot sector info: 
Mounting failed:   mount: unknown filesystem type ''

md/bcserver8:0: ________________________________________________________________

File system:       ext4
Boot sector type:  -
Boot sector info: 
Operating System:  Ubuntu 12.04 LTS
Boot files:        /boot/grub/grub.cfg /etc/fstab /boot/grub/core.img

Raidにブートファイルがあり、sdb2がフォーマットされていないようです。 (これにもかかわらず、grub-installを実行する前にシステムが起動しました)。レスキューCDから、「mount -t ext3/dev/sdb2/boot」が失敗します。しかし、grubはパーティション2(bios_grubをオンに設定するpartedコマンドの2)を明示的に使用するため、これが混乱を招くのは当然です。

だから私はこのようなことをしました:

# mkfs.ext3 -L boot1 /dev/sdb2
# mv boot boot_on_root
# mkdir boot
# mount /dev/sdb2 boot
# rsync -avHP boot_on_root/ boot/
# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc

次に再起動すると、再び黒い画面が表示され、プロンプトは表示されません。 http://paste.ubuntu.com/966848/

したがって、この時点で、私の推測では、bios_grubが設定されている場合、grubはMBRにインストールされず、ext3のext3ファイルシステムにはインストールされず、パーティション自体にインストールされます。そこにext3ファイルシステムをセットアップします。 EFIについての簡単な説明から、EFIは最初のパーティションがブートであると想定しているようですが、私の場合、最初のパーティションはスワップであり、マウントできないものではなくFATである必要があります...感覚、私はまだ手掛かりなしで完全に失われています。 [編集:今私は手がかりを持っています...更新のために少しスキップしてください]

そして boot-repair-disk でrepairをクリックすると、別の質問が表示されます。前回、エラーがウィンドウの下に隠れていたので、エラーを表示するためにもう一方をドラッグする必要がありました。今回はメインウィンドウがなくなり、新しいウィンドウには次のように表示されます。

GPT detected.       You may want to retry after creating a
BIOS-Boot partition (>1Mo, flag). Do you want to continue?

だから私は「はい」をクリックし、それは正常に修復されたと言い、別のペーストを作成しました: http://paste.ubuntu.com/966862/

しかし、まだカーソルが点滅している黒い画面があります。

今私の理論は、ブートが非脂肪非EFIのものによって上書きされたというものです。これは、他の方法では以前にセクター0〜63にあったであろう単なるグラブコードです。幸いにも、このページで非常に明確な声明に出くわしました。おそらく、これが何を意味するのかについての私の理解はおそらく完了しました。そして、私がそれを見つけた後、ジェレミーは答えを投稿しました。真の場合、これは欠けている重要な概念であることを確認します。 http://blog.psych0tik.net/2011/08/grub-embedding-blocklists-and-bios_grub-partitions/

質問:

何が起こっている? grubが起動しないのはなぜですか? 「ファイルが見つかりません」と表示されるのはなぜですか?

Partedで設定したこの設定(Ubuntuインストーラーによって設定されなかった)なしでgrubがインストールしないのはなぜですか?ルートはRAIDにあり、パーティションテーブルはGPTであるため、インストールに必要なのは、LVMにもソフトウェアRAIDにもない個別の/ bootであると思いました。

Ubuntu CDインストーラーは、この問題なしで、bios_grub設定なしでどのようにインストールしますか?

EFIの使用も検討します。これが良いアイデアであり、標準的な設定方法がある場合、私は常に新しいことを学ぶ用意があります。

すべての質問に答えなくても私を幸せにする最も速い答えは、インストールCDが行ったのと同じ方法でブートローダーを修正するためにレスキューCDから実行できるコマンドのセットです。 CDの代わりに、起動したシステムで実行できるとしたら、それもまた素晴らしいでしょう。

9
Peter

解決策は、/ bootパーティションと同じではないbios_grubパーティションを使用することです。

デフォルトでは、bios_grubパーティションは1MiBであり、bios_grubのフラグが立てられている必要があります。私のディスクは私のディスクの最初のパーティションです。 partedが示唆するように、パーティション2が実際に/ bootである場合、それは正しくないため、別の1MiBパーティションを作成する必要があります。

GPTとGRUB2では、最小のファイルシステムに3つのパーティションがあります。bios_grub、root、swapです。 (スワップが必要かどうかは完全にはわかりません)

「grub-install」を実行しただけでgrubが起動しないのはなぜですか?

不明...埋め込むことができないため機能しないことが明確に示されている場合、何も変更しないと思います。

「ファイルが見つかりません」と表示されるのはなぜですか?

/ vmlinuzは、ブートパーティションを使用するシンボリックリンクであり、ブートパーティションが破損しています。 bios_grubコードは、そのext3構造の上に記述されました。これはおそらく、/ bootがマウントされておらず、そこに表示されるgrubファイルが実際にはルートシステム上にあり、カーネルが含まれていないことを意味します。

partedで設定したこの設定なしにインストールしたくないのはなぜですか?

MPTとは異なり、GPTパーティションテーブルにはブートローダー用のスペースがありません。したがって、ブートコードを保持するために特定のパーティションを作成する必要があります。 「grub-install」を実行する前に、次のコマンドでこのパーティションを指定してください:

    parted /dev/sda set 1 bios_grub on

必要なのは個別の/ bootだけだと思っていました。 Ubuntu CDインストーラーは、bios_grub設定なしでどのようにインストールしますか?

この要件は、Ubuntuインストーラーに必要なすべてのようですが、簡単に壊れる非標準のシステムを作成します。

GRUBが「このGPTパーティションラベルにBIOSブートパーティションがない」)とある場合、/ではなくbios_grubパーティションを意味しますブート。

8
Jeremy