UEFI + GRUB2 (Slackware)

Tech > Linux

内容

1. 序

最近取り組んでいたのは,MBRで動き続けているSlackware64 14.2のマシンのルートディスクをあと付けでGPTにして,UEFIでブートするようにすることです.悪戦苦闘の末,何とか動くようになりました.

SlackwareをこれまでずっとMBRでやってきました(って変な日本語^^; ). Slackwareを使い始めた1995年の頃からMBR(lilo)だったもんですから,特に迷いもなく,当然のこととして受け入れていました.

最近少し困ってきたのは,どういうわけか,SSDにliloだと,起動してくれないのです.バックアップ用のHDDも内蔵しているので,そっちからブートするような設定にして切り抜けてきましたが,ルートディスクでないところにブートローダーがあるのは,あまり気持ちよくありません.まあ,実用上問題はないんですが^^;

気持ち悪いこともありますが,後々全部SSDにした時に困るので,UEFI + GRUBにすることにしました.これも,Slackware64のクリーンインストール時にUEFI + GRUBを選択すれば,何にも考えることなくできるんですが,既にMBRで動いているシステムをあと付けでUEFI + GRUBにするには,若干の調べと,数日間におよぶ試行錯誤が必要でした^^;

で,自分用のメモとして残します.自分用のメモなので,(たぶん)かんじんなことが,既知のこととして省略されていたりして,なんだかわからないと思いますが^^;

2. 予備用のディスクをGPTでパーティションを切る

最終的には今動いているルートディスクのパーティションを切り直すわけですが,その準備段階としてはいろんな手順が考えられますね.1番手っ取り早いのは,ルートディスクを交換してしまうことだと思います.しかし,今回は,これまでルートディスクとして動いてきたSSDをそのままに使うことにして,いったん中身を全部予備用ディスクにコピーし,元のSSDをGPTでパーティションを切り直して,全部コピーして戻すということにしました.

予備用ディスクのパーティションはこの際何でもいいんですが,予行演習として,GPTにしました.以下の作業は,当然のことながら全てroot権限で行います.

gdisk /dev/sdb

にて,512MBのEFI, 4GBのswap, 残り全部linuxパーティションとしました.当然ですが,EFIパーティションはvfat, linuxパーティションはext4でフォーマットして,swapパーティションはmkswapで初期化しました.

今のルートパーティションに/boot/efiがない場合は切っときます.

mkdir /boot/efi

そして,自前のコピースクリプトにて,/以下,全部コピーします.この辺は自分のメモとしては詳細不要なので詳しく書きません^^;

自分宛注意: Slackwareパッケージのdevsから/devへのコピーを忘れないこと.

3. コピーしたGPTのディスクからブートする

さて,コピーした予備用ディスクからブートします.

これは,UEFIによるブートの練習でもあります.事前の準備としては,Slackware64のインストールDVDイメージを,4GB以上のUSBメモリースティックにddコマンドで焼いときます.

コピーしたGPTディスクが,SCSIの何ディスクになるか確認しておきます.以下,/dev/sdbだとします.その内容が反映するように,コピーしたディスクの/etc/fstabを編集しておきます.たとえば,

/dev/sdb2 swap swap defaults 0 0
/dev/sdb1 /boot/efi vfat defaults 1 0
/dev/sdb3 / ext4 defaults,discard 1 1

こんな感じです.

また,Slackwareのユーザーの皆さんはたいてい自分でKernelをupdateしていると思いますが,今回の作業ではインストールイメージからブートさせるため,インストールイメージのKernelに対応したモジュールがルートになるパーティションにインストールされていることを確認しておきます.もし,削除済みだったりしたら,USBメモリーをマウントして,それからkernel modulesを探し出してインストーし直しておきます

いよいよUSBメモリースティックを差してマシンを再起動します.BIOSでBootドライブを選ぶモードに入り,USBメモリーのUEFIを選びます.すると,GRUBが起動しますから,”e”を押して起動のコマンドラインを編集します.

