Linuxを起動する方法はたくさんあります.本エントリでは
の2つを共存させたディスクを作成する方法についてまとめます
前者は,従来のBIOS経由での起動方法で,古いマザーボードだと必須となる方法です.後者は,EFI経由の起動方法で,最近のマーザーボードで使える"新しくて便利な"方法となります.
具体的な手順について
以下,実例として
の場合について手順を詳細に説明します
SSDは64GB で /dev/sdb に繋いであるものとします
なお既存のディスクを MBR/ESP両対応に変換する手順については,後日別エントリに書く予定です.
事前準備
事前知識として
- MBRを使う場合は,ディスクの先頭に1MB程度の領域を確保しておいて,そこに grub2を入れる事
- ESPを使う場合は,ディクスのパーティションテーブルを GPT という形式で設定する事
- ESPは FAT32 または FAT16でフォーマットする事
という条件があります
そこで,予め gptを使うために gdisk, fat でフォーマットするので dosfstools をインストールしておきます
$ sudo apt-get install gdisk dosfstools
$ sudo apt-get install grub-efi
gdisk を使ったパーティション設定
gdisk で
sudo /sbin/gdisk /dev/sdb
次のように表示されます
GPT fdisk (gdisk) version 1.0.1 Partition table scan: MBR: not present BSD: not present APM: not present GPT: not present Creating new GPT entries. Command (? for help):
まず expert モードに遷移,sector alignment value を 1に変更します
Command (? for help): x Expert command (? for help): l Enter the sector alignment value (1-65536, default = 2048): 1 Expert command (? for help): m Command (? for help):
各コマンドを説明すると,
- まず"x"でexpertモードに突入
- "l"でsector alignment value の変更
- 値を1 に設定
- "m"で元のモードに戻る
となります
続いて第一パーティションを作成します.このパーティションは MBR用 grub が使う領域になります
Command (? for help): n Partition number (1-128, default 1): 1 First sector (34-125045390, default = 34) or {+-}size{KMGTP}: 34 Last sector (34-125045390, default = 125045390) or {+-}size{KMGTP}: 2047 Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): EF02 Changed type of partition to 'BIOS boot partition'
各コマンドを説明すると,
と設定しています.これで "BIOS boot partition" が作成されます
念の為,"p"コマンドでパーティションテーブルを表示させて,状態を確認します
Command (? for help): p Disk /dev/sdb: 125045424 sectors, 59.6 GiB Logical sector size: 512 bytes Disk identifier (GUID):XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX Partition table holds up to 128 entries First usable sector is 34, last usable sector is 125045390 Partitions will be aligned on 1-sector boundaries Total free space is 125043343 sectors (59.6 GiB) Number Start (sector) End (sector) Size Code Name 1 34 2047 1007.0 KiB EF02 BIOS boot partition Command (? for help):
34セクタから2047セクタに EF02 で BIOS boot parttion が作成されていることが確認できます
うまく行ったら sector alignment value を 2048 に戻します
Command (? for help): x Expert command (? for help): l Enter the sector alignment value (1-65536, default = 2048): 2048 Expert command (? for help): m Command (? for help):
- "x"でexportモードに突入
- "l"でsector alignment value の変更
- 値を 2048 に設定
- "m"で元のモードに戻る
となります
Command (? for help): n Partition number (2-128, default 2): 2 First sector (2048-125045390, default = 2048) or {+-}size{KMGTP}: 2048 Last sector (2048-125045390, default = 125045390) or {+-}size{KMGTP}: 256M Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): EF00 Changed type of partition to 'EFI System'
と設定します.これで "EFI System" パーティションが作成されました
続けて Linux 用のパーティションを作成します.今回はディスクの残りの領域をすべて "/" パーティションに割り当てることにします
Command (? for help): n Partition number (3-128, default 3): First sector (524289-125045390, default = 526336) or {+-}size{KMGTP}: Last sector (526336-125045390, default = 125045390) or {+-}size{KMGTP}: Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): Changed type of partition to 'Linux filesystem'
- "n" で新しいパーティションを作成
- あとはデフォルト値をそのまま使えばいいので,enter キーを押すだけです
- パーティション番号が3
- 先頭セクタは 526336
- 末尾セクタは 125045390
- パーティションのGUID は 8300
となっています
最後に "p" でパーティション情報を表示させます
Command (? for help): p Disk /dev/sdb: 125045424 sectors, 59.6 GiB Logical sector size: 512 bytes Disk identifier (GUID):XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX Partition table holds up to 128 entries First usable sector is 34, last usable sector is 125045390 Partitions will be aligned on 2048-sector boundaries Total free space is 2047 sectors (1023.5 KiB) Number Start (sector) End (sector) Size Code Name 1 34 2047 1007.0 KiB EF02 BIOS boot partition 2 2048 524288 255.0 MiB EF00 EFI System 3 526336 125045390 59.4 GiB 8300 Linux filesystem
問題なければ "w" でパーティション情報をディスクに書き込みます
Command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): Y OK; writing new GUID partition table (GPT) to /dev/sdb.
問題なければ "Y" を押します."Y"を押すまではディスクには何も書き込まれないので,不安だったら
Ctrk-C とか "N" を押せば変更はキャンセルできます
各パーティションのフォーマット
再度パーティションを確認します
$ sudo /sbin/gdisk -l /dev/sdb
Number Start (sector) End (sector) Size Code Name 1 34 2047 1007.0 KiB EF02 BIOS boot partition 2 2048 526335 256.0 MiB EF00 EFI System 3 526336 125045390 59.4 GiB 8300 Linux filesystem
第1パーティションのフォーマットは不要です.grubが直接セクタを書き換えるためです
第2パーティション /dev/sdb2 は vfat 32 でフォーマットします.これはEFIのルールです
$ sudo /sbin/mkfs.vfat -F32 /dev/sdb2
第3パーティション /dev/sdb3 は ext4 でフォーマットしました
$ sudo /sbin/mkfs.ext4 /dev/sdb3
第三パーティションはディスクラベルも指定しておきます.ラベルは"ROOT"にします
$ sudo /sbin/e2label /dev/sdb3 ROOT
今時のLinuxはUUIDでパーティションを特定しますが,私は必ずラベルを設定するようにしています.
なぜなら,サーバ障害時などの緊急時には最悪SSDを取り外して,別のLinux BOXに繋いでマウントという手段を取ることがあり,その際はラベルを指定しておくと作業が円滑におこなえるためです.
システムのコピー
長いので別エントリにしています.linux環境を複製する方法 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き - こちらをご覧ください
grubのインストール
新しいディスク上を /mnt にマウントして,そこに chroot した環境で作業します
$ sudo mount /dev/sdb3 /mnt $ sudo mount --bind /dev /mnt/dev $ sudo mount --bind /proc /mnt/proc $ sudo chroot /mnt
MBR用grub2のインストール
従来のBIOSブートで使用するブートローダとして grub2 をインストールします
# /usr/sbin/grub-install --target=i386-pc /dev/sdb
エラーが出る場合は以下の点を確認します
- "BIOS boot partition"が正しく作成出来ているか?
パーティションテーブルの内容を再度チェックしましょう
- "multiple partition labels" というエラーが出る場合
以下のエラーが出る場合は
grub-install: warning: Attempting to install GRUB to a disk with multiple partition labels. This is not supported yet..
# dd if=/dev/zero of=/dev/sdb seek=1 count=2047
を実行してブートセクタから第一パーテションまでを一度消去します.あとは再度
# /usr/sbin/grub-install --target=i386-pc /dev/sdb
を実行すればOK
EFI用grub2のインストール
まず"EFI System"パーティションを /boot/efi にマウントします
# mkdir -p /boot/efi # mount /dev/sdb2 /boot/efi
続けてgrub2をインストール
# /usr/sbin/grub-install --target=x86_64-efi /dev/sdb
efibootmgr: EFI variables are not supported on this system. efibootmgr: EFI variables are not supported on this system.
という警告がでます
この警告が出る場合は再起動時にマザーボードのBIOS/EFIの設定画面に行き,ブートローダーとしてgrubを使うように設定する必要があります