こちらのサイトを参考にして、Linuxカーネルをソースからコンパイル・再構築してみました。
Contents
カーネルのダウンロード
上記のサイトからLinuxカーネルを入手します。
仮想マシンの設定
仮想マシンの容量をデフォルトの20GBにするとコンパイル時に容量が足りなくなるので、40GBに変更しておく。
再構築したカーネルで起動する際に1GBのRAMでは足りなくなったが、あとから用意に変更可能なので変更しなくてもよし。
カーネルの設定
ダウンロードしたカーネルを展開した後、カーネルの設定を行います。
# cd linux-4.12.7 # make menuconfig
参考にしたサイトではmenuconfigコマンドを利用していましたが、他にも利用できるコマンドはいくつかあるようです。
make config CUIで質問に答えていく
make menuconfig CUIでメニューから選択していく
make xconfig GUIでX(KDE)で操作
make gconfig GUIでX(GNOME)で操作
※CUIならmake menuconfigが良いらしい。
menuconfigコマンドを実行するとエラーで中断。
root@ubuntu:/home/hiyosi/ダウンロード/linux-4.12.7# make menuconfig HOSTCC scripts/basic/fixdep *** Unable to find the ncurses libraries or the *** required header files. *** 'make menuconfig' requires the ncurses libraries. *** *** Install ncurses (ncurses-devel) and try again. *** scripts/kconfig/Makefile:201: ターゲット 'scripts/kconfig/dochecklxdialog' のレシピで失敗しました make[1]: *** [scripts/kconfig/dochecklxdialog] エラー 1 Makefile:548: ターゲット 'menuconfig' のレシピで失敗しました make: *** [menuconfig] エラー 2
ライブラリが足りないようで”ncurses-devel”のインストールをしてみますが該当するライブラリが見つからず。
$ sudo apt-get install ncurses-dev
こちらを参考にパッケージ名を”ncurses-dev”にしてコマンドを通したところ解決しました。
“make menuconfig”を実行すると、CUIで詳細な設定ができる画面が表示されます。
今回はデフォルト設定のままconfigファイルを”save”して”exit”しました。
コンパイル
先程保存したconfigファイルの情報を元に、Linuxカーネルのソースファイルをコンパイルします。
カーネル本体
まず、カーネル本体?をコンパイルします。
root@ubuntu:/home/hiyosi/ダウンロード/linux-4.12.7# make scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: そのようなファイルやディレクトリはありません compilation terminated. scripts/Makefile.host:107: ターゲット 'scripts/sign-file' のレシピで失敗しました make[1]: *** [scripts/sign-file] エラー 1 Makefile:562: ターゲット 'scripts' のレシピで失敗しました make: *** [scripts] エラー 2
makeコマンドでコンパイルすると、”fatal error: openssl/opensslv.h: そのようなファイルやディレクトリはありません”と表示され、致命的なエラーで中断されました。
openssl/opensslv.hというヘッダファイルがないのが問題らしい。
こちらのサイトを参考にして、ヘッダファイルをインストールします。
$ sudo apt install libssl-dev
makeコマンドが正常に実行され、ソースファイルがコンパイルされました。
モジュール
次にモジュールをコンパイルします。
# make modules
モジュールのインストールも行います。
# make modules_install
インストール
いよいよカーネルをインストールします。
# make install
このコマンドで/bootに新しいファイルがいくつか追加され、ブートローダのgrubの設定ファイルもデフォルトで書き換えられるようです。
再起動
再起動を実行して新しいLinuxカーネルを立ち上げます。
# reboot
新しいLinuxカーネルで立ち上げるとカーネルパニックが発生してフリーズしました。
-- [ end kernel panic - not syncing : Out of memory and no killable processes...
今回は仮想マシンのRAMの割り当てを1GBから2GBに変更したところ、Linuxカーネルが起動しました。
新しいカーネルが起動後、unameコマンドでカーネルのバージョンを確認します。
// カーネル変更前 $ uname -r 4.4.0-21-generic // カーネル変更後 # uname -r 4.12.7
カーネルのバージョンが変わったことを確認できました。
終わりに
分かりやすいサイトを参考にしたので多少のエラーはありましたが、比較的簡単にLinuxカーネルを再構築することができました。
自分で触れるような小さな変更などから始めてみようと思います。