LinuCレベル2 201試験の出題範囲「2.01.4 Linuxカーネルのコンパイル」の解説まとめ

IT資格

LinuCレベル2 201試験の出題範囲「2.01.4 Linuxカーネルのコンパイル」の技術的内容についての解説をまとめました。

重要度2
概要Linuxカーネルの特定の機能を必要に応じて取り込んだり無効化するために、カーネルを適切に構成できる。また、必要に応じてLinuxカーネルをコンパイルし、新しいカーネルに変更点を書き込み、initrdイメージを作成し、新しいカーネルをインストールできる。
詳細/usr/src/linux//usr/src/linux/.configカーネルの MakefileKernel 2.6.x、3.x、4.x、5.x のmakeのターゲット。all, config, xconfig, menuconfig, gconfig, oldconfig, mrproper, bzImage, modules, modules_install, rpm-pkg, binrpm-pkg, deb-pkgカーネル構成をカスタマイズする。新しいカーネルおよび適切なカーネルモジュールを構築する。/lib/modules/kernel-version/, gzip, bzip2新しいカーネルおよび必要なモジュールをインストールする。module tools, depmodブートマネージャが新しいカーネルおよび関連付けられたファイルを探せるようにする。モジュールの構成ファイルDKMS を使用してカーネルのモジュールをコンパイルする。dkmsinitrd を構成する。Dracut,mkinitrd, mkinitramfs
LinuCレベル2 201試験 出題範囲 | LPI-Japan
仮想環境を含むLinuxのシステム設計・ネットワーク構築において、アーキテクチャに基づいた設計、導入、問題解決ができるエンジニアであることを認定します。試験センターの他に自宅でも受験できます。受験費用は税込16,500円。

ソースコードからのカーネルのビルドとインストール

ソースコードからカーネルをビルドしてカーネルをインストールすることができます。

以下のカーネルの公式サイトからカーネルをダウンロードできます。

The Linux Kernel Archives

browseをクリックすることで、ダウンロードするカーネル関連のファイルの情報を確認できます。

今回は試しに6.17.9の中身を確認します。

Making sure you're not a bot!

上記リンクから確認するとMakefileが含まれていることがわかります。以下はMakefileの中身です。

次の見出しで紹介する、makeコマンドはLinuxのソフトウェア等をインストールするのに使用するコマンドです。

makeコマンドを実行するにはMakefileが必要ですが、上記のカーネル公式サイトからカーネルのソースコードをダウンロードした場合は、Makefileがあらかじめ用意されている状態です。

前述した以下サイトから対象のカーネルのバージョンのtarballをクリックしてカーネルを.tar.xz形式でダウンロードします。

The Linux Kernel Archives

ダウンロードしたカーネルはscpコマンドや、TeraTermのSSH SCP…機能を利用して対象のLinuxへ送信します。

送信したtar.xzファイルはtar xvfコマンドで解凍します。

makeコマンドの概要

makeコマンドを利用して、カーネルのインストールや設定を行います。

makeコマンド意味
make config対話的に(質問形式で)設定を行う
make menuconfigターミナル上のGUIで設定を行う
make xconfigX上のGUIで設定を行う
make defconfigデフォルト状態の設定ファイルを作る
make oldconfig現在のカーネルの設定を引き継ぐ
make cloneconfig(oldconfigと同じ)
make allyesconfigすべての設定項目にyesを設定する
make allnoconfigほとんどの設定項目にnoを設定する
make randconfig設定項目にランダムな値を設定する
make clean設定ファイルを除いて一時ファイル等を削除
make mrproper設定ファイルを含めて一時ファイル等を削除

makeコマンド意味
make allカーネルとモジュールをビルド
make installビルドしたカーネルをインストール
make modulesカーネルモジュールをビルド
make modules_installカーネルモジュールをインストール
make rpmビルド後にrpmパッケージ化
make rpm-pkgソースを含むrpmパッケージを作る
make binrpm-pkgバイナリrpmパッケージを作る
make deb-pkgDebianパッケージを作る

/usr/src/linux/.configファイル

make config や make menuconfig で行った設定は以下のファイルに保存されます。

/usr/src/linux/.config

Red Hat Enterprise Linux系のLinuxでは以下のディレクトリになります。

/usr/src/kernels

/usr/src/linux/(カーネルのバージョン)/ディレクトリ配下のファイル

