「カーネル/伝統的なコンパイル方法」の版間の差分
(→カーネルソースのダウンロード: '準公式カーネルミラー' セクションをカーネルから移動) |
(冒頭を同期) |
||
1行目: | 1行目: | ||
[[Category:カーネル]] |
[[Category:カーネル]] |
||
+ | [[en:Kernel/Traditional compilation]] |
||
− | [[fr:Compiler un nouveau noyau]] |
||
− | [[ |
+ | [[pt:Kernel (Português)/Traditional compilation]] |
− | [[ |
+ | [[ru:Kernel (Русский)/Traditional compilation]] |
− | [[ |
+ | [[zh-hans:Kernel/Traditional compilation]] |
+ | この記事では、'''kernel.org のソース'''からカスタムカーネルをビルドする方法を紹介します。この方法は、全てのディストリビューションで共通の伝統的な方法です。あなたの経験量にもよりますが、[[カーネル/Arch build system]] を用いる方法よりも複雑です。[[Arch Build System]] のツールは、繰り返されるコンパイルタスクを効率的かつ安全にするために開発されメンテナンスされているということを考慮に入れておいてください。 |
||
− | [[zh-hans:Kernels/Compilation/Traditional]] |
||
− | この記事では '''kernel.org のソース'''からカスタムカーネルを作成する方法を説明しています。このカーネルをコンパイルする方法は全てのディストリビューションで共通の伝統的な方法です。経験にもよりますが、[[カーネル/コンパイル/Arch Build System|Arch Build System を使用する方法]]よりも複雑です。[[Arch Build System]] は何度もコンパイルする作業を効率的かつ安全に行うために開発されたツールです。 |
||
== 準備 == |
== 準備 == |
2023年6月10日 (土) 14:24時点における版
この記事では、kernel.org のソースからカスタムカーネルをビルドする方法を紹介します。この方法は、全てのディストリビューションで共通の伝統的な方法です。あなたの経験量にもよりますが、カーネル/Arch build system を用いる方法よりも複雑です。Arch Build System のツールは、繰り返されるコンパイルタスクを効率的かつ安全にするために開発されメンテナンスされているということを考慮に入れておいてください。
準備
カーネルの準備をするのに root アカウントや root 権限 (例: sudo) を使う必要はありません (推奨されません)。
コアパッケージのインストール
base-devel パッケージグループをインストールしてください。make や gcc などの必須パッケージがインストールされます。デフォルトの Arch カーネルの PKGBUILD に記載されている次のパッケージもインストールすることを推奨します: xmlto, docbook-xsl, kmod, inetutils, bc。
カーネルコンパイル用のディレクトリを作成
カーネル用にビルドディレクトリを作成することを推奨します。以下の例では home
ディレクトリに kernelbuild
を作成します:
$ mkdir ~/kernelbuild
カーネルソースのダウンロード
http://www.kernel.org からカーネルのソースをダウンロードしてください。tarball (tar.xz
) ファイルです。
ブラウザで tar.xz
リンクを右クリックして 名前を付けて保存...
を選択するか HTTP, FTP, RSYNC, Git を使用するグラフィカルあるいはコマンドラインのツールを使うことでダウンロードできます。
以下のコマンドでは先にインストールした wget を使って ~/kernelbuild
ディレクトリにカーネル 4.8.6 をダウンロードします:
$ cd ~/kernelbuild $ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.8.6.tar.xz
ビルドディレクトリの中で wget
を使わなかった場合は、tarball をビルドディレクトリに移動します:
$ mv /path/to/linux-4.8.6.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 -xvJf linux-4.8.6.tar.xz
カーネルツリーが完全にクリーンであることを確認したら準備完了です。カーネルソースを展開しただけではカーネルツリーがクリーンとは限りません。新しく作られたカーネルソースのディレクトリに移動して、make mrproper
コマンドを実行してください:
$ cd linux-4.8.6/ $ make clean && make mrproper
設定
あなたのコンピュータの正確な仕様にあわせてデフォルトカーネルをカスタマイズします。一番重要なステップです。カーネルコンフィグは .config
ファイルで設定し、カーネルモジュールの使用も含めます。
.config
のオプションを適切に設定することで、カーネルとコンピュータは効率的に機能します。
カーネルの設定
カーネルを設定する方法は2つ存在します:
- A. 公式カーネルの Arch のデフォルト設定を使う (推奨)
- B. 実行中のカーネルの設定に一致する設定ファイルを生成する (カーネルの設定を細かくカスタマイズしたい場合)
A. Arch のデフォルト設定
この方法では Arch のデフォルトのカーネル設定を使ってカスタムカーネルの .config
ファイルを作成します。標準の Arch カーネルが使われていることを確認して、カスタムカーネルのソースディレクトリの中で以下のコマンドを実行してください:
$ zcat /proc/config.gz > .config
B. 設定の生成
カーネル 2.6.32 から、localmodconfig
コマンドは現在動作中のカーネルで使われないオプションを全て無効化してカスタムカーネルの .config
ファイルを作成するようになりました。つまり、現在使用されているオプションだけが有効になります。
この最小主義的なアプローチを使えば、あなたの環境にぴったりな効率的で無駄のない設定ができますが、欠点もあります。新しいハードウェアや周辺機器、その他の機能が使えないカーネルになってしまう可能性などです。
$ make localmodconfig
高度な設定
カーネルコンフィグを簡単に調整できるツールが複数存在します。コンパイル時に設定を手動でひとつひとつ設定していては何時間もかかります。
make menuconfig
: ncurses コマンドラインインターフェイス (nconfig
によって置き換えられています)make nconfig
: コマンドラインの新しい ncurses インターフェイスmake xconfig
: ユーザーフレンドリーなグラフィカルインターフェイス。依存パッケージとして packagekit-qt4[リンク切れ: パッケージが存在しません] をインストールする必要があります。各オプションの情報を簡単に確認することができるので初心者向けです。make gconfig
: GTK+ を使用する、xconfig と同じようなグラフィカル設定
カーネルソースディレクトリの中で上記のコマンドを実行してください。新しい .config
ファイルが作成されるか、既存のファイルが上書きされます。任意の設定は全て自動的に有効になりますが、新しい設定オプションは自動的に選択されない場合があります (古いカーネル .config
を使用した場合)。
変更を加えたら .config
ファイルを保存してください。ソースディレクトリの外にバックアップすると良いでしょう。全てのオプションを適切に設定するまで複数回はバックアップが必要になると思われます。
設定がよくわからない場合は、少しずつオプションを変更してコンパイルしてください。ビルドしたカーネルで起動できない場合、こちら に必須のコンフィグアイテムのリストが存在します。
ライブ CD から lspci -k
を実行すると使用しているカーネルモジュールの名前が表示されます。一番重要なのは systemd を使うのに必要な cgroups のサポートです。
コンパイルとインストール
カーネルのコンパイル
コンパイルにかかる時間は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
- システムマップのカーネルシンボリックリンク
ブートローダーの設定
ブートローダーの設定ファイルに新しいカーネルのエントリを追加してください。GRUB, LILO, GRUB2, Syslinux, systemd-boot, REFInd を見てください。