背景
Linuxカーネルのコンパイルを改めてやってみた時のログ
今回はビルドのみでインストールまでは行ってません。
環境
$ uname -a
Linux Hades 4.15.0-46-generic #49-Ubuntu SMP Wed Feb 6 09:33:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
カーネルソースを入手
下記サイトから対象となるカーネルソースをダウンロードし、解凍します。
https://www.kernel.org/
$ tar xvf linux-5.1-rc1.tar.gz
(中略)
linux-5.1-rc1/virt/lib/Kconfig
linux-5.1-rc1/virt/lib/Makefile
linux-5.1-rc1/virt/lib/irqbypass.c
$ cd linux-5.1-rc1/
必要なモジュールをインストール
本環境で足りないものを下記でインストールしています。
現状の環境やカーネルバージョンで差分があるので適宜必要なものをインストールしてください。
$ yum groupinstall "Development Tools"
$ yum install kernel-devel
$ yum install rpm-build redhat-rpm-config unifdef
$ yum install ncurses ncurses-devel
$ yum install openssl-devel
足りないと下記のようにmake時にエラーとなります。
$ make
HOSTCC scripts/sign-file
scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: No such file or directory
#include <openssl/opensslv.h>
^
compilation terminated.
make[2]: *** [scripts/sign-file] Error 1
make[1]: *** [scripts] Error 2
make: *** [sub-make] Error 2
ディレクトリ構成
ここでは簡単に各ディレクトリの構成について書きます。
詳細は別途ご参照ください。
arch
arch サブディレクトリには、アーキテクチャ(architecture)固有の カーネルコードが含まれている。 さらに深いサブディレクトリがあり、たとえば、i386 や alpha と いったサポートするアーキテクチャごとに分かれている。
include
include サブディレクトリには、カーネルコードをビルドするのに必要な インクルードファイル(include files)の大部分が含まれている。 さらに深いサブディレクトリもあり、サポートするアーキテクチャごとのファイルが含 まれている。include/asm サブディレクトリは、たとえば include/asm-i386 といったそのアーキテクチャに必要な実際の include ディレクトリへのソフトリンク(シンボリックリンク)となっている。 アーキテクチャを変更するには、カーネルの makefile を編集し、Linux カーネル 設定プログラムを再実行する必要がある。
init
このディレクトリには、カーネルの初期化(initialization)コードが含まれているの で、カーネルの動作の仕組みをこれから見ようとする場合はよい出発点になる。
mm
このディレクトリには、メモリ管理(memory management)コードのすべてが含まれてい る。アーキテクチャ固有のメモリ管理コードについては、arch/i386/mm/fault.c といった arch/*/mm ディレクトリ以下にある。
drivers
システム上のデバイスドライバ(device drivers)は、すべてこのディレクトリに置かれ ている。 このディレクトリはさらに再分割され、block といったデバイスドライバ のクラスごとに分かれている。
ipc
このディレクトリには、カーネルのプロセス間通信(inter-process communications)に 関するコードが含まれている。
modules
このディレクトリは、ビルドされたモジュール(module)を保存するためだけに使用され ている。
fs
ファイルシステム(file system)コードのすべてはここに置かれている。 このディレクトリはさらに再分割されていて、vfat や ext2 と いったサポートするファイルシステムごとに分かれている。
kernel
主要なカーネル(kernel)コードが置かれている。ここでも、アーキテクチャ固有の カーネルコードは、arch/*/kernel にある。
net
カーネルのネットワーク(network)関係のコードが置かれている。
lib
このディレクトリには、カーネルのライブラリ(library)コードが含まれている。 アーキテクチャ固有のライブラリは、arch/*/lib で見つけることができる。
scripts
このディレクトリには、カーネルを設定するときに使用されるスクリプト(script) (たとえば、awk や tk スクリプト)が含まれている。
menuconfig
make configと異なりメニュー形式で表示され設定可能なモードです。
現在はmake configよりもこちらのほうが使われることが多いそうなので例によってmenuconfigを使います。
$ make menuconfig
キーストローク
Key | Description |
---|---|
? | Option description and tips/Help |
← → ↑ ↓ PgUp PgDn | Navigate through the kernel features and menuconfig commands. |
Esc+Esc | Exit menuconfig or cancel the command. |
Enter | Activate a command, or expand a branch. |
y | Compile and include this feature inside of the kernel. |
m | Compile this feature as a module, separate from the kernel. |
n | Do not compile the feature. |
/ | Search configuration parameter. |
各パラメータについては下記が大変参考になります。詳しく知りたい方はご参照ください。
http://www.embedded.jp/article/linux_kernel_2-1.html
ビルド
$ make clena ; make
まとめ
ビルド自体はそこまで難しくないことが分かりました。
じゃあ何が難しいのかはやはりmenuconfigで選べる設定を適切なものに変える判断何だと思います。
色々サイトを見て回りましたが正直難しいことだらけです。
ここら辺を掘り下げて自分の言葉にして次は記事を書きたいと思います。