/usr/src/linux/(カーネルのバージョン)/ディレクトリ配下の主なファイル・ディレクトリは以下です。
※Red Hat Enterprise Linux系では/usr/src/kernels/(カーネルのバージョン)/ディレクトリ配下に保存されます。CentOSはRed Hat Enterprise Linuxのクローンとなるディストリビューションです。

ファイル説明
.configカーネルのビルド設定ファイル
Makefilemake の設定やカーネルバージョンが書いてある
ディレクトリ説明
ディレクトリソースコードの種類
kernel/カーネル本体
Documentation/ドキュメントの類
arch/アーキテクチャ(i386、x86_64など)固有のコード
drivers/デバイスドライバ
fs/ファイルシステム(file system)
include/インクルードファイル(他のファイルから呼び出すコードのまとめ)
mm/メモリ管理(memory management)
net/ネットワーク

/lib/modules/ディレクトリ

カーネルモジュールは /lib/modules/(VERSION)/ にインストールされます。VERSION の部分は、uname -rを実行して確認できるカーネルのバージョンです。

/boot/config-xxxx(バージョン)はカーネルコンフィギュレーション

/boot/ディレクトリ配下のconfigから始まるファイルはカーネルコンフィギュレーションです。/usr/src/linux/.configのバックアップに当たるファイルになります。

make oldconfig として読み込むことができる「現在動いているカーネルのカーネルコンフィギュレーション」です。

/boot/initrd.img-xxxx(バージョン)は初期 RAM ディスクイメージ

/boot/initrd.img-xxxx(バージョン) は段階的ブートを行う際に仮のファイルシステムの内容をまとめたイメージファイル(初期 RAM ディスクイメージ)です。

make installコマンドを使った場合は必要に応じて自動で生成されます。

手動で本ファイルのインストールを行うには、mkinitrd(RHEL6以前)、dracut(RHEL7以降)、 mkinitramfs(Ubuntu等)コマンドで作成します。

/boot/System.map-xxxx(バージョン)はアドレスマップ

/boot/System.map-xxxx(バージョン)はカーネルがメモリ上に展開される際にシンボルとアドレスのマッピングを記述したファイル(アドレスマップ)です。

カーネルのビルド時に /usr/src/linux/System.map と同時に作成されます。

RHEL10.0で中身を確認してみます。かなり長文の中身になっています。

[root@RHEL100 boot]# more System.map-6.12.0-55.17.1.el10_0.x86_64
0000000000000000 D __per_cpu_start
0000000000000000 D fixed_percpu_data
0000000000001000 D cpu_debug_store
0000000000002000 D irq_stack_backing_store
0000000000006000 D cpu_tss_rw
000000000000b000 D gdt_page
000000000000c000 d exception_stacks
0000000000018000 d entry_stack_storage
0000000000019000 D espfix_waddr
0000000000019008 D espfix_stack
0000000000019010 D cpu_l2c_shared_map
0000000000019018 D cpu_llc_shared_map
0000000000019020 D cpu_info
0000000000019168 D x86_cpu_to_acpiid
000000000001916c D x86_cpu_to_apicid
0000000000019180 d amd_dr_addr_mask
00000000000191a0 D mce_banks_array
00000000000195a0 D mce_num_banks
00000000000195c0 d smca_bank_counts
0000000000019600 d smca_banks
0000000000019a00 D cpu_die_map
0000000000019a08 D cpu_core_map
0000000000019a10 D cpu_sibling_map
--More--(0%)
[root@RHEL100 boot]# ls -la
(中略)
-rw-r--r--.  1 root root   8933043  6月  8 09:00 System.map-6.12.0-55.17.1.el10_0.x86_64

FHS(FileSystem Hierarchy Standard)の概要

FHS(FileSystem Hierarchy Standard)は、Linuxのディレクトリ構成を定めた基準仕様のことです。例えば、/etcディレクトリに対して設定ファイルを保存しておくことにするなど、Linuxのディレクトリをどのように使うかという基準がFHSです。FHSの Hierarchy は階層を意味します。

「FHS」は、Linux(などのUNIX系OS)の標準的なディレクトリ構成を定めた標準仕様です。たとえば「/etcディレクトリには設定ファイルを置きましょう」など、ディレクトリの名前や構成、ファイルの名前などについての「標準」です。

