「カーネル/伝統的なコンパイル方法」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎高度な設定: 修正)
("コンパイル" を追加)
131行目: 131行目:
   
 
ライブメディアから {{ic|lspci -k #}} を実行すると、使用中のカーネルモジュールの名前のリストが出力されます。一番重要なのは、[[cgroups]] サポートを維持しなければならないことです。これは [[systemd]] に必要不可欠です。詳細は、[[Gentoo:Kernel/Gentoo Kernel Configuration Guide]]、[[Gentoo:Intel#Kernel]] (Intel プロセッサ)、[[Gentoo:Ryzen#Kernel]] (AMD Ryzen プロセッサ) を参照してください。
 
ライブメディアから {{ic|lspci -k #}} を実行すると、使用中のカーネルモジュールの名前のリストが出力されます。一番重要なのは、[[cgroups]] サポートを維持しなければならないことです。これは [[systemd]] に必要不可欠です。詳細は、[[Gentoo:Kernel/Gentoo Kernel Configuration Guide]]、[[Gentoo:Intel#Kernel]] (Intel プロセッサ)、[[Gentoo:Ryzen#Kernel]] (AMD Ryzen プロセッサ) を参照してください。
  +
  +
== コンパイル ==
  +
  +
{{Tip|あなたのプロセッサの命令セットに最適化するように {{Pkg|gcc}} を設定するには、カーネルソースディレクトリ内の {{ic|arch/x86/Makefile}} を編集してください:
  +
  +
* {{ic|Processor type and features > Processor Family}} で選択した {{ic|CONFIG_MK8,CONFIG_MPSC,CONFIG_MCORE2,CONFIG_MATOM,CONFIG_GENERIC_CPU}} を探してください。
  +
* {{ic|call cc-options}} フラグを {{ic|1=-march=native}} から、Processor Family で選択したものへ変えてください。例: {{ic|1=cflags-$(CONFIG_MK8) += $(call cc-option,-march=native)}}。これは、{{ic|1=-march=native}} でコンパイルする場合におそらく一番良い方法です。
  +
}}
  +
  +
コンパイルにかかる時間は15分程度から1時間以上まで幅広く、設定したカーネルコンフィグやプロセッサの性能によって大きく変わります。カスタムカーネルの {{ic|.config}} ファイルを設定したら、ソースディレクトリの中で以下のコマンドを実行するとコンパイルが始まります:
  +
  +
$ make
  +
  +
{{Tip|{{ic|-j''X''}} 引数を付けて ''make'' を実行すれば、コンパイルを速めることができます ({{ic|''X''}} は並列ジョブ数です)。マシンの CPU コアの数を設定すると、最も速くなることが多いです。例えば、2 コアのプロセッサの場合は {{ic|make -j2}} となります。詳細は [[makepkg#コンパイル時間を短縮する]] を参照してください。}}
   
 
== コンパイルとインストール ==
 
== コンパイルとインストール ==

2023年6月10日 (土) 17:17時点における版

この記事では、kernel.org のソースからカスタムカーネルをビルドする方法を紹介します。この方法は、全てのディストリビューションで共通の伝統的な方法です。あなたの経験量にもよりますが、カーネル/Arch build system を用いる方法よりも複雑です。Arch Build System のツールは、繰り返されるコンパイルタスクを効率的かつ安全にするために開発されメンテナンスされているということを考慮に入れておいてください。

準備

カーネルの準備では root アカウントや root 権限 (つまり、sudo) を使う必要はありませんし、推奨されてもいません。

コアパッケージをインストールする

base-devel メタパッケージをインストールしてください。これにより、makegcc などの必須パッケージがインストールされます。デフォルトの Arch カーネルの PKGBUILD に記載されている次のパッケージもインストールすることを推奨します: xmltokmodinetutilsbclibelfgitcpioperltarxz

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

あなたのカーネル用の個別のビルドディレクトリを作成することをおすすめします。以下の例では home ディレクトリに kernelbuild を作成します:

$ mkdir ~/kernelbuild

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

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

https://www.kernel.org からカーネルのソースをダウンロードしてください。カーネルのソースファイルは、あなたが選んだカーネルの tarball (.tar.xz) ファイルの形であるはずです。

ブラウザから tar.xz (tarball) リンクを右クリックしてダウンロードすることもできますし、HTTP や TFTPRsyncGit を使用するグラフィカルツールやコマンドラインツールでもダウンロードできます。

ノート:
  • ダウンロードしたカーネルの tarball の PGP 署名を検証するのは良いアイデアです。そうすれば、そのファイルが正規のものであることを確実にでき、信用の輪 (Web of Trust) を構築するのに役立ちます。kernel.org/signature を参照してください。
  • 特定のリリース (例: -rc リリース) では、ダウンロードしたアーカイブと展開後のディレクトリが、このページの例で使用されている A.B.C という命名形式に厳密には従っていません。必要に応じて調整してください。

以下のコマンドでは、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 が速い傾向にあります。

カーネルのソースを展開する

ビルドディレクトリ内で、カーネルの 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
ノート: mrproper Make ターゲットは clean ターゲットに依存しているため、これら両方を実行する必要はありません。参考までに [2] を参照してください。

カーネルの設定

これは、あなたのコンピュータの仕様を正確に反映させるために、デフォルトのカーネルをカスタマイズする作業の中で最も重要なステップです。カーネルの設定 (コンフィグレーション) は .config ファイルで設定されます。このファイルには、カーネルモジュールの使用に関する設定も含まれています。.config 内のオプションを適切に設定すれば、あなたのカーネルとコンピュータを最も効率的に機能させることができます。

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

カーネルの設定は、以下の2つを組み合わせて行うことができます:

  • 公式カーネルの Arch のデフォルト設定を使う (推奨)
  • カーネルオプションを手動で設定する (任意。高度な方法であり、推奨されません)

Arch のデフォルト設定

この方法では、Arch のデフォルトのカーネル設定を使ってカスタムカーネル用の .config ファイルを作成します。標準の Arch カーネルが実行中である場合、カスタムカーネルのソースディレクトリ内で以下のコマンドを実行することで、現在実行中のカーネルの .config ファイルを作成できます:

$ zcat /proc/config.gz > .config

あるいは、オンラインで official Arch Linux カーネルパッケージからデフォルトの設定を入手できます。

ヒント:
  • カーネルをアップグレードすると、一部のオプションが変更されたり、削除されたりする場合があります。この場合、#コンパイル 時に make を実行すると、バージョン間で変更された設定オプションに答えるよう尋ねてきます。このプロンプトを表示させずにデフォルトを適用させるには、make olddefconfig を実行してください。
  • modprobed-db を使用することで、不要なモジュールをデフォルトの Arch .config から取り除くことができます。適切に生成されたデータベースを入手できたら、make LSMOD=$HOME/.config/modprobed.db localmodconfig を実行して、modprobed.db データベース内に存在しないモジュールをすべて取り除いてください。
警告: 現在の .config ファイルを使ってカーネルをコンパイルする場合、.config を直接編集するか、あるいは #高度な設定 に記載されているユーザインターフェイスの General Setup > Local version - append to kernel release を使って、カーネルバージョン "CONFIG_LOCALVERSION" を忘れずに変更してください。名前を変更しなかった場合、既存のカーネルを間違って上書きしてしまう危険があります。

高度な設定

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

カーネルの設定を調整するためのツールが複数存在します。これらを使えば、何時間も掛けてコンパイル中に利用可能なオプションを1つずつすべて手作業で設定する手間を省けます。

ノート: 以下のツールは各カーネルの機能について3つの設定オプションを提供しています: y (有効)、n (無効)、m (カーネルモジュールとして有効、必要なときにロード)。

以下がそのツールです:

  • make menuconfig: コマンドライン ncurses インターフェイス。nconfig が後継です。
  • make nconfig: より新しい、コマンドライン用の ncurses インターフェイス。
  • make xconfig: ユーザーフレンドリーなグラフィカルインターフェイス。依存パッケージとして packagekit-qt5 をインストールする必要があります。簡単に操作でき、各オプションの情報も表示されるので、(特に初心者に) おすすめです。
  • make gconfig: グラフィカルな設定方法。xconfig に似ていますが、GTK を使用します。gtk2glib2、そして libgladeAUR を必要とします。

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

変更を加えたら .config ファイルを保存してください。ソースディレクトリの外にバックアップすると良いでしょう。すべてのオプションを適切に設定するまで、複数回これを繰り返す必要があるかもしれません。

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

ライブメディアから lspci -k # を実行すると、使用中のカーネルモジュールの名前のリストが出力されます。一番重要なのは、cgroups サポートを維持しなければならないことです。これは systemd に必要不可欠です。詳細は、Gentoo:Kernel/Gentoo Kernel Configuration GuideGentoo:Intel#Kernel (Intel プロセッサ)、Gentoo:Ryzen#Kernel (AMD Ryzen プロセッサ) を参照してください。

コンパイル

ヒント: あなたのプロセッサの命令セットに最適化するように gcc を設定するには、カーネルソースディレクトリ内の arch/x86/Makefile を編集してください:
  • Processor type and features > Processor Family で選択した CONFIG_MK8,CONFIG_MPSC,CONFIG_MCORE2,CONFIG_MATOM,CONFIG_GENERIC_CPU を探してください。
  • call cc-options フラグを -march=native から、Processor Family で選択したものへ変えてください。例: cflags-$(CONFIG_MK8) += $(call cc-option,-march=native)。これは、-march=native でコンパイルする場合におそらく一番良い方法です。

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

$ make
ヒント: -jX 引数を付けて make を実行すれば、コンパイルを速めることができます (X は並列ジョブ数です)。マシンの CPU コアの数を設定すると、最も速くなることが多いです。例えば、2 コアのプロセッサの場合は make -j2 となります。詳細は makepkg#コンパイル時間を短縮する を参照してください。

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

ヒント: 使用しているプロセッサの命令セットに 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
  • システムマップのカーネルシンボリックリンク

ブートローダの設定

ブートローダの設定ファイルに新しいカーネルのエントリを追加してください。利用可能なブートローダは Arch ブートプロセス#機能比較 を、その他の情報は関連する wiki ページを参照してください。

ヒント: カーネルのソースには LILO のエントリを自動で作成するスクリプトが含まれています。他のブートローダを使用する場合は、これは安全に無視できます。

参照