CentOSでホームサーバを作ろう
新しいバージョンのカーネルの導入(initrdの編集編)
最終更新:
centos-homeserver
-
view
はじめに
新しいバージョンのカーネルの導入に際して、initrdイメージの編集が必要になった場合について、
カーネルドライバの追加やinitスクリプトの編集などの手順を記述する。
具体的には、概要編にあったhwclockのエラーが発生した場合への対応を行う。
(対象のカーネルバージョンは2.6.27.50)
カーネルドライバの追加やinitスクリプトの編集などの手順を記述する。
具体的には、概要編にあったhwclockのエラーが発生した場合への対応を行う。
(対象のカーネルバージョンは2.6.27.50)
カーネルイメージの展開
まずテンポラリディレクトリにイメージを展開する。
# cp -p /boot/initrd-2.6.27.50.img ./
ブート用イメージファイルは圧縮されているため、zcatコマンドで伸張する。
# zcat initrd-2.6.27.50.img > initrd-2.6.27.50.dat
さらにCPIOでまとめられているので、"image"というディレクトリを作成しそこに展開する。
# mkdir ./image
# cd ./image
# cpio -i --file=../initrd-2.6.27.50.dat
必要なRTCに関係するカーネルモジュールをコピーする。
# cp -p /lib/modules/2.6.27.50/kernel/drivers/rtc/*.ko ./lib/
必要なモジュールをコピーし、initスクリプトの編集が終了したら、
再度ファイルをアーカイブする。まずはCPIOでファイルを1ファイルにまとめる。
再度ファイルをアーカイブする。まずはCPIOでファイルを1ファイルにまとめる。
# find . -print | cpio -o --file=../initrd-2.6.27.50.new.dat --format=newc
さらにgzip圧縮を行う。
# gzip -c9 ../initrd-2.6.27.50.new.dat > /boot/initrd-2.6.27.50.new.img
これで/boot/initrd-2.6.27.50.new.imgができたので、
それをgrub.confで指定すれば完了。
それをgrub.confで指定すれば完了。
- 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コマンドのエラーを回避するための方法は2つ考えられる。
(方法1)initrd自体の修正(=>大変)
initrdを以下のように修正する。
・正しいrtc作成に必要なドライバを組み込む。(〜.koを追加)
・initスクリプトの修正。(ドライバを読み込むinsmodの追加と、デバイス作成のためのmkmodの追加)
{(方法2)/etc/rc.sysinitスクリプトの修正(=>簡単)
/etc/rc.sysinitに以下の処理を追加する。
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コマンドのエラーを回避するための方法は2つ考えられる。
(方法1)initrd自体の修正(=>大変)
initrdを以下のように修正する。
・正しいrtc作成に必要なドライバを組み込む。(〜.koを追加)
・initスクリプトの修正。(ドライバを読み込むinsmodの追加と、デバイス作成のためのmkmodの追加)
{(方法2)/etc/rc.sysinitスクリプトの修正(=>簡単)
/etc/rc.sysinitに以下の処理を追加する。