カーネル/伝統的なコンパイル方法

提供: ArchWiki
2017年1月29日 (日) 00:36時点におけるKusakata (トーク | 投稿記録)による版 (文字列「[[zh-CN:」を「[[zh-hans:」に置換)
ナビゲーションに移動 検索に移動

この記事では kernel.org のソースからカスタムカーネルを作成する方法を説明しています。このカーネルをコンパイルする方法は全てのディストリビューションで共通の伝統的な方法です。経験にもよりますが、Arch Build System を使用する方法よりも複雑です。Arch Build System は何度もコンパイルする作業を効率的かつ安全に行うために開発されたツールです。

準備

カーネルの準備をするのに root アカウントや root 権限 (例: sudo) を使う必要はありません (推奨されません)。

コアパッケージのインストール

base-devel パッケージグループをインストールしてください。makegcc などの必須パッケージがインストールされます。デフォルトの Arch カーネルの PKGBUILD に記載されている次のパッケージもインストールすることを推奨します: xmlto, docbook-xsl, kmod, inetutils, bc

カーネルコンパイル用のディレクトリを作成

カーネル用にビルドディレクトリを作成することを推奨します。以下の例では home ディレクトリに kernelbuild を作成します:

$ mkdir ~/kernelbuild

カーネルソースのダウンロード

警告: systemd はカーネルバージョン 3.11 以上を必要とします (cgroups の統一的な階層のサポートは 4.2 以上)。詳しくは /usr/share/systemd/README を見てください。

http://www.kernel.org からカーネルのソースをダウンロードしてください。tarball (tar.xz) ファイルです。

ブラウザで tar.xz リンクを右クリックして 名前を付けて保存... を選択するか HTTP, FTP, RSYNC, Git を使用するグラフィカルあるいはコマンドラインのツールを使うことでダウンロードできます。

ノート: ダウンロードしたカーネル tarball の PGP 署名を検証すると良いでしょう。信頼の輪が正当であることが確認されます。kernel.org/signature を見てください。

以下のコマンドでは先にインストールした 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/

カーネルソースの展開

ビルドディレクトリの中にカーネル tarball を展開してください:

$ tar -xvJf linux-4.8.6.tar.xz

カーネルツリーが完全にクリーンであることを確認したら準備完了です。カーネルソースを展開しただけではカーネルツリーがクリーンとは限りません。新しく作られたカーネルソースのディレクトリに移動して、make mrproper コマンドを実行してください:

$ cd linux-4.8.6/
$ make clean && make mrproper

設定

あなたのコンピュータの正確な仕様にあわせてデフォルトカーネルをカスタマイズします。一番重要なステップです。カーネルコンフィグは .config ファイルで設定し、カーネルモジュールの使用も含めます。

ノート: まだこの段階で root アカウントや root 権限は必要ありません。

.config のオプションを適切に設定することで、カーネルとコンピュータは効率的に機能します。

カーネルの設定

カーネルを設定する方法は2つ存在します:

  • A. 公式カーネルの Arch のデフォルト設定を使う (推奨)
  • B. 実行中のカーネルの設定に一致する設定ファイルを生成する (カーネルの設定を細かくカスタマイズしたい場合)
ノート: B を選んだ場合、#高度な設定で説明しているツールを使ってカーネルを手動で設定する必要があります。

A. Arch のデフォルト設定

この方法では Arch のデフォルトのカーネル設定を使ってカスタムカーネルの .config ファイルを作成します。標準の Arch カーネルが使われていることを確認して、カスタムカーネルのソースディレクトリの中で以下のコマンドを実行してください:

$ zcat /proc/config.gz > .config
警告: 現在の .config ファイルを使ってカーネルをコンパイルする場合、下に記載しているユーザーインターフェイスのどれかを使って General Setup ---> オプションでカーネルバージョンの名前を変更してください。名前を変更しなかった場合、既存のカーネルを間違って上書きしてしまう危険があります。

B. 設定の生成

ヒント: この方法を使用する場合は、今後使うかもしれないあらゆるデバイスを接続してください。

カーネル 2.6.32 から、localmodconfig コマンドは現在動作中のカーネルで使われないオプションを全て無効化してカスタムカーネルの .config ファイルを作成するようになりました。つまり、現在使用されているオプションだけが有効になります。

この最小主義的なアプローチを使えば、あなたの環境にぴったりな効率的で無駄のない設定ができますが、欠点もあります。新しいハードウェアや周辺機器、その他の機能が使えないカーネルになってしまう可能性などです。

ノート: 以下のコマンドを実行する前に、再度、使用するデバイス全てがコンピュータに接続されていることを確認してください。
$ make localmodconfig

高度な設定

ヒント: カスタムカーネルで起動したりシャットダウンするときに大量のメッセージを表示させたくない場合、デバッグオプションは無効化すると良いでしょう。

カーネルコンフィグを簡単に調整できるツールが複数存在します。コンパイル時に設定を手動でひとつひとつ設定していては何時間もかかります。

ノート: 以下のツールはカーネルの機能について3つの設定オプションを用意しています: y (有効), n (無効), m (カーネルモジュールとして有効、必要なときにロード)。
  • make menuconfig: ncurses コマンドラインインターフェイス (nconfig によって置き換えられています)
  • make nconfig: コマンドラインの新しい ncurses インターフェイス
  • make xconfig: ユーザーフレンドリーなグラフィカルインターフェイス。依存パッケージとして packagekit-qt4[リンク切れ: package not found] をインストールする必要があります。各オプションの情報を簡単に確認することができるので初心者向けです。
  • make gconfig: GTK+ を使用する、xconfig と同じようなグラフィカル設定

カーネルソースディレクトリの中で上記のコマンドを実行してください。新しい .config ファイルが作成されるか、既存のファイルが上書きされます。任意の設定は全て自動的に有効になりますが、新しい設定オプションは自動的に選択されない場合があります (古いカーネル .config を使用した場合)。

変更を加えたら .config ファイルを保存してください。ソースディレクトリの外にバックアップすると良いでしょう。全てのオプションを適切に設定するまで複数回はバックアップが必要になると思われます。

設定がよくわからない場合は、少しずつオプションを変更してコンパイルしてください。ビルドしたカーネルで起動できない場合、こちら に必須のコンフィグアイテムのリストが存在します。

ライブ CD から lspci -k を実行すると使用しているカーネルモジュールの名前が表示されます。一番重要なのは systemd を使うのに必要な cgroups のサポートです。

コンパイルとインストール

ヒント: 使用しているプロセッサの命令セットに gcc を最適化したい場合、カーネルソースディレクトリ内の arch/x86/Makefile (i686) または arch/x86_64/Makefile (86_64) を編集してください:
  • Processor type and features > Processor Family で選択した CONFIG_MK8,CONFIG_MPSC,CONFIG_MCORE2,CONFIG_MATOM,CONFIG_GENERIC_CPU を確認してください。
  • -march=native の cc-option フラグを Processor Family で選択した文字列に変えてください。例: cflags-$(CONFIG_MK8) += $(call cc-option,-march=native)-march=native でコンパイルする場合におそらく一番良い方法です。
  • 32ビットカーネルの場合、代わりに arch/x86/Makefile_32.cpu を編集して使用しているプロセッサにあわせて -march=native を設定してください。

カーネルのコンパイル

コンパイルにかかる時間は15分程度から1時間以上まで幅広く、設定したカーネルコンフィグやプロセッサの性能によって大きく変わります。詳しくは Makeflags を見てください。カスタムカーネルの .config ファイルを設定したら、ソースディレクトリの中で以下のコマンドを実行するとコンパイルが始まります:

$ make

モジュールのコンパイル

警告: ここから、コマンドは root あるいは root 権限で実行する必要があります。通常ユーザーでは失敗します。

カーネルがコンパイルされたら、カーネルのモジュールをコンパイルします。root か root 権限を使って、以下のコマンドを実行してください:

# make modules_install

上記のコマンドを実行するとコンパイルされたモジュールが /lib/modules/<kernel version>-<config local version> にコピーされます。例えば、カーネルバージョン 4.8 をインストールした場合、/lib/modules/4.8.6-ARCH にモジュールがコピーされます。使用するカーネルによってモジュールを分けることができるようになっています。

ヒント: 標準的な Linux カーネルでは配布されていないモジュールを必要とする場合、完了した後にカスタムカーネル用にモジュールをコンパイルしてください。そのようなモジュールは基本的に実行中の環境で別個に明示的にインストールします。例えば NVIDIA#カスタムカーネルを見てください。

/boot ディレクトリにカーネルをコピー

ノート: bzImage カーネルファイルは使用しているシステムアーキテクチャにあわせて適切なディレクトリからコピーしてください。下を参照。

カーネルのコンパイルでは圧縮されたカーネルの 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 ディスクの作成

ノート: initramfs イメージファイルの名前は自由に付けられます。ただし、linux<major revision><minor revision> という命名規則に従うことを推奨します。例えば、'linux48' という名前であればメジャーバージョンが '4' でマイナーリビジョンが '8' の 4.8 カーネルです。複数のカーネルを保持するときや、定期的に mkinitcpio を使ったりサードパーティ製のモジュールをビルドする場合に楽になります。
ヒント: LILO ブートローダーを使用していてカーネルのデバイスマッパードライバーが使えない場合は、先に modprobe dm-mod を実行してください。

初期 RAM ディスクが何なのか知らない場合は Wikipediamkinitcpio を見てください。

自動生成したプリセットを使用する方法

既存の 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 ハンドラによって情報 (どの関数でクラッシュしたのかなど) を画面に表示するのに使われます。
ヒント: UEFI パーティションは FAT32 でフォーマットされるため、シンボリックリンクをサポートしません。

/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 を見てください。

ヒント: カーネルのソースには LILO のエントリを自動で作成するスクリプトが含まれています: $ arch/x86/boot/install.sh。更新するときは root で lilo と入力してください。