01
Linuxは何でできているか:カーネル・シェル・ディストリビューション・ライセンス
Linuxは玉ねぎのように考えるとわかりやすくなります。中心にはCPU・メモリ・ディスク・ネットワークカードといったハードウェアがあり、それを直接操作するカーネルが包んでいます。その外側に、人が入力したコマンドを解釈するシェル(bashなど)があり、いちばん外側に私たちが使うプログラムがあります。
プログラムはハードウェアに直接触れません。ファイルを読んだりネットワークに送ったりする必要があるときは、カーネルにシステムコールで頼みます。カーネルがハードウェアを操作して、結果を返してくれます。だからプログラムが1つおかしくなっても、ハードウェアとほかのプログラムはカーネルが守ってくれます。下の図で、コマンドを切り替えてみてください。
- コマンド
- ls /home
1つのコマンドが層を通ってハードウェアまで下り、戻ってくる · 黄緑 = 要求、水色 = 結果
シェルは「ls /home」を解釈してプログラムを実行します。プログラムはディスクに直接触れず、システムコール(openat · getdents64)でカーネルに頼みます。カーネルがハードウェアを操作して結果を返し、シェルがそれを画面に表示します。だからプログラムがおかしな動きをしても、ハードウェアとほかのプログラムはカーネルが守ってくれます。
ディストリビューション:カーネルにツールをまとめたもの
厳密にいうと、「Linux」はカーネルの名前です。カーネルだけでは使えないので、シェル・コマンドツール・パッケージマネージャー・インストーラーをまとめて提供しているものをディストリビューション(ディストロ)と呼びます。大きく2つの系統があり、このガイドでもコマンドが違うところは2つを並べて紹介します。
| RHEL系 | Debian系 | |
|---|---|---|
| 代表的なディストリビューション | Red Hat Enterprise Linux, Rocky Linux, AlmaLinux, Fedora | Debian, Ubuntu |
| パッケージ形式 | .rpm | .deb |
| パッケージマネージャー | rpm / dnf(以前はyum) | dpkg / apt |
| 管理者グループ | wheel | sudo |
カーネルのバージョンは、5.15.0のように「メジャー.マイナー.パッチ」と読みます。以前はマイナー番号が偶数なら安定版というルールがありましたが、今は使われていません。kernel.orgは、最新の開発版(mainline)、安定版(stable)、長く保守される長期サポート版(longterm)に分けて公開しています。
フリーソフトウェアとGPL
Linuxカーネルはリーナス・トーバルズが1991年に公開しました。その上で動く多くのツールは、リチャード・ストールマンが始めたGNUプロジェクトから来ています。ストールマンはフリーソフトウェア財団(FSF)を設立し、その代表的なライセンスがGPLです。GPLのプログラムは誰でも使い、改変し、再配布できますが、改変したものを配布するときは、ソースコードも同じGPLの条件で公開しなければなりません。自由を次の人にも引き継がせるこの仕組みをコピーレフトといいます。
| ライセンス | ポイント | 例 |
|---|---|---|
| GPL | 改変して配布するなら、ソースもGPLで公開(コピーレフト) | Linuxカーネル(GPLv2)、bash |
| LGPL | ライブラリを利用する(リンクする)だけのプログラムは、GPLで公開しなくてよい | glibcなどのライブラリ |
| BSD・MIT・Apache | ソース公開の義務がほとんどない寛容型ライセンス | さまざまなツール・ライブラリ |
問題文にこんな表現があれば → これを選ぶ
- “ハードウェアを直接管理し、プログラムに資源を割り当てる部分”カーネル
- “ユーザーが入力したコマンドを解釈して実行するプログラム”シェル(bashなど)
- “改変して配布するなら、ソースも同じ条件で公開”GPL(コピーレフト)
- “ライブラリをリンクして使うプログラムには公開義務がない”LGPL
- “GNUプロジェクトとFSFを始めた人物”リチャード・ストールマン
- “RHELと互換性のある無償のディストリビューション”Rocky Linux, AlmaLinux
何でできているかを見ました。次は、電源を入れたときにこれらの層がどんな順番で目を覚ますのかを見ていきましょう。
02
電源を入れると何が起きるか:起動の順序
電源を入れてからログイン画面が出るまでには、いくつかの段階が続きます。各段階が次の段階を見つけてバトンを渡すリレーなので、どの段階で止まったのかがわかれば、何が壊れたのかもわかります。
| 順番 | 段階 | すること |
|---|---|---|
| 1 | ファームウェア(BIOSまたはUEFI) | ハードウェアをチェックし、起動するデバイスを選ぶ |
| 2 | ブートセクター(MBR)またはEFIシステムパーティション | ブートローダーがある場所 |
| 3 | ブートローダー(GRUB2) | メニューを表示し、カーネルとinitramfsをメモリに読み込む |
| 4 | カーネル + initramfs | ハードウェアを初期化し、一時的なルートを使って本物のルートファイルシステムを見つけてマウントする |
| 5 | systemd(PID 1) | 最初のプロセス — サービスを順番どおりに起動する |
| 6 | ターゲット | multi-user(テキスト)やgraphical(グラフィカル)まで上がれば、ログインできる |
- 方式
- UEFI + GPT
- 結果
- ログイン画面までたどり着いた
電源ボタンからログイン画面まで · 故障を起こすと、その段階で止まる
電源を入れると、UEFIがハードウェアをチェックし、起動するデバイスを見つけてEFIシステムパーティションにあるブートローダーを実行します。GRUB2がカーネルとinitramfs(本物のルートファイルシステムをマウントするまで使う一時的なルート)をメモリに読み込み、カーネルは最初のプロセスであるsystemd(PID 1)を起動します。systemdがデフォルトターゲットまでサービスを立ち上げると、ログインできるようになります。
BIOS・MBRとUEFI・GPT:昔の方式と今の方式
名前が4つもあって難しそうに見えますが、2組に分けると単純です。BIOSとUEFIはマザーボードに組み込まれていて、電源を入れると最初に動くプログラム(ファームウェア)です。MBRとGPTは、ディスクの先頭に「このディスクはこう分かれている」と書いておく目次の形式(パーティションテーブル)です。昔の組み合わせはBIOS + MBR、今の組み合わせはUEFI + GPTが一般的です。2つの方式は、次の段階であるブートローダーの見つけ方が違います。
| 昔の方式 | 今の方式 | |
|---|---|---|
| ファームウェア | BIOS | UEFI |
| ディスクの目次 | MBR | GPT |
| ブートローダーの見つけ方 | ディスクの先頭1セクター(512バイト)に入っている小さなコードをそのまま実行する | 起動専用の小さなパーティション(EFIシステムパーティション)を開き、ブートローダーのファイルを選んで実行する |
| たとえるなら | 本の表紙の裏に貼られたメモを読んで、そのとおりにする | 「起動」フォルダーを開いて、実行するファイルを選ぶ |
EFIシステムパーティションは、Linuxではふつう/boot/efiにマウントされています。試験では「UEFIで起動するとき、ブートローダーがある場所」としてよく出てきます。
ブートローダーGRUB2
こうして見つけられて実行されるブートローダーがGRUB2です。以前はLILOも使われていましたが、今はGRUB2が標準です。設定を変えるときに、つまずきやすいところが1つあります。起動時に実際に読まれるgrub.cfgは、直接編集しません。元になる/etc/default/grubを編集してから、grub2-mkconfig(Ubuntuではupdate-grub)を実行すると、grub.cfgが新しく生成されます。
ランレベルからターゲットへ
以前のinitは、「ランレベル」という数字でシステムの状態を分けていました。systemdはこれをターゲットに置き換え、古い名前も通じるように対応づけています。
| ランレベル | systemdのターゲット | 状態 |
|---|---|---|
| 0 | poweroff.target | 電源オフ |
| 1 | rescue.target | レスキューモード(管理者だけ、基本のサービスだけ) |
| 3 | multi-user.target | マルチユーザー、テキストモード(サーバーでよくあるデフォルト) |
| 5 | graphical.target | マルチユーザー、グラフィカルな画面 |
| 6 | reboot.target | 再起動 |
デフォルトのターゲットはsystemctl get-defaultで確認し、systemctl set-defaultで変更します。故障したときに使うモードは2つあります。rescue.targetは、ファイルシステムをマウントし、最小限のサービスで管理者が1人で入るレスキューモードです。emergency.targetは、それよりもさらに少なく(ルートを読み取り専用でだけ)立ち上げる緊急モードです。/etc/fstabが間違っていて起動が止まると、たいてい緊急モードに落ちます。
問題文にこんな表現があれば → これを選ぶ
- “UEFIで起動するとき、ブートローダーがある場所”EFIシステムパーティション(/boot/efi)
- “現在のLinuxで標準のブートローダー”GRUB2(以前はLILO)
- “カーネルが最初に実行するプロセス(PID 1)”systemd
- “ランレベル3に当たるsystemdのターゲット”multi-user.target
- “グラフィカルログインで起動するターゲット”graphical.target(ランレベル5)
- “GRUBの設定を変えたあとにすること”grub2-mkconfig(update-grub)でgrub.cfgを生成し直す
起動のステップ3~4で、カーネルは「ルートファイルシステム」を見つけてマウントしました。次は、ディスクをどう分けて、どうつなぐのかを見ていきます。
広告
03
ディスクを分けてつなぐ:パーティション・ファイルシステム・ディレクトリ構造
新しいディスクは、そのままでは使えません。3つのステップを踏みます。まずディスクを区画(パーティション)に分け、各パーティションにファイルを入れるための形式(ファイルシステム)を作り(mkfs)、ディレクトリツリーのどこかにマウント(mount)します。WindowsのようにC:やD:のドライブが別々にあるのではなく、すべてのディスクが/から始まる1本の木の枝としてつながります。
- パーティションテーブル
- MBR
- 使える容量
- 2 / 4 TiB
ディスクの円盤(1周 = ディスク全体)を扇形のパーティションに分け、それぞれをディレクトリツリー(フォルダー)のどこかにマウントする
MBRはパーティションの情報をディスクの先頭512バイトに記録し、基本パーティションを4つまで作れます。もっと必要なら、そのうち1つを拡張パーティションにして、中に論理パーティションを置きます(論理パーティションは5番から)。512バイトセクターでは、2 TiBを超える部分は使えません。どのパーティションも、ファイルシステムを作り(mkfs)、ディレクトリツリーのどこかにマウントして(mount)はじめて使えるようになります。
| MBR | GPT | |
|---|---|---|
| パーティションの数 | 基本パーティションは4つまで(1つを拡張パーティションにして、その中に論理パーティション。5番から) | デフォルトで128個 |
| ディスクの大きさ | 512バイトセクターで2TiBまで | それよりはるかに大きいディスク |
| 起動 | BIOS | UEFI(EFIシステムパーティション) |
ファイルシステムとスワップ
Linuxでよく使われるファイルシステムはext4とXFSです。どちらもジャーナリングファイルシステムで、変更する内容をまずジャーナルに書いておいてから反映します。だから突然電源が落ちても、ファイルシステムが壊れる危険が少なく、チェックも速く済みます。RHEL系はXFSをデフォルトで使います。XFSはサイズを大きくするのは簡単ですが、小さくすることは事実上できないと考えておきましょう(末尾の一部だけを縮める機能があるだけです)。スワップ(swap)は、メモリが足りないときに一時的に使うディスクの領域です。ディレクトリにはマウントせず、swaponで有効にします。
/etc/fstab:起動のたびにマウントする場所
mountコマンドでマウントしたものは、再起動すると外れてしまいます。起動のたびにマウントするには、/etc/fstabに1行ずつ書きます。1行は6つのフィールドです。
# デバイス(またはUUID) マウント先 種類 オプション dump チェック順 UUID=4c2f…a91e /home xfs defaults 0 0 /dev/sdb1 /data ext4 defaults,nofail 0 2
ここに書いたディスクがないと、起動が緊急モードで止まります(2章)。なくても困らないディスクにはnofailを付けておきます。デバイス名(/dev/sdb1)はディスクをつなぐ順番によって変わることがあるので、変わらないUUIDで書くほうが安全です。
ディレクトリ構造(FHS)
どのディストリビューションでも、ディレクトリごとに役割が決まっています(ファイルシステム階層標準、FHS)。
| ディレクトリ | 役割 |
|---|---|
| /etc | システムの設定ファイル |
| /home | 一般ユーザーのホームディレクトリ(/rootは管理者のホーム) |
| /var | ログ(/var/log)、メール、キャッシュのように変わり続けるデータ |
| /tmp | 誰でも使える一時ファイル(スティッキービット、5章) |
| /usr | インストールされたプログラムとライブラリ(最近は/bin・/sbinが/usr/bin・/usr/sbinに統合されていることが多い) |
| /opt | 別途インストールする追加のソフトウェア |
| /boot | カーネルとブートローダーのファイル |
| /dev | デバイスファイル(/dev/sdaなど) |
| /proc | カーネルとプロセスの情報をファイルのように見せる仮想ファイルシステム(ディスク上にはない) |
問題文にこんな表現があれば → これを選ぶ
- “MBRで基本パーティションを4つより多くしたい”1つを拡張パーティションにして、その中に論理パーティション
- “2TiBを超えるディスクを1つのパーティションで使う”GPT
- “突然の停電でもファイルシステムの損傷を減らす方式”ジャーナリング(ext4、XFS)
- “起動のたびに自動でマウントする”/etc/fstabに登録
- “システムの設定ファイルが集まるディレクトリ”/etc
- “ログファイルがたまる場所”/var/log
- “ディスクではなくカーネルの情報を見せる仮想ファイルシステム”/proc
ディスクをつないだので、次はその中のファイルを見ていきます。実は、ファイルの名前とファイルの中身は別々の場所にあります。
Pro限定
ここまでは無料で読めます
残りの6章はPro会員向けです。各章に3D図解と「問題文にこんな表現があれば」の整理が続き、最後の章では実際に解いて確かめられます。
- 04inode・リンク・基本コマンド
- 05パーミッション
- 06ユーザーとグループ
- 07シェル:リダイレクト・パイプ・vi
- 08プロセスとシグナル
- 09パッケージとサービスの管理