USBメモリにVine Linuxをインストールしよう -- 2007-11-08
最近は低価格化がかなり進んできたUSBメモリ。最近の情勢ではようやくLinuxのディストリビューションをそのままUSBメモリに入れられるようになってきました。ちょっとしたアソビゴコロからUSBにVine Linux 4.1をインストールすることにしました。
このページは何度もVine Linuxをインストールしている人向きのページです。ちょっとしたミスで元のハードディスクの内容を壊してしまいますので自信のない人は無理は禁物!!
前提とされる知識
- Vine Linuxインストール
- grubの設定
- パーティション操作
- レスキューモードでの作業
用意したもの
- USBメモリ BUFFALO RUF2-R1G 1GB(別に何でもいいですが、アクセスが速いほうがウレシイ)
- Vine Linux 4.1インストールCD
このほかに実マシンのVine Linux 4.1(Linux環境でも可)があるとトラブル対応が楽になります。
USBメモリへのインストール
インストールは通常通りインストールプロセスで行います。ただし、起動時に
linux expert usb-storage
で起動しています。
注意点
- パーティション作成時は自動ではUSBメモリを認識してくれない場合があるのでDiskDrudを使うか、Ctrl+Alt+F2でコンソールに抜けてfdiskを使う(戻るときはAlt+F7)
- 当然、USBメモリのデバイス名を注意深く確認すること
- grubをそのままの状態ではインストールしてくれないことが多い(元のハードディスクにインストールしたがる)ので、「grubをインストールしない」オプションで進める(ひょっとしたら/dev/sda1にインストール、というオプションでもいいかもしれませんが、試してません)
インストール終了時にちょこちょこ
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のシステムが作れると思います(意味があるかどうかは不明ですが・・・)