mirror作成 on FreeBSD ZFS

eSATAのディスクとボードを買った。

OSが起動している状態で差し込むと、あっさりad4として認識。ホットスワップも完全なようす。

atapci0: <SiI 3124 SATA300 controller> port 0xd000-0xd00f mem
0xd8094000-0xd8094
07f,0xd8080000-0xd8087fff irq 16 at device 1.0 on pci1
atapci0: [ITHREAD]
ata2: <ATA channel 0> on atapci0
ata2: [ITHREAD]
ata3: <ATA channel 1> on atapci0
ata3: [ITHREAD]
ata4: <ATA channel 2> on atapci0
ata4: [ITHREAD]
ata5: <ATA channel 3> on atapci0
ata5: [ITHREAD]
        (snip)
ad4: 476940MB <SAMSUNG HA500LJ CW300-11> at ata2-master SATA150

ということで、内蔵RAIDなんてなんのその、ZFSでmirrorしてみる。

現状

 pool: zpool_lo
 state: ONLINE
 scrub: none requested
 config:
        NAME        STATE     READ WRITE CKSUM
        zpool_lo    ONLINE       0     0     0
          ad0s1e    ONLINE       0     0     0

ストレージプールにad4を追加

  % sudo zpool add zpool_lo ad4
  % zpool status
 pool: zpool_lo
 state: ONLINE
 scrub: none requested
 config:

        NAME        STATE     READ WRITE CKSUM
        zpool_lo    ONLINE       0     0     0
          ad0s1e    ONLINE       0     0     0
          ad4       ONLINE       0     0     0

簡単に追加できた。

が、しかし、一度追加してらもう戻せなくなってしまった…

  %sudo zpool remove zpool_lo ad4
  cannot remove ad4: only inactive hot spares can be removed

そういえば、追加は簡単にできるがshrinkはできないんだった。orz

send/recv作戦発動

というわけで、sendしてスナップショットを退避させ、作業した後にrecvで戻す作戦を実施

send
 % zfs snapshot zpool_lo/home@20070123
 % zfs send zpool_lo/home@20080123 | ssh backup.jp "cat > /home/faw/zfs_snapshots/home-20080123.zfssnap"
ここでかなり時間がかかる(16Gあるし)ので、その間した作業の差分を再度送る
 % zfs snapshot zpool_lo/home@20070123-2
 % zfs send -i zpool_lo/home@20080123 zpool_lo/home@20070123-2 | ssh backup..jp "cat > /home/faw/zfs_snapshots/home-20080123-2.zfssnap"

ちなみに、zfsがだめだった場合に備えて、単なるtarでもバックアップを取っておいた。

ここで、念のためsingle user modeに落ちる。

 % sudo shutdown now
zpoolの破棄/再構築
 # zpool destroy zpool_lo  <- 破棄
 # zpool create zpool_lo mirror ad01e ad4
今度はちゃんとmirrorをつけること

ad4とかしちゃったんだけど、そうすると、

 # zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
zpool_lo                 50G   24.2G   25.8G    48%  ONLINE     -

ん?500G追加したんだけど、50Gになってる。って、当たり前。mirrorなんだから小さい方に合わせられちゃうよな、ふつー。

というわけで、慌ててfdiskでad4s1を作る。おばかさんですなぁ。

 # zpool create zpool_lo mirror ad01e ad4s1
 # zpool status
 pool: zpool_lo
 state: ONLINE
 scrub: none requested
 config:

        NAME        STATE     READ WRITE CKSUM
        zpool_lo    ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            ad0s1e  ONLINE       0     0     0
            ad4s1   ONLINE       0     0     0
スナップショットのrecv
  # scp faw@backup.jp:/home/faw/zfs_snapshots/home-20080123.zfssnap .
  # zfs recv zpool_lo/home < home-20080123.zfssnap
  # zfs recv zpool_lo/home < home-20080123-2.zfssnap

たぶんsshで送りながらでもできるだろうけど、念のためローカルにコピってからrecv。ちなみに、先にzfs create zpool_lo/homeとかやっておくと怒られる。

ちなみにかかった時間。

  • 16.5Gのスナップショットをrecvするのにかかった時間
    • 0.01s user 161.85s system 20% cpu 13:11.55 total
  • 7.7Gの増分スナップショットをrecvするのにかかった時間
    • 0.02s user 91.38s system 16% cpu 9:00.93 total

なんで増分なのにこんなにでかいかというと、tarでバックアップを取ったのを消し忘れてたから。

まとめ

  • mirrorじゃないものにzpool addする(容量増設)と戻せないよ
  • mirrorすると容量が少ない方に合わさってしまうよ
  • send/recvはかなりいけてる。完璧に復元した
    • 時間も現実的な時間