カーネルをソースコードからビルドする
はじめに
カーネルをビルドする時というのは誰にでもやってくる可能性がある。カーネルの脆弱性についてのPoCやオリジナルのエクスプロイトを動かしてみたい時、カーネルモジュールを作ってみたくなった時、自分でカーネルのチューニングをしてみたくなった時など。
今回は某の課題でカーネルをビルドして脆弱性を再現するという目的で試してみたので、そこでやったことと、調べたことをまとめておく。
やる
このサイト参考にしてカーネルのビルドしたんだけど、うまくいかなかった。
と思ったら、こちらの記事をみると、makeを使ってビルドできるとのことなので、こちらを参考にして試したことを書いていく。
ソースのダウンロード
まず、以下のリンクから/usr/src/
ディレクトリにwgetなどで任意のバージョンのカーネルのtarballをダウンロードして、展開する。
https://cdn.kernel.org/pub/linux/kernel/
# cd /usr/src/ # wget https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.8.1.tar.gz # tar xf linux-3.8.1.tar.gz
一応、linuxというシンボリックリンクを貼っておくのがいい。カーネルのソースを使うプログラムでは、この場所をカーネルのソースだとしているものもあるためである。
# ln -s linux-3.8.1 linux
コンパイル
# cd linux-3.8.1 # make oldconfig
これで.config
ファイルを生成する。カーネルの設定を変更する際には、manuconfig
コマンドを使用すれば良い。僕の場合はSMAP機能を無効化したかっただけなので、直接.config
ファイルのCONFIG_X86_SMAP=n
に変更した。
カーネル2.6以降はmakeだけでいいようだ。 また、動的にモジュールを組み込むカーネルとしてコンパイルした場合には,ローダブル・モジュールのコンパイルが別途必要になる。
# make # make modules
インストール
# make modules_install # make install
これで、再起動すれば新しいカーネルで起動することができる。
デフォルトで起動するカーネルを変更する
デフォルトで起動するカーネルを変更したい場合は、/boot/grub/grub.cfg
を編集すればよい。
以下の部分を変更する。
# # DO NOT EDIT THIS FILE # # It is automatically generated by grub-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub # ### BEGIN /etc/grub.d/00_header ### if [ -s $prefix/grubenv ]; then set have_grubenv=true load_env fi if [ "${next_entry}" ] ; then set default="${next_entry}" set next_entry= save_env next_entry set boot_once=true else # この行を編集 set default="gnulinux-advanced-66cbee71-3ca7-4246-b214-139f7331adc3>gnulinux-3.18.25-advanced-66cbee71-3ca7-4246-b2\ 14-139f7331adc3" fi ######### # 以下略 # #########
det default=
のところを編集する。
gnulinux-advanced-66cbee71-3ca7-4246-b214-139f7331adc3
は既に記述されていた部分で、末尾に>gnulinux-3.18.25-advanced-66cbee71-3ca7-4246-b214-139f7331adc3
を追記する。
ここの追記する内容は、submenu 'Advanced options for Ubuntu'
ってところに書いてある。
起動したいバージョンのmenuentryから、
menuentry 'Ubuntu, with Linux 3.8.1' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_opt\ ion 'gnulinux-3.8.1-advanced-66cbee71-3ca7-4246-b214-139f7331adc3'
ここの末尾のgnulinux-3.8.1-advanced-66cbee71-3ca7-4246-b214-139f7331adc3
に対応する部分を追記すればいい。
たぶん起動できるはず。
(grubのところは思い出しながら書いてるので、間違ってることとかエラー出たとかあればコメントしてほしい)