CentOSでカーネルの再構築を行いカーネルモジュールを有効にする方法


投稿日:2014年2月26日
  • 7
  • 1
  • 0



清く正しく、CentOSのカーネルを再構築する方法

kernelmake

前回Clam AntiVirusの設定を行いました。この投稿ではリアルタイムスキャンに必要なカーネルモジュールを有効にします。

カーネルの再構築が必要になるため、多少敷居の高い作業ですが、それほど気負うことはありません。

このページでは初めてカーネルの再構築をする方でも設定できるように、解説を交えながら進めていきます。


目次

カーネルを再構築する方法はさまざまありますが、清く正しく、CentOSのカーネルを再構築する方法ということで「公式のCentOS Wikiの解説」にしたがって進めていきます。

Capability Moduleについて
kernel develのインストール
作業用ディレクトリの作成
rpmbuildコマンドとソースファイルのインストール
ソースファイルの展開とCentOSのパッチを当てる
コードの構成
カーネルのコンパイルとモジュールのインストール
コンパイルしたカーネルのインストールとGRUBの設定


Capability Moduleについて

まずは今回モジュールとして取り込むCapability Module(ケーパビリティ モジュールまたはケイパビリティ モジュール)について解説しておきます。

Capability ModuleはLinux kernel2.6.37以前で使われていたファイルアクセス通知機能です。
ファイルを開くとき、保存するときなど、ファイルに対してなんらかの操作をしたことを通知する機能です。
この機能を利用してウイルスのリアルタイムスキャンをしようというわけです。

すこしややこしいですが、Clam AntiVirusのリアルタイムスキャンはClamukoという機能を使います。
ClamukoDazukoというデバイスドライバが必要で、DazukoにはCapability Moduleが必要、という関係になっています。

カーネルモジュールについて

カーネルはLinuxの中核です。ここに多くの人にとって必要のないドライバを追加すると、無駄にOS自体のサイズが大きくなり、動作も重くなります。またカーネルに機能を追加するには、毎回再構築をする必要があります。

カーネルモジュールは、そうした問題を解決する、必要なときにだけ機能を追加することができる機能拡張のような仕組みです。
モジュール化することで、再構築を行うこと無く機能を追加したり、モジュール単位でアップデートが可能になります。

ところが今回有効にするCapability Moduleを有効にするには、Linuxのカーネルソースからモジュール化する必要があるため、結局カーネルの再構築が必要になります。

カーネルのバージョンに関する注意

Linuxカーネル2.6.37以降のファイルアクセス通知機能はFanotifyという機構に取って代わっています。

そのためClam AntiVirusの最新版である0.98以降はFanotifyを使ってリアルタイムスキャンしています。
0.98以降ではDazukoCapability Moduleを利用したリアルタイムスキャンはできないので注意してください。

前回も触れましたが以上の理由から「64bitのCentOS 5.9でカーネルは2.6.18、Clam AntiVirus 9.7」という組み合わせを想定して解説を進めていきます。

環境の違う場合はコマンド等も変わってくるため、適宜マニュアル等を参照しながら進めてください。

後日追記

上記の環境でCapability Moduleをモジュール化することによる不具合が発生しました。
次回の投稿に内容と対策をまとめたのでご覧ください。

kernel develのインストール

kernel develとはカーネルソースの再構築時に必要なヘッダーファイルなどで構成されたパッケージです。
余談ですが、読み方はdevelopから来ていることを考えると、カーネルディベロでいいんでしょうか?

まずはサーバのカーネルを確認

# uname -r
2.6.18-371.1.2.el5xen

2.6.18」がLinuxのカーネルバージョン、「371.1.2.el5xen」がCentOSのエクストラバージョンを示しています。

el5」はRHEL5を示しており、「xen」は仮想化ソフトウエアのXEN(ゼン)に対応しているという意味です。

続いてCentOSのバージョンも確認

# cat /etc/redhat-release
CentOS release 5.9 (Final)

それではXEN用のkernel develをインストールします。

# yum install kernel-xen-devel
Dependencies Resolved

================================================================================
 Package               Arch        Version                   Repository    Size
================================================================================
Installing:
 kernel-xen-devel      x86_64      2.6.18-371.4.1.el5        updates      5.9 M

Transaction Summary
================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 5.9 M
Is this ok [y/N]: y ←yと入力してエンター。
Downloading Packages:
kernel-xen-devel-2.6.18-371.4.1.el5.x86_64.rpm           | 5.9 MB     00:02
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : kernel-xen-devel                                         1/1

Installed:
  kernel-xen-devel.x86_64 0:2.6.18-371.4.1.el5

Complete!

インストールされたkernel develは「/usr/src/kernels/」に保存されています。

補足:XEN用でない場合

XEN用でない通常のカーネルの場合は以下のコマンドでインストールしてください。

# yum install kernel-devel

補足:Phisical Address Extensionの場合

特殊な例として32bitOSで4GBを超えるメモリを扱うPhisical Address Extensionというバージョンも存在します。

# yum install kernel-PAE-devel

また、今回は利用しませんが、CentOS 6系では「kernel-devel」で統一されています。


作業用ディレクトリの作成

カーネルの再構築をするための作業環境を整えます。

一般ユーザーに変更して、ユーザーのホームディレクトリ上で作業します。

rootユーザーでソースファイルを展開して作業すると、思わぬトラブルが発生する可能性があります。影響を一般ユーザーのホームディレクトリに限定するために、一般ユーザーで作業を行うようにしてください。

rpmパッケージを作成する作業で実際にファイルのインストールを実行してしまうなどの重大なシステム障害をもたらす可能性があります。

一般ユーザーへの変更

# su hoge ←作業をする一般ユーザーの名前を入力してください。

作業に必要なディレクトリを作成

$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

ホームディレクトリにrpmbuildというディレクトリを作り、後に続く大文字のディレクトリを作成ています。

rpmbuildコマンドの環境設定

$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

再構築の際に使われるrpmbuildコマンドはユーザーのホームディレクトリにある「.rpmmacros」を設定ファイルとして参照します。

その設定ファイルに「%_topdir %(echo $HOME)/rpmbuild」と入力することで、「~/rpmbuild」でrpmbuildコマンドを実行できるようになります。

_topdir」とはrpmbuildコマンドに用意されている作業ディレクトリのトップディレクトリを表すマクロ変数です。

これでカーネルをコンパイルする環境が整いました。


rpmbuildコマンドとソースファイルのインストール

まず、rootユーザーに変更してビルドするのに必要なパッケージをインストールします。

# yum install rpm-build redhat-rpm-config unifdef

Transaction Summary
================================================================================
Install       7 Package(s)
Upgrade       4 Package(s)

