coLinuxでルートファイルシステムにxfsを使用する方法
coLinuxの標準カーネルではxfsサポートがkernel module扱いになっています。したがって、そのままでは起動時にxfsパーティションを認識できません。ここではinitramfsを使用してxfsパーティションを認識する方法を説明します。
構築準備
initramfsはカーネル2.6から始まったinitrdに代わるRAMディスクです。カーネルは初期化処理が終わったらinitramfsを / にマウントし、/initを実行します。/initはカーネルモジュールを読み込み、パーティションをマウントします。最後に、新パーティションにある/sbin/initを実行します。
以下のバイナリをinitramfsに含める必要があります。私はbusyboxを使っています。
- /bin/sh
- /bin/mount
- /bin/umount
- /sbin/insmod
- /sbin/mdev
- /dev (/dev/consoleをmknodしておくこと)
- /proc
- /sys
- /point
initスクリプトの作成
/initを書きます。
#!/bin/sh ROOT=/dev/sda4 echo -e "\x1b[1;32m *\x1b[0m Mounting filesystem(s)" /bin/mount -t proc none /proc /bin/mount -t sysfs none /sys /bin/mount -t tmpfs none /dev echo -e "\x1b[1;32m *\x1b[0m Starting mdev" /sbin/mdev -s echo -e "\x1b[1;32m *\x1b[0m Loading kernel module(s)" /sbin/insmod /xfs.ko echo -e "\x1b[1;32m *\x1b[0m Mounting root filesystem... $ROOT" /bin/mount -o ro "$ROOT" /point echo -e "\x1b[1;32m *\x1b[0m Switching environment" /bin/umount /sys /bin/umount /proc /bin/umount /dev exec switch_root /point /sbin/init echo -e "\x1b[1;31m *\x1b[0m Fallback to /bin/ash" exec /bin/ash
「仙石浩明の日記: initramfs (initrd) の init を busybox だけで書いてみた」のコードを組み合わせると、カーネルパラメータからrootを取ってくることができます。
「root=」カーネルパラメータを指定している場合は、その値が ROOT 変数に代入される
for p in `cat /proc/cmdline`; do case $p in root=*) ROOT=`echo $p | sed 's/.*=//'` ;; esac donehttp://blog.gcd.org/archives/51053466.html
initramfsの生成
initramfsの実体はcpioアーカイブをgzipで固めたものです。以下のコマンドで生成できます。
find . | cpio -v -o -H newc | gzip > ../initramfs.gz"
最後に、このinitramfs.gzをWindowsにコピーし、coLinuxの設定ファイルを少し書き直します。
initrd="C:\hogehoge\initramfs.gz"
こんな感じでメッセージが出ます。
Freeing unused kernel memory: 128k freed * Mounting filesystem(s) mount: no /etc/mtab mount: no /etc/mtab mount: no /etc/mtab * Starting mdev * Loading kernel module(s) SGI XFS with ACLs, security attributes, realtime, no debug enabled SGI XFS Quota Management subsystem * Mounting target filesystem... /dev/sda4 Filesystem "sda4": Disabling barriers, not supported by the underlying device XFS mounting filesystem sda4 Starting XFS recovery on filesystem: sda4 (logdev: internal) Ending XFS recovery on filesystem: sda4 (logdev: internal) mount: no /etc/mtab
ここまで来るのに数日間かかった・・・。