今回も microSD & ZFS ネタ。前回はmicroSDを使って世界最小のZFSストレージに挑戦してみたけど、今回は世界最小の Bootable ZFS 環境を作ってみよう。当然 ZFS on root 採用で。
とはいえ、BIOSとカードリーダーが対応さえしていれば、microSDをブートデバイスにするのは意外と簡単。順を追って説明していこう。 (2008/3/11追記: 比較的新しいマシンでは、USBからbootしようとすると"BTX Halted"となって失敗することがあるようだ。これに対する修正が3/10に-currentにcommitされたので、最新のソースを取得して cd /usr/src/sys/boot && make install をしておこう。)
まず、buildworld & buildkernelでFreeBSD環境をビルドしておく。もちろんバージョンは7.0以降が必須。
~# cd /usr/src /usr/src# make buildworld /usr/src# make buildkernel KERNCONF=SDKERNEL
この例で使用したカーネルビルドファイルSDKERNELは、基本的にGENERICとほとんど同じもので構わない。ただし、"makeoptions DEBUG=-g" の部分だけはコメントアウトしておこう。そうしないと、シンボルファイルで容量が膨れ上がってしまう。もっと容量を節約したい場合は、buildkernelに MODULES_OVERRIDE="acpi zfs tmpfs" といったオプションを付けて、必要最低限のカーネルモジュールだけを作るといった方法もある。
ビルドが出来たら、microSDをPCに挿してファイルシステムを作っていこう。
~# fdisk -BI /dev/da0 ~# cat sdlabel.txt 8 partitions: # size offset fstype a: 200000 0 unused c: * 0 unused d: * * unused ~# bsdlabel -RB /dev/da0s1 sdlabel.txt
とりあえずこんな感じでパーティションを切っておく。da0s1aが約100MBで、da0s1dが残りとなる。これでも一応、GENERICカーネル(DEBUGオプションなし) + 全カーネルモジュールは十分入る。
続いて、ZFSのセットアップをする。
~# zpool create sdpool da0s1d ~# zfs set atime=off sdpool ~# zfs set compression=gzip sdpool ~# zfs create sdpool/usr ~# zfs create sdpool/var ~# zfs create sdpool/home
さらに、カーネルを置くUFSパーティションも準備しよう。シンボリックリンクの張り方がポイント。
~# newfs /dev/da0s1a ~# mkdir /sdpool/bootdir ~# mount /dev/da0s1a /sdpool/bootdir ~# mkdir /sdpool/bootdir/boot ~# ln -s bootdir/boot /sdpool/boot
ここまで準備できたら、いよいよFreeBSD本体のインストールだ。MODULES_OVERRIDEを指定していた場合は、installkernelにも同じオプションを付けるのを忘れずに。
~# cd /usr/src /usr/src# make installkernel KERNCONF=SDKERNEL DESTDIR=/sdpool /usr/src# gzip -9 /sdpool/boot/kernel/kernel /usr/src# make installworld DESTDIR=/sdpool /usr/src# mergemaster -i -D /sdpool
次に、以下のようにして、ZFS側の / の内容をUFS側にコピーしよう。
~# cd /sdpool && pax -rwkXpe . bootdir
コピーが出来たら、設定ファイルを修正する。
~# echo 'zfs_load="YES"' > /sdpool/boot/loader.conf ~# echo 'zfs_enable="YES"' > /sdpool/etc/rc.conf ~# echo "sdpool / zfs rw,noatime 0 0" > /sdpool/etc/fstab ~# echo "/dev/da0s1a /bootdir ufs rw,noatime 1 1" >> /sdpool/etc/fstab ~# echo "tmpfs /tmp tmpfs rw 0 0" >> /sdpool/etc/fstab ~# echo "/dev/da0s1a / ufs rw,noatime 1 1" > /sdpool/bootdir/etc/fstab ~# umount /sdpool/bootdir ~# zpool export sdpool
boot/loader.conf, etc/rc.conf, etc/fstab, bootdir/etc/fstab の内容を上記のように設定したら、母艦側での作業は終了だ。
さっそくPCをリセットして、microSDから起動させてみよう。最初は、ブートメニューでは "4" を押してシングルユーザーモードで立ち上げておくこと。
そうすると、まずUFS側(da0s1a)がルートファイルシステムとなって立ち上がるはずだから、以下のコマンドを順に実行して、ZFS環境の最後の調整をする。
# mount -u / # zpool import sdpool # zfs set mountpoint=/usr sdpool/usr # zfs set mountpoint=/var sdpool/var # zfs set mountpoint=/home sdpool/home # zfs set mountpoint=legacy sdpool # echo 'vfs.root.mountfrom="zfs:sdpool"' >> /boot/loader.conf # reboot
これで、次にmicroSDから起動させればそこはもう ZFS on root な世界。心ゆくまでZFS環境を満喫しよう。
以下は1GBのmicroSDにインストールした直後の結果。まだたっぷり空きはあるので、いろんなアプリケーションを追加することができるね。
microsd# mount sdpool on / (zfs, local, noatime) devfs on /dev (devfs, local) /dev/da0s1a on /bootdir (ufs, local, noatime) tmpfs on /tmp (tmpfs, local) sdpool/home on /home (zfs, local, noatime) sdpool/usr on /usr (zfs, local, noatime) sdpool/var on /var (zfs, local, noatime) microsd# df Filesystem 1K-blocks Used Avail Capacity Mounted on sdpool 795264 7296 787968 1% / devfs 1 1 0 100% /dev /dev/da0s1a 96654 44938 43984 51% /bootdir tmpfs 1442524 4 1442520 0% /tmp sdpool/home 787968 0 787968 0% /home sdpool/usr 852352 64384 787968 8% /usr sdpool/var 788096 128 787968 0% /var microsd# zfs list NAME USED AVAIL REFER MOUNTPOINT sdpool 70.5M 770M 7.17M legacy sdpool/home 18K 770M 18K /home sdpool/usr 63.0M 770M 63.0M /usr sdpool/var 143K 770M 143K /var microsd# zfs get compressratio NAME PROPERTY VALUE SOURCE sdpool compressratio 2.28x - sdpool/home compressratio 1.00x - sdpool/usr compressratio 2.28x - sdpool/var compressratio 3.76x -
ちなみに、今日の日記タイトルの元ネタはコレ。一応、ThinkPadのHDDを外してmicroSDのみの状態からbootさせることもできました。意味ないけど。(笑)
HbXdCt この間も俊太郎の詩をお http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra, =-O,
この間も俊太郎の詩をお, http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra,