GeekFactory

int128.hatenablog.com

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
done
http://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

ここまで来るのに数日間かかった・・・。