カーネル/伝統的なコンパイル方法
この記事では、kernel.org のソースからカスタムカーネルをビルドする方法を紹介します。この方法は、全てのディストリビューションで共通の伝統的な方法です。あなたの経験量にもよりますが、カーネル/Arch build system を用いる方法よりも複雑です。Arch Build System のツールは、繰り返されるコンパイルタスクを効率的かつ安全にするために開発されメンテナンスされているということを考慮に入れておいてください。
準備
カーネルの準備では root アカウントや root 権限 (つまり、sudo) を使う必要はありませんし、推奨されてもいません。
コアパッケージをインストールする
base-devel メタパッケージをインストールしてください。これにより、make や gcc などの必須パッケージがインストールされます。デフォルトの Arch カーネルの PKGBUILD に記載されている次のパッケージもインストールすることを推奨します: xmlto、kmod、inetutils、bc、libelf、git、cpio、perl、tar、xz。
カーネルコンパイル用のディレクトリを作成する
あなたのカーネル用の個別のビルドディレクトリを作成することをおすすめします。以下の例では home
ディレクトリに kernelbuild
を作成します:
$ mkdir ~/kernelbuild
カーネルのソースをダウンロードする
https://www.kernel.org からカーネルのソースをダウンロードしてください。カーネルのソースファイルは、あなたが選んだカーネルの tarball (.tar.xz) ファイルの形であるはずです。
ブラウザから tar.xz
(tarball) リンクを右クリックしてダウンロードすることもできますし、HTTP や TFTP、Rsync、Git を使用するグラフィカルツールやコマンドラインツールでもダウンロードできます。
以下のコマンドでは、wget がインストールされていて、~/kernelbuild
内で wget を使ってカーネル A.B.C を取得しています:
$ cd ~/kernelbuild $ wget https://cdn.kernel.org/pub/linux/kernel/vA.x/linux-A.B.C.tar.xz
ダウンロードしたファイルを信頼する前に、そのファイルの正しさを検証するべきです。まず、署名をダウンロードし、その署名を使って署名鍵のフィンガープリントを入手します。そして、そのフィンガープリントを使って実際の署名鍵を入手します:
$ wget https://cdn.kernel.org/pub/linux/kernel/vA.x/linux-A.B.C.tar.sign $ gpg --list-packets linux-A.B.C.tar.sign $ gpg --recv-keys 前のコマンドで入手したフィンガープリント
注意点として、この署名は tar アーカイブ (つまり、拡張子 .tar
) に対して生成されたものであって、圧縮された .tar.xz
ファイルのものではありません。.tar.xz
ファイルを .tar
へ展開する必要があります。xz がインストールされていることを確認してください。インストールされていれば、以下のようにできます:
$ unxz linux-A.B.C.tar.xz $ gpg --verify linux-A.B.C.tar.sign linux-A.B.C.tar
このコマンドで "Good signature" という文字列を含む出力が出てこなかった場合、この先に進んではなりません。
wget
をビルドディレクトリ内で使わなかった場合、tarball をビルドディレクトリ内へ移動する必要があります。例えば:
$ mv /path/to/linux-A.B.C.tar.xz ~/kernelbuild/
準公式カーネルミラー
いくつかの kernel.org Git リポジトリの準公式ミラーがそれぞれのメンテナによって提供されています。これらのミラーは kernel.org よりも clone が速い傾向にあります。
- メインラインブランチは Linus Torvalds の GitHub アカウントでミラーリングされています: https://github.com/torvalds/linux.git 。
- 安定ブランチは Greg Kroah-Hartman の GitHub アカウントでミラーリングされています: https://github.com/gregkh/linux 。[1]
カーネルのソースを展開する
ビルドディレクトリ内で、カーネルの tarball を展開してください:
$ tar -xvf linux-A.B.C.tar
パーミッションエラーが発生しないことを確実にするには、chown を実行してフォルダの所有者を現在のユーザに変更する必要があります。
フォルダとその中の全ファイルの所有者を現在のユーザに変更するには、chown コマンドを実行してください。
$ chown -R $USER:$USER linux-A.B.C
これにより、フォルダ内の全ファイルの所有者があなたになりました。なので、パーミッション関連のエラーは発生しません。
準備を終える前に、カーネルツリーが絶対的にクリーンであることを確認してください。解凍後のソースツリーがクリーンであると思い込んではなりません。確認するには、新しく作成したカーネルソースディレクトリに移動し、make mrproper
コマンドを実行してください:
$ cd linux-A.B.C $ make mrproper
カーネルの設定
これは、あなたのコンピュータの仕様を正確に反映させるために、デフォルトのカーネルをカスタマイズする作業の中で最も重要なステップです。カーネルの設定 (コンフィグレーション) は .config
ファイルで設定されます。このファイルには、カーネルモジュールの使用に関する設定も含まれています。.config
内のオプションを適切に設定すれば、あなたのカーネルとコンピュータを最も効率的に機能させることができます。
カーネルの設定は、以下の2つを組み合わせて行うことができます:
- 公式カーネルの Arch のデフォルト設定を使う (推奨)
- カーネルオプションを手動で設定する (任意。高度な方法であり、推奨されません)
Arch のデフォルト設定
この方法では、Arch のデフォルトのカーネル設定を使ってカスタムカーネル用の .config
ファイルを作成します。標準の Arch カーネルが実行中である場合、カスタムカーネルのソースディレクトリ内で以下のコマンドを実行することで、現在実行中のカーネルの .config
ファイルを作成できます:
$ zcat /proc/config.gz > .config
あるいは、オンラインで official Arch Linux カーネルパッケージからデフォルトの設定を入手できます。
高度な設定
カーネルの設定を調整するためのツールが複数存在します。これらを使えば、何時間も掛けてコンパイル中に利用可能なオプションを1つずつすべて手作業で設定する手間を省けます。
以下がそのツールです:
make menuconfig
: コマンドライン ncurses インターフェイス。nconfig
が後継です。make nconfig
: より新しい、コマンドライン用の ncurses インターフェイス。make xconfig
: ユーザーフレンドリーなグラフィカルインターフェイス。依存パッケージとして packagekit-qt5 をインストールする必要があります。簡単に操作でき、各オプションの情報も表示されるので、(特に初心者に) おすすめです。make gconfig
: グラフィカルな設定方法。xconfig に似ていますが、GTK を使用します。gtk2、glib2、そして libgladeAUR を必要とします。
カーネルソースディレクトリの中で上記のどれかのコマンドを実行してください。新しい .config
ファイルが作成されるか、既存のファイルが上書きされます。任意の設定は全て自動的に有効になりますが、新しい設定オプションは自動的に選択されない場合があります (古いカーネル .config
を使用した場合)。
変更を加えたら .config
ファイルを保存してください。ソースディレクトリの外にバックアップすると良いでしょう。すべてのオプションを適切に設定するまで、複数回これを繰り返す必要があるかもしれません。
設定がよくわからない場合は、少しずつオプションを変更してコンパイルしてください。ビルドしたカーネルで起動できない場合、ここに必須のコンフィグアイテムのリストが存在します。
ライブメディアから lspci -k #
を実行すると、使用中のカーネルモジュールの名前のリストが出力されます。一番重要なのは、cgroups サポートを維持しなければならないことです。これは systemd に必要不可欠です。詳細は、Gentoo:Kernel/Gentoo Kernel Configuration Guide、Gentoo:Intel#Kernel (Intel プロセッサ)、Gentoo:Ryzen#Kernel (AMD Ryzen プロセッサ) を参照してください。
コンパイル
コンパイルにかかる時間は15分程度から1時間以上まで幅広く、設定したカーネルコンフィグやプロセッサの性能によって大きく変わります。カスタムカーネルの .config
ファイルを設定したら、ソースディレクトリの中で以下のコマンドを実行するとコンパイルが始まります:
$ make
インストール
モジュールをインストールする
カーネルがコンパイルできたら、次はモジュールです。まず、モジュールをビルドしてください:
$ make modules
次に、モジュールをインストールしてください。root として、あるいは root 権限で、以下のコマンドを実行してください:
# make modules_install
This will copy the compiled modules into /lib/modules/A.B.C/
. This keeps the modules for individual kernels used separated.
これで、コンパイルされたモジュールが /lib/modules/A.B.C/
へコピーされます。これにより、使用されるカーネル毎にモジュールが分けられるようになっています。
カーネルを /boot ディレクトリにコピーする
カーネルをコンパイルすると、カーネルの圧縮された bzImage
(big zImage) が生成されます。生成されない場合、以下を実行する必要があります:
make bzImage
このファイルは /boot
ディレクトリにコピーして名前を変える必要があります。名前に vmlinuz-
という接頭辞を付ければ、好きな名前を付けることができます。以下の例では、コンパイルされ、インストールされた A.B.C カーネルがコピーされ、vmlinuz-linuxAB
という名前に変更されます:
# cp -v arch/x86/boot/bzImage /boot/vmlinuz-linuxAB
初期 RAM ディスクを作成する
初期 RAM ディスクが何なのか知らない場合は Wikipedia や mkinitcpio を見てください。
自動化されたプリセットを用いる方法
既存の mkinitcpio プリセットをコピーして変更を加えることで公式カーネルと同じようにカスタムカーネルの initramfs イメージを生成できます。カーネルを再コンパイルする場合などに有用です (例: アップデートする場合など)。以下の例では、標準の Arch カーネルのプリセットファイルをコピーして、上でインストールしたカーネル A.B.C 用に変更を加えます。
まず、既存のプリセットファイルをコピーして、bzImage
をコピーしたときに /boot/vmlinuz-
の後ろにつけたカスタムカーネルの名前と一致するように名前を変更してください:
# cp /etc/mkinitcpio.d/linux.preset /etc/mkinitcpio.d/linuxAB.preset
次に、ファイルを編集してカスタムカーネル用に変更します。ALL_kver=
パラメータも bzImage
をコピーしたときに付けたカスタムカーネルの名前と合わせる必要があります:
/etc/mkinitcpio.d/linuxAB.preset
... ALL_kver="/boot/vmlinuz-linuxAB" ... default_image="/boot/initramfs-linuxAB.img" ... fallback_image="/boot/initramfs-linuxAB-fallback.img"
最後に、公式カーネルと同じようにカスタムカーネルの initramfs イメージを生成してください:
# mkinitcpio -p linuxAB
手動による方法
プリセットファイルを使用する以外にも、mkinitcpio を使って手動で initramfs ファイルを生成することもできます。コマンドの構文は以下の通りです:
# mkinitcpio -k kernel_version -g /boot/initramfs-file_name.img
-k
(--kernel kernel_version
): initramfs イメージを生成する際に用いるモジュールを指定します。kernel_version
は、カスタムカーネルのモジュールディレクトリ (/usr/lib/modules/
内にあるディレクトリ) の名前と同じにします (カーネルイメージへのパスも使用できます)。-g
(--generate file_name
):/boot
ディレクトリに生成する initramfs ファイルの名前を指定します。上記の命名規則を使うことを推奨します。
例えば、上でインストールした A.B.C カスタムカーネルの場合のコマンドは以下のようになります:
# mkinitcpio -k A.B.C -g /boot/initramfs-linuxAB.img
System.map をコピーする
System.map
ファイルは Linux を起動するのに必ずしも必須ではありません。一種の"電話帳"みたいなもので、カーネルの特定のビルドの機能が記載されています。System.map
にはカーネルのシンボルの一覧 (つまり、関数名や変数名など) とそれぞれのアドレスが含まれます。この "シンボル名とアドレスの対応表" を使うのは:
- klogd や ksymoops などの一部プロセス
- カーネルのクラッシュ中に情報 (つまり、どの関数でクラッシュしたかなど) をスクリーンへ出力するために OOPS ハンドラによって使用されます。
/boot
がシンボリックリンクをサポートしているファイルシステム (つまり FAT32 以外のファイルシステム) 上にある場合、System.map
を /boot
にコピーして、カーネルの名前をコピー先のファイルの名前の後ろに加えてください。それから /boot/System.map
から /boot/System.map-linuxAB
にシンボリックリンクを作成してください:
# cp System.map /boot/System.map-linuxAB # ln -sf /boot/System.map-linuxAB /boot/System.map
以上の全ての手順を完了したら、以下の3つのファイルと1つのシンボリックリンクがあなたの /boot
ディレクトリに追加されているはずです:
- カーネル:
vmlinuz-linuxAB
- Initramfs:
initramfs-linuxAB.img
- System Map:
System.map-linuxAB
- System Map のカーネルのシンボリックリンク:
System.map
(System.map-linuxAB
へのシンボリックリンク)
コンパイルとインストール
カーネルのコンパイル
コンパイルにかかる時間は15分程度から1時間以上まで幅広く、設定したカーネルコンフィグやプロセッサの性能によって大きく変わります。詳しくは Makeflags を見てください。カスタムカーネルの .config
ファイルを設定したら、ソースディレクトリの中で以下のコマンドを実行するとコンパイルが始まります:
$ make
モジュールのコンパイル
カーネルがコンパイルされたら、カーネルのモジュールをコンパイルします。root か root 権限を使って、以下のコマンドを実行してください:
# make modules_install
上記のコマンドを実行するとコンパイルされたモジュールが /lib/modules/<kernel version>-<config local version>
にコピーされます。例えば、カーネルバージョン 4.8 をインストールした場合、/lib/modules/4.8.6-ARCH
にモジュールがコピーされます。使用するカーネルによってモジュールを分けることができるようになっています。
/boot ディレクトリにカーネルをコピー
カーネルのコンパイルでは圧縮されたカーネルの bzImage
(big zImage) が生成されます。このファイルは /boot
ディレクトリにコピーして名前を変える必要があります。名前の前に vmlinuz-
と付けさえすれば、好きな名前を付けることができます。以下の例では、インストール・コンパイルした 4.8 カーネルを vmlinuz-linux48
と名前を変えてコピーしています:
- 32ビット (i686) カーネル:
# cp -v arch/x86/boot/bzImage /boot/vmlinuz-linux48
- 64ビット (x86_64) カーネル:
# cp -v arch/x86_64/boot/bzImage /boot/vmlinuz-linux48
初期 RAM ディスクの作成
初期 RAM ディスクが何なのか知らない場合は Wikipedia や mkinitcpio を見てください。
自動生成したプリセットを使用する方法
既存の mkinitcpio プリセットをコピーして変更を加えることで公式カーネルと同じようにカスタムカーネルの initramfs イメージを生成できます。カーネルを再コンパイルする場合などに有用です (例: アップデートする場合など)。以下の例では、標準の Arch カーネルのプリセットファイルをコピーして、上でインストールしたカーネル 4.8 用に変更を加えます。
まず、既存のプリセットファイルをコピーして、bzImage
をコピーしたときに /boot/vmlinuz-
の後ろにつけたカスタムカーネルの名前と一致するように名前を変更します (上記の場合、linux48
):
# cp /etc/mkinitcpio.d/linux.preset /etc/mkinitcpio.d/linux48.preset
次に、ファイルを編集してカスタムカーネル用に変更します。ALL_kver=
パラメータも bzImage
をコピーしたときに付けたカスタムカーネルの名前と合わせる必要があります:
/etc/mkinitcpio.d/linux48.preset
... ALL_kver="/boot/vmlinuz-linux48" ... default_image="/boot/initramfs-linux48.img" ... fallback_image="/boot/initramfs-linux48-fallback.img"
最後に、公式カーネルと同じようにカスタムカーネルの initramfs イメージを生成してください:
# mkinitcpio -p linux48
手動で作成する方法
プリセットファイルを使用する以外にも、mkinitcpio を使って手動で initramfs ファイルを生成することもできます。コマンドの構文は以下の通りです:
# mkinitcpio -k <kernelversion> -g /boot/initramfs-<file name>.img
-k
(--kernel <カーネルバージョン>): initramfs イメージを生成するときに使用するモジュールを指定します。<kernelversion>
の名前はカスタムカーネルのソースディレクトリの名前と同じになります (/usr/lib/modules/
にあるモジュールディレクトリの名前も同じく)。-g
(--generate <ファイル名>):/boot
ディレクトリに生成する initramfs ファイルの名前を指定します。上記の命名規則を使うことを推奨します。
例えば、上でインストールした 4.8 カスタムカーネルの場合のコマンドは:
# mkinitcpio -k linux-4.8.6 -g /boot/initramfs-linux48.img
System.map のコピー
System.map
ファイルは Linux を起動するのに必ずしも必須ではありません。一種の"電話帳"みたいなものでカーネルの特定のビルドの機能が記載されています。System.map
にはカーネルのシンボルの一覧 (つまり機能や変数の名前など) とそれぞれのアドレスが含まれます。この"アドレスマッピングのシンボル名"を使うのは:
- klogd や ksymoops などの一部プロセス
- カーネルがクラッシュした時に OOPS ハンドラによって情報 (どの関数でクラッシュしたのかなど) を画面に表示するのに使われます。
/boot
がシンボリックリンクをサポートしているファイルシステム (つまり FAT32 以外のファイルシステム) 上にある場合、System.map
を /boot
にコピーして、カーネルの名前をファイルの名前の後ろに加えてください。それから /boot/System.map
から /boot/System.map-YourKernelName
にシンボリックリンクを作成してください:
# cp System.map /boot/System.map-YourKernelName # ln -sf /boot/System.map-YourKernelName /boot/System.map
以上の全ての手順を完了したら、以下の3つのファイルと1つのシンボリックリンクがあなたの /boot
ディレクトリに追加されているはずです:
- カーネル:
vmlinuz-YourKernelName
- Initramfs:
Initramfs-YourKernelName.img
- システムマップ:
System.map-YourKernelName
- システムマップのカーネルシンボリックリンク
ブートローダの設定
ブートローダの設定ファイルに新しいカーネルのエントリを追加してください。利用可能なブートローダは Arch ブートプロセス#機能比較 を、その他の情報は関連する wiki ページを参照してください。
参照
- https://cateee.net/lkddb/web-lkddb/ : カーネル設定の文字列とその説明のアルファベット順の包括的なリストがあります。