KNOPPIX-5.0.1のカーネルを2.6.19に差し替える

来年度のksPCを組んで驚いたのはIDEがSATAチップの下で動いていることだった。もうIDEは完全にレガシーの扱いなんですねえ。それはそうとこのPCにLinuxをインストールしようとするとこの構成にまだ対応できてなくてこの下に繋いだDVDドライブからデータを読み込めないのである。

その問題そのものは優秀なTAのお陰で最新のカーネルを使えば解決するということはすぐ分かった。参考: http://plabatut.free.fr/html/ga_965p_ds4.html.en
新しいPCでKNOPPIXを動かす必要があったため、KNOPPIXのカーネルの差し替えを試行錯誤で行ってみた。基本は以前KMZさんがKNOPPIXをばらしたときやネット検索で引っかかったものなどを参考にしてみた。

1. カーネル再構築

KNOPPIX:/usr/src/knoppix-kernel.README にあるように、KNOPPIXだからといって特別なパッチを当てたり特別なオプションを設定する必要は無いので普通にビルド。(後述の理由からCONFIG_EXPORTFS=yとしておくとちょっと楽かも)

2. cloop.koとunionfs.koのコンパイル

cloop.koはカーネルバージョンを見ているので、カーネルを差し替えたならそれにあわせてcloop.koを差し替える必要アリ。debianのpoolからcloop-2.05~20060829のソースをダウンロード。ビルドする。カーネルソースが必要になるので適切なディレクトリにおいておく。上のカーネル再構築の作業の時点でしかるべき場所/usr/src/linux-2.6.19 等においておけばよい。

unionfs.koも同様に展開。Linux-2.6.19でビルドするためにはunionfs本家サイトからCVS-snapshotをとってきた上で、さらにソースを弄る必要アリ。修正部分はこんな感じ。 via: http://www.mail-archive.com/reiserfs-list@namesys.com/msg22488.html

diff -ur ../unionfs-1.5pre-cvs200612261700/dirfops.c ./dirfops.c
--- ../unionfs-1.5pre-cvs200612261700/dirfops.c 2006-12-27 07:00:45.000000000 +0900
+++ ./dirfops.c 2006-12-30 06:36:42.000000000 +0900
@@ -161,7 +161,7 @@
}
dprint(PRINT_DEBUG, "calling readdir for %d.%lld (offset = %lld)\n",
uds->uds_bindex, uds->uds_dirpos, offset);
-               err = vfs_readdir(hidden_file, unionfs_filldir, (void *)&buf);
+               err = vfs_readdir(hidden_file, (filldir_t)unionfs_filldir, (void *)&buf);
dprint(PRINT_DEBUG,
"readdir on %d.%lld = %d (entries written %d, filldir called %d)\n",
uds->uds_bindex, (long long)uds->uds_dirpos, err,
diff -ur ../unionfs-1.5pre-cvs200612261700/dirhelper.c ./dirhelper.c
--- ../unionfs-1.5pre-cvs200612261700/dirhelper.c       2006-12-27 07:00:45.000000000 +0900
+++ ./dirhelper.c       2006-12-30 06:35:11.000000000 +0900
@@ -263,7 +263,7 @@
buf->filldir_called = 0;
buf->rdstate->uds_bindex = bindex;
err = vfs_readdir(hidden_file,
-                                         readdir_util_callback, buf);
+                                         (filldir_t)readdir_util_callback, buf);
if (buf->err)
err = buf->err;
} while ((err >= 0) && buf->filldir_called);
diff -ur ../unionfs-1.5pre-cvs200612261700/lookup.c ./lookup.c
--- ../unionfs-1.5pre-cvs200612261700/lookup.c  2006-12-27 07:00:45.000000000 +0900
+++ ./lookup.c  2006-12-30 16:17:39.000000000 +0900
@@ -399,9 +399,7 @@
{
if (!unionfs_dentry_cachep)
return;
-       if (kmem_cache_destroy(unionfs_dentry_cachep))
-               printk(KERN_ERR
-                      "unionfs_dentry_cache: not all structures were freed\n");
+       kmem_cache_destroy(unionfs_dentry_cachep);
return;
}

diff -ur ../unionfs-1.5pre-cvs200612261700/rdstate.c ./rdstate.c
--- ../unionfs-1.5pre-cvs200612261700/rdstate.c 2006-12-27 07:00:45.000000000 +0900
+++ ./rdstate.c 2006-12-30 16:17:55.000000000 +0900
@@ -47,10 +47,7 @@
{
if (!unionfs_filldir_cachep)
return;
-       if (kmem_cache_destroy(unionfs_filldir_cachep)) {
-               printk(KERN_ERR
-                      "unionfs_filldir_cache: not all structures were freed\n");
-       }
+       kmem_cache_destroy(unionfs_filldir_cachep);
return;
}

