SUJを試すには、24日(協定世界時)にコミットされたr207141以降のFreeBSD 9-CURRENTが必要。VirtualBoxなどの仮想環境を利用すると試しやすい。同機能を実装したシステムを用意したら、起動時の選択画面で4を押してシステムをシングルユーザモードで起動し、たとえば次のようにtunefs(8)でSUJを有効にする。この例なら/、/usr、/var、/tmpのUFS2がSUJ有効になる。アンマウントされた状態で実行しないと適用されない。
# tunefs -j enable /
# tunefs -j enable /usr
# tunefs -j enable /var
# tunefs -j enable /tmp
ジャーナル機能が有効になっているかどうかはdumpfs(8)コマンドでチェックできる。有効になっていればフラグの項目に「soft-updates+journal」のようにジャーナルが表示される。Soft Updatesも有効になっていないならnoneが、Soft Updatesのみが有効になっている場合はsoft-updatesのみが表示される。
# dumpfs / | head -20
magic 19540119 (UFS2) time Tue Apr 27 12:41:31 2010
superblock location 65536 id [ 49847688 e19f5ebf ]
ncg 12 size 1048576 blocks 1013015
bsize 16384 shift 14 mask 0xffffc000
fsize 2048 shift 11 mask 0xfffff800
frag 8 shift 3 fsbtodb 2
minfree 8% optim time symlinklen 120
maxbsize 16384 maxbpg 2048 maxcontig 8 contigsumsize 8
nbfree 80777 ndir 592 nifree 272619 nffree 1719
bpg 11758 fpg 94064 ipg 23552 unrefs 0
nindir 2048 inopb 64 maxfilesize 140806241583103
sbsize 2048 cgsize 16384 csaddr 3000 cssize 2048
sblkno 40 cblkno 48 iblkno 56 dblkno 3000
cgrotor 6 fmod 0 ronly 0 clean 0
avgfpdir 64 avgfilesize 16384
flags soft-updates+journal
fsmnt /
volname swuid 0
cs[].cs_(nbfree,ndir,nifree,nffree):
#
SUJの実行例
SUJが機能しているかどうかは、いきなり電源を切ったりリセットボタンを押して試せばいい。従来であれば起動途中でfsck(8)を実施するように促されるか、システム起動後にバックグラウンドfsck(8)が動き始める。しかしSUJが有効になったシステムでは次のように起動時に修正が実施され、そのままシステムが起動してくる。
WARNING: / was not properly dismounted
/: mount pending error: blocks 0 files 1
(略)
Starting file system checks:
** SU+J Recovering /dev/ada0s1a
** Reading 16777216 byte journal from inode 78.
** Building recovery table.
** Resolving unreferenced inode list.
** Processing journal entries.
** 45 journal records in 5632 bytes for 25.57% utilization
** Freed 13 inodes (3 dirs) 0 blocks, and 5 frags.
** SU+J Recovering /dev/ada0s1f
** Reading 33554432 byte journal from inode 228.
** Building recovery table.
** Resolving unreferenced inode list.
** Processing journal entries.
** 0 journal records in 0 bytes for nan% utilization
** Freed 0 inodes (0 dirs) 0 blocks, and 0 frags.
** SU+J Recovering /dev/ada0s1d
** Reading 33554432 byte journal from inode 5.
** Building recovery table.
** Resolving unreferenced inode list.
** Processing journal entries.
** 66 journal records in 10752 bytes for 19.64% utilization
** Freed 28 inodes (4 dirs) 0 blocks, and 14 frags.
Mounting local file systems:
当然だが、稼働しているシステムでは問題が発生すると困る。壊れても問題がないシステムを使うか、VirtualBoxなどの仮想環境で実験した方がいい。手動でfsck(8)を実施すると次のように表示内容が変わっていることがわかる。最初にジャーナルを利用するか聞かれるようになる。
# fsck /tmp
** /dev/ada0s1e
USE JOURNAL?? [yn] y
** SU+J Recovering /dev/ada0s1e
** Reading 8388608 byte journal from inode 3.
RECOVER? [yn] y
** Building recovery table.
** Resolving unreferenced inode list.
** Processing journal entries.
WRITE CHANGES? [yn] y
** 0 journal records in 0 bytes for nan% utilization
** Freed 0 inodes (0 dirs) 0 blocks, and 0 frags.
#
なおジャーナルそのものは対象となるファイルシステムのトップディレクトリ下に.sujournalという名前のファイルで作成される。ls(1)コマンドで確認でき、パーミッションがあれば中身も読める。
# ls -alh / | head -10
total 16484
drwxr-xr-x 25 root wheel 1.5K 4月 27 07:20 .
drwxr-xr-x 25 root wheel 1.5K 4月 27 07:20 ..
-rw-r--r-- 2 root wheel 784B 12月 21 05:24 .cshrc
-rw-r--r-- 2 root wheel 247B 12月 21 05:24 .profile
-rw------- 1 root wheel 1.0K 12月 24 09:36 .rnd
drwxrwxr-x 2 root operator 512B 2月 1 2009 .snap
-r-------- 1 root wheel 16M 1月 1 1970 .sujournal
-r--r--r-- 1 root wheel 6.1K 2月 16 05:24 COPYRIGHT
drwxr-xr-x 2 root wheel 1.0K 4月 26 04:36 bin
/% ls -alh / | grep journal
-r-------- 1 root wheel 16M 1月 1 1970 .sujournal
# ls -alh /usr | grep journal
-r-------- 1 root wheel 32M 1月 1 1970 .sujournal
#
ZFS、SUJ、HASTでエンタープライズレベルストレージ
SUJの登場はFreeBSDにとってターニングポイントとなる。大規模ストレージが必要になる場合、これまではfsck(8)の問題を避けるためにZFSなどの新しいファイルシステムを採用するか、その部分だけは専門のNASアプライアンスやNASサーバを導入するケースが多かった。SUJの登場でシステム再起動時の時間がきわめて短くなるため、大規模ストレージ用途でも採用しやすくなる。デスクトップやノートPCでワークステーションとして使う場合にもシステムクラッシュ時の復旧が高速になって便利だ。
FreeBSDプロジェクトは2010年2月、HASTの完了を発表した。HASTはGEOMレベルで高信頼が要求されるレプリケーションを実現するというもの。これもエンタープライズレベルのストレージシステムが要求されるシーンで必要とされてきたものだ。
ZFSの移植とプロダクション品質の実現、UFS2へジャーナル機能の導入(SUJ)、高信頼レプリケーションシステムHASTの導入という3つの実現は、FreeBSDを大規模ストレージシステムとして採用しやすくするために欠かせない機能となる。FreeBSD 9における注目の新機能になる見通し。