ZFSのvolumeをメンテナンスしてみる

自宅で使っているFreeBSD 9-CURRENTのサーバーは、1日2回rsyncでmaster(ZFSで運用)とslave(ufs2で運用)の同期を取っているんだけど、なんか突然masterとslaveのサイズが突然狂い、masterのディスク容量が300GB近く減ってしまい、謎な状態になってしまった。

FreeBSDといえばnorkさん:-) ということで、アドバイスを貰いながら調査開始。現状は、
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
tank 76828570 236367 76592202 0% /
devfs 1 1 0 100% /dev
tank/home 457538808 380946606 76592202 83% /home
tank/tmp 76598820 6618 76592202 0% /tmp
tank/usr 80612883 4020681 76592202 5% /usr
tank/var 76933828 341626 76592202 0% /var
devfs 1 1 0 100% /var/named/dev
/dev/ada1s1a 10154158 763750 8578076 8% /backup
/dev/ada1s1d 50777034 360384 46354488 1% /backup/var
/dev/ada1s1e 101554150 3929868 89499950 4% /backup/usr
/dev/ada1s1f 306459988 83787410 198155780 30% /backup/home
こんな感じ。次に、snapshotをとっていないか確認。

# zfs list -t snapshot
no datasets available
特にとってない。次に、

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 384G 73.0G 231M legacy
tank/home 363G 73.0G 363G /home
tank/swap 16G 89.0G 2.38M -
tank/tmp 6.46M 73.0G 6.46M /tmp
tank/usr 3.83G 73.0G 3.83G /usr
tank/var 334M 73.0G 334M /var
やっぱり問題がなさそうだ。続いて、

# du -sh /home
85G /home

ここで、やはりおかしい結論に。/、/var、/usr、/tmpに関しては、ほぼ同じ数値を出しているのに、/homeだけ、dfで見たサイズとduで見たサイズが明らかに違う。ここで、volumeを作り直してみたら? という事で、

シングルユーザーモードに持って行き、
# zfs rename tank/home tank/home.bak
# zfs set mountpoint=/home.bak tank/home.bak
# zfs create tank/home
# zfs set mountpoint=/home tank/home
と実行し、従来のvolume(tank/home)をtank/home.bak として/home.bakでマウント可能に、新しいvolumeをtank/homeとし、/homeでマウントできるように変更。

次に、
# cd /home.bak
# pax -rwvpe . /home/
として、コピーすることに。そしたら、コピー途中で/homeがいわゆるfile system full状態になる。まずい、と思ったけど、コピー対象の中にISO Imageとかあり、そいつは/backupの中にあるので、ここは思い切って消してしまい、再度コピー開始。
すると、自分のホームディレクトリの~/.spamassassin/ の中に、bayes_seen.なんとか っていう、ものすごい巨大なファイルが有ることを発見。どうも、ものすごい巨大になりすぎて、rsyncでもコピー不可能なサイズに膨れ上がったのも1つの原因っぽい。って事で、rm して解決か、と思いきや、やっぱりサイズが変わらない・・・。

しょうがないので、このファイルを消した状態で最後までコピーし、最後に
# zfs destroy tank/home.bak
したら、ごりごりとHDDと書きに行ったあとで終了。最後に、バックアップからISO-imageを書き戻し、再起動して終了。

終わった後のサイズは、
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
tank 373903045 236367 373666678 0% /
devfs 1 1 0 100% /dev
tank/home 457541099 83874421 373666678 18% /home
tank/tmp 373673292 6614 373666678 0% /tmp
tank/usr 377687364 4020686 373666678 1% /usr
tank/var 374011986 345308 373666678 0% /var
devfs 1 1 0 100% /var/named/dev
/dev/ada1s1a 10154158 763750 8578076 8% /backup
/dev/ada1s1d 50777034 360384 46354488 1% /backup/var
/dev/ada1s1e 101554150 3929868 89499950 4% /backup/usr
/dev/ada1s1f 306459988 83787410 198155780 30% /backup/home

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 100G 356G 231M legacy
tank/home 80.0G 356G 80.0G /home
tank/swap 16G 372G 2.39M -
tank/tmp 6.46M 356G 6.46M /tmp
tank/usr 3.83G 356G 3.83G /usr
tank/var 337M 356G 337M /var

# du -sh /home
80G /home

ってことで問題なし。なぜ、bayes_seen.なんとかっていう巨大なファイルができて、そいつが悪さをしたのかは謎だけど、まぁとりあえず復旧したので良しとするか。

ちなみに、zfsのpoolのメンテナンスには、
# zpool scrub tank
とかやって、いわゆるfsck相当の事をしてみたりもできる。

詳しくは、sunのサイトのzfs(1M)とか、zpool(1M)を見るといいんじゃないかな。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント