ブートローダとは、OSが起動するためのトリガーだ。例えば、複数のOSがインストールされているとき、ブートローダで選択をして起動をする。
ブートローダのインストール方法についてまとめている。
ブートローダとは?
コンピュータシステムを起動するとBIOSやUEFIがシステムを初期化(使用出来る状態への準備)をし「ブートローダ」が起動する。そのブートローダからOSが起動される。いわば、「起動のためのトリガー」である。
複数のOSがHDDやSSD(これら補助記憶媒体)にインストールされている場合、ブートローダから指定してOSを起動する。
従来のMBR(MasterBootRecord)を使用した環境の場合MBRからブートセクタをロード、さらにサブシステムをロードして最終的にOS(Linuxの場合カーネル)をロードする形になる。
UEFIの場合はUEFI自体が一つのシステムとして形になっており、FAT系のパーティションを自力で検出、のちにGPTをロードしOSを読み出してゆくというながれになる。
昨今のGRUBであればUEFI環境でも問題なく稼動する。しかし、もし何か事情があって古いブートローダ、例えば古典的なLILOを使用しなければならないときはUEFIをレガシーなモードで動作させると、従来のBIOSとMBRの組み合わせと同じ挙動を再現するようになっている。
ブートローダをインストールするにあたって
ブートローダは一度インストールしたら他のブートローダをインストールすることはほぼない。また設定を間違えるとOSが起動しなくなるなど、入門者にとっては致命的な事故につながる。そもそもインストーラが初期段階でブートローダを適切に設定してしまうことがほとんどだろう。
ブートローダを入れ替える場合、理解をふかめる為に「事故を覚悟できる」もしくは実機で「実験機をかまえることが出来る」のであればいいのだが、そうでない場合はとりあえず仮想マシンを使用して実験をしてほしい。
実際のところ「GRUB2」について知っていれば、これからさき困ることは少ないので「GRUB Legacy」「LILO」は知識上知っている程度でも問題ない。
GRUB2
現代のLinuxでのブートローダは「GRUB2」がデファクトスタンダードとなっている。
現代のGRUB2とその前にあった旧GRUBは「GRUB Legacy」として一般的に区別される。GRUB Legacyと共通していえることが、自力でシェルをもっているので、設定を間違えて登録してしまった場合でもGRUBのシェルからOSをブートすることが可能という点だ。
しかし現代のGRUB2は「GRUB Legacy」と比較すると構造が複雑になっている。設定ファイルもコマンドを使用して自動生成するようになっている。CentOS7の場合はデフォルトでGRUB2がインストールされる。
起動している状態でブートローダを再インストールしたい場合など
MBRとの組み合わせでGRUB2を使用している場合
# grub2-install /dev/sda
とすると「/dev/sda」のMBRにGRUB2がインストールされる
もしくはUEFIなマシンでは
# yum reinstall grub2-efi shim
とすると一応安全に再インストールが可能となっている。
設定ファイルは「/boot/grub/grub.cfg」となっているがこれは「grub-mkconfig」コマンドにより自動生成されるものなので、手動編集は避けよう。では設定などはどこを編集するのかというと「/etc/default/grub」ファイルを編集する。
# vi /etc/default/grub
主な項目としては
- GRUB_DEFAULT=0
- GRUB_TIMEOUT=5
- GRUB_CMDLINE_LINUX=”各オプション”
- GRUB_DEFAULT=saved
などだろう。
GRUB_DEFAULTは何番目のエントリをデフォルトで起動するか?
GRUB_TIMEOUTはGRBUの画面を何秒間表示するか?
GRUB_CMDLINE_LINUXは起動時、 コマンドラインオプションへ追加したいオプションを指定する。
GRUB_DEFAULT=saved デフォルトのメニューエントリーを前回選択したものにする。
他
GRUB_DISABLE_RECOVERY=”true” リカバリーモードの表示をどうするか?
GRUB_TERMINAL_OUTPUT=”console” どのような表示出力をするか?
GRUB_DISABLE_SUBMENU=true サブメニュー化を許容するかどうか?
GRUB_DISTRIBUTOR=”ディストリビューション情報” ディストリビューションのバージョン情報を名前として登録
などがある。
変更を加えたら
# grub2-mkconfig -o /boot/grub2/grub.cfg
を実行し設定ファイルを再生成する。
また起動時メニュー画面で「c」キーを押すとシェルに突入し入力を受付けるようになる。
デフォルトのパーティション設定をしていた場合
grub> set root=(hd0,1)
grub> linux /vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/centos-root rd.lvm.lv=centos/root
grub> initrd /initramfs-3.10.0-327.el7.x86_64.img
grub> boot
と入力してゆくと一応に手動でカーネルを指定して起動できる。
GRUB Legacy
GRUB Legacyなど、ここから先は、ほぼ知識上しっていれば問題ない。
設定ファイルは
Debianなどの場合「/boot/grub/menu.lst」
RedHatなどの場合「/boot/grub/grub.conf」
となっていた。
設定の一例をあげると以下のようになっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
default=0 timeout=5 title Linux root (hd0,0) kernel /vmlinuz root=/dev/sda1 initrd /initrd.img root (hd0,0) インストールされているディスクを指定 kernel /vmlinuz root=/dev/sda1 カーネルとパラメータを指定 initrd /initrd.img |
イニシャルラムディスクが必要な場合指定する。
独自でシェルをもっており起動時にカーネルやラムディスクなどの指定が可能である。
LILO
LILOはLILOコマンドが実行された時点で、MBRに書き込みをおこなう、また起動時に高度なシェルはもちあわせていないので設定をあやまると「起動できない」といった状態が発生する。
設定ファイルの位置は「/etc/lilo.conf」である。例として以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
prompt timeout=50 default=linux boot=/dev/sda map=/boot/map install=menu image=/boot/vmlinuz label=linux initrd=/boot/initrd.img read-only root=/dev/sda1 |
boot=/dev/sda は実際にインストールするHDDなどを指定
image=/boot/vmlinuz で今HDD上のどこにカーネルが存在するのかの情報を設定
label=linux はメニューで表示される名前
initrd=/boot/initrd.img はイニシャルラムディスクがある場合指定する。
root=/dev/sda1 はルートパーティション
設定項目的にはこれだけ知っていれば、ほぼ問題ないはずだ。
設定を編集した後は
# lilo
とコマンドを発行する必要がある。
なおliloは設定に不備があった場合、起動しなくなる可能性が高い。なのでliloコマンド実行時のメッセージに注意しよう。
まとめ
このページでは「ブートローダとは」と「ブートローダのインストール方法」についてお伝えをした。
特にインストールについてはあまり実施することはないだろうが、Linuxエンジニアとして知っておいて損は無い。