Total download size: 3.2 M
Is this ok [y/N]: y ←yと入力してエンター。
Downloading Packages:
(1/11): unifdef-1.171-5.fc6.x86_64.rpm                   |  15 kB     00:01
(2/11): redhat-rpm-config-8.0.45-32.el5.centos.noarch.rp |  54 kB     00:01
(3/11): rpm-python-4.4.2.3-34.el5.x86_64.rpm             |  65 kB     00:01
(4/11): popt-1.10.2.3-34.el5.x86_64.rpm                  |  79 kB     00:01
(5/11): xz-libs-4.999.9-0.3.beta.20091007git.el5.x86_64. |  95 kB     00:01
(6/11): xz-4.999.9-0.3.beta.20091007git.el5.x86_64.rpm   | 146 kB     00:01
(7/11): elfutils-libs-0.137-3.el5.x86_64.rpm             | 183 kB     00:02
(8/11): elfutils-0.137-3.el5.x86_64.rpm                  | 215 kB     00:02
(9/11): rpm-build-4.4.2.3-34.el5.x86_64.rpm              | 304 kB     00:04
(10/11): rpm-libs-4.4.2.3-34.el5.x86_64.rpm              | 926 kB     00:09
(11/11): rpm-4.4.2.3-34.el5.x86_64.rpm                   | 1.2 MB     00:10
--------------------------------------------------------------------------------
Total                                            37 kB/s | 3.2 MB     01:30
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Updating       : popt                                                    1/15
  Installing     : elfutils-libs                                           2/15
  Installing     : elfutils                                                3/15
  Installing     : xz-libs                                                 4/15
  Installing     : xz                                                      5/15
  Installing     : unifdef                                                 6/15
  Installing     : redhat-rpm-config                                       7/15
  Updating       : rpm-libs                                                8/15
  Updating       : rpm                                                     9/15
  Updating       : rpm-python                                             10/15
  Installing     : rpm-build                                              11/15
  Cleanup        : rpm-python                                             12/15
  Cleanup        : rpm                                                    13/15
  Cleanup        : popt                                                   14/15
  Cleanup        : rpm-libs                                               15/15

Installed:
  redhat-rpm-config.noarch 0:8.0.45-32.el5.centos
  rpm-build.x86_64 0:4.4.2.3-34.el5
  unifdef.x86_64 0:1.171-5.fc6

Dependency Installed:
  elfutils.x86_64 0:0.137-3.el5
  elfutils-libs.x86_64 0:0.137-3.el5
  xz.x86_64 0:4.999.9-0.3.beta.20091007git.el5
  xz-libs.x86_64 0:4.999.9-0.3.beta.20091007git.el5

Dependency Updated:
  popt.x86_64 0:1.10.2.3-34.el5         rpm.x86_64 0:4.4.2.3-34.el5
  rpm-libs.x86_64 0:4.4.2.3-34.el5      rpm-python.x86_64 0:4.4.2.3-34.el5

Complete!

もし開発環境である「Development Tools」をインストールしていない場合は追加でインストールしておいてください。

# yum groupinstall "Development Tools"

環境によっては100近いパッケージがインストールされるため出力結果は折りたたんでいます。必要な場合は「ソースを表示」をクリックしてください。


(省略)

Dependencies Resolved

================================================================================
 Package                 Arch    Version                         Repository
                                                                           Size
================================================================================
Installing:
 autoconf                noarch  2.59-12                         base     647 k
 automake                noarch  1.9.6-2.3.el5                   base     476 k
 automake14              noarch  1.4p6-13.el5.1                  base     200 k
 automake15              noarch  1.5-16.el5.2                    base     230 k
 automake16              noarch  1.6.3-8.el5.1                   base     241 k
 automake17              noarch  1.7.9-7.el5.2                   base     278 k
 bison                   x86_64  2.3-2.1                         base     549 k
 byacc                   x86_64  1.9-29.2.2                      base      41 k
 cscope                  x86_64  15.5-20.el5                     base     144 k
 ctags                   x86_64  5.6-1.1                         base     131 k
 cvs                     x86_64  1.11.22-11.el5_8.1              base     738 k
 dev86                   x86_64  0.16.17-2.2                     base     398 k
 diffstat                x86_64  1.41-1.2.3.el5                  base      19 k
 dogtail                 noarch  0.6.1-4.el5                     base     172 k
 doxygen                 x86_64  1:1.4.7-2                       base     2.4 M
 flex                    x86_64  2.5.4a-41.fc6                   base     131 k
 gcc-gfortran            x86_64  4.1.2-54.el5                    base     3.5 M
 gdb                     x86_64  7.0.1-45.el5.centos             base     2.4 M
 gettext                 i386    0.17-1.el5                      base     2.4 M
 indent                  x86_64  2.2.9-14.fc6                    base      97 k
 libtool                 x86_64  1.5.22-7.el5_4                  base     667 k
 ltrace                  x86_64  0.5-20.45svn.el5                base      71 k
 oprofile                x86_64  0.9.4-20.el5                    base     2.6 M
 patchutils              x86_64  0.2.31-2.2.2                    base     111 k
 pkgconfig               x86_64  1:0.21-2.el5                    base      61 k
 pstack                  x86_64  1.2-7.2.2                       base     4.5 k
 python-ldap             x86_64  2.2.0-2.1                       base     123 k
 rcs                     x86_64  5.7-30.1                        base     349 k
 splint                  x86_64  3.1.1-16.el5                    base     1.5 M
 strace                  x86_64  4.5.18-18.el5                   base     178 k
 subversion              i386    1.6.11-11.el5_9                 base     3.1 M
 subversion              x86_64  1.6.11-11.el5_9                 base     3.2 M
 swig                    x86_64  1.3.29-2.el5                    base     2.9 M
 systemtap               x86_64  1.8-6.el5                       base      27 k
 texinfo                 x86_64  4.8-14.el5                      base     763 k
 valgrind                i386    1:3.5.0-5.el5                   base      20 M
 valgrind                x86_64  1:3.5.0-5.el5                   base      21 M
Updating:
 binutils                x86_64  2.17.50.0.6-26.el5              base     2.9 M
Installing for dependencies:
 alsa-lib                x86_64  1.0.17-1.el5                    base     414 k
 apr                     i386    1.2.7-11.el5_6.5                base     124 k
 apr-util                i386    1.2.7-11.el5_5.2                base      80 k
 at-spi                  x86_64  1.7.11-3.el5                    base     304 k
 audiofile               x86_64  1:0.2.6-5                       base     107 k
 avahi-glib              x86_64  0.6.16-10.el5_6                 base      15 k
 esound                  x86_64  1:0.2.36-4                      base     131 k
 gail                    x86_64  1.9.2-3.el5_4                   base     352 k
 gnome-keyring           x86_64  0.6.0-1.fc6                     base     166 k
 gnome-mime-data         x86_64  2.4.2-3.1                       base     691 k
 gnome-mount             x86_64  0.5-3.el5                       base      70 k
 gnome-python2           x86_64  2.16.0-1.fc6                    base     130 k
 gnome-python2-bonobo    x86_64  2.16.0-1.fc6                    base      71 k
 gnome-python2-gconf     x86_64  2.16.0-1.fc6                    base      34 k
 gnome-python2-gnomevfs  x86_64  2.16.0-1.fc6                    base      69 k
 gnome-vfs2              x86_64  2.16.2-12.el5_9                 base     1.3 M
 imake                   x86_64  1.0.2-3                         base     319 k
 libXTrap                x86_64  1.0.0-3.1                       base      23 k
 libXevie                x86_64  1.0.1-3.1                       base      14 k
 libXfontcache           x86_64  1.0.2-3.1                       base     9.7 k
 libXtst                 x86_64  1.0.1-3.1                       base      16 k
 libXxf86misc            x86_64  1.0.1-3.1                       base      12 k
 libart_lgpl             x86_64  2.3.17-4                        base      75 k
 libbonobo               x86_64  2.16.0-1.1.el5_5.1              base     524 k
 libbonoboui             x86_64  2.16.0-1.fc6                    base     394 k
 libgfortran             x86_64  4.1.2-54.el5                    base     245 k
 libglade2               x86_64  2.6.0-2                         base      96 k
 libgnome                x86_64  2.16.0-6.el5                    base     860 k
 libgnomecanvas          x86_64  2.14.0-4.1                      base     224 k
 libgnomeui              x86_64  2.16.0-5.el5                    base     984 k
 libgomp                 i386    4.4.7-1.el5                     base      74 k
 libxslt                 x86_64  1.1.17-4.el5_8.3                base     424 k
 neon                    i386    0.25.5-10.el5_4.1               base     101 k
 neon                    x86_64  0.25.5-10.el5_4.1               base     100 k
 perl-URI                noarch  1.35-3                          base     116 k
 postgresql-libs         i386    8.1.23-6.el5_8                  base     197 k
 pycairo                 x86_64  1.2.0-1.1                       base      28 k
 pygtk2                  x86_64  2.10.1-12.el5                   base     1.2 M
 pygtk2-libglade         x86_64  2.10.1-12.el5                   base      19 k
 pyorbit                 x86_64  2.14.1-3.el5                    base      50 k
 pyspi                   x86_64  0.6.1-1.el5                     base      98 k
 python-numeric          x86_64  23.7-2.2.2.el5_6.1              base     801 k
 shared-mime-info        x86_64  0.19-5.el5                      base     149 k
 systemtap-client        x86_64  1.8-6.el5                       base     2.3 M
 systemtap-devel         x86_64  1.8-6.el5                       base     2.0 M
 systemtap-runtime       x86_64  1.8-6.el5                       base     227 k
 xorg-x11-fonts-base     noarch  7.1-2.1.el5                     base     3.7 M
 xorg-x11-server-Xvfb    x86_64  1.1.1-48.101.0.1.el5.centos.2   updates  1.6 M
 xorg-x11-server-utils   x86_64  7.1-5.el5_6.2                   base     172 k
 xorg-x11-xauth          x86_64  1:1.0.1-2.1                     base      32 k
 xorg-x11-xinit          x86_64  1.0.2-15.el5                    base      26 k

