linuxカーネル再構築
CentOS5.xのマシンでufsなファイルシステムをmountする必要が出てきた。
CentOS5ではufsはサポートされていないので、既存のカーネルのままufs.koを作る事にした。
開発環境をインストールして、最新にする。
[root@c108 ~]# yum groupinstall "Development Libraries" "Development Tools"
[root@c108 ~]# yum update
カーネルソースを取得するツールとカーネル構築に必要な追加パッケージをインストールします。
[root@c108 ~]# yum install yum-utils gnupg unifdef
[root@c108 ~]#
カーネル構築用のユーザ(rpmbuilder)を作成して、ソースを取得する。
[root@c108 ~]# useradd -r -m rpmbuilder
[root@c108 ~]# su - rpmbuilder
[rpmbuilder@c108 ~]$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
[rpmbuilder@c108 ~]$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
[rpmbuilder@c108 ~]$ yumdownloader --source kernel
[rpmbuilder@c108 ~]$ ls -l
合計 66644
-rw-rw-r-- 1 rpmbuilder rpmbuilder 68155255 1月 20 05:04 kernel-2.6.18-408.el5.src.rpm
drwxrwxr-x 7 rpmbuilder rpmbuilder 4096 3月 5 17:40 rpmbuild
[rpmbuilder@c108 ~]$
次に、ソース(kernel-2.6.18-408.el5.src.rpm)を展開して、パッチの適用を済ませる
[rpmbuilder@c108 ~]$ rpm -Uvh kernel-2.6.18-408.el5.src.rpm
[rpmbuilder@c108 ~]$ rpmbuild -bp --target x86_64 rpmbuild/SPECS/kernel.spec
これでお膳立ては済んで、必要なカーネルモジュールを有効にするために make menuconfig を実行する
[rpmbuilder@c108 ~]$ cd rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18-408.el5.x86_64
[rpmbuilder@c108 linux-2.6.18-408.el5.x86_64]$ make menuconfig
目的の ufs.ko は、「File systems」->「Miscellaneous filesystems」の「UFS file system support」を有効にする。

選択後、「Exit」を選択して「Do you wish to save your new kernel configuration?」にて「Yes」を選択して .config を更新します。

そして、
[rpmbuilder@c108 linux-2.6.18-408.el5.x86_64]$ make prepare
[rpmbuilder@c108 linux-2.6.18-408.el5.x86_64]$ make modules_prepare
[rpmbuilder@c108 linux-2.6.18-408.el5.x86_64]$ make M=fs/ufs
[rpmbuilder@c108 linux-2.6.18-408.el5.x86_64]$ strip --strip-debug fs/ufs/ufs.ko
[rpmbuilder@c108 linux-2.6.18-408.el5.x86_64]$ sudo cp fs/ufs/ufs.ko /lib/modules/`uname -r`/extra
[rpmbuilder@c108 linux-2.6.18-408.el5.x86_64]$ sudo /sbin/depmod -a
[rpmbuilder@c108 linux-2.6.18-408.el5.x86_64]$ sudo /sbin/modprobe ufs
これで ufs なファイルシステムを読むことができる。
[root@c108 ~]# mount -t ufs -o ufstype=sun,ro /dev/sdb7 /mnt/sun
カーネルをupgradeする †
ufs.koを使って古いHDDを読み込んでいると、途中でマシンがフリーズしてしまった。全く読めないのではなく、
読めるには読めるのだが、なぜだかフリーズしてしまう。
なので、カーネルごと新調することにした。
CentOS5のカーネルは、 2.6.18 である。この 2.6 系のlongtermな 2.6.32.70 を適用することにした。
[root@c108 ~]# cd /usr/src
[root@c108 src]# wget ftp://ftp.riken.jp/Linux/kernel.org/linux/kernel/v2.6/longterm/v2.6.32/linux-2.6.32.70.tar.xz
[root@c108 src]# xz -cd linux-2.6.32.70.tar.xz | tar xf - && cd linux-2.6.32.70
[root@c108 linux-2.6.32.70]# cp /boot/config-2.6.18-408.el5 .config
[root@c108 linux-2.6.32.70]# make oldconfig
(質問は全てリターンキーで応答)
[root@c108 linux-2.6.32.70]# make menuconfig
注意点 ここで必ず「General setup」->「enable deprecated sysfs features which may confuse old userspace tools」を有効にすること。これをしないと起動中にハングします。

この変更を保存して、Makefileに印を入れて、コンパイル・インストールを行います
[root@c108 linux-2.6.32.70]# vi Makefile
(略)
EXTRAVERSION = .70-chaperone
(略)
[root@c108 linux-2.6.32.70]# time(make&& make modules&& make modules_install&& make install) *紅茶とケーキで待ちましょう
コンパイル終了後に、次の起動時にこのカーネルを使用させるように /boot/grub/grub.conf を修正する。
[root@c108 linux-2.6.32.70]# vi /boot/grub/grub.conf
- default=1
+ default=0
[root@c108 linux-2.6.32.70]# reboot
再起動後、採用されているカーネルを確認する
[root@c108 ~]# cat /etc/redhat-release
CentOS release 5.11 (Final)
[root@c108 ~]#
[root@c108 ~]# uname -r
2.6.32.70-chaperone
[root@c108 ~]#