BSD界隈四方山話

第126回つかってみようHAMMER1ファイルシステム

HAMMER1ファイルシステム

前回はHAMMER2ファイルシステムの使い方を紹介しました。HAMMER2ファイルシステムはそろそろ本格的に使えそうな感じになってきていますが、クラスタリング系の機能はまだとされていますし、HAMMER1ファイルシステムで使えたいくつかの機能は使えなくなっています。HAMMER2ファイルシステムがより完成形に近づくまでHAMMER1ファイルシステムを使うというのはひとつの手ではあります。

HAMMER2とHAMMER1は利用するコマンドが違います。まず、HAMMER1ファイルシステムとして利用したい領域をnewfs_hammer(8)コマンドでフォーマットします。-Lでラベルを指定する必要があります。newfs_hammer(8)コマンドでフォーマットを実施すると次のようになります(もちろん対象領域のデータは消えますので注意してください⁠⁠。

 newfs_hammer(8)コマンドでHAMMER1ファイルシステムとしてフォーマット
dfly50# newfs_hammer -L HAMMER1 /dev/da1s0
Volume 0 DEVICE /dev/da1s0      size  20.00GB
initialize freemap volume 0
initializing the undo map (512 MB)
---------------------------------------------
HAMMER version 7
1 volume total size  20.00GB
root-volume:         /dev/da1s0
boot-area-size:       32.00KB
memory-log-size:     256.00KB
undo-buffer-size:      0.50GB
total-pre-allocated:   0.52GB
fsid:                20dc7878-d30a-11e7-84f4-010c290d16d7

NOTE: Please remember that you may have to manually set up a
cron(8) job to prune and reblock the filesystem regularly.
By default, the system automatically runs 'hammer cleanup'
on a nightly basis.  The periodic.conf(5) variable
'daily_clean_hammer_enable' can be unset to disable this.
Also see 'man hammer' and 'man HAMMER' for more information.

WARNING: HAMMER filesystems less than 50GB are not recommended!
You may have to run 'hammer prune-everything' and 'hammer reblock'
quite often, even if using a nohistory mount.
dfly50#

HAMMER1ファイルシステムでフォーマットした領域はmount_hammer(8)コマンドでマウントします。次のようにHAMMER1とHAMMER2は別のファイルシステムとして区別されていることを確認できると思います。下記の例だと/はHAMMER2ファイルシステム、/mntはHAMMER1ファイルシステムになっています。

 HAMMER1とHAMMER2はこのように別のファイルシステムとして認識されている
dfly50# mount_hammer /dev/da1s0 /mnt
dfly50# mount
da0s1d on / (hammer2, local)
devfs on /dev (devfs, nosymfollow, local)
/dev/da0s1a on /boot (ufs, local)
/build/usr.obj on /usr/obj (null)
/build/var.crash on /var/crash (null)
/build/var.cache on /var/cache (null)
/build/var.spool on /var/spool (null)
/build/var.log on /var/log (null)
/build/var.tmp on /var/tmp (null)
tmpfs on /tmp (tmpfs, local)
procfs on /proc (procfs, local)
HAMMER1 on /mnt (hammer, noatime, local)
dfly50#

HAMMER1で使えた機能でHAMMER2でなくなってしまったものに「undo(1)」というコマンドがあります。そのうちHAMMER2でも使えるようになるかもしれませんが、試したかぎりでは今のところHAMMER1ファイルシステムでのみサポートされているようです。

これは名前のとおり、ファイルシステムに対して行われた変更をアンドゥするというものです。将来にわたってバックアップとして必要という場合には定期的にスナップショットを取る必要がありますが、一瞬前に間違えて実施してしまった操作をなかったことにするなら、このundo(1)コマンドが利用できます。

たとえば、次のようにデータファイルがあったとします。

 データファイルの存在を確認
dfly50# ls -alh
total 17
drwxr-xr-x  1 root  wheel     0B Nov 27 09:33 .
drwxr-xr-x  1 root  wheel     0B Nov 25 01:04 ..
-r--r--r--  1 root  wheel    13K Nov 27 09:32 data.txt
dfly50#

このデータファイルを削除してみます。当然、削除したファイルはlsで確認しても表示されません。

 削除したファイルはもう表示されない
dfly50# rm data.txt
dfly50# ls -al
total 1
drwxr-xr-x  1 root  wheel  0 Nov 27 09:33 .
drwxr-xr-x  1 root  wheel  0 Nov 25 01:04 ..
dfly50#

しかし、HAMMER1ファイルシステムではundo(1)コマンドが使えますので、この消えてしまったファイルを元に戻すことが可能です。次のように引数にパスを指定してundo(1)コマンドを実行すれば失われたデータを戻すといった動作をさせることができます。

 undo(1)コマンドで元に戻す
dfly50# undo data.txt > data.txt.org
dfly50# ls -alh
total 17
drwxr-xr-x  1 root  wheel     0B Nov 27 09:35 .
drwxr-xr-x  1 root  wheel     0B Nov 25 01:04 ..
-rw-r--r--  1 root  wheel    13K Nov 27 09:34 data.txt.org
dfly50#

操作を間違えてうっかり必要なファイルを削除してしまうことは誰しも経験のあることではないかと思います。削除したことがなくても、削除しそうになってヒヤッとした経験はあるのではないでしょうか。

HAMMER1ファイルシステムとundoコマンドを使うとそんなときになんとか原状復帰させることが可能になります。ヒヤッとしたときにこの機能は心強いものです。もしもこうした凡ミスが多いというのであれば、DragonFly BSDをいれてHAMMER1ファイルシステムで使ってみるというのはいいアイディアかもしれません。使ったことがないのであれば、一度使ってみてはいかがでしょうか。

FreeBSD勉強会

12月7日(木)19:00~ 第68回 BSDTW 2017から注目点紹介+α(ヴァル研 セミナールーム)

2017年11月11~12日に台湾の台北において開催された「BSDTW 2017」の発表内容を要点をしぼって紹介します。日本国外で開催される*BSDカンファレンスとしてはもっとも楽に参加できるカンファレンスでしょう。来年以降の開催時期はまだ決まっていませんが、飯もうまいし参加するにはいいカンファレンスです。どのような発表が行われたのかぜひ聞いていってください。

本勉強会への参加者には抽選か勝ち抜きかでデーモンTシャツなどのグッズをお渡しします :)

参加登録はこちらから。

FreeBSD勉強会 発表者募集

FreeBSD勉強会では発表者を募集しています。FreeBSDに関して発表を行いたい場合、@daichigotoまでメッセージをお願いします。30分~1時間ほどの発表資料を作成していただき発表をお願いできればと思います。

おすすめ記事

記事・ニュース一覧