Transaction Summary
================================================================================
Install      88 Package(s)
Upgrade       1 Package(s)

Total download size: 95 M
Is this ok [y/N]: y ←yと入力してエンター。
Downloading Packages:
(1/89): pstack-1.2-7.2.2.x86_64.rpm                      | 4.5 kB     00:00
(2/89): libXfontcache-1.0.2-3.1.x86_64.rpm               | 9.7 kB     00:00
(3/89): libXxf86misc-1.0.1-3.1.x86_64.rpm                |  12 kB     00:00
(4/89): libXevie-1.0.1-3.1.x86_64.rpm                    |  14 kB     00:00
(5/89): avahi-glib-0.6.16-10.el5_6.x86_64.rpm            |  15 kB     00:00
(6/89): libXtst-1.0.1-3.1.x86_64.rpm                     |  16 kB     00:00
(7/89): diffstat-1.41-1.2.3.el5.x86_64.rpm               |  19 kB     00:00
(8/89): pygtk2-libglade-2.10.1-12.el5.x86_64.rpm         |  19 kB     00:00
(9/89): libXTrap-1.0.0-3.1.x86_64.rpm                    |  23 kB     00:00
(10/89): xorg-x11-xinit-1.0.2-15.el5.x86_64.rpm          |  26 kB     00:00
(11/89): systemtap-1.8-6.el5.x86_64.rpm                  |  27 kB     00:00
(12/89): pycairo-1.2.0-1.1.x86_64.rpm                    |  28 kB     00:00
(13/89): xorg-x11-xauth-1.0.1-2.1.x86_64.rpm             |  32 kB     00:00
(14/89): gnome-python2-gconf-2.16.0-1.fc6.x86_64.rpm     |  34 kB     00:00
(15/89): byacc-1.9-29.2.2.x86_64.rpm                     |  41 kB     00:00
(16/89): pyorbit-2.14.1-3.el5.x86_64.rpm                 |  50 kB     00:00
(17/89): pkgconfig-0.21-2.el5.x86_64.rpm                 |  61 kB     00:00
(18/89): gnome-python2-gnomevfs-2.16.0-1.fc6.x86_64.rpm  |  69 kB     00:00
(19/89): gnome-mount-0.5-3.el5.x86_64.rpm                |  70 kB     00:00
(20/89): gnome-python2-bonobo-2.16.0-1.fc6.x86_64.rpm    |  71 kB     00:00
(21/89): ltrace-0.5-20.45svn.el5.x86_64.rpm              |  71 kB     00:00
(22/89): libgomp-4.4.7-1.el5.i386.rpm                    |  74 kB     00:00
(23/89): libart_lgpl-2.3.17-4.x86_64.rpm                 |  75 kB     00:00
(24/89): apr-util-1.2.7-11.el5_5.2.i386.rpm              |  80 kB     00:00
(25/89): libglade2-2.6.0-2.x86_64.rpm                    |  96 kB     00:00
(26/89): indent-2.2.9-14.fc6.x86_64.rpm                  |  97 kB     00:00
(27/89): pyspi-0.6.1-1.el5.x86_64.rpm                    |  98 kB     00:00
(28/89): neon-0.25.5-10.el5_4.1.x86_64.rpm               | 100 kB     00:00
(29/89): neon-0.25.5-10.el5_4.1.i386.rpm                 | 101 kB     00:00
(30/89): audiofile-0.2.6-5.x86_64.rpm                    | 107 kB     00:00
(31/89): patchutils-0.2.31-2.2.2.x86_64.rpm              | 111 kB     00:00
(32/89): perl-URI-1.35-3.noarch.rpm                      | 116 kB     00:00
(33/89): python-ldap-2.2.0-2.1.x86_64.rpm                | 123 kB     00:00
(34/89): apr-1.2.7-11.el5_6.5.i386.rpm                   | 124 kB     00:00
(35/89): gnome-python2-2.16.0-1.fc6.x86_64.rpm           | 130 kB     00:00
(36/89): flex-2.5.4a-41.fc6.x86_64.rpm                   | 131 kB     00:00
(37/89): esound-0.2.36-4.x86_64.rpm                      | 131 kB     00:00
(38/89): ctags-5.6-1.1.x86_64.rpm                        | 131 kB     00:00
(39/89): cscope-15.5-20.el5.x86_64.rpm                   | 144 kB     00:00
(40/89): shared-mime-info-0.19-5.el5.x86_64.rpm          | 149 kB     00:00
(41/89): gnome-keyring-0.6.0-1.fc6.x86_64.rpm            | 166 kB     00:00
(42/89): xorg-x11-server-utils-7.1-5.el5_6.2.x86_64.rpm  | 172 kB     00:00
(43/89): dogtail-0.6.1-4.el5.noarch.rpm                  | 172 kB     00:00
(44/89): strace-4.5.18-18.el5.x86_64.rpm                 | 178 kB     00:00
(45/89): postgresql-libs-8.1.23-6.el5_8.i386.rpm         | 197 kB     00:00
(46/89): automake14-1.4p6-13.el5.1.noarch.rpm            | 200 kB     00:00
(47/89): libgnomecanvas-2.14.0-4.1.x86_64.rpm            | 224 kB     00:00
(48/89): systemtap-runtime-1.8-6.el5.x86_64.rpm          | 227 kB     00:00
(49/89): automake15-1.5-16.el5.2.noarch.rpm              | 230 kB     00:00
(50/89): automake16-1.6.3-8.el5.1.noarch.rpm             | 241 kB     00:00
(51/89): libgfortran-4.1.2-54.el5.x86_64.rpm             | 245 kB     00:00
(52/89): automake17-1.7.9-7.el5.2.noarch.rpm             | 278 kB     00:00
(53/89): at-spi-1.7.11-3.el5.x86_64.rpm                  | 304 kB     00:00
(54/89): imake-1.0.2-3.x86_64.rpm                        | 319 kB     00:00
(55/89): rcs-5.7-30.1.x86_64.rpm                         | 349 kB     00:00
(56/89): gail-1.9.2-3.el5_4.x86_64.rpm                   | 352 kB     00:00
(57/89): libbonoboui-2.16.0-1.fc6.x86_64.rpm             | 394 kB     00:00
(58/89): dev86-0.16.17-2.2.x86_64.rpm                    | 398 kB     00:00
(59/89): alsa-lib-1.0.17-1.el5.x86_64.rpm                | 414 kB     00:00
(60/89): libxslt-1.1.17-4.el5_8.3.x86_64.rpm             | 424 kB     00:00
(61/89): automake-1.9.6-2.3.el5.noarch.rpm               | 476 kB     00:00
(62/89): libbonobo-2.16.0-1.1.el5_5.1.x86_64.rpm         | 524 kB     00:00
(63/89): bison-2.3-2.1.x86_64.rpm                        | 549 kB     00:00
(64/89): autoconf-2.59-12.noarch.rpm                     | 647 kB     00:00
(65/89): libtool-1.5.22-7.el5_4.x86_64.rpm               | 667 kB     00:00
(66/89): gnome-mime-data-2.4.2-3.1.x86_64.rpm            | 691 kB     00:00
(67/89): cvs-1.11.22-11.el5_8.1.x86_64.rpm               | 738 kB     00:00
(68/89): texinfo-4.8-14.el5.x86_64.rpm                   | 763 kB     00:00
(69/89): python-numeric-23.7-2.2.2.el5_6.1.x86_64.rpm    | 801 kB     00:00
(70/89): libgnome-2.16.0-6.el5.x86_64.rpm                | 860 kB     00:00
(71/89): libgnomeui-2.16.0-5.el5.x86_64.rpm              | 984 kB     00:00
(72/89): pygtk2-2.10.1-12.el5.x86_64.rpm                 | 1.2 MB     00:00
(73/89): gnome-vfs2-2.16.2-12.el5_9.x86_64.rpm           | 1.3 MB     00:00
(74/89): splint-3.1.1-16.el5.x86_64.rpm                  | 1.5 MB     00:00
(75/89): xorg-x11-server-Xvfb-1.1.1-48.101.0.1.el5.cento | 1.6 MB     00:00
(76/89): systemtap-devel-1.8-6.el5.x86_64.rpm            | 2.0 MB     00:00
(77/89): systemtap-client-1.8-6.el5.x86_64.rpm           | 2.3 MB     00:01
(78/89): gdb-7.0.1-45.el5.centos.x86_64.rpm              | 2.4 MB     00:01
(79/89): doxygen-1.4.7-2.x86_64.rpm                      | 2.4 MB     00:01
(80/89): gettext-0.17-1.el5.i386.rpm                     | 2.4 MB     00:01
(81/89): oprofile-0.9.4-20.el5.x86_64.rpm                | 2.6 MB     00:01
(82/89): swig-1.3.29-2.el5.x86_64.rpm                    | 2.9 MB     00:01
(83/89): binutils-2.17.50.0.6-26.el5.x86_64.rpm          | 2.9 MB     00:01
(84/89): subversion-1.6.11-11.el5_9.i386.rpm             | 3.1 MB     00:01
(85/89): subversion-1.6.11-11.el5_9.x86_64.rpm           | 3.2 MB     00:01
(86/89): gcc-gfortran-4.1.2-54.el5.x86_64.rpm            | 3.5 MB     00:01
(87/89): xorg-x11-fonts-base-7.1-2.1.el5.noarch.rpm      | 3.7 MB     00:01
(88/89): valgrind-3.5.0-5.el5.i386.rpm                   |  20 MB     00:09
(89/89): valgrind-3.5.0-5.el5.x86_64.rpm                 |  21 MB     00:09
--------------------------------------------------------------------------------
Total                                           1.7 MB/s |  95 MB     00:54
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : libbonobo                                               1/90
  Installing     : libart_lgpl                                             2/90
  Installing     : libglade2                                               3/90
  Installing     : libgnomecanvas                                          4/90
  Installing     : gnome-keyring                                           5/90
  Installing     : audiofile                                               6/90
  Installing     : neon                                                    7/90
  Installing     : apr                                                     8/90
  Installing     : gail                                                    9/90
  Installing     : libXfontcache                                          10/90
  Installing     : libxslt                                                11/90
  Installing     : libXxf86misc                                           12/90
  Installing     : xorg-x11-xauth                                         13/90
  Installing     : imake                                                  14/90
  Installing     : gdb                                                    15/90
  Installing     : python-numeric                                         16/90
  Installing     : pyorbit                                                17/90
  Installing     : libXevie                                               18/90
  Installing     : avahi-glib                                             19/90
  Installing     : shared-mime-info                                       20/90
  Installing     : libXtst                                                21/90
  Installing     : at-spi                                                 22/90
  Installing     : pyspi                                                  23/90
  Installing     : alsa-lib                                               24/90
  Installing     : esound                                                 25/90
  Updating       : binutils                                               26/90
  Installing     : libgfortran                                            27/90
  Installing     : libXTrap                                               28/90
  Installing     : xorg-x11-server-utils                                  29/90
  Installing     : xorg-x11-xinit                                         30/90
  Installing     : pycairo                                                31/90
  Installing     : pygtk2                                                 32/90
  Installing     : pygtk2-libglade                                        33/90
  Installing     : postgresql-libs                                        34/90
  Installing     : apr-util                                               35/90
  Installing     : neon                                                   36/90
  Installing     : libgomp                                                37/90
  Installing     : gcc-gfortran                                           38/90
  Installing     : oprofile                                               39/90
  Installing     : splint                                                 40/90
  Installing     : ctags                                                  41/90
  Installing     : ltrace                                                 42/90
  Installing     : pkgconfig                                              43/90
  Installing     : patchutils                                             44/90
  Installing     : strace                                                 45/90
  Installing     : valgrind                                               46/90
  Installing     : doxygen                                                47/90
  Installing     : cvs                                                    48/90
  Installing     : texinfo                                                49/90
  Installing     : python-ldap                                            50/90
  Installing     : flex                                                   51/90
  Installing     : cscope                                                 52/90
  Installing     : bison                                                  53/90
  Installing     : rcs                                                    54/90
  Installing     : byacc                                                  55/90
  Installing     : dev86                                                  56/90
  Installing     : indent                                                 57/90
  Installing     : diffstat                                               58/90
  Installing     : swig                                                   59/90
  Installing     : autoconf                                               60/90
  Installing     : perl-URI                                               61/90
  Installing     : automake                                               62/90
  Installing     : xorg-x11-fonts-base                                    63/90
  Installing     : xorg-x11-server-Xvfb                                   64/90
  Installing     : systemtap-devel                                        65/90
  Installing     : systemtap-runtime                                      66/90
  Installing     : systemtap-client                                       67/90
  Installing     : gnome-mime-data                                        68/90
  Installing     : subversion                                             69/90
  Installing     : systemtap                                              70/90
  Installing     : libtool                                                71/90
  Installing     : automake17                                             72/90
  Installing     : pstack                                                 73/90
  Installing     : automake15                                             74/90
  Installing     : automake14                                             75/90
  Installing     : automake16                                             76/90
  Installing     : subversion                                             77/90
  Installing     : gettext                                                78/90
  Installing     : valgrind                                               79/90
  Installing     : gnome-vfs2                                             80/90
  Installing     : libgnome                                               81/90
  Installing     : libbonoboui                                            82/90
  Installing     : libgnomeui                                             83/90
  Installing     : gnome-mount                                            84/90
  Installing     : gnome-python2-bonobo                                   85/90
  Installing     : gnome-python2                                          86/90
  Installing     : gnome-python2-gconf                                    87/90
  Installing     : dogtail                                                88/90
  Installing     : gnome-python2-gnomevfs                                 89/90
  Cleanup        : binutils                                               90/90