diff -ur ../unionfs-1.5pre-cvs200612261700/super.c ./super.c
--- ../unionfs-1.5pre-cvs200612261700/super.c   2006-12-27 07:00:45.000000000 +0900
+++ ./super.c   2006-12-30 16:18:05.000000000 +0900
@@ -380,9 +380,7 @@
print_entry_location();
if (!unionfs_inode_cachep)
goto out;
-       if (kmem_cache_destroy(unionfs_inode_cachep))
-               printk(KERN_ERR
-                      "unionfs_inode_cache: not all structures were freed\n");
+       kmem_cache_destroy(unionfs_inode_cachep);
out:
print_exit_location();
return;
@@ -623,7 +621,7 @@
arg.found = 0;
while (arg.found != 2) {
arg.called = 0;
-                       err = vfs_readdir(hidden_file, filldir, &arg);
+                       err = vfs_readdir(hidden_file, (filldir_t)filldir, &arg);
if (!arg.called || err < 0)
break;
}

3. KNOPPIXイメージの展開、再構築

公開されているKNOPPIXイメージのcloopファイルは上でビルドしたextract_compressed_fsでは何故か解凍できないので、公開されているイメージでブートしてからその/KNOPPIX以下をコピー。これがcloopファイルのルートになる。(この辺りはKNOPPIXのカスタマイズで検索すればいろいろ載っている)
カーネルを新しくしたのでモジュールを入れ替える。新しいカーネルのモジュールを /lib/modules 以下にコピーするだけでOK。(そんなに気にする必要は無いと思うが念のため一応) /lib/modules/2.6.19/{build,source} のリンクを /usr/src/linux-2.6.19 に張りなおす。

mkisofsでisoファイルを作成、create_compressed_fsでcloop圧縮する。以下、KNOPPIX本体が knoppix_root以下にあるとして

# mkisofs -R -U -V "KNOPPIX.net filesystem" -publisher \
"KNOPPIX www.knoppix.net" \
-hide-rr-moved -cache-inodes -no-bak -pad \
knoppix_root \
| create_compressed_fs -m 65536 - > KNOPPIX.mine

4. minirootのカスタマイズ

cloop-2.05だとモジュールにchkblk=0とかthread_mode=0みたいなオプションは渡せないみたいなので、minirt.gz内linuxrcの該当部分を変更。

また、カーネルオプションでexportfsをモジュールにした場合は、unionfsモジュールを読み込む前にexportfsを読み込むようにminirt.gz内のlinuxrcを変更する必要がある(最初からexportfsをカーネルに組み込んでしまえば飛ばしてもよい)。具体的には以下の通り。

--- linuxrc     2006-06-14 14:27:37.000000000 +0900
+++ ../mount3/linuxrc   2006-12-30 22:25:42.420994624 +0900
@@ -500,8 +500,8 @@
done
echo ""

-  loadmodule cloop.ko chkblks=$CHKBLK "$THREAD" file="$1/$KNOPPIX_DIR/$KNOPPIX_NAME"
-  #loadmodule cloop.ko file="$1/$KNOPPIX_DIR/$KNOPPIX_NAME"
+  #loadmodule cloop.ko chkblks=$CHKBLK "$THREAD" file="$1/$KNOPPIX_DIR/$KNOPPIX_NAME"
+  loadmodule cloop.ko file="$1/$KNOPPIX_DIR/$KNOPPIX_NAME"

echo "0" > /proc/sys/kernel/printk
mountit /dev/cloop /KNOPPIX "-o ro" || FOUND_KNOPPIX=""
@@ -726,6 +726,7 @@
cat /KNOPPIX/etc/ld.so.cache > /etc/ld.so.cache
echo ""
UNIONFS=""
+ loadmodule exportfs.ko
loadmodule unionfs.ko 2>/dev/null && UNIONFS="yes"
# Enable kernel messages
echo "6" > /proc/sys/kernel/printk

5.ブートメディアの作成

isoファイル内で差し替える必要があるのは

  • /boot/isolinux/linux …カーネル
  • /boot/isolinux/minirt.gz …miniroot
  • /KNOPPIX/KNOPPIX …KNOPPIX本体(cloopファイル)
  • /KNOPPIX/modules/cloop.ko …cloopモジュール
  • /KNOPPIX/modules/unionfs.ko …unionfsモジュール
  • /KNOPPIX/modules/exportfs.ko …exportfsモジュール

以上を組み込んだ後、mkisofsでCDイメージを作成。CDイメージのルートディレクトリに移動して、

# mkisofs -l -r -J -V "Knoppix_Mine" -b boot/isolinux/isolinux.bin \
-c boot/isolinux/boot.cat -o ../myknpx.iso \
-no-emul-boot -boot-load-size 4 -boot-info-table .

一般的なカスタマイズとの違いは、カーネルを差し替えることで起動に必要なモジュールをコンパイルしなおすこと(最新のカーネルなので対応するモジュールがビルドできない場合は、自分でパッチ当てていく必要がある)、それをKNOPPIX本体が収まっているcloopファイルとは別の場所に収めること、それら変更した設定にあわせてinitrdを調整することである。

参考サイト

カテゴリー: Knoppix, ks. KNOPPIX-5.0.1のカーネルを2.6.19に差し替える はコメントを受け付けていません。
%d人のブロガーが「いいね」をつけました。