今更BIOS boot
って内容ですが。古いサーバマシンのトラブルついでにUbuntuのupgradeやってたらgrub-installでcritical errorが起きて焦ったので、その対応メモなど。
事例1:core.img ‘unusually large’
Grubが何やってるか知らないとまったく意味不明なエラーですが「最初のパーティションの開始位置をもう少し後ろにずらして下さい」というエラーでした。
ディスクの先頭512BがMBRと呼ばれる部分です。BIOSはここにローダがあると想定して読んで実行するんですが、Grubはlegacyの頃からMBRより後ろ、かつ先頭パーティションの直前までの隙間領域(伝統的には62セクタ)を利用していました。legacyだとStage 1.5とか呼ばれていた部分。2でも同じ場所にStage 2を読むためのcore.imgというのをこっそり置いています。
で、upgradeの際にcore.imgが少し大きくなっちゃって入りきらなくなった、というのが今回のエラーでした。……知らんがな。自分はまるまる1パーティションをraid用に切って突っ込んでたので、パーティションをずらすのは面倒。このディスクにGrubを入れるのは諦めて、かわりに/tmpとswapに使ってたSSDの先頭をずらしてインストールしました。先頭がswap用だったので% sudo swapoff -a
してからfdiskで1つ目のパーティションを切り直してgrub-install /dev/sdX
(Xは環境に合わせて変えてください)。当面こっちから起動して、次にディスク交換する時に余裕を持ってパーティションを切ることにします。
事例2:this GPT partition label contains no BIOS Boot Partition
壊れたRAIDのディスクを交換する際にサイズを2TBから3TBに上げたのですが、fdiskが
WARNING: The size of this disk is 3.0 TB (3000592982016 bytes).
DOS partition table format can not be used on drives for volumes
larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID
partition table format (GPT).
と言っていたので、partedから何も考えずにGPTでパーティションを切りました。で、こちらのエラーはGPTではcore.img用の領域を明示的に作ってください、というエラー。確かに言われるがままにGPTで切ってしまいましたが、EFI環境外で使うとなると、なんらかのケアが必要なのは確かに想定できたトラブル。
で、このcore.img用の特殊なパーティションについては、partedで適当なパーティションを作って(parted) set X bios_grub on
(Xはパーティション番号)で設定できました。パーティション番号が1である必要はないみたいです。確保するセクタ位置について縛りがあるかどうかは今回調べていません(先頭が空いてたので、冒険はせずに先頭に確保した)。
おわりに
昔はこの手のメモを日記としてウェブ上に書き残してたもんですが、最近はGoogle Docsに自分用のメモを書くだけになってました。トラブル時に検索しても「ハマった」情報ばかりで、解決したという情報が少ない時代が続いていた気がしますが、最近は検索結果からQiitaの記事があれば「この情報でいけるか?」みたいな雰囲気があったので、せっかくだから自分もまた書き残すことにしました。