Linuxのブートに関する世界観です。
Linuxでは、カーネルイメージやブートローダは/bootというブート用のディレクトリに置かれている。
起動を確実にするために、/bootをジャーナリングのないext2ファイルシステムでフォーマットすることもある(後日注記:UEFIを用いた新しいシステムの場合、ESPとなる/bootパーティションはFAT32でフォーマットする)。/bootの中にカーネルイメージとブートローダを配置する。
ブートローダとは、OSの起動を行うためにBIOSから実行されるソフトウェア。Linuxではgrubを用いることが多い。
BIOSは、BIOSの設定で、ハードディスク、CD/DVDドライブ、フロッピーディスクなどの起動の優先順位が決まっている。多くの場合、ハードディスクよりもCD/DVDの方が優先されているため、CD/DVDにディスクが入っていて、そのディスクから起動できる場合にはディスクから起動する。これは、Linuxのインストールメディアから起動したい場合などに用いられる。CD/DVDから起動しない場合は、BIOSの設定を変更する。フロッピーディスクやCD/DVDにメディアが入っていない場合は、BIOSはハードディスクから起動しようとする。
現在の主流のパーティショニング技術にはMBRとGPTがある。MBRの場合、MBRにインストールされたブートローダgrubが起動される。
基本的にBIOSではなくEFI/UEFIでブートする場合、従来のMBR以外にGPTを使うことができるようになった。(BIOSベースのシステムでGPTを使うこともある。)
後日注記:従来のMBRによるパーティショニングでは、プライマリパーティションを4つしか設定できず、それ以上のパーティションは拡張パーティションにしなければならなかった。これはMBRの領域サイズが小さいためで、GPTでは領域のサイズが大きい。このため、GPTでは無制限にパーティションを切ることができ、サイズの上限も大きい。ただし、BIOSベースのシステムでGPTを使う場合、Windowsをデュアルブートできないなどの問題もある。
grubはLinuxを起動するだけではなく、Windowsの起動もできる。
grubは/boot/grub/grub.cfgの設定に従ってOSを起動する選択肢を表示し、起動時に起動したいOSを選択できる。
現在はgrubは/etc/default/grubや/etc/grub.d以下のスクリプトに従って、/boot/grub/grub.cfgを自動作成する。この時、システムに存在するOSの一覧を検出するため、特に何もしなくても、Windowsや別にインストールされているLinuxを検出して、メニューを表示する。
後日注記:昔のデュアルブートは複雑で、/boot以下にある起動したいカーネルイメージを指定するなどする必要がありましたが(詳細は覚えていないので違っていたら申し訳ない)、今はGRUBが自動的にインストールされているシステムを見つけてくれるので、簡単です。面白味はなくなったかもしれませんが、設定を間違える恐れがなく、とても便利です。
2024.10.28編集
2024.10.30編集
今でこそ、Linuxの世界ではGNU GRUBが標準的なブートローダーとして使われているが、過去にはLILOと呼ばれるブートローダーが使われていたことがあり、過去の文献などではLILOが出てくることも多い。
2024.10.28
Linuxカーネルのイメージファイルは、通常/bootパーティションに置かれる。
コンピュータの起動時に、BIOSからブートローダーの(Linuxでは主に)GRUBが実行され、GRUBによって/bootにあるLinuxのカーネルイメージが実行される。その上でSysV initあるいはsystemdにより、サービスが起動される。
一度Linuxをインストールしたらめったに再インストールする必要はないが、GRUBをMBRに再インストールするためには以下を実行する。
# grub2-install /dev/sda
必要に応じて/dev/sdaを変えること。
GRUB 2の新しい仕様として、GRUBのメニューファイル/boot/grub/grub.cfgはgrub-mkconfigコマンドによって自動作成されるようになった。よって、このファイルを手動で設定してはならない。設定すべきファイルは/etc/default/grubに存在するので、それを編集する。
内容は以下が参考になる。
編集したら、以下を実行して設定ファイルを再作成する。
# grub2-mkconfig -o /boot/grub/grub.cfg
/boot/grub/grub.cfgは環境によって/boot/grub2/grub.cfgになる場合があります。
GRUBは簡単なインタラクティブ・シェルを内蔵していて、起動しなくなった場合でもコマンドによって復旧することができる。
起動時のメニュー画面で「c」を実行すると、
grub>
というシェルの入力モードになる。
この状態で、手動でカーネルを実行できる。以下が参考になる。
以下のページが参考になります。
また、以下のページは詳しくて、「今のLinuxのブートの仕組み」を知る上で参考になります。
2023.01.09編集
WindowsとLinuxのように、複数のOSを同じハードディスクから起動したい場合、昔はデュアルブートやマルチブートという方法を使っていました。
たとえば、GRUBを使って、ハードディスクの中の別々のパーティションに記録した、WindowsとLinuxのシステムを起動時に選択して起動することができます。
昔は複雑な設定が必要でしたが、今はGRUBが自動的にインストールされているシステムを検索するため、簡単にデュアルブート構成を実現できます。
ですが、最近のWindowsやLinuxを使うのであれば、デュアルブートよりももっとよい方法があります。それは仮想化ソフトを使う方法です。
仮想化ソフトを使うことで、WindowsやMacの上でLinuxを動かしたりすることが簡単にできます。
また、ホストOSがLinuxである場合は、Dockerを使うことで、Linuxの上で仮想マシンのコンテナをいくらでも動かすことができて、便利です。
デュアルブートに勝る仮想化ソフトのメリットは、ホストOSが実行中であってもゲストOSを実行できることです。
デュアルブートの場合、Windowsを実行している時にLinuxを実行したくなったら、WindowsをシャットダウンしてLinuxを起動しなければなりません。
なので、「Linuxのインストール中にWindowsでインターネットの情報源を調査する」ということができません。
仮想化ソフトなら、Windowsの実行中にLinuxを実行できます。
デメリットがあるとしたら、専用の仮想化ソフトが必要になることです。仮想化システムでは、ホストOSに専用の仮想化ソフトをインストールして、その上でゲストOSを導入しなければなりません。この時、仮想化ソフトを導入するためには、複雑な設定と管理が必要です。仮想化ソフトごとに異なり、不都合や手間がかかることが多くあります。それに比べて、デュアルブートはGRUBなどから起動するシステムを選ぶだけでよいため、手軽です。
また、仮想化ソフトは仮想化のオーバーヘッドがかかるので、ゲストOSの実行が遅くなって操作が重たくなります。Linuxの上でLinuxを動かすだけのDockerならまだ軽量ですが、そうでない場合、非力なパソコンで仮想化ソフトを動かすのは困難があります。デュアルブートの場合はそれがありません。ネイティブの速度で実行できます。
Macを使う場合、Intel MacではWindowsをMacの上で動かすことのできる「Boot Camp」という機能があり、デュアルブートと同等のものとして利用できます。昔僕がデザインの作業所で使っていたMacにも、Boot CampによるWindowsシステムが入っていました。ですが、使わないのに容量を食ってしまうので削除しました。デュアルブートや仮想化ソフトの場合も同じで、あまり多くのシステムを同じパソコンに入れすぎると、使わないのに容量を馬鹿みたいに食ってしまいます。なので、使わないシステムは導入しないようにしましょう。
仮想化ソフトの用途としては、プログラミングやサーバー構築用の勉強用です。Windowsを使っていながら、LinuxでApacheやPHPなどを動かす勉強ができます。Windows用のApacheを入れる方法もありますが、Linuxを使ったほうがより実践的で、本番環境に近い環境でテストができます。
2024.10.28