ZFS を NFS で export する2016年06月03日 12時35分29秒

FreeBSD 上の ZFS を NFS で公開する方法は幾つかあるようだ。zfs share を用いた方法から、/etc/export のみで行う古典的な方法などがある。

一番簡単なのは古典的な方法。/etc/export に UFS と同じように記述する。NFS v3 を用いての記述例。以下の zfs はいわゆる legacy mount 形式を使っている。

$ cat /etc/export
/mnt/zfs -alldirs -network 10.0.0.0/8
$ sh /etc/rc.d/nfsd onestart
/mnt/zfs に zfs がマウントされている。ロックなどが必要でなければ、nfsd のみ起動。
$ mount | grep zfs
zfs on /mnt/zfs (zfs, NFS exported, local, noatime, nfsv4acls)

zpool の修復を試みての結論2016年03月25日 12時36分11秒

ここ数日の間、zpool が破損して resilver を繰り返していたので、復旧を試みていた。

HRS's Web Page の ZFS のトラブル続きは結構古いが、ここが細かな説明などでも相変わらず的を得ていて、参考になる。

UFS では、fsck でかなりの問題は解決できて、それこそ書き込み中のファイルでもない限りは他所への影響は限定的だった。

ZFS では、派手な失敗を犯すと派手に壊れていくようだ。zpool status -v で影響のあったファイルを削除し、エラーが出たディレクトリを別に退避したり、バックアップのあるファイルの削除を行ったりと、回復を試みた。

最終的には、resilier を繰り返すよりも、バックアップをして、zpool を destroy で一度破壊して、再構築した方が早かった。致命的なダメージを与えた zpool は下手に、修復を試みるよりもさっさと諦めて、作り直した方が手っ取り早く、また安全。

七年近く使っていた zpool だったので、プール自体はそのまま保持しようと思ったのと、折角なので zpool を観察してみたかったのもある。そこでの最終結論は上記の通り。派手に壊れた zpool は再構築が一番。

FreeBSD の USB 接続の注意点2016年03月16日 09時22分42秒

FreeBSD で外付けのハードディスクを幾つか使っている。そのなかで起きた問題は大きく分けて三つ。
  1. USB を抜く時に隣の線を動かして、一時的に断線する。
  2. 外付けの電源が抜けてしまい停止する。
  3. USB を抜いた時にバスのスキャンが掛かり、デバイスが一時的に外れてしまう。

最初のは人為的なミス。気を付けはしているが、どうしても避けられない。動作中に機械を動かしたり、接続し直したりするときに間違って起きたり、スイッチが意図に反して切れてしまったりする。

三つ目は抜き差しを繰り返したり、二台、三台と USB 機器を接続していると起きるようだ。必ず起きるわけでは無いが、起きると困るので、ファイルを移動しているときなどは慎重になるようになった。

これらで、ZFS も UFS も落したことがあるが、UFS の方が障害時に安全で被害も少ないのが個人的な印象。ただ、UFS は一デバイスに収まっているので、被害が限定的になりやすいのも事実。UFS は作業中のファイルだけが壊れ、時間こそ掛かるが、fsck でほぼ事足りる。ZFS は柔軟で拡張性も高いが、raidz でも複数のデバイスが一気に落ちると、自動修正の所為で逆に脆いようだ。デバイスが一気に消えて、一部の繋がっているデバイスで更に無理をしようとするので、触っていないファイルまで被害が及んだりする。その後の scrub 等が厄介だ。

個人的な利用の範囲なので、それなりに偏った環境だとは思う。だが、逆にスナップショットや raidz で、複数の履歴を保持しているZFS でこそバックアップをしっかり取っておきたいと思う。

zfs send でスナップショットを一気に送る2016年02月29日 13時33分29秒

zfs send で一気に送ったファイルシステムもあれば、全てのスナップショットを複製したい場合もある。そんな時に使うのが大文字の -I オプション。二つの間にあるスナップショットの全てを一度に移動できる。ただし、これは必ず二つスナップショットを指定しないといけないので、最初のスナップショットは別に送る必要がありそうだ。当該機は、FreeBSD 10.2-RELEASE。

年に一つ、二つ保存しているファイルシステムをこのように送れる。-n を使って、試行。

# zfs send -n -v -I 2010_02_27 zfs/export@2015_11_23
send from @2010_02_27 to zfs/export@2012_07_22 estimated size is 61.2G
send from @2012_07_22 to zfs/export@2013_11_21 estimated size is 15.3G
send from @2013_11_21 to zfs/export@2014_07_20 estimated size is 9.17G
send from @2014_07_20 to zfs/export@2014_11_21 estimated size is 1.71G
send from @2014_11_21 to zfs/export@2015_02_24 estimated size is 2.25G
send from @2015_02_24 to zfs/export@2015_07_20 estimated size is 3.79G
send from @2015_07_20 to zfs/export@2015_11_23 estimated size is 2.44G
total estimated size is 95.8G

