最近USBメモリを買いました。それで、exFATでフォーマットするとパフォーマンスが上がると聞いて実際にexFATでフォーマットしてみると、たしかに速度が若干早くなりました。
が、1つ問題が起こりました。今まではGentooのLiveDVDからlivecd, boot/gentoo, boot/gentoo.igz, image.squashfsをGRUB2が入ったUSBメモリにコピーしgrub.cfgに以下のような内容を書いておくことで、USBメモリからGentooのLiveDVDを起動していました。
menuentry "Gentoo Linux 20121221 (nox)" {
linux /boot/gentoo/gentoo root=/dev/ram0 init=/linuxrc keymap=jp aufs looptype=squashfs loop=/boot/gentoo/image.squashfs cdroot vga=791 console=tty1 quiet nox
initrd /boot/gentoo/gentoo.igz
}
しかし、その方法では起動できなくなってしまいました。画面に出力された内容から考えると、なんらかの原因でimage.squashfsが含まれるパーティションを見つけることができないようでした。色々考え最終的にその原因は恐らくinitramfsでexFATをマウントできないから見つけられないんだろうという結論に至りました。でも、せっかくexFATにしたのにまたFAT32に戻すのも負けた気がするので、フォーマットがexFATのまま使う方法を考えました。
どうするかというと、initramfs(gentoo.igz)に手を加えてexFATをマウントできるようにします。
LinuxでexFATのパーティションをマウントするにはfuseとexfatが必要なので、まずそれぞれをコンパイルします。動的リンクすると色々ややこしいのでできるだけ静的リンクすることにします。また、ここでは32bitのgentoo.igzを書き換えることを前提にコマンドが書かれていますが、64bitのgentoo64.igzもだいたい同じ感じでできると思います。
まずfuseをコンパイルします。prefixはどこか適当なところを指定してください。exfatのコンパイル時に使います。rootでこの作業を行うとmake install時に/sbin/mount.fuseが置き換えられてしまうので一般ユーザで行なってください。
$ # 64bitシステム上で32bitのgentoo.igzを弄る場合下の2行を実行しておく
$ export CFLAGS="-m32"
$ export LDFLAGS="-m32"
$
$ wget "http://sourceforge.net/projects/fuse/files/fuse-2.X/2.9.3/fuse-2.9.3.tar.gz"
$ tar xf fuse-2.9.3.tar.gz
$ cd fuse-2.9.3
$ ./configure --prefix="`pwd`/../prefix" --enable-static
$ make install
次にexfatをコンパイルします。
$ wget "https://exfat.googlecode.com/files/fuse-exfat-1.0.1.tar.gz"
$ tar xf fuse-exfat-1.0.1.tar.gz
$ cd fuse-exfat-1.0.1
$ # 静的リンク時うまくいかないので書き換えておく
$ sed -i -e "s/\\[libs + \\[libfuse\\]\\]/\\[libs + \\[libfuse\\] + \\['pthread', 'dl'\\]\\]/" SConstruct
$ export CFLAGS="-static"
$ export LDFLAGS="-static -L`pwd`/../prefix/lib"
$ # 64bitシステム上で32bitのgentoo.igzを弄る場合更にこの2行も実行する
$ export CFLAGS="$CFLAGS -m32"
$ export LDFLAGS="$LDFLAGS -m32"
$ scons CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS"
次はgentoo.igzを展開した後、exFATでフォーマットされたパーティションをinitramfs内でマウントできるようにし、新しくgentoo-exfat.igzを作成します。
$ mkdir gentoo
$ cd gentoo
$ cat /path/to/gentoo.igz | xz -d | sudo cpio -id
$ sudo cp /path/to/prefix/lib/lib{fuse.so.2.9.3,ulockmgr.so.1.0.1} lib
$ cd lib; sudo ln -s libfuse.so.2.9.3 libfuse.so.2; cd ..
$ sudo cp /path/to/prefix/bin/* bin
$ sudo cp /path/to/fuse-2.9.3/util/mount.fuse sbin
$ sudo cp /path/to/fuse-exfat-1.0.1/fuse/mount.exfat-fuse sbin
$ cd etc; curl "https://gist.github.com/int2xx9/d50f77a056896d001a96/raw/077638c102c487785e12a94bda8505ab9346badd/gistfile1.txt" | sudo patch; cd ..
$ sudo find . -print | sudo cpio -o -H newc | gzip -9 > ../gentoo-exfat.igz
gentoo-exfat.igzが作成できたら、initrdにgentoo.igzの代わりにgentoo-exfat.igzを使用し、ちゃんとGentooが起動できるかを確かめます。できなかったらどこか間違えているんだと思います。
いちいちパソコン起動するのがめんどくさいって人は、USBメモリをアンマウントした上で ((アンマウントしてないと変更内容が反映されないっぽいです)) qemuを使ってqemu -hda /dev/sdb
(/dev/sdbはUSBメモリのデバイスファイル)みたいにすることでUSBメモリから起動できるか確認ができて便利です。
最後にx86(32bit)向けのgentoo-exfat.igzを載せておきます。上の手順をやるのがめんどくさいって人は使ってください。gentoo-exfat.igz
3月9日追記
64bitのが必要になって作成したのでこれも載せておきます。あとgentoo-exfat.igzへのリンクが間違ってたので直しておきました。
gentoo64-exfat.igz
3月11日追記
具体的にどれなのかファイル名を書いてませんでしたが、元になるLiveDVDはlivedvd-x86-amd64-32ul-20121221.isoです。