BSD界隈四方山話

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

今回はDragonFlay BSD 5.0のルートパーティションをHAMMER2ファイルシステムに指定した場合の活用方法を紹介します。

HAMMER2ファイルシステムの使い方

DragonFly BSD 5.0をHAMMER2ファイルシステム指定でインストールすると、次のような感じでルートパーティションがHAMMER2ファイルシステムの状態でシステムが起動してきます。

 da0s1dがHAMMER2ファイルシステムになっていることがわかる
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)
dfly50#

この領域はhammer2(8)コマンドで制御できます。ZFSにおけるzfs(8)コマンドやzpool(8)コマンドに相当するコマンドです。hammer2(8)コマンドはサブコマンドを指定して操作するタイプのコマンドで、次のようなサブコマンドが用意されています。

 hammer2(8)ユーティリティの主なサブコマンド
hammer2サブコマンド操作内容
connect ターゲットクラスタリンクへ追加
chaindump パスインメモリチェーントポをダンプ
destroy パスディレクトリエントリの削除(inodeがおかしい場合などのみで使用)
disconnect ターゲットクラスタリンクの削除
hash ファイル名ディレクトリハッシュの出力
info [デバイスファイルパス]H2パーティション情報の表示
mountadd [デバイスファイルパス]H2パーティションのすべての@LOCALをマウント
status [パス]アクティブクラスタステータスを表示
pfs-list [パス]PFS一覧表示
pfs-clid ラベル指定したPFSに対するクラスタIDを表示
pfs-fsid ラベル指定したPFSに対するプライベートIDを表示
pfs-create ラベルPFSの作成
pfs-delete ラベルPFSの削除
snapshot パス [ラベル]PFSまたはディレクトリのスナップショットを作成
serviceサービスデーモンを起動
stat [パス]inodeクォータ情報および設定情報を表示
leafpfs leafデーモンを起動
shell [ホスト]デバッグシェルへ接続
debugspan ターゲットターゲットへ接続しCONN/SPANを実行
rsainitrsaフィールドを初期化
show デバイスファイルパスRaw hammer2メディアダンプ
freemap デバイスファイルパスRaw hammer2メディアダンプ
setcomp 圧縮アルゴリズム[:レベル] パス圧縮アルゴリズムおよび圧縮レベルを指定(none、autozero、lz4、zlib)
setchech チェックアルゴリズム パスチェックアルゴリズムを指定(none、crc32、xxhash64、sha192)
clrcheck パスチェックコードオーバーライドをクリア
setcrc32 パスチェックアルゴリズムをcrc32へ変更
setxxhash64 パスチェックアルゴリズムをxxhash64へ変更
setsha192 パスチェックアルゴリズムをsha192へ変更
bulkfree パスバルクフリーパスを実行

たとえばpfs-listサブコマンドを使えば次のようにpfsが表示されます。

 pfs-listの出力例
dfly50# hammer2 pfs-list
Type        ClusterId (pfs_clid)                 Label
SNAPSHOT    b04ae3f9-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055702
MASTER      3876b8e5-ca2c-11e7-8720-010c290d16d7 ROOT
SNAPSHOT    b222e9dd-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055705
SNAPSHOT    d59b6e60-cfc5-11e7-b9d5-010c290d16d7 ROOT.20171123.054345
MASTER      3876b6f3-ca2c-11e7-8720-010c290d16d7 LOCAL
SNAPSHOT    b17f2aa9-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055704
dfly50#

infoサブコマンドを使うと次のようにデバイスファイルパスを指定しての出力が可能です。

 infoサブコマンドの出力例
dfly50# hammer2 info /dev/da0s1d
/dev/da0s1d:
    ROOT.20171123.055702
    ROOT
    ROOT.20171123.055705
    ROOT.20171123.054345
    LOCAL
    ROOT.20171123.055704
dfly50#

snapshotサブコマンドは次のようにスナップショットを作成するコマンドです。

 snapshotサブコマンドでスナップショットを作成
dfly50# hammer2 snapshot /
created snapshot ROOT.20171123.055800
dfly50# hammer2 snapshot /
created snapshot ROOT.20171123.055801
dfly50# hammer2 snapshot /usr
created snapshot ROOT.20171123.055803
dfly50#

作成したスナップショットはpfs-listで確認できます。

 pfs-listサブコマンドでスナップショットを確認
dfly50# hammer2 pfs-list
Type        ClusterId (pfs_clid)                 Label
SNAPSHOT    d30dc465-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055800
SNAPSHOT    b04ae3f9-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055702
MASTER      3876b8e5-ca2c-11e7-8720-010c290d16d7 ROOT
SNAPSHOT    b222e9dd-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055705
SNAPSHOT    d59b6e60-cfc5-11e7-b9d5-010c290d16d7 ROOT.20171123.054345
SNAPSHOT    d3a59daf-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055801
MASTER      3876b6f3-ca2c-11e7-8720-010c290d16d7 LOCAL
SNAPSHOT    d4f68f5d-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055803
SNAPSHOT    b17f2aa9-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055704
dfly50# hammer2 pfs-delete ROOT.20171123.054345
dfly50# hammer2 pfs-list
Type        ClusterId (pfs_clid)                 Label
SNAPSHOT    d30dc465-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055800
SNAPSHOT    b04ae3f9-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055702
MASTER      3876b8e5-ca2c-11e7-8720-010c290d16d7 ROOT
SNAPSHOT    b222e9dd-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055705
SNAPSHOT    d3a59daf-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055801
MASTER      3876b6f3-ca2c-11e7-8720-010c290d16d7 LOCAL
SNAPSHOT    d4f68f5d-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055803
SNAPSHOT    b17f2aa9-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055704
dfly50#