Installed:
  autoconf.noarch 0:2.59-12              automake.noarch 0:1.9.6-2.3.el5
  automake14.noarch 0:1.4p6-13.el5.1     automake15.noarch 0:1.5-16.el5.2
  automake16.noarch 0:1.6.3-8.el5.1      automake17.noarch 0:1.7.9-7.el5.2
  bison.x86_64 0:2.3-2.1                 byacc.x86_64 0:1.9-29.2.2
  cscope.x86_64 0:15.5-20.el5            ctags.x86_64 0:5.6-1.1
  cvs.x86_64 0:1.11.22-11.el5_8.1        dev86.x86_64 0:0.16.17-2.2
  diffstat.x86_64 0:1.41-1.2.3.el5       dogtail.noarch 0:0.6.1-4.el5
  doxygen.x86_64 1:1.4.7-2               flex.x86_64 0:2.5.4a-41.fc6
  gcc-gfortran.x86_64 0:4.1.2-54.el5     gdb.x86_64 0:7.0.1-45.el5.centos
  gettext.i386 0:0.17-1.el5              indent.x86_64 0:2.2.9-14.fc6
  libtool.x86_64 0:1.5.22-7.el5_4        ltrace.x86_64 0:0.5-20.45svn.el5
  oprofile.x86_64 0:0.9.4-20.el5         patchutils.x86_64 0:0.2.31-2.2.2
  pkgconfig.x86_64 1:0.21-2.el5          pstack.x86_64 0:1.2-7.2.2
  python-ldap.x86_64 0:2.2.0-2.1         rcs.x86_64 0:5.7-30.1
  splint.x86_64 0:3.1.1-16.el5           strace.x86_64 0:4.5.18-18.el5
  subversion.i386 0:1.6.11-11.el5_9      subversion.x86_64 0:1.6.11-11.el5_9
  swig.x86_64 0:1.3.29-2.el5             systemtap.x86_64 0:1.8-6.el5
  texinfo.x86_64 0:4.8-14.el5            valgrind.i386 1:3.5.0-5.el5
  valgrind.x86_64 1:3.5.0-5.el5