最後のinitrdの行を消し,その上の長ったらしいコマンドラインの最後に,改行せずに,

なんだかんだ root=/dev/sdb3 3
(もともとあるinitrdについては行ごと消す)

などと付け加えておきます.root=…を行末に付けるとNGなことがあるので,その場合は前のほうにします.最後の3は,run levelを3(CUI)にするためで,GUIでいいなら必要ありません.

4. 元ディスクにコピーバック

これまでと全く同じ手順です.元のディスクをgdiskで,GPTのパーティションをきり,EFI, SWAP, rootのパーティションにし,それぞれを初期化して,コピーします.

fstabの書き換えも同じ要領です.

そしたら,3とおなじく,USBメモリースティックからGRUBを起動して,準備ができた元ディスクのルートパーティションをrootに指定してシステムの起動をします.

5. UEFI + GRUBのインストール

さて,メモリースティックのUEFI + GRUBから,GPTのパーティションにした元ディスクをルートにして,めでたくブートできました.あとは,この元ディスクにブートローダーをインストールするだけです^^;

ここから先は,「動けば良いのだ」モードです.よくわかってないのです^^; UEFIとGRUB,どちらを先にインストールしたかも忘れてしまいました^^;;

事前準備としては,Slackwareのインストーラーや以前grubのインストールを試みたときの残骸があると面倒なので,

rm -rfv /boot/grub

としておきます.

UEFI

efibootmgrでおまじないします.efibootmgrの使い方は,gentooの「efibootmgr」に詳しく書いてあります.

たしかこんなコマンドを使ったはず^^;

 efibootmgr -c -d /dev/sda -L "Slackware-14.2" -l "\EFI\slackware14.2"

GRUB

BIOS bootパーティションを/dev/sda1とすると,

grub-install /dev/sda1
grub-mkconfig -o /boot/grub/grub.cfg

GRUBのデフォルトは,/etc/default/grubという,Slackwareらしからぬファイルを編集して,

GRUB_DEFAULT="1>8"

などとします(/etc/default/grubの編集後は,grub-mkconfigを実行します).

(2016年4月16日)

Notes:
1. 使用しているMainboardのハードやBIOSとの相性に依存しているのかも知れません.
2. EFIパーティションは, “2MiB” って書いてある手引きが多いですが,あとの作業で何度か容量不足を経験しています.別にけちる必要もないので,512MBとしています.100MBでも10MBでも余裕だと思います.
3. fdiskでもできます.
4. この作業は,この段階ではできませんね.2に戻って,今動いているドライブにインストールして,それから全コピーしなおして(私はrsyncを使っているので差分だけのコピーで済むのでこのような修正のときは楽です)から,この節に戻ります^^;
5. fdiskでもできます.
6. /dev/sdaのパーティションはGPTなので,BIOS bootパーティションを/dev/sda1とすると,

efibootmgr -c -d /dev/sda1 -L "Slackware-15.0" -l "\EFI\slackware15.0"

ではないか(要確認).

使用しているMainboardのハードやBIOSとの相性に依存しているのかも知れません.
EFIパーティションは, “2MiB” って書いてある手引きが多いですが,あとの作業で何度か容量不足を経験しています.別にけちる必要もないので,512MBとしています.100MBでも10MBでも余裕だと思います.
fdiskでもできます.
この作業は,この段階ではできませんね.2に戻って,今動いているドライブにインストールして,それから全コピーしなおして(私はrsyncを使っているので差分だけのコピーで済むのでこのような修正のときは楽です)から,この節に戻ります^^;
fdiskでもできます.
/dev/sdaのパーティションはGPTなので,BIOS bootパーティションを/dev/sda1とすると,
efibootmgr -c -d /dev/sda1 -L "Slackware-15.0" -l "\EFI\slackware15.0"

ではないか(要確認).