はじめに
最近CentOS7でDockerを使うようになり、今更ですがCentOS7の特徴をまとめてみました。
試した環境
Biosから起動するCentOS
# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
CentOS6からの変更点まとめ参考
↓に変更の要点がまとめられています。
CentOS6とCentOS7の比較表
その中でも、ブートローダ、systemd、firewalld、ネットワーク関連のコマンド変更に着目して、今回はブートローダについてまとめてみました。
ブートローダ
Cent6
バージョン
grub Lagacy
# grub-install --version
grub-install (GNU GRUB 0.97)
設定ファイル
- /boot/grub/menu.lstと**/boot/grub/grub.conf** 普通にこのファイルを直接編集
- /boot/grub/menu.lstは/boot/grub/grub.confへのシンボリックリンクになっている。
# ll /boot/grub/menu.lst
lrwxrwxrwx. 1 root root 11 9月 14 23:54 2016 /boot/grub/menu.lst -> ./grub.conf
ブートシーケンス
bios
↓
mbr(stage1) #biosがmbrにあるstage1(ブートローダ)を読み込む
↓
セクタ2~64(stage1.5) #stage1がセクタ2以降にあるstage1.5を読み込む
↓
/boot/grub/stage2(stage2) #(stage1.5はファイルシステムを解釈できるのでstage2を呼び出せる)
↓
/boot/grub/menu.lstを読み込む
↓
grub起動画面
↓
カーネルとinitramfsのロード
シーケンス詳細
ステージ制
Stage 1ローダは直接Stage 2ローダを読み込めるが、通常はその間に入るStage 1.5ローダを読み込むためセットアップを行う
stage1.5はどこ
MBRの直後から最初のパーティション手前までにある先頭30KB以内に位置するローダ。何らかの理由でこの領域が利用できない場合Stage 1.5ローダのインストールに失敗する(例えば、異常なパーティションテーブルが原因でセクタアドレスが読み取れなかったり、特殊なディスクドライバを必要とするケース、またはGPTもしくはLVMなどを利用するシステムの場合など)
stage1.5の特徴
Stage 1.5ローダのイメージはファイルシステム固有のドライバを含んでいる。よってファイルシステム上にあるstage2を呼び出すことができる
grubコマンド
grub-installしかつかったことない。grub(stageを)インストール。ただ自分が実行したときうまくいかずにgrubシェル(bashライクなインタフェースでgrubに関する設定ができる)を実行してインストールした記憶がある。
# grub-
grub-crypt grub-install grub-md5-crypt grub-terminfo
# grub
Probing devices to guess BIOS drives. This may take a long time.
GNU GRUB version 0.97 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename.]
grub>
Cent7
バージョン
Grub2
# grub2-install --version
grub2-install (GRUB) 2.02~beta2
ブートシーケンス
bios
↓
MBR(boot.img) # biosがboot.imgを起動
↓
セクタ2~64 # boot.imgがcore.imgを起動。ファイルシステムにある各モジ
ールを動的にリンク
↓
/boot/grub2/grub.cfgを参照
↓
grub起動画面
↓
カーネルとinitramfsのロード
Cent6との違い
- セクタ1(MBR)にboot.img、セクタ2ー64にcore.imgが配置
- モジュールを動的にロード
- stage1,stage1.5,stage2なくなる → boot.imgとcore.img、coreimgが動的に複数のモジュールをロードする。
設定ファイル
詳しい説明
Linux 上の GRUB 2 がブートできなくなったときの対処方法
- /boot/grub2以下に関連ファイルある
- boot/grub2/grub.cfg
- ここは直接編集しない。コマンドで生成する
- 編集方法
- /etc/default/grubを編集
- /etc/grub.dにあるスクリプトも適宜編集
- grub-mkconfigコマンド > /boot/grub/grub.cfg
- /boot/grub2/grub.cfgを生成
grubコマンド
たくさんある!
grubシェル起動はない???
# grub
grub2-bios-setup grub2-glue-efi grub2-mkconfig grub2-mkpasswd-pbkdf2 grub2-probe grub2-set-default
grub2-editenv grub2-install grub2-mkfont grub2-mkrelpath grub2-reboot grub2-setpassword
grub2-file grub2-kbdcomp grub2-mkimage grub2-mkrescue grub2-render-label grub2-sparc64-setup
grub2-fstest grub2-macbless grub2-mklayout grub2-mkstandalone grub2-rpm-sort grub2-syslinux2cfg
grub2-get-kernel-settings grub2-menulst2cfg grub2-mknetdir grub2-ofpathname grub2-script-check grubby
補足
set root
設定ファイルに記載されているrootはルートパーティションの指定ではなくカーネルとinitrdが置かれているディスクとパーティションのこと。
device.map
grubの設定ファイルに書かれているGrub形式のデバイス名(hd0) を Linuxデバイス名(/dev/sda)にマッピングする
# cat /boot/grub/device.map
# this device map was generated by anaconda
(hd0) /dev/sda
カーネル起動せずにgrub>になってしまったら
Linux 上の GRUB 2 がブートできなくなったときの対処方法
なるほど👀
GRUB 2 が正常に起動し、 モジュール (および / boot/grub/[arch]/ に格納されている他モジュール) をロードしたが、grub.cfg ファイルが見つからなかったことを意味
なるほど👀
このようなことがなぜ起こるのでしょうか。カーネルが何らかの理由でドライブ名を変更した、ハード ディスクを移動した、パーティションを変更した、または新しいオペレーティング システムを追加して関連する何かを移動したなどです。これらの場合は、GRUB がファイルを検出できないだけで、ファイル自体はもとの場所に存在します。そこで、GRUB がプロンプトを出したら、ファイルの場所を指定し、システムをブートして、GRUB の設定を修正すればよいのです。
まとめ
ブートローダを調べることでカーネルがどうやって起動するかを確認することができました。biosから起動される前提でしたが、UEFIなどにも興味があるのでUEFIについてもまとめてみようと思います。