[zfs] どこにも mount されていないのに zfs snapshot が取れない件

| トラックバック(0)

Nevada と OpenSolaris 2008.05 の multiboot 環境で遭遇した現象。
Nevada を起動して使っている時に rpool/ROOT/opensolaris の snapshot をとろうと実行するも、

# zfs snapshot rpool/ROOT/opensolaris@test
cannot snapshot 'rpool/ROOT/opensolaris@test': dataset is busy
なんて言われて、snashot が作成できません。
この領域は mount されているわけでもなく、rpool/ROOT/opensolaris/opt などの snapshot は取得できます。
Nevada 側からすると、rpool/ROOT/opensolaris には何もしていないわけで。。。うむぅ

と、いろいろと調べてみると、claim_txg という値が 0 じゃないと snapshot とれないらすぃ。
http://www.opensolaris.org/jive/thread.jspa?messageID=36229#36229

claim_txg って何?って調べてみると、ZIL (ZFS Intent Log) 関連らしい。
とにかく、こいつを 0 にしてあげればいいとのこと。
0 にするには、手動で mount/unmount すればいいとのことで、さっそくやってみる。
手動マウントは、
# zfs set mountpoint=legacy rpool/ROOT/opensolaris
# mount -F zfs rpool/ROOT/opensolaris/mnt
# umount /mnt
そして、zfs snapshot を実行すると、見事に snapshot げっつ。
これかっ。これなのかっ!

解決はしたものの、claim_txg が 0 にならず snapshot が取れないという事象は、発生のタイミングもわからないので、今後に備えてなんとかこの値を目で確認することができるようにしておかないと。

というわけで、claim_txg を手っ取り早く確認する方法は、debugger のような名前でスルーしたくなるのですが、その名も zdb (zfs debugger)コマンドでみることができます。
log 関係の情報なので -i オプションですが、これに -v をつけないと claim_txg まで表示してくれません。
zfs pool である rpool の情報をみてみましょう。
# zdb -iv rpool
Dataset mos [META], ID 0, cr_txg 4, 22.8M, 236 objects
Dataset rpool/swap [ZVOL], ID 28, cr_txg 15, 1.24M, 3 objects

ZIL header: claim_txg 0, seq 0

Dataset rpool/export/home [ZPL], ID 57, cr_txg 79, 15.3G, 25059 objects

ZIL header: claim_txg 0, seq 0

TX_WRITE len 208, txg 23834, seq 2489
Total 1
TX_WRITE 1

Dataset rpool/export [ZPL], ID 51, cr_txg 76, 19.0K, 5 objects

ZIL header: claim_txg 0, seq 0

Dataset rpool/ROOT/snv_92 [ZPL], ID 45, cr_txg 69, 5.61G, 255862 objects

ZIL header: claim_txg 20398, seq 0

Dataset rpool/ROOT/newBE [ZPL], ID 91, cr_txg 1505, 4.38G, 264278 objects

ZIL header: claim_txg 22972, seq 0

Dataset rpool/ROOT/snv_93@newBE [ZPL], ID 86, cr_txg 1503, 5.59G, 255520 objects
Dataset rpool/ROOT/snv_93@snv_93 [ZPL], ID 151, cr_txg 18978, 5.61G, 255860 objects
Dataset rpool/ROOT/snv_93 [ZPL], ID 169, cr_txg 18980, 6.90G, 271280 objects

ZIL header: claim_txg 0, seq 0

Dataset rpool/ROOT/opensolaris/opt@install [ZPL], ID 220, cr_txg 21581, 3.60M, 1136 objects
Dataset rpool/ROOT/opensolaris/opt [ZPL], ID 217, cr_txg 21576, 211M, 8287 objects
Dataset rpool/ROOT/opensolaris@install [ZPL], ID 209, cr_txg 21566, 2.22G, 98752 objects
Dataset rpool/ROOT/opensolaris [ZPL], ID 195, cr_txg 21523, 2.24G, 99912 objects
Dataset rpool/ROOT [ZPL], ID 22, cr_txg 12, 18.0K, 4 objects
Dataset rpool/dump [ZVOL], ID 34, cr_txg 18, 1.48G, 3 objects
Dataset rpool [ZPL], ID 5, cr_txg 4, 116K, 39 objects

ZIL header: claim_txg 0, seq 0
むむ。rpool/ROOT/opensolaris は、 0 になっていますね。なるほど。

で、rpool/ROOT/snv_92 と newBE の 2 つが 0 じゃないですね。
snapshot を取ってみると、見事に dataset is busy となりやがります。
というわけで、先ほどの Workaround を実行してみる。
# zdb -iv rpool/ROOT/newBE
Dataset rpool/ROOT/newBE [ZPL], ID 91, cr_txg 1505, 4.38G, 264278 objects

ZIL header: claim_txg 22972, seq 0

# mount -F zfs rpool/ROOT/newBE /mnt
# ls /mnt
./ a/ cdrom/ etc/ kernel/ mnt/ platform/ root/ system/ var/
../ bin@ dev/ export/ lib/ net/ proc/ rpool/ tmp/
BE_newBE boot/ devices/ home/ media/ opt/ rmdisk/ sbin/ usr/
# umount /mnt
# zdb -iv rpool/ROOT/newBE
Dataset rpool/ROOT/newBE [ZPL], ID 91, cr_txg 1505, 4.38G, 264278 objects

ZIL header: claim_txg 0, seq 0


で、snapshot 取れるようになりました。めでたしめでたし。
ちょいと、頭の隅にいれとかないといけないような感じですね。

トラックバック(0)

トラックバックURL: http://solaris.sunfish.suginami.tokyo.jp/blog/mt/mt-tb.cgi/606

: Twitter Updates

    follow me on Twitter

    ウェブページ

    タグクラウド

    Techonrati

    Technorati search

    » リンクしているブログ

    Powered by Movable Type 4.23-ja