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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(1版 をインポートしました)
 
(3人の利用者による、間の17版が非表示)
1行目: 1行目:
 
[[Category:カーネル]]
 
[[Category:カーネル]]
[[en:Kernels/Compilation/Traditional]]
+
[[en:Kernel/Traditional compilation]]
[[it:Kernels/Compilation/Traditional]]
+
[[pt:Kernel (Português)/Traditional compilation]]
[[ru:Kernels/Compilation/Traditional]]
+
[[ru:Kernel (Русский)/Traditional compilation]]
[[zh-CN:Kernels/Compilation/Traditional]]
+
[[zh-hans:Kernel/Traditional compilation]]
この記事では '''kernel.org のソース'''からカスタムカーネルを作成する方法を説明ています。このカーネルをコンパイルする方法は全てのディストリビューションで共通の伝統的な方法です。複雑ぎると感じるときは他の方法見て下さ: [[Kernels#コンパイル]]
+
この記事では'''kernel.org のソース'''からカスタムカーネルをビルドする方法を紹介します。この方法は全てのディストリビューションで共通の伝統的な方法です。あなたの経験量にもよりま[[カーネル/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/
 
  +
=== コアパッケージをインストールする ===
  +
  +
{{Pkg|base-devel}} [[メタパッケージ]]をインストールしてください。これにより、{{Pkg|make}} や {{Pkg|gcc}} などの必須パッケージがインストールされます。デフォルトの Arch カーネルの [https://github.com/archlinux/svntogit-packages/blob/packages/linux/trunk/PKGBUILD PKGBUILD] に記載されている次のパッケージもインストールすることを推奨します: {{Pkg|xmlto}}、{{Pkg|kmod}}、{{Pkg|inetutils}}、{{Pkg|bc}}、{{Pkg|libelf}}、{{Pkg|git}}、{{Pkg|cpio}}、{{Pkg|perl}}、{{Pkg|tar}}、{{Pkg|xz}}。
  +
  +
=== カーネルコンパイル用のディレクトリを作成する ===
  +
  +
あなたのカーネル用の個別のビルドディレクトリを作成することをおすすめします。以下の例では {{ic|home}} ディレクトリに {{ic|kernelbuild}} を作成します:
  +
  +
$ mkdir ~/kernelbuild
  +
  +
=== カーネルのソースをダウンロードする ===
  +
  +
{{Warning|[[systemd]] はバージョン 3.12 以上のカーネルを必要とします ([[cgroups]] の統一的な階層のサポートは 4.2 以上)。詳しくは {{ic|/usr/share/doc/systemd/README}} を見てください。}}
  +
  +
https://www.kernel.org からカーネルのソースをダウンロードしてください。カーネルのソースファイルは、あなたが選んだカーネルの [[Wikipedia:ja:tar|tarball]] (''.tar.xz'') ファイルの形であるはずです。
  +
  +
ブラウザから {{ic|tar.xz}} (''tarball'') リンクを右クリックしてダウンロードすることもできますし、HTTP や [[TFTP]]、[[Rsync]]、[[Git]] を使用するグラフィカルツールやコマンドラインツールでもダウンロードできます。
  +
  +
{{Note|
  +
* ダウンロードしたカーネルの tarball の PGP 署名を検証するのは良いアイデアです。そうすれば、そのファイルが正規のものであることを確実にでき、信用の輪 (Web of Trust) を構築するのに役立ちます。[https://kernel.org/signature.html#using-gnupg-to-verify-kernel-signatures kernel.org/signature] を参照してください。
  +
* 特定のリリース (例: {{ic|-rc}} リリース) では、ダウンロードしたアーカイブと展開後のディレクトリが、このページの例で使用されている {{ic|''A''.''B''.''C''}} という命名形式に厳密には従っていません。必要に応じて調整してください。
  +
}}
  +
  +
以下のコマンドでは、{{Pkg|wget}} がインストールされていて、{{ic|~/kernelbuild}} 内で {{Pkg|wget}} を使ってカーネル ''A''.''B''.''C'' を取得しています:
   
* 解凍してソースディレクトリに移動してください:
 
 
$ cd ~/kernelbuild
 
$ cd ~/kernelbuild
  +
$ wget <nowiki>https://cdn.kernel.org/pub/linux/kernel/</nowiki>v''A''.x/linux-''A''.''B''.''C''.tar.xz
$ tar -xvJf linux-3.16.tar.xz
 
$ cd linux-3.16
 
次のコマンドを実行してコンパイルの準備をします:
 
make mrproper
 
これによってカーネルツリーが完全にクリーンなことを確認します。カーネルコンパイルの前にこのコマンドを実行することをカーネル開発者は推奨しています。解凍した後のソースツリーに依存しないでください。
 
   
  +
ダウンロードしたファイルを信頼する前に、そのファイルの正しさを検証するべきです。まず、署名をダウンロードし、その署名を使って署名鍵のフィンガープリントを入手します。そして、そのフィンガープリントを使って実際の署名鍵を入手します:
=== /usr/src/ の使用について ===
 
root でコンパイルするために {{ic|/usr/src/}} を使い、適切なシンボリックリンクを作成することは、長年議論の的になっています。
 
   
  +
$ wget <nowiki>https://cdn.kernel.org/pub/linux/kernel/</nowiki>v''A''.x/linux-''A''.''B''.''C''.tar.sign
* これを良くない習慣だと考えるユーザーもいます。設定とコンパイルには home ディレクトリを使い、root でインストールするのが一番キレイな方法だと思っているからです。
 
  +
$ gpg --list-packets linux-''A''.''B''.''C''.tar.sign
  +
$ gpg --recv-keys ''前のコマンドで入手したフィンガープリント''
   
  +
注意点として、この署名は tar アーカイブ (つまり、拡張子 {{ic|.tar}}) に対して生成されたものであって、圧縮された {{ic|.tar.xz}} ファイルのものではありません。{{ic|.tar.xz}} ファイルを {{ic|.tar}} へ展開する必要があります。{{pkg|xz}} がインストールされていることを確認してください。インストールされていれば、以下のようにできます:
* 他の経験のあるユーザーは、コンパイルプロセス全体を root で行うことは全くもって安全で、時には推奨さえされると考えています。
 
   
  +
$ unxz linux-''A''.''B''.''C''.tar.xz
あなたが快適におもう方法を使って下さい。以下の説明は方法にあわせて交換することが可能です。
 
  +
$ gpg --verify linux-''A''.''B''.''C''.tar.sign linux-''A''.''B''.''C''.tar
   
  +
このコマンドで "Good signature" という文字列を含む出力が出てこなかった場合、この先に進んではなりません。
== ビルド設定 ==
 
あなたのコンピューターの正確な仕様にあわせてカーネルをカスタマイズするのに最も大事なステップです。{{ic|.config}} のオプションを適切に設定することで、あなたのカーネルとコンピューターを最も効率的に動作させることができるようになります。
 
   
  +
{{ic|wget}} をビルドディレクトリ内で使わなかった場合、tarball をビルドディレクトリ内へ移動する必要があります。例えば:
=== カーネルの設定 ===
 
{{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.}}
 
   
  +
$ mv /path/to/linux-''A''.''B''.''C''.tar.xz ~/kernelbuild/
==== 初心者向け ====
 
初心者にやりやすい手間を省ける選択肢が2つあります:
 
* デフォルトの Arch の設定を変更したい場合、実行中のカーネルから .config ファイルをコピーしてください。
 
$ zcat /proc/config.gz > .config
 
* カーネル 2.6.32 から、'''localmodconfig''' を使うことで現在使用されているオプションだけを選択できます。
 
*# 標準の {{ic|-ARCH}} カーネルで起動して、システムで使う予定がある全てのデバイスを接続してください。
 
*# ソースディレクトリに {{ic|cd}} してから次を実行してください: {{ic|$ make localmodconfig}}
 
*# 作られた設定ファイルは {{ic|.config}} に書き込まれます。これで下で説明しているようにしてコンパイル・インストールができます。
 
   
==== 伝統的な menuconfig ====
+
==== 準公式カーネルミラー ====
$ make menuconfig
 
   
  +
いくつかの kernel.org Git リポジトリの準公式ミラーがそれぞれのメンテナによって提供されています。これらのミラーは kernel.org よりも clone が速い傾向にあります。
既に {{ic|.config}} が存在しない限り (例: 上書き)、これで新しいものが作られます。オプションの依存関係は自動的に選択されます。新しいオプション (古いカーネル {{ic|.config}} がある場合) は自動で選択されたりされなかったりします。
 
   
  +
* メインラインブランチは Linus Torvalds の GitHub アカウントでミラーリングされています: https://github.com/torvalds/linux.git 。
変更はカーネルに加えて設定ファイルを保存してください。ソースディレクトリの外にバックアップ用のコピーを作っておくと良いでしょう、オプションを全て正しく設定するまで何回もやり直すことができるからです。自信がないときは、コンパイルのオプションだけを変更してください。新しくビルドしたカーネルで起動できない場合は、[https://www.archlinux.org/news/users-of-unofficial-kernels-must-enable-devtmpfs-support/ ここ]にある必須の設定アイテムの一覧を見て下さい。liveCD から {{ic|$ lspci -k #}} を実行すると使用されているカーネルモジュールの名前を表示できます。さらに、CGROUPS サポートは必ず必要になります。これは [[systemd|systemd]] を使うのに必須だからです。
 
  +
* 安定ブランチは Greg Kroah-Hartman の GitHub アカウントでミラーリングされています: https://github.com/gregkh/linux 。[http://kroah.com/log/blog/2019/06/15/linux-stable-tree-mirror-at-github/]
   
==== ジョニング ====
+
=== ネルのソースを展開する ===
現在の設定ファイルを使ってカーネルをコンパイルするつもりならば、カーネルのバージョンの名前を変更することを忘れないで下さい。そうしないと誤って既存のカーネルを置き換えてしまう可能性があります。
 
   
  +
ビルドディレクトリ内で、カーネルの tarball を展開してください:
$ make menuconfig
 
General setup --->
 
(-ARCH) Local version - append to kernel release '3.n.n-RCn'
 
   
  +
$ tar -xvf linux-''A''.''B''.''C''.tar
== コンパイルとインストール ==
 
   
  +
パーミッションエラーが発生しないことを確実にするには、[[Wikipedia:ja:Chown|chown]] を実行してフォルダの所有者を現在のユーザに変更する必要があります。
=== コンパイル ===
 
コンパイル時間は15分から1時間超えまで様々です。主として選択したオプション・モジュールの数と、プロセッサの能力によって変わります。詳しくは [[Makepkg#MAKEFLAGS|Makeflags]] を見て下さい。
 
   
  +
フォルダとその中の全ファイルの所有者を現在のユーザに変更するには、chown コマンドを実行してください。
{{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 }} を実行してください。
 
  +
$ chown -R $USER:$USER linux-''A''.''B''.''C''
  +
  +
これにより、フォルダ内の全ファイルの所有者があなたになりました。なので、パーミッション関連のエラーは発生しません。
  +
  +
準備を終える前に、カーネルツリーが絶対的にクリーンであることを確認してください。解凍後のソースツリーがクリーンであると思い込んではなりません。確認するには、新しく作成したカーネルソースディレクトリに移動し、{{ic|make mrproper}} コマンドを実行してください:
  +
  +
$ cd linux-''A''.''B''.''C''
  +
$ make mrproper
  +
  +
{{Note|{{ic|mrproper}} Make ターゲットは {{ic|clean}} ターゲットに依存しているため、これら両方を実行する必要はありません。参考までに [https://unix.stackexchange.com/q/387640] を参照してください。}}
  +
  +
== カーネルの設定 ==
  +
  +
これは、あなたのコンピュータの仕様を正確に反映させるために、デフォルトのカーネルをカスタマイズする作業の中で最も重要なステップです。カーネルの設定 (コンフィグレーション) は {{ic|.config}} ファイルで設定されます。このファイルには、[[カーネルモジュール]]の使用に関する設定も含まれています。{{ic|.config}} 内のオプションを適切に設定すれば、あなたのカーネルとコンピュータを最も効率的に機能させることができます。
  +
  +
{{Note|この段階では root アカウントや root 権限は必要ありません。}}
  +
  +
カーネルの設定は、以下の2つを組み合わせて行うことができます:
  +
  +
* 公式カーネルの Arch のデフォルト設定を使う (推奨)
  +
* カーネルオプションを手動で設定する (任意。高度な方法であり、推奨されません)
  +
  +
=== Arch のデフォルト設定 ===
  +
  +
この方法では、Arch のデフォルトのカーネル設定を使ってカスタムカーネル用の {{ic|.config}} ファイルを作成します。標準の Arch カーネルが実行中である場合、カスタムカーネルのソースディレクトリ内で以下のコマンドを実行することで、現在実行中のカーネルの {{ic|.config}} ファイルを作成できます:
  +
  +
$ zcat /proc/config.gz > .config
  +
  +
あるいは、オンラインで [https://github.com/archlinux/svntogit-packages/blob/packages/linux/trunk/config official Arch Linux カーネル]パッケージからデフォルトの設定を入手できます。
  +
  +
{{Tip|
  +
* カーネルをアップグレードすると、一部のオプションが変更されたり、削除されたりする場合があります。この場合、[[#コンパイル]] 時に {{ic|make}} を実行すると、バージョン間で変更された設定オプションに答えるよう尋ねてきます。このプロンプトを表示させずにデフォルトを適用させるには、{{ic|make olddefconfig}} を実行してください。
  +
* [[modprobed-db]] を使用することで、不要なモジュールをデフォルトの Arch {{ic|.config}} から取り除くことができます。[[modprobed-db#データベースを生成する|適切に生成されたデータベース]]を入手できたら、{{ic|1=make LSMOD=$HOME/.config/modprobed.db localmodconfig}} を実行して、{{ic|modprobed.db}} データベース内に存在しないモジュールをすべて取り除いてください。
  +
}}
  +
  +
{{Warning|現在の {{ic|.config}} ファイルを使ってカーネルをコンパイルする場合、{{ic|.config}} を直接編集するか、あるいは [[#高度な設定]] に記載されているユーザインターフェイスの ''General Setup > Local version - append to kernel release'' を使って、カーネルバージョン "CONFIG_LOCALVERSION" を忘れずに変更してください。名前を変更しなかった場合、既存のカーネルを間違って上書きしてしまう危険があります。}}
  +
  +
=== 高度な設定 ===
  +
  +
{{Tip|カスタムカーネルで起動したりシャットダウンするときに大量のメッセージを表示させたくない場合、関連するデバッグオプションは無効化すると良いでしょう。}}
  +
  +
カーネルの設定を調整するためのツールが複数存在します。これらを使えば、何時間も掛けてコンパイル中に利用可能なオプションを1つずつすべて手作業で設定する手間を省けます。
  +
  +
{{Note|以下のツールは各カーネルの機能について3つの設定オプションを提供しています: {{ic|y}} (有効)、{{ic|n}} (無効)、{{ic|m}} (カーネルモジュールとして有効、必要なときにロード)。}}
  +
  +
以下がそのツールです:
  +
  +
* {{ic|make menuconfig}}: コマンドライン ncurses インターフェイス。{{ic|nconfig}} が後継です。
  +
* {{ic|make nconfig}}: より新しい、コマンドライン用の ncurses インターフェイス。
  +
* {{ic|make xconfig}}: ユーザーフレンドリーなグラフィカルインターフェイス。依存パッケージとして {{Pkg|packagekit-qt5}} をインストールする必要があります。簡単に操作でき、各オプションの情報も表示されるので、(特に初心者に) おすすめです。
  +
* {{ic|make gconfig}}: グラフィカルな設定方法。xconfig に似ていますが、GTK を使用します。{{Pkg|gtk2}}、{{Pkg|glib2}}、そして {{AUR|libglade}} を必要とします。
  +
  +
カーネルソースディレクトリの中で上記のどれかのコマンドを実行してください。新しい {{ic|.config}} ファイルが作成されるか、既存のファイルが上書きされます。任意の設定は全て自動的に有効になりますが、新しい設定オプションは自動的に選択されない場合があります (古いカーネル {{ic|.config}} を使用した場合)。
  +
  +
変更を加えたら {{ic|.config}} ファイルを保存してください。ソースディレクトリの外にバックアップすると良いでしょう。すべてのオプションを適切に設定するまで、複数回これを繰り返す必要があるかもしれません。
  +
  +
設定がよくわからない場合は、少しずつオプションを変更してコンパイルしてください。ビルドしたカーネルで起動できない場合、[https://archlinux.org/news/users-of-unofficial-kernels-must-enable-devtmpfs-support/ ここ]に必須のコンフィグアイテムのリストが存在します。
  +
  +
ライブメディアから {{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#コンパイル時間を短縮する]] を参照してください。}}
  +
  +
== インストール ==
  +
  +
=== モジュールをインストールする ===
  +
  +
カーネルがコンパイルできたら、次はモジュールです。まず、モジュールをビルドしてください:
  +
  +
$ make modules
  +
  +
次に、モジュールをインストールしてください。root として、あるいは root 権限で、以下のコマンドを実行してください:
   
=== モジュールのインストール ===
 
 
# make modules_install
 
# make modules_install
   
のコマンドはコンパイルされたモジュール {{ic|/lib/modules/[kernel version + CONFIG_LOCALVERSION]}} コピーます。これによってあなたのマシン上にあ他のカーネルによって使われるものとモジュール分けることができます。
+
れで、コンパイルされたモジュール {{ic|/lib/modules/''A''.''B''.''C''/}} コピーされます。これによ使用されるカーネルにモジュール分けられようになっています。
   
  +
{{Tip|標準的な Linux カーネルでは配布されていないモジュールを必要とする場合、完了した後にカスタムカーネル用にモジュールをコンパイルしてください。そのようなモジュールは基本的に実行中の環境で別個に明示的にインストールします。例えば [[NVIDIA#カスタムカーネル]] を見てください。}}
=== カーネルを /boot ディレクトリにコピー ===
 
# cp -v arch/x86/boot/bzImage /boot/vmlinuz-YourKernelName
 
   
=== 初期 RAM ディの作成 ===
+
=== カーネルを /boot ディトリにコピーする ===
これが何なのか知らない場合は、次を参照してください: [[wikipedia:ja:initrd|Wikipedia の Initramfs]] と [[mkinitcpio|mkinitcpio]]。
 
# mkinitcpio -k FullKernelName -c /etc/mkinitcpio.conf -g /boot/initramfs-YourKernelName.img
 
   
  +
{{Note|{{ic|bzImage}} カーネルファイルは使用しているシステムアーキテクチャにあわせて適切なディレクトリからコピーしてください。下を参照。}}
{{ic|/boot}} のファイルには自由に名前を付けることができます。ただし、あなたが以下のことをしているのならば [kernel-major-minor-revision] という形式の名前を付けたほうが混乱を避けるのに役立つでしょう:
 
* 複数のカーネルを使っている。
 
* mkinitcpio を頻繁に使用する。
 
* サードパーティ製のモジュールをビルドする。
 
{{Tip|頻繁にイメージをリビルドするような場合は、次のようなコマンドを使えるようにプリセットファイルを作成すると便利です:<code># mkinitcpio -p custom</code>。[[mkinitcpio#イメージ作成とアクティベーション|ここ]]を参照してください。}}
 
   
LILO を使っていてカーネルの device-mapper ドラバー通信できない場合まず {{ic|modprobe dm-mod}} を実行する必要があります
+
カーネルをコンパルすると、カーネルの圧縮された {{ic|bzImage}} (big zImage) が生成されます。生成されない場合、以下を実行する必要があります:
   
  +
make bzImage
=== System.map のコピー ===
 
{{ic|System.map}} ファイルは Linux の起動に必須ではありません。これは一種の"電話帳"みたいなものでカーネルの特定のビルドの機能が記載されています。{{ic|System.map}} にはカーネルのシンボルの一覧 (つまり機能や変数の名前など) とそれぞれのアドレスが含まれます。この"アドレスマッピングのシンボル名"を使うのは:
 
   
  +
このファイルは {{ic|/boot}} ディレクトリにコピーして名前を変える必要があります。名前に {{ic|vmlinuz-}} という接頭辞を付ければ、好きな名前を付けることができます。以下の例では、コンパイルされ、インストールされた ''A''.''B''.''C'' カーネルがコピーされ、{{ic|vmlinuz-linux''AB''}} という名前に変更されます:
* klogd, ksymoops といったプロセス
 
* カーネルがクラッシュした時に OOPS ハンドラによって情報 (どの関数がクラッシュしたのかなど) を画面に表示するのに使われます。
 
   
  +
# cp -v arch/x86/boot/bzImage /boot/vmlinuz-linux''AB''
{{ic|System.map}} を {{ic|/boot}} にコピーしてシンボリックリンクを作成してください:
 
  +
# cp System.map /boot/System.map-YourKernelName
 
  +
=== 初期 RAM ディスクを作成する ===
# ln -sf /boot/System.map-YourKernelName /boot/System.map
 
  +
  +
{{Note|Initramfs イメージファイルの名前は自由に付けられます。ただし、{{ic|linux''major_revision<wbr>minor_revision''}} という命名規則に従うことを推奨します。複数のカーネルを保持するときや、定期的に mkinitcpio を使ったりサードパーティ製のモジュールをビルドする場合に楽になります。}}
  +
  +
{{Tip|LILO ブートローダーを使用していてカーネルのデバイスマッパードライバーが使えない場合は、先に {{ic|modprobe dm-mod}} を実行しなければなりません。}}
  +
  +
初期 RAM ディスクが何なのか知らない場合は [[wikipedia:ja:Initrd|Wikipedia]] や [[mkinitcpio]] を見てください。
  +
  +
==== 自動化されたプリセットを用いる方法 ====
  +
  +
既存の [[Mkinitcpio#イメージ作成とアクティベーション|mkinitcpio プリセット]]をコピーして変更を加えることで公式カーネルと同じようにカスタムカーネルの initramfs イメージを生成できます。カーネルを再コンパイルする場合などに有用です (例: アップデートする場合など)。以下の例では、標準の Arch カーネルのプリセットファイルをコピーして、上でインストールしたカーネル ''A''.''B''.''C'' 用に変更を加えます。
  +
  +
まず、既存のプリセットファイルをコピーして、{{ic|bzImage}} をコピーしたときに {{ic|/boot/vmlinuz-}} の後ろにつけたカスタムカーネルの名前と一致するように名前を変更してください:
  +
  +
# cp /etc/mkinitcpio.d/linux.preset /etc/mkinitcpio.d/linux''AB''.preset
  +
  +
次に、ファイルを編集してカスタムカーネル用に変更します。{{ic|1=ALL_kver=}} パラメータも {{ic|bzImage}} をコピーしたときに付けたカスタムカーネルの名前と合わせる必要があります:
  +
  +
{{hc|/etc/mkinitcpio.d/linux''AB''.preset|2=
  +
...
  +
ALL_kver="/boot/vmlinuz-linux''AB''"
  +
...
  +
default_image="/boot/initramfs-linux''AB''.img"
  +
...
  +
fallback_image="/boot/initramfs-linux''AB''-fallback.img"
  +
}}
  +
  +
最後に、公式カーネルと同じようにカスタムカーネルの initramfs イメージを生成してください:
  +
  +
# mkinitcpio -p linux''AB''
  +
  +
==== 手動による方法 ====
  +
  +
プリセットファイルを使用する以外にも、mkinitcpio を使って手動で initramfs ファイルを生成することもできます。コマンドの構文は以下の通りです:
  +
  +
# mkinitcpio -k ''kernel_version'' -g /boot/initramfs-''file_name''.img
  +
  +
* {{ic|-k}} ({{ic|--kernel ''kernel_version''}}): initramfs イメージを生成する際に用いるモジュールを指定します。{{ic|''kernel_version''}} は、カスタムカーネルのモジュールディレクトリ ({{ic|/usr/lib/modules/}} 内にあるディレクトリ) の名前と同じにします (カーネルイメージへのパスも使用できます)。
  +
* {{ic|-g}} ({{ic|--generate ''file_name''}}): {{ic|/boot}} ディレクトリに生成する initramfs ファイルの名前を指定します。上記の命名規則を使うことを推奨します。
  +
  +
例えば、上でインストールした ''A''.''B''.''C'' カスタムカーネルの場合のコマンドは以下のようになります:
  +
  +
# mkinitcpio -k ''A''.''B''.''C'' -g /boot/initramfs-linux''AB''.img
  +
  +
=== System.map をコピーする ===
  +
  +
{{ic|System.map}} ファイルは Linux を起動するのに必ずしも必須ではありません。一種の"電話帳"みたいなもので、カーネルの特定のビルドの機能が記載されています。{{ic|System.map}} にはカーネルのシンボルの一覧 (つまり、関数名や変数名など) とそれぞれのアドレスが含まれます。この "シンボル名とアドレスの対応表" を使うのは:
  +
  +
* klogd や ksymoops などの一部プロセス
  +
* カーネルのクラッシュ中に情報 (つまり、どの関数でクラッシュしたかなど) をスクリーンへ出力するために OOPS ハンドラによって使用されます。
  +
  +
{{Tip|[[EFI システムパーティション]]は FAT32 でフォーマットされているため、シンボリックリンクをサポートしません。}}
  +
  +
{{ic|/boot}} がシンボリックリンクをサポートしているファイルシステム (つまり FAT32 以外のファイルシステム) 上にある場合、{{ic|System.map}} を {{ic|/boot}} にコピーして、カーネルの名前をコピー先のファイルの名前の後ろに加えてください。それから {{ic|/boot/System.map}} から {{ic|/boot/System.map-linux''AB''}} にシンボリックリンクを作成してください:
  +
  +
# cp System.map /boot/System.map-linux''AB''
  +
# ln -sf /boot/System.map-linux''AB'' /boot/System.map
   
 
以上の全ての手順を完了したら、以下の3つのファイルと1つのシンボリックリンクがあなたの {{ic|/boot}} ディレクトリに追加されているはずです:
 
以上の全ての手順を完了したら、以下の3つのファイルと1つのシンボリックリンクがあなたの {{ic|/boot}} ディレクトリに追加されているはずです:
* カーネル: vmlinuz-YourKernelName
 
* Initramfs-YourKernelName.img
 
* システムマップ: System.map-YourKernelName
 
* システムマップのシンボリックリンク: System.map
 
   
  +
* カーネル: {{ic|vmlinuz-linux''AB''}}
== ブートローダーの設定 ==
 
  +
* Initramfs: {{ic|initramfs-linux''AB''.img}}
  +
* System Map: {{ic|System.map-linux''AB''}}
  +
* System Map のカーネルのシンボリックリンク: {{ic|System.map}} ({{ic|System.map-linux''AB''}} へのシンボリックリンク)
  +
  +
== ブートローダの設定 ==
  +
  +
ブートローダの設定ファイルに新しいカーネルのエントリを追加してください。利用可能なブートローダは [[Arch ブートプロセス#機能比較]] を、その他の情報は関連する wiki ページを参照してください。
  +
  +
{{Tip|カーネルのソースには [[LILO]] のエントリを自動で作成するスクリプトが含まれています。他のブートローダを使用する場合は、これは安全に無視できます。}}
   
  +
== 参照 ==
ブートローダーの設定ファイルに新しいカーネルのエントリを追加してください - [[GRUB|GRUB]], [[LILO]], [[Syslinux|Syslinux]] にある例を見て下さい。
 
   
  +
* https://cateee.net/lkddb/web-lkddb/ : カーネル設定の文字列とその説明のアルファベット順の包括的なリストがあります。
{{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.}}
 
   
  +
{{TranslationStatus|Kernel/Traditional compilation|2023-06-10|774832}}
== カスタムカーネルで NVIDIA ビデオドライバーを使う ==
 
カスタムカーネルで NVIDIA のドライバーを使うには、[[NVIDIA#Alternate install: カスタムカーネル|カスタムカーネルで nVIDIA ドライバをインストールする方法]]を参照してください。AUR から nvidia ドライバーをインストールすることも可能です。
 

2023年6月10日 (土) 18:53時点における最新版

この記事では、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#コンパイル時間を短縮する を参照してください。

インストール

モジュールをインストールする

カーネルがコンパイルできたら、次はモジュールです。まず、モジュールをビルドしてください:

$ make modules

次に、モジュールをインストールしてください。root として、あるいは root 権限で、以下のコマンドを実行してください:

# make modules_install

これで、コンパイルされたモジュールが /lib/modules/A.B.C/ へコピーされます。これにより、使用されるカーネル毎にモジュールが分けられるようになっています。

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

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

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

カーネルをコンパイルすると、カーネルの圧縮された bzImage (big zImage) が生成されます。生成されない場合、以下を実行する必要があります:

make bzImage

このファイルは /boot ディレクトリにコピーして名前を変える必要があります。名前に vmlinuz- という接頭辞を付ければ、好きな名前を付けることができます。以下の例では、コンパイルされ、インストールされた A.B.C カーネルがコピーされ、vmlinuz-linuxAB という名前に変更されます:

# cp -v arch/x86/boot/bzImage /boot/vmlinuz-linuxAB

初期 RAM ディスクを作成する

ノート: Initramfs イメージファイルの名前は自由に付けられます。ただし、linuxmajor_revisionminor_revision という命名規則に従うことを推奨します。複数のカーネルを保持するときや、定期的に mkinitcpio を使ったりサードパーティ製のモジュールをビルドする場合に楽になります。
ヒント: LILO ブートローダーを使用していてカーネルのデバイスマッパードライバーが使えない場合は、先に modprobe dm-mod を実行しなければなりません。

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

自動化されたプリセットを用いる方法

既存の 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 ハンドラによって使用されます。
ヒント: EFI システムパーティションは FAT32 でフォーマットされているため、シンボリックリンクをサポートしません。

/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 へのシンボリックリンク)

ブートローダの設定

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

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

参照

翻訳ステータス: このページは en:Kernel/Traditional compilation の翻訳バージョンです。最後の翻訳日は 2023-06-10 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。