Dependency Installed:
  alsa-lib.x86_64 0:1.0.17-1.el5
  apr.i386 0:1.2.7-11.el5_6.5
  apr-util.i386 0:1.2.7-11.el5_5.2
  at-spi.x86_64 0:1.7.11-3.el5
  audiofile.x86_64 1:0.2.6-5
  avahi-glib.x86_64 0:0.6.16-10.el5_6
  esound.x86_64 1:0.2.36-4
  gail.x86_64 0:1.9.2-3.el5_4
  gnome-keyring.x86_64 0:0.6.0-1.fc6
  gnome-mime-data.x86_64 0:2.4.2-3.1
  gnome-mount.x86_64 0:0.5-3.el5
  gnome-python2.x86_64 0:2.16.0-1.fc6
  gnome-python2-bonobo.x86_64 0:2.16.0-1.fc6
  gnome-python2-gconf.x86_64 0:2.16.0-1.fc6
  gnome-python2-gnomevfs.x86_64 0:2.16.0-1.fc6
  gnome-vfs2.x86_64 0:2.16.2-12.el5_9
  imake.x86_64 0:1.0.2-3
  libXTrap.x86_64 0:1.0.0-3.1
  libXevie.x86_64 0:1.0.1-3.1
  libXfontcache.x86_64 0:1.0.2-3.1
  libXtst.x86_64 0:1.0.1-3.1
  libXxf86misc.x86_64 0:1.0.1-3.1
  libart_lgpl.x86_64 0:2.3.17-4
  libbonobo.x86_64 0:2.16.0-1.1.el5_5.1
  libbonoboui.x86_64 0:2.16.0-1.fc6
  libgfortran.x86_64 0:4.1.2-54.el5
  libglade2.x86_64 0:2.6.0-2
  libgnome.x86_64 0:2.16.0-6.el5
  libgnomecanvas.x86_64 0:2.14.0-4.1
  libgnomeui.x86_64 0:2.16.0-5.el5
  libgomp.i386 0:4.4.7-1.el5
  libxslt.x86_64 0:1.1.17-4.el5_8.3
  neon.i386 0:0.25.5-10.el5_4.1
  neon.x86_64 0:0.25.5-10.el5_4.1
  perl-URI.noarch 0:1.35-3
  postgresql-libs.i386 0:8.1.23-6.el5_8
  pycairo.x86_64 0:1.2.0-1.1
  pygtk2.x86_64 0:2.10.1-12.el5
  pygtk2-libglade.x86_64 0:2.10.1-12.el5
  pyorbit.x86_64 0:2.14.1-3.el5
  pyspi.x86_64 0:0.6.1-1.el5
  python-numeric.x86_64 0:23.7-2.2.2.el5_6.1
  shared-mime-info.x86_64 0:0.19-5.el5
  systemtap-client.x86_64 0:1.8-6.el5
  systemtap-devel.x86_64 0:1.8-6.el5
  systemtap-runtime.x86_64 0:1.8-6.el5
  xorg-x11-fonts-base.noarch 0:7.1-2.1.el5
  xorg-x11-server-Xvfb.x86_64 0:1.1.1-48.101.0.1.el5.centos.2
  xorg-x11-server-utils.x86_64 0:7.1-5.el5_6.2
  xorg-x11-xauth.x86_64 1:1.0.1-2.1
  xorg-x11-xinit.x86_64 0:1.0.2-15.el5

Updated:
  binutils.x86_64 0:2.17.50.0.6-26.el5

Complete!

続いて「先ほど作業ディレクトリを作成した一般ユーザーに戻り」実際にカーネルのソースをダウンロードして展開します。
CentOS 5系の場合はダウンロードするカーネルのソースは「http://vault.centos.org/N/updates/SRPMS/」からダウンロードできます。「N」の部分にダウンロードしたいCentOSのバージョンを入力してください。

CentOS 5.10の例

http://vault.centos.org/5.10/updates/SRPMS/

カーネルソースのダウンロードと展開

$ rpm -i http://vault.centos.org/5.10/updates/SRPMS/kernel-2.6.18-371.4.1.el5.src.rpm 2>&1 | grep -v mock

2>&1」は標準エラー出力を標準出力にしています。つまり標準出力も標準エラーもコンソールに表示するという意味です。
そのあとに「|(パイプ)」で「grep -v mock」と続くのでmockという文字列の含まれない行が表示されます。