snapshotサブコマンドはラベル名を指定して作成することも可能で、作成した名前でpfs-listに表示されます。

 指定した名前で作成したスナップショットもpfs-listに表示される
dfly50# hammer2 pfs-list
Type        ClusterId (pfs_clid)                 Label
SNAPSHOT    d30dc465-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055800
SNAPSHOT    b04ae3f9-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055702
SNAPSHOT    2f413921-cfc8-11e7-b9d5-010c290d16d7 ROOT.20171123.060035
SNAPSHOT    7b21d515-cfc8-11e7-b9d5-010c290d16d7 snapshottest-2
MASTER      3876b8e5-ca2c-11e7-8720-010c290d16d7 ROOT
SNAPSHOT    25a47ba9-cfc8-11e7-b9d5-010c290d16d7 ROOT.20171123.060018
SNAPSHOT    6b4a3550-cfc8-11e7-b9d5-010c290d16d7 snapshottest-1
SNAPSHOT    b222e9dd-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055705
SNAPSHOT    d3a59daf-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055801
MASTER      3876b6f3-ca2c-11e7-8720-010c290d16d7 LOCAL
SNAPSHOT    d4f68f5d-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055803
SNAPSHOT    b17f2aa9-cfc7-11e7-b9d5-010c290d16d7 ROOT.20171123.055704
dfly50#

スナップショットはマウントすることでアクセスが可能です。マウントにはmount_hammer2(8)コマンドを使います。次のように2つのスナップショットで違うファイルが存在していることを確認できます。

 mount_hammer2(8)でスナップショットをマウント その1
dfly50# mount_hammer2 @snapshottest-1 /mnt
dfly50# ls /mnt/snaptest/
a
dfly50# umount /mnt
dfly50#
 mount_hammer2(8)でスナップショットをマウント その2
dfly50# mount_hammer2 @snapshottest-2 /mnt
dfly50# ls /mnt/snaptest/
b
dfly50# umount /mnt
dfly50#

新しいディスクをHAMMER2の対象とするには、newfs_hammer2(8)でフォーマットしてmount_hammer2(8)でマウントします。次のような感じです。

 新しいディスクをHAMMER2でフォーマット
dfly50# newfs_hammer2 /dev/da1s0
newfs_hammer2: WARNING: HAMMER2 VFS not loaded, cannot get version info.
Using version 1
Volume /dev/da1s0      size  20.00GB
---------------------------------------------
version:          1
total-size:        20.00GB (21474836480 bytes)
boot-area-size:    64.00MB
aux-area-size:    256.00MB
topo-reserved:	   80.00MB
free-space:        19.61GB
vol-fsid:         255ea42f-cfc9-11e7-b9d5-010c290d16d7
sup-clid:         255ea434-cfc9-11e7-b9d5-010c290d16d7
sup-fsid:         255ea439-cfc9-11e7-b9d5-010c290d16d7
PFS "LOCAL"
    clid 2560d105-cfc9-11e7-b9d5-010c290d16d7
    fsid 2560d10e-cfc9-11e7-b9d5-010c290d16d7
PFS "DATA"
    clid 2560d150-cfc9-11e7-b9d5-010c290d16d7
    fsid 2560d154-cfc9-11e7-b9d5-010c290d16d7

dfly50#
 フォーマットした領域をmount_hammer2(8)コマンドでマウント
dfly50# mount_hammer2 /dev/da1s0 /mnt
dfly50# df -h
Filesystem         Size   Used  Avail Capacity  Mounted on
da0s1d            16.6G   473M  16.1G     3%    /
devfs             1024B  1024B     0B   100%    /dev
/dev/da0s1a       1022M   154M   786M    16%    /boot
/build/usr.obj    16.6G   473M  16.1G     3%    /usr/obj
/build/var.crash  16.6G   473M  16.1G     3%    /var/crash
/build/var.cache  16.6G   473M  16.1G     3%    /var/cache
/build/var.spool  16.6G   473M  16.1G     3%    /var/spool
/build/var.log    16.6G   473M  16.1G     3%    /var/log
/build/var.tmp    16.6G   473M  16.1G     3%    /var/tmp
tmpfs              486M     0B   486M     0%    /tmp
procfs            4096B  4096B     0B   100%    /proc
/dev/da1s0@DATA   19.6G     0B  19.6G     0%    /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)
/dev/da1s0@DATA on /mnt (hammer2, local)
dfly50#

クラスタの利用はまだできないとされていたので使えるのはこのあたりということになります。ZFSの場合はzpool(8)でストレージデバイスやストレージソースをストレージプールに追加していき、そこからzfs(8)でファイルシステムなどを作成します。これを比べてHAMMER2では従来のUNIX的アプローチでファイルシステムを作成し、それらをクラスタに追加することでスケールさせるといった仕組みを採用していることになります。

今のところHAMMER2ファイルシステムで実装されている機能はZFSで実装されている機能の一部といったところです。おいしいところだけピンポイントで実装し、シンプルな状態を保っているといった感じがします。従来のファイルシステムやツールと地続きになっている感じがあります。

FreeBSD勉強会

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

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

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

参加登録はこちらから。

FreeBSD勉強会 発表者募集

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

おすすめ記事

記事・ニュース一覧