FHS(Filesystem Hierarchy Standard) - Linux技術者認定 LinuC | LPI-Japan
Linuxを学習する上で出てくる素朴な疑問や、便利なテクニックなどを紹介しています。LinuCは、クラウド・DX時代に活躍するエンジニアに求められるLinuxを中心とした技術や知識を身につけることができるLinux技術者認定試験。出題範囲に...

/usr/src の概要

/usr/src/ は、カーネルのソースやビルドに必要なファイル・ディレクトリが保存されているディレクトリです。

「/usr/src」ディレクトリには、「プログラムのソースコード」が置かれます。カーネルのコンパイルを行う際に、ダウンロードしたカーネルのソースコードをこのディレクトリの下に配置したことがある、という経験のある方も多いのではないでしょうか。もちろん、Linuxカーネルだけでなく、インターネットなどから入手したソフトウェアをソースコードからコンパイルする場合、このディレクトリに配置することが慣例になっています。

「/usr/src」ディレクトリ - Linux技術者認定 LinuC | LPI-Japan
Linuxを学習する上で出てくる素朴な疑問や、便利なテクニックなどを紹介しています。LinuCは、クラウド・DX時代に活躍するエンジニアに求められるLinuxを中心とした技術や知識を身につけることができるLinux技術者認定試験。出題範囲に...

初期RAMディスク

初期 RAM ディスクは、システム起動時に仮の環境としてまずメモリ上にファイルシステムを展開し、そこでカーネルを動作させてから本来のファイルシステムをルートにマウントし直す、といった段階的なブートを実現する機能のことです。

初期RAMディスクは、Linux起動時に以下のような順番で動作します。

  • 電源投入
  • BIOS/UEFIの起動
  • ブートローダ(GRUB,GRUB2..)
  • カーネル(vmlinuz)とinitramfs(初期RAMディスク)の読み込み
  • カーネルの実行
  • initramfs(初期RAMディスク)の実行
  • initの実行(SysVinit,Systemd..)

初期RAMディスクのイメージファイル形式は2種類あります。initrd 形式と initramfs 形式です。

初期 RAM ディスクイメージの作成方法

初期 RAM ディスクイメージの作成方法を解説します。

mkinitrdコマンド、dracutコマンド と mkinitramfsコマンド

initrd 形式はマウント可能なファイルシステムイメージを gzip 圧縮したものです。
なので、gzip -d や gunzip コマンドで gzip を解凍した後、mount でマウントを行えば、イメージ内のディレクトリ・ファイルを参照することができます。
ただし、イメージファイルをマウントするためには、マウントオプションでループバック形式であることを伝える必要があります。これを行うためには mount -o loop のようにオプションを指定します。

initramfs 形式のイメージは cpio アーカイブを gzip 圧縮したものです。

initramfs 形式の初期 RAM ディスクイメージをgunzip コマンドで解凍した後、cpio コマンドでアーカイブからファイルへの書き出しを行えば、イメージ内のディレクトリ・ファイルを参照することができます。

mkinitrdコマンドは主に RHEL系(RHEL / CentOS / Fedora の旧世代) で使われていたツール

mkinitrdコマンドは、RHEL6以前のRed Hat系のディストリビューションで使われていたコマンドです。

RHEL7以降はdracut が主流

RHEL7以降はmkintrdは使われず、dracutが主流になっています。mkinitrdコマンド、dracutコマンドもどちらも初期RAMディスクを作成するコマンドです。

mkinitramfsコマンドはDebian / Ubuntu 系で使われるツール

mkinitramfsコマンドはDebian / Ubuntu 系で使われる初期RAMディスクを作成するコマンドです。

mkinitrdコマンド、dracutコマンド と mkinitramfsコマンドの演習問題例

以下は出題の例題です。

初期 RAM ディスクを作成することが出来るコマンドはどれか。(全て選択してください)

  • mkramdisk
  • mkinitrd
  • makeramdisk
  • mkinitramfs
  • dracut

答えは以下です。

  • mkinitrd
  • mkinitramfs
  • dracut

DKMS(Dynamic Kernel Module Support)の概要

DKMS(Dynamic Kernel Module Support)は、カーネルと独立して自動的にカーネルモジュールを更新するための機能です。

参考資料

本記事を作成するために使用した参考資料を掲載します。

第3章 システムの初期化
Arch ブートプロセス - ArchWiki
タイトルとURLをコピーしました