清く正しく、CentOSのカーネルを再構築する方法
前回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という機能を使います。
ClamukoはDazukoというデバイスドライバが必要で、DazukoにはCapability Moduleが必要、という関係になっています。
カーネルモジュールについて
カーネルはLinuxの中核です。ここに多くの人にとって必要のないドライバを追加すると、無駄にOS自体のサイズが大きくなり、動作も重くなります。またカーネルに機能を追加するには、毎回再構築をする必要があります。
カーネルモジュールは、そうした問題を解決する、必要なときにだけ機能を追加することができる機能拡張のような仕組みです。
モジュール化することで、再構築を行うこと無く機能を追加したり、モジュール単位でアップデートが可能になります。
ところが今回有効にするCapability Moduleを有効にするには、Linuxのカーネルソースからモジュール化する必要があるため、結局カーネルの再構築が必要になります。
カーネルのバージョンに関する注意 Linuxカーネル2.6.37以降のファイルアクセス通知機能はFanotifyという機構に取って代わっています。 そのためClam AntiVirusの最新版である0.98以降はFanotifyを使ってリアルタイムスキャンしています。 0.98以降ではDazukoとCapability 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権限でncursesとncurses-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」を打つとコンソールが以下の様な表示に変わります。
Security optionsの項目に進む
目指すSecurity optionsは下から5番目あたりにあります。キーボードの下矢印で移動したら、エンターキーを押して進みます。
Defoult Linux Capabilitiesを有効に
Defoult Linux Capabilitiesの項目を選択して、画面上部にある解説にあるように「M」と入力します。
ちなみに「Y」はカーネルへの組み込み、「N」は削除、「M」はモジュールとして取り込むという指定です。
Defoult Linux Capabilitiesの項目が「M」となっていることを確認したら、キーボードの右矢印を押して「Exit」を選択、エンターでSecurity optionsを抜けます。
追記 上の追記でも書きましたが、この設定だとBINDが起動しない不具合が発生します。対策として「M」ではなく「Y」にしました。 詳しくは「次回の投稿」をご覧ください。
設定を抜けます
再びLinux Kernel Configurationの画面になると思うので、同じように右矢印を押して「Exit」を選択、エンターで抜けます。
構成ツールを抜けます
するとDo you wish to save your new kernel configuration?と出るので、変更した設定を保存するべく「Yes」を選択してエンター。
以上で構成ツールでの作業は終了です。
試しに設定が正しく「.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
今ではmakeとmake modules_installだけで良いので、簡単になりました。
コンパイルしたカーネルのインストールとGRUBの設定
コンパイルが完了すると「/usr/src/linux/arch/
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