実際に送るときは、二段回式。

# zfs send zfs/export@2010_02_27 | zfs receive bkup/export@2010_02_27
# zfs send -I 2010_02_27 zfs/export@2015_11_23 | zfs receive bkup/export
一つ目のコマンドと、二つ目のコマンドでは receive の方の引数が、若干変わる。

zpool で zfs プールの名前を変更2016年02月25日 13時43分43秒

zfs send で二つの zpool を統合した。広くした「bkup」プールに普段用の「zfs」から、ファイルシステムを移動した。実は ZFS のプールの名前が「zfs」だと、慣れていないと混乱しやすくなる。何はともあれ、私的利用には以前の利用形式の「zfs」プール名がいい。

zfs にはファイルシステムの名前を変更する zfs rename がある。zpool には rename コマンドは存在しないが、zpool import を用いて名前を変更することが出来る。

注意点としては、

  • 新旧のプール名は export しておく。
  • zfs でマウントポイントの変更を忘れないように。
  • マウントポイントを変える前に zfs unmount が必要。
等がある。

「bkup」プールを「zfs」プールに名前を変更して、/mnt/zfs にマウントポイントを替える。zpool import の第一引数は現在のプールの名前で、第二引数は新しいプールの名前になる。

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
bkup  1.82T  1.59T   239G         -      -    87%  1.00x  ONLINE  -
zfs    698G   578G   120G         -      -    82%  1.00x  ONLINE  -
# zpool export zfs
# zpool export bkup
# zpool import bkup zfs
# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zfs   1.82T  1.59T   239G         -      -    87%  1.00x  ONLINE  -
# zfs set mountpoint=zfs zfs
cannot set property for 'zfs': 'mountpoint' must be an absolute path, 'none', or 'legacy'
# zfs set mountpoint=/mnt/zfs zfs
作業は FreeBSD 10.2-RELEASE で行ったが、zpool と zfs のコマンドはどこでも共通。

zfs send でファイルシステムを複製する2016年02月24日 12時40分33秒

zfs send と zfs receive は、旧来の dump と restore に相当するもの。zfs send でバックアップを取り、zfs receive で復元する。

以前はこのコマンドはスナップショットしか取れなかったが、FreeBSD 10.2-RELEASE の物は、ファイルシステムや、ボリュームも複製できるようになっている。「--head--」と呼ばれるスナップショットが作られて、それが送られる形だ。また、スナップショット用の zfs send と違い、ファイルシステムはマウントされていてはいけない。

# zfs send zfs/pict | zfs receive -n -v bkup/pict
warning: cannot send 'zfs/pict': target is busy; if a filesystem, it must not be
 mounted
cannot receive: failed to read from stream

写真がたまって手狭になった zfs プールの pict ファイルシステムを拡張した bkup プールに移動する。

# zfs send zfs/pict | zfs receive -v bkup/pict
receiving full stream of zfs/pict@--head-- into bkup/pict@--head--
received 256GB stream in 15303 seconds (17.1MB/sec)
# zfs list -t all
NAME                     USED  AVAIL  REFER  MOUNTPOINT
...
bkup/pict                253G   131G   253G  /mnt/bkup/pict
bkup/pict@--head--          0      -   253G  -
,,,
zfs/pict                 262G  98.7G   254G  /mnt/zfs/pict
zfs/pict@2015_11_14     8.71G      -   236G  -
見ての通り、「--head--」タグが残るのは受信側だけのようだ。また、この方法ではスナップショットが保存されていないのが分かる。

zpool を拡張し、新たな容量を確保2016年02月23日 13時30分04秒

zpool のデバイスを交換した。五年ぐらい前には zpool replace をして、新しいディスクの容量が大きければ、自動的に大きくなっていたのを覚えているが、最近の ZFS は動作が変わったようだ。FreeBSD 10.2-RELEASE を用いている。

zpool には autoexpand と言う属性がある。初期値は off になっている。これを on にすると、ディスクが交換された時に、新たな容量が利用可能になっていると、自動的に認識して容量が拡大される。mirror や raidz の時にはそれぞれの領域が拡張可能にならないと利用可能にならない。off の時は、zpool online -e にて拡張できる。

zpool list でどれだけ利用可能か調べられる。932GB 程広げられるようになった。

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
bkup   931G   692G   239G      932G      -    74%  1.00x  ONLINE  -
$ zpool status
  pool: bkup
 state: ONLINE
