CentOSでホームサーバを作ろう
新しいバージョンのカーネルの導入(概要編)
最終更新:
centos-homeserver
-
view
はじめに
CentOSはREHLを基にしているため、他のディストリビューションと違いカーネルのバージョンアップが遅い傾向がある。
(枯れた古いカーネルに対して、バグFixをしたり、新しい機能を取捨選択して取り込んでUpdateしたりしてはいる。)
なので、最新のカーネルにある機能を試したいという場合には、カーネルの再構築をする必要がある。
以下に新しいカーネルをRPMファイルにし、インストールするやり方を記述する。
基本的には参考リンクの手順をトレースする。
(枯れた古いカーネルに対して、バグFixをしたり、新しい機能を取捨選択して取り込んでUpdateしたりしてはいる。)
なので、最新のカーネルにある機能を試したいという場合には、カーネルの再構築をする必要がある。
以下に新しいカーネルをRPMファイルにし、インストールするやり方を記述する。
基本的には参考リンクの手順をトレースする。
必要なパッケージを導入する。
# yum -y install kernel-devel rpm-build
make menuconfigを使いたいなら以下のパッケージも導入する。
# yum -y ncurses ncurses-devel
最新カーネルを基にRPMパッケージを作成する。
- The Linux Kernel Archivesから最新のカーネルをダウンロードする。
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.xx.x.tar.bz2(xの部分は適宜補完。)
- ダウンロードしたlinux-2.6.xx.x.tar.bz2を/usr/srcに移動。
# mv ./linux-2.6.xx.x.tar.bz2 /usr/src
# cd /usr/src
- linux-2.6.xx.x.tar.bz2を解凍します。
# tar xvjf linux-2.6.xx.x.tar.bz2
# cd linux-2.6.xx.x
- カーネル構築の初期化。
# make mrproper
- 現カーネルの設定ファイルをコピー。
# cp /boot/config-2.6.〜〜〜 ./.config(〜の部分はそれぞれの環境に合わせて補完。)
- コピーしてきた設定ファイルを元に新しい.configファイルを作成。
# make oldconfig
※古い設定ファイルに無い設定項目のみ確認してきますが、
多すぎて確認しきれないので、まずはデフォルトのEnter押下で対応し、
その後で下の補足事項にあるように設定を調整する。
多すぎて確認しきれないので、まずはデフォルトのEnter押下で対応し、
その後で下の補足事項にあるように設定を調整する。
+ | 補足事項 |
- hwclockのエラーへの対応
カーネル2.6.19以降はRTC(Real Time Clock)の仕組みが変わり、
PC以外の機器向けのより汎用的なRTCになった。
具体的には、以前はPC向けの"/dec/rtc"1つのみ存在していたが、
今後は様々な機器(Non-PC)向けに"/dev/rtcN"のように複数のクロックを持てる仕組みになった。
(様々な"/dev/rtcN"の作成は各機器向けのドライバが担当する。
詳細はカーネル付属のドキュメント(Document/rtc.txt)か参考リンクを参照。)
※その影響で新しい.configファイルを見ると、
従来のバージョンでは存在した"CONFIG_RTC"という項目が無くなってしまっている。
古い設定を引き継いだデフォルト設定のままのカーネル上で"hwclock"コマンドを実行すると、
"/dev/rtc"にアクセスできないというエラー(error=19)が発生し、"hwclock"コマンドが使えない。
これは、新しいカーネル上で"hwclock"が参照すべき正しい"/dev/rtc"は"/dev/rtc0"であることが原因である。
("/dev/rtc"は互換性のために残されているはずなのだが、自分の環境ではうまく動作しなかった。)
hwclockコマンドのエラーを回避するためにinitrdを修正する。
残念ながら、"ln -s /dev/rtc0 /dev/rtc"による回避はマシン起動完了後しか有効ではないので、
/etc/rc.sysinit内でのhwclockの実行には間に合わない。
具体的にはinitrd内に、
・rtc作成に必要なドライバを組み込む。(rtc-〜.koなどを追加)
・initスクリプトの修正。(上のドライバを読み込むためのinsmodの追加と、デバイス作成のためのmkmodの追加)
の2つを行う。 詳細については「initrdの編集編」を参照のこと。
PC以外の機器向けのより汎用的なRTCになった。
具体的には、以前はPC向けの"/dec/rtc"1つのみ存在していたが、
今後は様々な機器(Non-PC)向けに"/dev/rtcN"のように複数のクロックを持てる仕組みになった。
(様々な"/dev/rtcN"の作成は各機器向けのドライバが担当する。
詳細はカーネル付属のドキュメント(Document/rtc.txt)か参考リンクを参照。)
※その影響で新しい.configファイルを見ると、
従来のバージョンでは存在した"CONFIG_RTC"という項目が無くなってしまっている。
古い設定を引き継いだデフォルト設定のままのカーネル上で"hwclock"コマンドを実行すると、
"/dev/rtc"にアクセスできないというエラー(error=19)が発生し、"hwclock"コマンドが使えない。
これは、新しいカーネル上で"hwclock"が参照すべき正しい"/dev/rtc"は"/dev/rtc0"であることが原因である。
("/dev/rtc"は互換性のために残されているはずなのだが、自分の環境ではうまく動作しなかった。)
hwclockコマンドのエラーを回避するためにinitrdを修正する。
残念ながら、"ln -s /dev/rtc0 /dev/rtc"による回避はマシン起動完了後しか有効ではないので、
/etc/rc.sysinit内でのhwclockの実行には間に合わない。
具体的にはinitrd内に、
・rtc作成に必要なドライバを組み込む。(rtc-〜.koなどを追加)
・initスクリプトの修正。(上のドライバを読み込むためのinsmodの追加と、デバイス作成のためのmkmodの追加)
の2つを行う。 詳細については「initrdの編集編」を参照のこと。
- RPMファイルを作成します。
# make rpm
以下の場所にRPMファイルが作成されます。
カーネルのRPMファイル
/usr/src/redhat/RPMS/x86_64/kernel-2.6.xx.x.x86_64.rpm
(※32bitカーネルの場合は、/usr/src/redhat/RPMS/i386に作成される。)
srcのRPMファイル
/usr/src/redhat/SRPMS/kernel-2.6.xx.x.src.rpm
カーネルのRPMファイル
/usr/src/redhat/RPMS/x86_64/kernel-2.6.xx.x.x86_64.rpm
(※32bitカーネルの場合は、/usr/src/redhat/RPMS/i386に作成される。)
srcのRPMファイル
/usr/src/redhat/SRPMS/kernel-2.6.xx.x.src.rpm
※ちなみに、rpmに含まれるファイルを確認したかったら
rpm -qpl kernel-2.6.xx.x.x86_64.rpm | grep xxxx("xxxx"の文字があるファイルを一覧)
などで確認が可能。
rpm -qpl kernel-2.6.xx.x.x86_64.rpm | grep xxxx("xxxx"の文字があるファイルを一覧)
などで確認が可能。
最新カーネルRPMのインストール
# rpm -ivh /usr/src/redhat/RPMS/x86_64/kernel-2.6.xx.x.x86_64.rpm
initrdの作成とgrub.confの設定
参考リンクの方にも記述されておりますが、rpmでインストールするだけでは、
initrdの作成やgrub.confの修正が行われません。
mkinitrdコマンドとgrub.confの修正をする必要があります。
initrdの作成やgrub.confの修正が行われません。
mkinitrdコマンドとgrub.confの修正をする必要があります。
- initrdの作成
# mkinitrd /boot/initrd-2.6.xx.x.img 2.6.xx.x
(※xの部分はインストールしたカーネルのバージョンに合わせる。)
- grub.confの修正
# vi /boot/grub
例えばバージョン2.6.27.50の場合は、以下のように追記する。
title CentOS (2.6.27.50)
root (hd0,1) kernel /vmlinuz-2.6.27.50 ro root=LABEL=/
initrd /initrd-2.6.27.50.img
再起動とカーネルの確認
# reboot
再起動に成功したら、起動しているカーネルを確認する。
# uname -r
また、再インストールが必要なカーネルモジュールがあれば、
それらを再度インストールする。(make install)
それらを再度インストールする。(make install)
<参考>
最新カーネルのアンインストール手順
- rpmコマンド(アンインストール)
# rpm -e kernel-2.6.xx.x
- ブートイメージの削除
/boot/initrd-2.6.xx.x.imgを削除
# rm /boot/initrd-2.6.xx.x.img
- grub.confの修正
/etc/grub.confの上記で追加した部分を削除
不要なファイルの削除
RPMファイルを作成する過程で作られた
ディレクトリ | 説明 |
/usr/src/redhat/BUILD | ソースが展開されビルドが行われるフォルダ |
/usr/src/redhat/SOURCES | SRPMに含まれるソースファイル・パッチなどが配置される |
/usr/src/redhat/SPECS | RPMファイルを作成する手順が書かれているスペックファイルが配置される |
の配下ファイルはインストールが完了したら不要なので、適宜削除する。
(ただし、RPMを再ビルドする場合は残しておいても良い。)
(ただし、RPMを再ビルドする場合は残しておいても良い。)
# rm -rf /usr/src/redhat/BUILD/*
# rm -rf /usr/src/redhat/SOURCES/*
# rm -rf /usr/src/redhat/SPECS/*
カーネルパニックが発生する場合への対応
自分の環境では、initrdが「/dev/root」(ルートディレクトリ)をマウントしようとして
カーネルパニックを起こすケースが多かった。
ネット上の情報を総合したところ、現状のCentOS 5.5のmkinitrdは問題があり、
必要なカーネルモジュールを組み込まずにinitrdを作成してしまうようである。
実際に作成されたinitrdを展開して内容を確認すると、
やはり2.6.27.xx以前では問題無いが、それ以降のカーネル(2.6.31〜.xx)では
問題が発生してしまうようである。
自分の環境で確認した限りでは、
2.6.27.xx以前では以下のカーネルモジュールが存在しているが、
カーネルパニックを起こすケースが多かった。
ネット上の情報を総合したところ、現状のCentOS 5.5のmkinitrdは問題があり、
必要なカーネルモジュールを組み込まずにinitrdを作成してしまうようである。
実際に作成されたinitrdを展開して内容を確認すると、
やはり2.6.27.xx以前では問題無いが、それ以降のカーネル(2.6.31〜.xx)では
問題が発生してしまうようである。
自分の環境で確認した限りでは、
2.6.27.xx以前では以下のカーネルモジュールが存在しているが、
- scsi_mod.ko
- sd_mod.ko
2.6.31.xx以降では上記モジュールは存在しなくなり新しい
- libahci.ko
のモジュールに変わってしまう。
従って、31以降のカーネルを用いるには、
上記2つのモジュールを組み込んだinitrdを手動で作成するしかないと考えられる。
(※勿論、環境によっては問題が発生しない方もいるとは思うが。)
従って、31以降のカーネルを用いるには、
上記2つのモジュールを組み込んだinitrdを手動で作成するしかないと考えられる。
(※勿論、環境によっては問題が発生しない方もいるとは思うが。)
iptablesでエラーが発生するケースへの対応(
カーネル入れ替え後に「iptables-restore: line xx failed」というメッセージが発生した。
参考リンクのページの情報によると必要なカーネルモジュールが組み込まれていないことが原因らしい。
再度"make menuconfig"を行って、必要なモジュールを組み込む。
Networking support
=> Networking options
=> Network packet filtering framework (Netfilter)
=> Core Netfilter Configuration
以下のモジュールは全て"M"にして組み込んだ方が良いと思われる。
(”STATE"のキーワードを有効にするだけなら"Netfilter connection tracking support"だけでも良いかも。)
参考リンクのページの情報によると必要なカーネルモジュールが組み込まれていないことが原因らしい。
再度"make menuconfig"を行って、必要なモジュールを組み込む。
Networking support
=> Networking options
=> Network packet filtering framework (Netfilter)
=> Core Netfilter Configuration
以下のモジュールは全て"M"にして組み込んだ方が良いと思われる。
(”STATE"のキーワードを有効にするだけなら"Netfilter connection tracking support"だけでも良いかも。)
参考リンク
- CentOSでのカーネルバージョンアップ手順
- initrdとは(1)
- initrdとは(2)
- initrdの中身
- mkinitrdコマンド
- ハウツー:自分のシステムに最適なカーネルを構築する
- RPM管理について
- 「/dev/rootが見つからない」というカーネルパニックへの対応-(1)(CentOS5.5にカーネル2.6.34系を導入)
- 上の関連情報(mkinitrdのバグ報告)
- カーネル入れ替え後にiptablesでエラーが発生する場合の対応
- 2.6.19以降でのRTCの変更について(カーネルドキュメント)