トップ <前の日記(2007-10-31) 次の日記(2007-11-26)> 最新 編集

yaBLOG

2004|03|04|
2006|04|05|06|07|09|10|11|12|
2007|02|05|06|07|08|09|10|11|12|
2008|01|02|03|04|

2007-11-19 microSDな男たち:オレのThinkPadはゼロスピンドルッ!

_ [FreeBSD]ZFS on rootなFreeBSD環境をmicroSD上に構築してみる

今回も 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させることもできました。意味ないけど。(笑)

本日のツッコミ(全2件) [ツッコミを入れる]
_ Vflchebh (2010-02-26 06:04)

HbXdCt この間も俊太郎の詩をお http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra, =-O,

_ viagra (2010-03-08 08:31)

この間も俊太郎の詩をお, http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra,

お名前:
E-mail:
コメント:
本日のリンク元
アンテナ
検索