status: ...
action: ...
  scan: resilvered 16 in 7h56m with 0 errors on Mon Feb 22 00:53:02 2016
config:

        NAME              STATE     READ WRITE CKSUM
        bkup              ONLINE       0     0     0
          raidz1-0         ONLINE       0     0     0
            gpt/zfs5       ONLINE       0     0     0
            gpt/zfs6       ONLINE       0     0     0
            gpt/zfs3       ONLINE       0     0     0
            gpt/zfs7       ONLINE       0     0     0
raidz 編成でどのデバイスに対して online を行えば分からなかったので、取り敢えず一番最初の物に。
# zpool online -e bkup gpt/zfs5
# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
bkup  1.82T   692G  1.14T         -      -    37%  1.00x  ONLINE  -
無事に拡張できたようだ。

zpol resilver が一旦停止している2016年02月22日 07時01分07秒

ZFS の zpool replace でディスクを交換している。現在利用中なのは FreeBSD 10.2-RELEASE。終っていないはずなのに、ディスクのランプが付いていない。

zpool status を見てみると、resilvering とは出ているものの iostatsystat -vm では IO が止まっている。

何度か、ランプの点灯が止まっているのに気が付いた。zpool status を行ったら、resilver が動き出した様だ。I/O やシステムのエラーは一つも出ていない。

しばらく見ていると、zpool status を行う度に、resilver が再開している。ただ、残念なことに zpool status が確実に再開させられるようではないみたいだ。取り敢えず、一時凌ぎには使えるようだ。

ZFS で複数のデバイスを replace するのなら一度に全て2016年02月21日 13時25分13秒

ZFS のプールを扱う zpool には replace コマンドがある。稼働中のディスクを交換するためのコマンドだ。

ディスク容量の拡張などで、ディスクの交換をする。raidz では最低四台のディスクが必要になるし、mirror 等の構成でも二台からになる。特に raidz を用いている場合の容量は、最小のディスクサイズが元になるので、無駄なく使うにはディスクの大きさを揃えることになる。そして、拡張するには全てを交換することになる。

FreeBSD 10.2-RELEASE で実験してみたところ、zpool replace は複数のディスクを同時に交換することが出来る。そして、replace の作業は scrub の作業を行いつつデータを新しいディスクに移す作業のようだ。複数の replace の要求があると、replace を同時に進める。結局やることは scrab とデータの書き出しなので、恐らく同時に進めるのが実装的に一番簡単なのだろう。逆に、同時に進めるために、二つめの replace の要求をすると、一つ目が停止し、最初から同時に再開となる。

四つのデバイスを使った構成で raidz を構築している。今回、容量の拡張で、二つのデバイスを同時に変更、そして、一時的なデータ領域の移動に一つをファイルに移している。

# zpool status
  pool: bkup
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat Feb 20 22:37:02 2016
        9.00G scanned out of 692G at 13.3M/s, 14h38m to go
        6.53G resilvered, 1.30% done
config:

        NAME                    STATE     READ WRITE CKSUM
        bkup                    ONLINE       0     0     0
          raidz1-0              ONLINE       0     0     0
            replacing-0         ONLINE       0     0     0
              gpt/zfs1          ONLINE       0     0     0
              gpt/zfs5          ONLINE       0     0     0  (resilvering)
            replacing-1         ONLINE       0     0     0
              gpt/zfs2          ONLINE       0     0     0
              gpt/zfs6          ONLINE       0     0     0  (resilvering)
            gpt/zfs3            ONLINE       0     0     0
            replacing-3         ONLINE       0     0     0
              gpt/zfs4          ONLINE       0     0     0
              /mnt/ufs/bkup.zfs ONLINE       0     0     0  (resilvering)
USB-2.0 が限界の HP Pavilion dv6426us で 2GB のメモリで動いている為、速度は遅い。32bit CPU なので、i386 カーネルの zfs。

尚、replace の速度は、IO やバスの制限は掛かるものの、replace 自体の速度は何台同時に変えていても、大きな変化は無いようだ。一台の時と、三台のときでは一割り程度しか変わっていない。そして、scarb の時間は利用量に影響されるので、必要のないファイルは replace の前に消しておくと時間の節約になる。

FreeBSD で msdosfs を小文字で2015年11月27日 16時43分53秒

msdosfs、つまり FAT ファイルシステムを FreeBSD でマウントすると全てが大文字で出てくる。この動作は FAT ファイルシステムの長いファイル名と大文字小文字の区別が無い為のようだが、小文字で表示した方が見やすい。

取り敢えず、-s オプションを使うと良いようだ。

$ mount_msdosfs -s /dev/da0s1 /mnt/msdos
$ ls /mnt/msdos
dcim