USBメモリにVine Linuxをインストールしよう -- 2007-11-08  

最近は低価格化がかなり進んできたUSBメモリ。最近の情勢ではようやくLinuxのディストリビューションをそのままUSBメモリに入れられるようになってきました。ちょっとしたアソビゴコロからUSBにVine Linux 4.1をインストールすることにしました。
このページは何度もVine Linuxをインストールしている人向きのページです。ちょっとしたミスで元のハードディスクの内容を壊してしまいますので自信のない人は無理は禁物!!

前提とされる知識  

用意したもの  

このほかに実マシンのVine Linux 4.1(Linux環境でも可)があるとトラブル対応が楽になります。

USBメモリへのインストール  

インストールは通常通りインストールプロセスで行います。ただし、起動時に

linux expert usb-storage

で起動しています。

注意点  

インストール終了時にちょこちょこ  

grubをインストールする  

インストールプロセス終了後、Ctrl+Alt+F2でコンソールに抜けてgrubをインストールできるはずですが・・・なぜかコンソールが使えません。仕方がないのでインストールCDでレスキューモードで再起動してインストールしました(当然、別のLinux環境がある場合はそちらを使ってgrubをインストールしても使えます)

linux rescue usb-storage

でUSBストレージを使うレスキューモードで起動します。この時、USBメモリを起動時にあらかじめ差しておかないとうまく認識しないようです。
認識したらUSBメモリにインストールしたシステムから/usr/lib/grub/i386-pc以下のファイルを/boot/grubにコピーします。ただし、defaultmenu.sh、menu.lstは不要です。コピーが終わったらgrubをインストールします。ここではUSBメモリが/dev/sdaだとします。

# grub
grub> root(hd0,0)
grub> setup(hd0)
grub> quit

以上でgrubのインストールは完了です。ついでなのでこの環境のままinitrdを作成します。

initrdの作成  

少々めんどくさいのですが、initrdを少し修正する必要があります。
上記の手順でレスキューモードに入っている場合はUSB側のシステム領域を/mnt/diskにでもマウントします(/mnt/sysimageにマウントされている場合はそれでもいいですが)。

# mount /dev/sda3 /mnt/disk
# chroot /mnt/disk

chrootでUSBシステムにルートパーティションを移して作業可能になります。
initrdを作成するときは以下のようになります。このやり方ではinitrd作成後、作業が必要になるのでめんどくさい人は次節の「mkinitrdを書き換える」を参照してください。

# mkinitrd --with-usb initrd-usb.img 2.6.16-0vl68

これでUSBドライバを組み込んだinitrdを作成できます。ただ、私のPCではinitの待ち時間内(5秒)にUSBメモリを認識してくれなかったので、initrdを展開してinitスクリプトを修正します。

# cd /root
# mkinitrd --with-usb initrd-usb-pre.img 2.6.16-0vl68 <-- initrdを作ります
# mkdir initwork
# cd initwork
# gzip -dc ../initrd-usb-pre.img | cpio -idmv

これでinitworkディレクトリ以下にinitrdの内容が展開されました。
この中のinitスクリプトを修正します。initスクリプトの中でusb-storageモジュール読み込み後にsleep 5というのがありますが、これをsleep 10にします。これで修正は完了です。
もう一度イメージを作成します。

# find | cpio -H newc -o | gzip -9 > ../initrd-usb.img

これでinitrdが作成できました。

mkinitrdスクリプトを書き換えてしまう!!  

いちいちイメージを展開してinitスクリプトの書き換えがめんどくさい場合はmkinitrdスクリプトを修正します。mkinitrdはシェルスクリプトなので必要な場所を修正してしまえばいいのです。

685:    # Hack - we need a delay after loading usb-storage to give things
686:    #        time to settle down before we start looking a block devices
687:    if [ "$module" = "usb-storage" ]; then
688:    echo "sleep 5" >> $RCFILE

この部分ですね。まさにusb-storage用にハックされた場所みたいです。このsleep 5をsleep 10にすれば万事解決。
あと、aptでカーネルアップグレードの時にいちいちmkinitrdをするのがめんどくさい場合は、さらにwith-usbオプション周辺をハックしてしまうのも手です。

195:     --with-usb)
196:         withusb=yes
197:         ;;

このwithusb変数をyesにすればいいだけなので、このオプション認識ループが終了した時点でwithusb=yesを入れてしまえばよさそうです(まだやってないけど)。

以上の修正が必要になりますがこれだけでUSBブートLinuxができてしまいます。
ただ、1GBでは少々心許ないのでできれば4GBぐらいが欲しいですね。おそらく4GBあればその中でXenを使ったLinux on Linuxのシステムが作れると思います(意味があるかどうかは不明ですが・・・)