ConeOS 5.10で65Mあるので多少時間がかかります。
ダウンロードされたファイルは「SOURCES」や「SPECS」といったディレクトリにインストールされます。


ソースファイルの展開とCentOSのパッチを当てる

ディレクトリを移動して「kernel.spec」ファイルを使ってカーネルソースにパッチを当てます。

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

以下パッチを当てた際の表示。必要なら「ソースを表示」をクリックしてください。

ビルド対象プラットフォーム: x86_64
ターゲット x86_64 用にビルド中
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.6383
+ umask 022
+ cd /home/hoge/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ '[' '!' -d kernel-2.6.18/vanilla-2.6.18.4 ']'
+ rm -f pax_global_header
+ cd /home/hoge/rpmbuild/BUILD
+ rm -rf kernel-2.6.18
+ /bin/mkdir -p kernel-2.6.18
+ cd kernel-2.6.18
+ /usr/bin/bzip2 -dc /home/hoge/rpmbuild/SOURCES/linux-2.6.18.4.tar.bz2
+ tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
++ /usr/bin/id -u
+ '[' 506 = 0 ']'
++ /usr/bin/id -u
+ '[' 506 = 0 ']'
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ mv linux-2.6.18.4 vanilla-2.6.18.4
+ cp -rl vanilla-2.6.18.4 linux-2.6.18-371.4.1.el5.x86_64
+ cd linux-2.6.18-371.4.1.el5.x86_64
+ echo 'Patch #1 (kernel-2.6.18-redhat.patch):'
Patch #1 (kernel-2.6.18-redhat.patch):
+ patch -p1 --fuzz=2 -E -s
+ cp /home/hoge/rpmbuild/SOURCES/COPYING.modules Documentation/
+ mkdir configs
+ for cfg in 'kernel-2.6.18-x86_64*.config'
+ cp -f /home/hoge/rpmbuild/SOURCES/kernel-2.6.18-x86_64-debug.config /home/hoge/rpmbuild/SOURCES/kernel-2.6.18-x86_64-xen.config /home/hoge/rpmbuild/SOURCES/kernel-2.6.18-x86_64.config .
+ for i in 'kernel-2.6.18-x86_64*.config'
+ mv kernel-2.6.18-x86_64-debug.config kernel-2.6.18-x86_64-debug.config.tmp
+ /home/hoge/rpmbuild/SOURCES/merge.pl /home/hoge/rpmbuild/SOURCES/config-rhel-generic kernel-2.6.18-x86_64-debug.config.tmp
+ rm kernel-2.6.18-x86_64-debug.config.tmp
+ for i in 'kernel-2.6.18-x86_64*.config'
+ mv kernel-2.6.18-x86_64-xen.config kernel-2.6.18-x86_64-xen.config.tmp
+ /home/hoge/rpmbuild/SOURCES/merge.pl /home/hoge/rpmbuild/SOURCES/config-rhel-generic kernel-2.6.18-x86_64-xen.config.tmp
+ rm kernel-2.6.18-x86_64-xen.config.tmp
+ for i in 'kernel-2.6.18-x86_64*.config'
+ mv kernel-2.6.18-x86_64.config kernel-2.6.18-x86_64.config.tmp
+ /home/hoge/rpmbuild/SOURCES/merge.pl /home/hoge/rpmbuild/SOURCES/config-rhel-generic kernel-2.6.18-x86_64.config.tmp
+ rm kernel-2.6.18-x86_64.config.tmp
+ for i in 'kernel-2.6.18-x86_64*.config'
+ mv kernel-2.6.18-x86_64-debug.config kernel-2.6.18-x86_64-debug.config.tmp
+ /home/hoge/rpmbuild/SOURCES/merge.pl /home/hoge/rpmbuild/SOURCES/config-rhel-x86_64-generic kernel-2.6.18-x86_64-debug.config.tmp
+ rm kernel-2.6.18-x86_64-debug.config.tmp
+ for i in 'kernel-2.6.18-x86_64*.config'
+ mv kernel-2.6.18-x86_64-xen.config kernel-2.6.18-x86_64-xen.config.tmp
+ /home/hoge/rpmbuild/SOURCES/merge.pl /home/hoge/rpmbuild/SOURCES/config-rhel-x86_64-generic kernel-2.6.18-x86_64-xen.config.tmp
+ rm kernel-2.6.18-x86_64-xen.config.tmp
+ for i in 'kernel-2.6.18-x86_64*.config'
+ mv kernel-2.6.18-x86_64.config kernel-2.6.18-x86_64.config.tmp
+ /home/hoge/rpmbuild/SOURCES/merge.pl /home/hoge/rpmbuild/SOURCES/config-rhel-x86_64-generic kernel-2.6.18-x86_64.config.tmp
+ rm kernel-2.6.18-x86_64.config.tmp
+ rm -f kernel-2.6.18-i686-kdump.config kernel-2.6.18-x86_64-kdump.config
+ rm -f kernel-2.6.18-i586.config
+ for i in '*.config'
+ mv kernel-2.6.18-x86_64-debug.config .config
++ head -1 .config
++ cut -b 3-
+ Arch=x86_64
+ make ARCH=x86_64 nonint_oldconfig
.config:106:warning: trying to assign nonexistent symbol INFINIBAND_QIB
.config:3129:warning: trying to assign nonexistent symbol NFS_FSCACHE
.config:3166:warning: trying to reassign symbol EDAC_DEBUG
+ echo '# x86_64'
+ cat .config
+ for i in '*.config'
+ mv kernel-2.6.18-x86_64-xen.config .config
++ head -1 .config
++ cut -b 3-
+ Arch=x86_64
+ make ARCH=x86_64 nonint_oldconfig
.config:106:warning: trying to assign nonexistent symbol INFINIBAND_QIB
.config:3129:warning: trying to assign nonexistent symbol NFS_FSCACHE
+ echo '# x86_64'
+ cat .config
+ for i in '*.config'
+ mv kernel-2.6.18-x86_64.config .config
++ head -1 .config
++ cut -b 3-
+ Arch=x86_64
+ make ARCH=x86_64 nonint_oldconfig
.config:106:warning: trying to assign nonexistent symbol INFINIBAND_QIB
.config:3129:warning: trying to assign nonexistent symbol NFS_FSCACHE
+ echo '# x86_64'
+ cat .config
+ cd ..
+ '[' -d deleteme ']'
+ find . '(' -name '*.orig' -o -name '*~' ')' -exec rm -f '{}' ';'
+ cp /home/hoge/rpmbuild/SOURCES/Config.mk .
+ '[' -d xen ']'
+ cd /home/hoge/rpmbuild/BUILD
+ cd kernel-2.6.18
+ /bin/gzip -dc /home/hoge/rpmbuild/SOURCES/xen-15502.tar.bz2
+ tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
++ /usr/bin/id -u
+ '[' 506 = 0 ']'
++ /usr/bin/id -u
+ '[' 506 = 0 ']'
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ cd config
+ echo 'Patch #2 (xen-config-2.6.18-redhat.patch):'
Patch #2 (xen-config-2.6.18-redhat.patch):
+ patch -p1 --fuzz=2 -s
+ cd ..
+ cd xen
+ echo 'Patch #3 (xen-2.6.18-redhat.patch):'
Patch #3 (xen-2.6.18-redhat.patch):
+ patch -p1 --fuzz=2 -E -s
+ cd ..
+ exit 0

