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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
1行目: 1行目:
 
[[Category:カーネル]]
 
[[Category:カーネル]]
  +
[[fr:Compiler un nouveau noyau]]
[[en:Kernels/Compilation/Traditional]]
 
  +
[[en:Kernels/Traditional compilation]]
 
[[it:Kernels/Compilation/Traditional]]
 
[[it:Kernels/Compilation/Traditional]]
 
[[ru:Kernels/Compilation/Traditional]]
 
[[ru:Kernels/Compilation/Traditional]]
 
[[zh-CN:Kernels/Compilation/Traditional]]
 
[[zh-CN:Kernels/Compilation/Traditional]]
この記事では '''kernel.org のソース'''からカスタムカーネルを作成する方法を説明しています。このカーネルをコンパイルする方法は全てのディストリビューションで共通の伝統的な方法です。複雑ぎると感じるときは他の方法を見て下さい: [[カーネル#コンパイル]]。
+
この記事では '''kernel.org のソース'''からカスタムカーネルを作成する方法を説明しています。このカーネルをコンパイルする方法は全てのディストリビューションで共通の伝統的な方法です。経験にもよりま、[[カーネル/コンパイル/Arch Build System|Arch Build System を使用する方法]]よりも複雑です。[[Arch Build System]] は何度もコンパイルする作業を効率的かつ安全に行うために開発されたツールです
   
== ソースの取得 ==
+
== 準備 ==
* http://www.kernel.org からカーネルのソースを取得します。GUI で行うこともできますしテキストベースのツールも利用できます: HTTP, [[Ftp|FTP]], [[Rsync|RSYNC]], [[Git]]。
 
例えば http で wget を使う場合:
 
$ wget -c https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.tar.xz
 
* ダウンロードした tarball の署名を検証すると良いでしょう。詳しくは [http://kernel.org/signature.html#using-gnupg-to-verify-kernel-signatures kernel.org/signature] を見て下さい。
 
   
  +
カーネルの準備をするのに root アカウントや root 権限 (例: [[sudo]]) を使う必要はありません (推奨されません)。
* カーネルソースをビルドディレクトリにコピーしてください、例:
 
  +
$ cp linux-3.16.tar.xz ~/kernelbuild/
 
  +
=== コアパッケージのインストール ===
  +
  +
{{Grp|base-devel}} パッケージグループをインストールしてください。{{Pkg|make}} や {{Pkg|gcc}} などの必須パッケージがインストールされます。デフォルトの Arch カーネルの [https://projects.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/linux PKGBUILD] に記載されている次のパッケージもインストールすることを推奨します: {{Pkg|xmlto}}, {{Pkg|docbook-xsl}}, {{Pkg|kmod}}, {{Pkg|inetutils}}, {{Pkg|bc}}。
  +
  +
=== カーネルコンパイル用のディレクトリを作成 ===
  +
  +
カーネル用にビルドディレクトリを作成することを推奨します。以下の例では {{ic|home}} ディレクトリに {{ic|kernelbuild}} を作成します:
  +
  +
$ mkdir ~/kernelbuild
  +
  +
=== カーネルソースのダウンロード ===
  +
  +
{{Warning|[[systemd]] はカーネルバージョン 3.11 以上を必要とします ([[cgroups]] の統一的な階層のサポートは 4.2 以上)。詳しくは {{ic|/usr/share/systemd/README}} を見てください。}}
  +
  +
http://www.kernel.org からカーネルのソースをダウンロードしてください。[[wikipedia:Tar (computing)|tarball]] ({{ic|tar.xz}}) ファイルです。
  +
  +
ブラウザで {{ic|tar.xz}} リンクを右クリックして {{ic|名前を付けて保存...}} を選択するか HTTP, [[Ftp#FTP|FTP]], [[Rsync|RSYNC]], [[Git]] を使用するグラフィカルあるいはコマンドラインのツールを使うことでダウンロードできます。
  +
  +
{{Note|ダウンロードしたカーネル tarball の PGP 署名を検証すると良いでしょう。信頼の輪が正当であることが確認されます。[http://kernel.org/signature.html#using-gnupg-to-verify-kernel-signatures kernel.org/signature] を見てください。}}
  +
  +
以下のコマンドでは先にインストールした {{Pkg|wget}} を使って {{ic|~/kernelbuild}} ディレクトリにカーネル 4.8.6 をダウンロードします:
   
* 解凍してソースディレクトリに移動してください:
 
 
$ cd ~/kernelbuild
 
$ cd ~/kernelbuild
$ tar -xvJf linux-3.16.tar.xz
+
$ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.8.6.tar.xz
$ cd linux-3.16
 
次のコマンドを実行してコンパイルの準備をします:
 
make mrproper
 
これによってカーネルツリーが完全にクリーンなことを確認します。カーネルコンパイルの前にこのコマンドを実行することをカーネル開発者は推奨しています。解凍した後のソースツリーに依存しないでください。
 
   
  +
ビルドディレクトリの中で {{ic|wget}} を使わなかった場合は、tarball をビルドディレクトリに移動します:
=== /usr/src/ の使用について ===
 
root でコンパイルするために {{ic|/usr/src/}} を使い、適切なシンボリックリンクを作成することは、長年議論の的になっています。
 
   
  +
$ mv /path/to/linux-4.8.6.tar.xz ~/kernelbuild/
* これを良くない習慣だと考えるユーザーもいます。設定とコンパイルには home ディレクトリを使い、root でインストールするのが一番キレイな方法だと思っているからです。
 
   
  +
=== カーネルソースの展開 ===
* 他の経験のあるユーザーは、コンパイルプロセス全体を root で行うことは全くもって安全で、時には推奨さえされると考えています。
 
   
  +
ビルドディレクトリの中にカーネル tarball を展開してください:
あなたが快適におもう方法を使って下さい。以下の説明は方法にあわせて交換することが可能です。
 
   
  +
$ tar -xvJf linux-4.8.6.tar.xz
== ビルド設定 ==
 
  +
あなたのコンピューターの正確な仕様にあわせてカーネルをカスタマイズするのに最も大事なステップです。{{ic|.config}} のオプションを適切に設定することで、あなたのカーネルとコンピューターを最も効率的に動作させることができるようになります。
 
  +
カーネルツリーが完全にクリーンであることを確認したら準備完了です。カーネルソースを展開しただけではカーネルツリーがクリーンとは限りません。新しく作られたカーネルソースのディレクトリに移動して、{{ic|make mrproper}} コマンドを実行してください:
  +
  +
$ cd linux-4.8.6/
  +
$ make clean && make mrproper
  +
  +
== 設定 ==
  +
  +
あなたのコンピュータの正確な仕様にあわせてデフォルトカーネルをカスタマイズします。一番重要なステップです。カーネルコンフィグは {{ic|.config}} ファイルで設定し、[[カーネルモジュール]]の使用も含めます。
  +
  +
{{Note|まだこの段階で root アカウントや root 権限は必要ありません。}}
  +
  +
{{ic|.config}} のオプションを適切に設定することで、カーネルとコンピュータは効率的に機能します。
   
 
=== カーネルの設定 ===
 
=== カーネルの設定 ===
{{Warning|新しいビデオカードで早期 KMS のために ''radeon'' ドライバーをカーネル (>3.3.3) にコンパイルするときは、あなたの使っているカードのファームウェアファイルを含める必要があります。そうしないとアクセラレーションが効きません。[http://wiki.x.org/wiki/radeonBuildHowTo#Missing_Extra_Firmware こちら] を参照してください。}}
 
{{Tip| It is possible, to configure a kernel that does not require initramfs on '''''simple configurations'''''. Ensure that all your modules required for video/input/disks/fs are compiled into the kernel. As well as support for DEVTMPFS_MOUNT, TMPFS, AUTOFS4_FS at the very least. If in doubt, learn about these options and what they mean ''before'' attempting.}}
 
   
  +
カーネルを設定する方法は2つ存在します:
==== 初心者向け ====
 
  +
* A. 公式カーネルの Arch のデフォルト設定を使う (推奨)
初心者にやりやすい手間を省ける選択肢が2つあります:
 
* デフォルトの Arch の設定を変更したい場合、実行中のカーネルから .config ファイルをコピしてださ
+
* B. 実行中のカーネルの設定に一致する設定ファイルを生成する (カネルの設定を細かカスタマイズした場合)
$ zcat /proc/config.gz > .config
 
* カーネル 2.6.32 から、'''localmodconfig''' を使うことで現在使用されているオプションだけを選択できます。
 
*# 標準の {{ic|-ARCH}} カーネルで起動して、システムで使う予定がある全てのデバイスを接続してください。
 
*# ソースディレクトリに {{ic|cd}} してから次を実行してください: {{ic|$ make localmodconfig}}
 
*# 作られた設定ファイルは {{ic|.config}} に書き込まれます。これで下で説明しているようにしてコンパイル・インストールができます。
 
   
  +
{{Note|B を選んだ場合、[[#高度な設定]]で説明しているツールを使ってカーネルを手動で設定する必要があります。}}
==== 伝統的な menuconfig ====
 
$ make menuconfig
 
   
  +
==== A. Arch のデフォルト設定 ====
既に {{ic|.config}} が存在しない限り (例: 上書き)、これで新しいものが作られます。オプションの依存関係は自動的に選択されます。新しいオプション (古いカーネル {{ic|.config}} がある場合) は自動で選択されたりされなかったりします。
 
   
  +
この方法では Arch のデフォルトのカーネル設定を使ってカスタムカーネルの {{ic|.config}} ファイルを作成します。標準の Arch カーネルが使われていることを確認して、カスタムカーネルのソースディレクトリの中で以下のコマンドを実行してください:
変更はカーネルに加えて設定ファイルを保存してください。ソースディレクトリの外にバックアップ用のコピーを作っておくと良いでしょう、オプションを全て正しく設定するまで何回もやり直すことができるからです。自信がないときは、コンパイルのオプションだけを変更してください。新しくビルドしたカーネルで起動できない場合は、[https://www.archlinux.org/news/users-of-unofficial-kernels-must-enable-devtmpfs-support/ ここ]にある必須の設定アイテムの一覧を見て下さい。liveCD から {{ic|$ lspci -k #}} を実行すると使用されているカーネルモジュールの名前を表示できます。さらに、CGROUPS サポートは必ず必要になります。これは [[systemd|systemd]] を使うのに必須だからです。
 
   
  +
$ zcat /proc/config.gz > .config
==== バージョニング ====
 
現在の設定ファイルを使ってカーネルをコンパイルするつもりならば、カーネルのバージョンの名前を変更することを忘れないで下さい。そうしないと誤って既存のカーネルを置き換えてしまう可能性があります。
 
   
  +
{{Warning|現在の {{ic|.config}} ファイルを使ってカーネルをコンパイルする場合、下に記載しているユーザーインターフェイスのどれかを使って {{ic| General Setup --->}} オプションでカーネルバージョンの名前を変更してください。名前を変更しなかった場合、既存のカーネルを間違って上書きしてしまう危険があります。}}
$ make menuconfig
 
  +
General setup --->
 
  +
==== B. 設定の生成 ====
(-ARCH) Local version - append to kernel release '3.n.n-RCn'
 
  +
  +
{{tip|この方法を使用する場合は、今後使うかもしれないあらゆるデバイスを接続してください。}}
  +
  +
カーネル 2.6.32 から、{{ic|localmodconfig}} コマンドは現在動作中のカーネルで使われないオプションを全て無効化してカスタムカーネルの {{ic|.config}} ファイルを作成するようになりました。つまり、現在使用されているオプションだけが有効になります。
  +
  +
この最小主義的なアプローチを使えば、あなたの環境にぴったりな効率的で無駄のない設定ができますが、欠点もあります。新しいハードウェアや周辺機器、その他の機能が使えないカーネルになってしまう可能性などです。
  +
  +
{{Note|以下のコマンドを実行する前に、再度、使用するデバイス全てがコンピュータに接続されていることを確認してください。}}
  +
  +
$ make localmodconfig
  +
  +
=== 高度な設定 ===
  +
  +
{{Tip|カスタムカーネルで起動したりシャットダウンするときに大量のメッセージを表示させたくない場合、デバッグオプションは無効化すると良いでしょう。}}
  +
  +
カーネルコンフィグを簡単に調整できるツールが複数存在します。コンパイル時に設定を手動でひとつひとつ設定していては何時間もかかります。
  +
  +
{{Note|以下のツールはカーネルの機能について3つの設定オプションを用意しています: {{ic|y}} (有効), {{ic|n}} (無効), {{ic|m}} (カーネルモジュールとして有効、必要なときにロード)。}}
  +
  +
* {{ic|make menuconfig}}: ncurses コマンドラインインターフェイス ({{ic|nconfig}} によって置き換えられています)
  +
* {{ic|make nconfig}}: コマンドラインの新しい ncurses インターフェイス
  +
* {{ic|make xconfig}}: ユーザーフレンドリーなグラフィカルインターフェイス。依存パッケージとして {{Pkg|packagekit-qt4}}{{Broken package link|package not found}} をインストールする必要があります。各オプションの情報を簡単に確認することができるので初心者向けです。
  +
* {{ic|make gconfig}}: GTK+ を使用する、xconfig と同じようなグラフィカル設定
  +
  +
カーネルソースディレクトリの中で上記のコマンドを実行してください。新しい {{ic|.config}} ファイルが作成されるか、既存のファイルが上書きされます。任意の設定は全て自動的に有効になりますが、新しい設定オプションは自動的に選択されない場合があります (古いカーネル {{ic|.config}} を使用した場合)。
  +
  +
変更を加えたら {{ic|.config}} ファイルを保存してください。ソースディレクトリの外にバックアップすると良いでしょう。全てのオプションを適切に設定するまで複数回はバックアップが必要になると思われます。
  +
  +
設定がよくわからない場合は、少しずつオプションを変更してコンパイルしてください。ビルドしたカーネルで起動できない場合、[https://www.archlinux.org/news/users-of-unofficial-kernels-must-enable-devtmpfs-support/ こちら] に必須のコンフィグアイテムのリストが存在します。
  +
  +
ライブ CD から {{ic|lspci -k}} を実行すると使用しているカーネルモジュールの名前が表示されます。一番重要なのは [[systemd]] を使うのに必要な [[cgroups]] のサポートです。
   
 
== コンパイルとインストール ==
 
== コンパイルとインストール ==
  +
{{Tip|使用しているプロセッサの命令セットに {{Pkg|gcc}} を最適化したい場合、カーネルソースディレクトリ内の {{ic|arch/x86/Makefile}} (i686) または {{ic|arch/x86_64/Makefile}} (86_64) を編集してください:
  +
* {{ic|Processor type and features > Processor Family}} で選択した {{ic|CONFIG_MK8,CONFIG_MPSC,CONFIG_MCORE2,CONFIG_MATOM,CONFIG_GENERIC_CPU}} を確認してください。
  +
* {{ic|-march<nowiki>=</nowiki>native}} の cc-option フラグを Processor Family で選択した文字列に変えてください。例: {{ic|cflags-$(CONFIG_MK8) +<nowiki>=</nowiki> $(call cc-option,-march<nowiki>=</nowiki>native)}}。{{ic|-march<nowiki>=</nowiki>native}} でコンパイルする場合におそらく一番良い方法です。
  +
* 32ビットカーネルの場合、代わりに {{ic|arch/x86/Makefile_32.cpu}} を編集して使用しているプロセッサにあわせて {{ic|-march<nowiki>=</nowiki>native}} を設定してください。}}
   
=== コンパイル ===
+
=== カーネルのコンパイル ===
コンパイル時間は15分から1時間超えまで様々です。主として選択したオプション・モジュールの数と、プロセッサの能によって変わります。詳しくは [[Makepkg#MAKEFLAGS|Makeflags]] を見てさい。
+
コンパイルにかかる時間は15分程度から1時間以上まで幅広く、設定したコンフィグやプロセッサの能によって大きく変わります。詳しくは [[Makepkg#MAKEFLAGS|Makeflags]] を見てください。カスタムカーネルの {{ic|.config}} ファイルを設定したら、ソースディレクトリの中で以下のコマンドを実行するとコンパイルが始まります:
   
  +
$ make
{{Warning | If you use GRUB and still have LILO installed; {{ic|make all}} will configure LILO, and may result in an unbootable system.}}
 
  +
{{ic| $ make }} を実行してください。
 
  +
=== モジュールのコンパイル ===
  +
{{warning|ここから、コマンドは root あるいは root 権限で実行する必要があります。通常ユーザーでは失敗します。}}
  +
  +
カーネルがコンパイルされたら、カーネルのモジュールをコンパイルします。root か root 権限を使って、以下のコマンドを実行してください:
   
=== モジュールのインストール ===
 
 
# make modules_install
 
# make modules_install
   
のコマンドコンパイルされたモジュール {{ic|/lib/modules/[kernel version + CONFIG_LOCALVERSION]}} にコピーます。これによってあなたのマシ他のカーネルによって使われるものとモジュールを分けることができます。
+
上記のコマンドを実行するとコンパイルされたモジュール {{ic|/lib/modules/<kernel version>-<config local version>}} にコピーされます。例えばカーネルバージョ 4.8 をインストールした場合、{{ic|/lib/modules/4.8.6-ARCH}} モジュールがコピーされます。使用するカーネルによってモジュールを分けることができるようになっています。
  +
  +
{{Tip|標準的な Linux カーネルでは配布されていないモジュールを必要とする場合、完了した後にカスタムカーネル用にモジュールをコンパイルしてください。そのようなモジュールは基本的に実行中の環境で別個に明示的にインストールします。例えば [[NVIDIA#カスタムカーネル]]を見てください。}}
  +
  +
=== /boot ディレクトリにカーネルをコピー ===
  +
{{Note|{{ic|bzImage}} カーネルファイルは使用しているシステムアーキテクチャにあわせて適切なディレクトリからコピーしてください。下を参照。}}
  +
  +
カーネルのコンパイルでは圧縮されたカーネルの {{ic|bzImage}} (big zImage) が生成されます。このファイルは {{ic|/boot}} ディレクトリにコピーして名前を変える必要があります。名前の前に {{ic|vmlinuz-}} と付けさえすれば、好きな名前を付けることができます。以下の例では、インストール・コンパイルした 4.8 カーネルを {{ic|vmlinuz-linux48}} と名前を変えてコピーしています:
  +
  +
* 32ビット (i686) カーネル:
  +
# cp -v arch/x86/boot/bzImage /boot/vmlinuz-linux48
   
  +
* 64ビット (x86_64) カーネル:
=== カーネルを /boot ディレクトリにコピー ===
 
# cp -v arch/x86/boot/bzImage /boot/vmlinuz-YourKernelName
+
# cp -v arch/x86_64/boot/bzImage /boot/vmlinuz-linux48
   
 
=== 初期 RAM ディスクの作成 ===
 
=== 初期 RAM ディスクの作成 ===
  +
{{Note|initramfs イメージファイルの名前は自由に付けられます。ただし、{{ic|linux<major revision><minor revision>}} という命名規則に従うことを推奨します。例えば、'linux48' という名前であればメジャーバージョンが '4' でマイナーリビジョンが '8' の 4.8 カーネルです。複数のカーネルを保持するときや、定期的に mkinitcpio を使ったりサードパーティ製のモジュールをビルドする場合に楽になります。}}
これが何なのか知らない場合は、次を参照してください: [[wikipedia:ja:initrd|Wikipedia の Initramfs]] と [[mkinitcpio|mkinitcpio]]。
 
# mkinitcpio -k FullKernelName -c /etc/mkinitcpio.conf -g /boot/initramfs-YourKernelName.img
 
   
  +
{{Tip|LILO ブートローダーを使用していてカーネルのデバイスマッパードライバーが使えない場合は、先に {{ic|modprobe dm-mod}} を実行してください。}}
{{ic|/boot}} のファイルには自由に名前を付けることができます。ただし、あなたが以下のことをしているのならば [kernel-major-minor-revision] という形式の名前を付けたほうが混乱を避けるのに役立つでしょう:
 
* 複数のカーネルを使っている。
 
* mkinitcpio を頻繁に使用する。
 
* サードパーティ製のモジュールをビルドする。
 
{{Tip|頻繁にイメージをリビルドするような場合は、次のようなコマンドを使えるようにプリセットファイルを作成すると便利です:<code># mkinitcpio -p custom</code>。[[mkinitcpio#イメージ作成とアクティベーション|ここ]]を参照してください。}}
 
   
  +
初期 RAM ディスクが何なのか知らない場合は [[wikipedia:ja:Initrd|Wikipedia]] や [[mkinitcpio]] を見てください。
LILO を使っていてカーネルの device-mapper ドライバーと通信できない場合、まず {{ic|modprobe dm-mod}} を実行する必要があります。
 
  +
  +
==== 自動生成したプリセットを使用する方法 ====
  +
既存の [[Mkinitcpio#イメージ作成とアクティベーション|mkinitcpio プリセット]]をコピーして変更を加えることで公式カーネルと同じようにカスタムカーネルの initramfs イメージを生成できます。カーネルを再コンパイルする場合などに有用です (例: アップデートする場合など)。以下の例では、標準の Arch カーネルのプリセットファイルをコピーして、上でインストールしたカーネル 4.8 用に変更を加えます。
  +
  +
まず、既存のプリセットファイルをコピーして、{{ic|bzImage}} をコピーしたときに {{ic|/boot/vmlinuz-}} の後ろにつけたカスタムカーネルの名前と一致するように名前を変更します (上記の場合、{{ic|linux48}}):
  +
  +
# cp /etc/mkinitcpio.d/linux.preset /etc/mkinitcpio.d/linux48.preset
  +
  +
次に、ファイルを編集してカスタムカーネル用に変更します。{{ic|ALL_kver<nowiki>=</nowiki>}} パラメータも {{ic|bzImage}} をコピーしたときに付けたカスタムカーネルの名前と合わせる必要があります:
  +
  +
{{hc|/etc/mkinitcpio.d/linux48.preset|
  +
...
  +
ALL_kver<nowiki>=</nowiki>"/boot/vmlinuz-linux48"
  +
...
  +
default_image<nowiki>=</nowiki>"/boot/initramfs-linux48.img"
  +
...
  +
fallback_image<nowiki>=</nowiki>"/boot/initramfs-linux48-fallback.img"}}
  +
  +
最後に、公式カーネルと同じようにカスタムカーネルの initramfs イメージを生成してください:
  +
  +
# mkinitcpio -p linux48
  +
  +
==== 手動で作成する方法 ====
  +
プリセットファイルを使用する以外にも、mkinitcpio を使って手動で initramfs ファイルを生成することもできます。コマンドの構文は以下の通りです:
  +
  +
# mkinitcpio -k <kernelversion> -g /boot/initramfs-<file name>.img
  +
  +
* {{ic|-k}} (--kernel <カーネルバージョン>): initramfs イメージを生成するときに使用するモジュールを指定します。{{ic|<kernelversion>}} の名前はカスタムカーネルのソースディレクトリの名前と同じになります ({{ic|/usr/lib/modules/}} にあるモジュールディレクトリの名前も同じく)。
  +
* {{ic|-g}} (--generate <ファイル名>): {{ic|/boot}} ディレクトリに生成する initramfs ファイルの名前を指定します。上記の命名規則を使うことを推奨します。
  +
  +
例えば、上でインストールした 4.8 カスタムカーネルの場合のコマンドは:
  +
  +
# mkinitcpio -k linux-4.8.6 -g /boot/initramfs-linux48.img
   
 
=== System.map のコピー ===
 
=== System.map のコピー ===
{{ic|System.map}} ファイルは Linux 起動に必須ではありません。これは一種の"電話帳"みたいなものでカーネルの特定のビルドの機能が記載されています。{{ic|System.map}} にはカーネルのシンボルの一覧 (つまり機能や変数の名前など) とそれぞれのアドレスが含まれます。この"アドレスマッピングのシンボル名"を使うのは:
+
{{ic|System.map}} ファイルは Linux 起動するの必ずしも必須ではありません。一種の"電話帳"みたいなものでカーネルの特定のビルドの機能が記載されています。{{ic|System.map}} にはカーネルのシンボルの一覧 (つまり機能や変数の名前など) とそれぞれのアドレスが含まれます。この"アドレスマッピングのシンボル名"を使うのは:
   
* klogd, ksymoops といったプロセス
+
* klogd ksymoops などの一部プロセス
* カーネルがクラッシュした時に OOPS ハンドラによって情報 (どの関数クラッシュしたのかなど) を画面に表示するのに使われます。
+
* カーネルがクラッシュした時に OOPS ハンドラによって情報 (どの関数クラッシュしたのかなど) を画面に表示するのに使われます。
   
{{ic|System.map}} {{ic|/boot}} にコピしてシンボリックリンクを作成てください:
+
{{Tip|UEFI パーティションは FAT32 でフォマットされるため、シンボリックリンクをサポートません。}}
  +
  +
{{ic|/boot}} がシンボリックリンクをサポートしているファイルシステム (つまり FAT32 以外のファイルシステム) 上にある場合、{{ic|System.map}} を {{ic|/boot}} にコピーして、カーネルの名前をファイルの名前の後ろに加えてください。それから {{ic|/boot/System.map}} から {{ic|/boot/System.map-YourKernelName}} にシンボリックリンクを作成してください:
 
# cp System.map /boot/System.map-YourKernelName
 
# cp System.map /boot/System.map-YourKernelName
 
# ln -sf /boot/System.map-YourKernelName /boot/System.map
 
# ln -sf /boot/System.map-YourKernelName /boot/System.map
   
 
以上の全ての手順を完了したら、以下の3つのファイルと1つのシンボリックリンクがあなたの {{ic|/boot}} ディレクトリに追加されているはずです:
 
以上の全ての手順を完了したら、以下の3つのファイルと1つのシンボリックリンクがあなたの {{ic|/boot}} ディレクトリに追加されているはずです:
* カーネル: vmlinuz-YourKernelName
+
* カーネル: {{ic|vmlinuz-YourKernelName}}
* Initramfs-YourKernelName.img
+
* Initramfs: {{ic|Initramfs-YourKernelName.img}}
* システムマップ: System.map-YourKernelName
+
* システムマップ: {{ic|System.map-YourKernelName}}
* システムマップのシンボリックリンク: System.map
+
* システムマップのカーネルシンボリックリンク
   
 
== ブートローダーの設定 ==
 
== ブートローダーの設定 ==
   
ブートローダーの設定ファイルに新しいカーネルのエントリを追加してください - [[GRUB|GRUB]], [[LILO]], [[Syslinux|Syslinux]] にある例を見てさい。
+
ブートローダーの設定ファイルに新しいカーネルのエントリを追加してください[[GRUB]], [[LILO]], [[GRUB2]], [[Syslinux]], [[systemd-boot]], [[REFInd]] を見てください。
 
{{Tip| Kernel sources include a script to automate the process for LILO: {{ic|$ arch/x86/boot/install.sh}}. Remember to type {{ic|lilo}} as root at the prompt to update it.}}
 
   
  +
{{Tip|カーネルのソースには LILO のエントリを自動で作成するスクリプトが含まれています: {{ic|$ arch/x86/boot/install.sh}}。更新するときは root で {{ic|lilo}} と入力してください。}}
== カスタムカーネルで NVIDIA ビデオドライバーを使う ==
 
カスタムカーネルで NVIDIA のドライバーを使うには、[[NVIDIA#Alternate install: カスタムカーネル|カスタムカーネルで nVIDIA ドライバをインストールする方法]]を参照してください。AUR から nvidia ドライバーをインストールすることも可能です。
 

2016年11月29日 (火) 00:33時点における版

この記事では 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 と入力してください。