宇宙ドーナツ研究会

セキュリティ系お勉強メモ

カーネル再構築メモ

そもそもカーネル再構築ってナニ?

  • カーネルやモジュールを、機能追加や削除するために作り直すこと
    何も考えずに CentOS をイメージからインストールすると、組み込まれていない機能が結構ある。
    それらを後から追加したい時は、カーネル再構築が必要になる。

  • ここで疑問
    CentOSの初回インストール時、追加するコンポーネントを選択する場面がある。
    ここでコンポーネントを全選択することは、OSとカーネルのソースをフルでインストールすることと同じなんだろうか?

再構築の流れ

OSのソースを取ってくる

CentOS であれば、ここから。
http://vault.centos.org
以下は例。

$ rpm -i http://vault.centos.org/7.2.1511/updates/Source/SPackages/kernel-3.10.0-514.6.2.el7.src.rpm

rpmbuild を使う準備をする

適当なディレクトリで、下記を実行。

$ cd ~
$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}     
$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros 

CentOSのソースは、src.rpm という形式で配布されています。
これに含まれるソースコードのビルドに使用するのが、rpmbuild です。
ここでは、rpmbuild を使ってOSのソースをビルドするための準備をしています。
RPMファイルやrpmbuild については、この記事に纏めてあります。

パッチファイルをソースに組み込む

下記を実行します。
が、正直言うと、これが何をやってるのか、よくわからんです。。

$ cd =~/rpmbuild/SPECS
$ rpmbuild -bp --target=`uname -m` kernel.spec

.config ファイルを作る

下記を実行します。

$ cd ~/rpmbuild/BUILD
$ mv .config .config.old
$ cp /boot/config-`uname -r` ./.config
$ make oldconfig
$ make xconfig
  • .configファイルとは
    カーネルに組み込む機能やその他設定について記載したファイルのこと。
    カーネル再構築には、このファイルが必要。

  • make oldconfig とは
    ちょっと機能を追加するだけなのに、カーネル全体の構成を書いて1からビルドするのは非効率。
    make oldconfigを使えば、現在動いているカーネルの機能との差分だけを適用できます。
    なので当然、現在動いているカーネルの.configファイルが必要になります。
    上記コードの2行目で、/boot 配下のconfigファイルを持ってきてるのは、そのためです。

  • make xconfig とは
    .config ファイルに機能や設定の情報を手動で入力するのは面倒。
    そのため、.config ファイルを自動で作成してくれるツールが用意されています。
    そのうちの1つが、make xconfig。
    GUI にて、各種設定ができます。
    ちなみに、自分がやった時は、コマンドライン上からだと、「Xwindow に接続できません」的なエラーが出力され、実行できませんでした。
    ランレベルを5 にして、GUI画面から端末を開いたところ、正常に実行できました。

ビルドする

$ make -j[1-9]

.config の用意ができたところで、ビルドします。
ただのmakeでも良いのですが、環境や追加する機能によっては、時間がクソかかります。
この-j オプションを使うと、CPUコア数に応じて、並列処理をしてくれます。

今回、僕は、仮想マシンにCPUを2つ割り当てていました。
1CPUあたりの論理コアが2つであるため、最大4つまで並列処理ができるはずです。
なので、make -j4 としました。

ビルドしたモジュールを /lib/modules に置く

$ make modules_install

ビルドしたモジュールを、規定の場所に置きます。

ビルドしたカーネルを /boot に置く

$ make install

カーネルや初期RAMディスクなどを、/boot 配下に置いてくれます。

と、カーネル再構築の手順は、こんな感じです。

参考URL

http://d.hatena.ne.jp/jitsu102/20100325/1269461776
<https://wiki.centos.org/HowTos/I_need_the_Kernel_Source#head-a8dae925eec15786df9f6f8c918eff16bf67be0d >