rpmbuildコマンドの「-bp」オプションはソースを展開しパッチを適用することを意味します。「–target=」は通常PLATFORMを指定します。
こちらで入力しなくても「uname -m」というコマンドが指定されているので自動で入力されます。私の環境ではXeonなので「x86_64」でした。

rpmbuildコマンドについてさらに詳しく知りたい方は「コチラのサイト」へ。

以上の作業で「~/rpmbuild/BUILD/kernel*/linux*/」にカーネルがコンパイルできる状態で展開されました。「*」はバージョンによって異なります。

今回の例では「~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18-371.4.1.el5.x86_64」になります。このソースを使ってカーネルのコンパイル作業を進めていきます。


コードの構成

ここからは一般的なカーネルの再構築作業です。
まずは「コードの構成」という作業を行います。コードの構成は以下のコマンドで行います。

make menuconfig テキストベースの構成ツール。通常コンソールで作業する場合はこのツールを使う。操作が独特で慣れるまで作業がもたつく。
make xconfig X Window(Qt)ベースの構成ツール。マウスで操作できるので選択が楽。カーネル2.6以降。
make gconfig X Window(Gtk)ベースの構成ツール。xconfigと似ている。
make oldconfig 古いカーネル(現在使用中のカーネルなど)から「.config」を取り出して、新しいカーネルで使用するオプションを比較。過去のカーネルの設定を基本的に引き継ぐことができるのでアップデート時に便利。
異なる部分を質問形式で設定するため、変更点が多いメジャーアップデート時は現実的ではない。

今回はカーネルのバージョンは同じで、エクストラバージョンだけ違うだけなので「make oldconfig」を使って作業します。

インスールしたソースファイルのディレクトリに移動

$ cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18-371.4.1.el5.x86_64

現在のカーネルの設定ファイルをコピー

$ cp /boot/config-2.6.18-371.1.2.el5xen .config

カーネルのアップデートを行っている場合は「/boot」に幾つかファイルがあると思いますが「uname -r」で表示されたバージョンのものをコピーしてください。

元々作業ディレクトリにあった「.config」は「.config.old」というファイルに置き換えられます。

make oldconfig」で構成を引き継ぎます。

$ make oldconfig

このままだとアップデートしただけなので「make menuconfig」で構成を変更します。

$ make menuconfig

以下のエラーが出る場合は「ncurses」と「ncurses-devel」をインストールしてください。

(省略)
make[2]: *** [scripts/kconfig/lxdialog/checklist.o] エラー 1
make[1]: *** [menuconfig] エラー 2
make: *** [menuconfig] エラー 2

root権限でncursesncurses-develをインストール。ncurses-develにはi386用とx86_64用があるのでアーキテクチャを指定してインストールします。

# yum install ncurses ncurses-devel.x86_64

Dependencies Resolved

================================================================================
 Package              Arch          Version                   Repository   Size
================================================================================
Installing:
 ncurses-devel        x86_64        5.5-24.20060715           base        1.7 M

Transaction Summary
================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 1.7 M
Is this ok [y/N]: y ←yと入力してエンター。
Downloading Packages:
ncurses-devel-5.5-24.20060715.x86_64.rpm                 | 1.7 MB     00:23
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : ncurses-devel                                            1/1

Installed:
  ncurses-devel.x86_64 0:5.5-24.20060715

Complete!

必要なパッケージをインストールした状態で「make menuconfig」を打つとコンソールが以下の様な表示に変わります。

kernelmake01

Security optionsの項目に進む

目指すSecurity optionsは下から5番目あたりにあります。キーボードの下矢印で移動したら、エンターキーを押して進みます。

kernelmake02

Defoult Linux Capabilitiesを有効に

Defoult Linux Capabilitiesの項目を選択して、画面上部にある解説にあるように「M」と入力します。
ちなみに「Y」はカーネルへの組み込み、「N」は削除、「M」はモジュールとして取り込むという指定です。

Defoult Linux Capabilitiesの項目が「M」となっていることを確認したら、キーボードの右矢印を押して「Exit」を選択、エンターSecurity optionsを抜けます。

追記

上の追記でも書きましたが、この設定だとBINDが起動しない不具合が発生します。対策として「M」ではなく「Y」にしました。
詳しくは「次回の投稿」をご覧ください。
kernelmake03

設定を抜けます

再びLinux Kernel Configurationの画面になると思うので、同じように右矢印を押して「Exit」を選択、エンターで抜けます。

kernelmake04

構成ツールを抜けます

するとDo you wish to save your new kernel configuration?と出るので、変更した設定を保存するべく「Yes」を選択してエンター。

kernelmake05

以上で構成ツールでの作業は終了です。
試しに設定が正しく「.config」ファイルに書き出されたか確認してみます。

$ vi .config
(省略)
#
# Security options
#
CONFIG_KEYS=y
CONFIG_KEYS_DEBUG_PROC_KEYS=y
# CONFIG_SECURITY_DMESG_RESTRICT is not set
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_NETWORK_XFRM=y
CONFIG_SECURITY_CAPABILITIES=m
(省略)

3092行目あたり、「CONFIG_SECURITY_CAPABILITIES=m」となり、モジュールとして取り込む設定になりました。


カーネルのコンパイルとモジュールのインストール

コンパイルを行う前に、インストールするカーネルのエクストラバージョンを指定します。
デフォルトだと「2.6.18-prep」となってバージョンを把握しにくいので、CentOSの仕様に合わせて、「2.6.18-371.4.1.el5xen」となるように編集します。

カーネルのソースディレクトリにある「Makefile」の4行目EXTRAVERSION」の項目を編集します。

# vi /home/<user name>/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18-371.4.1.el5.x86_64/Makefile

<user name>の部分は一般ユーザーの名前に置き換えてください。

EXTRAVERSION = -prep
↓
EXTRAVERSION = -371.4.1.el5xen

ここまできたら後はコンパイルを行うだけです。
カーネル2.6以降のコードのコンパイル以下のように簡略化されています。

カーネルのコンパイル

$ make

構成ツールで選択したカーネルとモジュールのコンパイル(環境にもよりますがかなり時間がかかるので注意してください。私のVPSでは30分程度かかりました)

コンパイル時のオプション

コンパイル時に「-j <num>」と指定すると、マルチスレッドで処理し、高速化することができます。最適な並行処理数は諸説ありますがCPUの数+1程度が良いとされています。
今回の私の環境では6CPUなので7を指定しました。

$ make -j 7

コンパイルが終了したらroot権限に戻して、モジュールのインストール。
こちらは選択したモジュールを実際にインストールするためroot権限が必要です。

$ su
# make modules_install

無事インストール作業が終われば、「/lib/modules/」に構成ツールで選択したモジュールがインストールされていると思います。

今回の例では「/lib/modules/2.6.18-371.4.1.el5xen」というディレクトリが作成されて、中にモジュールがインストールされています。

目的だったCapability Moduleも「/lib/modules/2.6.18-371.4.1.el5xen/kernel/security/capability.ko」にインストールされています。

補足1 rpmパッケージの作成する場合

コンパイル時に以下のコマンドを打てば「/home/<user name>/rpmbuild/RPMS」にrpmパッケージを作成することができます。同じ環境を別のサーバに構築する場合に便利です。
コチラもオプションで「-j <num>」とするとで並行処理数を指定することができます。

$ make rpm -j 7

rpmでコンパイルすると「make modules_install」に相当する処理も同時に行われます。モジュールが「/lib/modules」にインストールされます。
その際に作成されたテンポラリファイルが「/var/tmp」にも保存されています。

rpmを使ってインストールする場合は、以下のように指定してください。
ファイルのパスは今回の例です。アーキテクチャやバージョンはコンパイルした環境に合わせてください。

# rpm -ivh /home/www/rpmbuild/RPMS/x86_64/kernel-2.6.18371.4.1.el5xen-1.x86_64.rpm

オプションの「i」はインストール。「v」は詳細出力。「h」は進捗状況の出力。を、それぞれ意味しています。

この方法でカーネルをインストールした場合は、後述するGRUBへの記述を自分でする必要があります。また、「vmlinuz」は圧縮されておらず、通常60MBほどあるので「/boot」をセオリー通りに100MBのパーティションに作成している場合は容量に注意してください。

また起動時にカーネルと共に読み込まれる、ドライバ関連のファイルをまとめたinitial ram diskも、自分で作成する必要があります。
以下のコマンドで作成することができます。

mkinitrd <initrdの出力先> <対象バージョン>

今回の例

# mkinitrd /boot/initrd-2.6.18-371.4.1.el5xen.img 2.6.18-371.4.1.el5xen

補足2 カーネル2.4以前のカーネルの再構築をする手順

カーネル2.4以前では以下の手順でコードのコンパイルを行っていました。習慣で必要のないコマンドを打っている解説が多く見られるので、参考までに掲載しておきます。

依存関係のリストを作成

# make dep

不要なファイルの作成(コンパイル時や依存関係リスト作成時の一時ファイル)

# make clean

カーネルのコンパイル

# make bzImage

構成ツールで選択したモジュールのコンパイル

# make modules

モジュールのインストール

# make modules_install

今ではmakemake modules_installだけで良いので、簡単になりました。


コンパイルしたカーネルのインストールとGRUBの設定

コンパイルが完了すると「/usr/src/linux/arch//boot」にbzImageという名前でカーネルが作成されている…と思ったら、作成されていない…。CentOSだと違うのかな?

Wikiには以下に保存されているとあります。

/home/<username>/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18-371.4.1.el5.x86_64/arch/x86_64/boot/compressed

しかし「vmlinux.scr」というファイルだけで、目的の起動用のカーネルイメージが見つかりません。

調べてみるとコンパイルを行ったディレクトリである「/home/hoge/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18-371.4.1.el5.x86_64」に「vmlinuz」が既に作成されていました。これを元にインストールできるようです。

vmlinux」というファイルもありますが、これを圧縮して作成された起動用のカーネルが「vmlinuz」です。「vmlinux」が60MBに対して、「vmlinuz」は2.2MBなので、ざっと1/30程度に圧縮されていることがわかります。

このディレクトリで「make install」とする方法もありますが、「installkernel」コマンドという、カーネルのインストール用のコマンドが用意されているので利用しましょう。

installkernelについてヘルプを見てみます。

# installkernel -h
Usage: installkernel <kernel_version> <bootimage> <mapfile>

どうやら以下のように指定するとインストール作業をしてくれるようです。

installkernel カーネルバージョン-エクストラバージョン bzImageのパス mapfileのパス

バージョンの表示は「Makefile」のものと合わせて「2.6.18-371.4.1.el5xen」。

bootimageはbzImage形式でなく、「/home/hoge/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18-371.4.1.el5.x86_64」に「vmlinuz」が既に作られているのでパスを省略して指定。

mapfileも上記と同じディレクトリにSystem.mapとして作られているものを指定します。

# installkernel 2.6.18-371.4.1.el5xen vmlinuz System.map

コマンドが見つからないと出る場合は「/sbin」に「installkernel」があるか確認して、以下のコマンドでパスが通っているか確かめてください。

# echo $PATH

通っていないようなら以下のコマンドでパスを通します。

# PATH=$PATH:/sbin

installkernelコマンドを実行すると「/boot」に起動用のカーネルがインストールされます。(vmlinuzとSystem.mapはシンボルリンク)

/boot/initrd-2.6.18-371.4.1.el5xen.img
/boot/vmlinuz-2.6.18-371.4.1.el5xen
/boot/vmlinuz
/boot/System.map-2.6.18-371.4.1.el5xen
/boot/System.map

さらに起動用カーネルを指定する「grub.conf」には以下のように設定されています。

# cat /boot/grub/grub.conf

(省略)
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-371.4.1.el5xen)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-371.4.1.el5xen ro root=LABEL=/ console=xvc0
        initrd /initrd-2.6.18-371.4.1.el5xen.img
title CentOS (2.6.18-371.1.2.el5xen)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-371.1.2.el5xen ro root=LABEL=/ console=xvc0
        initrd /initrd-2.6.18-371.1.2.el5xen.img
(省略)

GRUBについて簡単に解説

GRUB(ジーラブ)はLinuxのブートローダです。
簡単に言えばどのような設定で起動するかを決める機構です。GRUBで起動時に使うカーネルを指定します。
更に詳しく知りたい方はWikiにいやというほど詳しく解説されているので参照してくださいw

それぞれの設定を解説すると以下のようになります。

default=1」となっているので2番目(2.6.18-371.1.2.el5xen)の項目で起動することがわかります。(一番上の項目で起動する場合は0を指定する)

timeout=5」は起動の際、5秒以内にカーネルを選択しないと「default」で設定した項目で起動するという設定。

splashimage」は起動時に表示されるイメージの選択。必要ない場合はコメントアウトしてください。

(hd0,0)」はイメージファイルの場所を表しています。「hd0」は1番目のハードディクスドライブ、その後の「0」は1番目のパーティションという意味です。

例えば、2番目のハードディクスドライブの1番めのパーティションを指定したいなら「(hd1,0)」といった具合に記述します。

hiddenmenu」は起動カーネルを選択するGRUB メニューインターフェイスを表示しないという設定です。(grabの設定通り起動する)

title」はそのままタイトルです。

root」はsplashimageと同じようにGRUBのrootパーティションを指定。

kernel」は今回インストールしたカーネル本体を指定します。

initrd」はカーネルのブート時に使用するRAMディスクです。カーネルをブートするときに必要なコマンドやファイルが配置されています。

今回インストールしたカーネルを指定

それでは今回インストールしたカーネルで起動するように「default」の値を変更します。

# vi /boot/grub/grub.conf
default=1
↓
default=0

以上で設定が完了したので、再起動します。

# reboot

起動後、以下のように表示されれば、設定したカーネルで起動しています。

Kernel 2.6.18-371.4.1.el5xen on an x86_64

お疲れ様でした。これでカーネルの再構築を行い、Capability Moduleを有効にすることができました。

カーネルの再構築は、慣れないうちは覚えることが多く、敷居の高い作業ですが、慣れてしまえばなんてことはありません。
自分専用にカーネルをカスタマイズすれば、軽量で高速な自分だけのOSも作れます。

ぜひチャレンジしてみてください。

次の投稿ではDazukoを利用してリアルタイムスキャンをしてみます。
Clam AntiVirusのClamukoでウイルスのリアルタイムスキャンを有効にする方法」を参照してください。
しかしこれが、壮絶なバグとの戦いでしたw



現在のページを共有する



現在のページに関連する記事


おすすめの記事


コメントを残す

プログラミングに関する質問は「日本語でプログラミングの悩みを解決するQ&Aサイト sukegra」をご利用ください。面倒な登録なしでご利用になりれます。