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における注目の新機能になる見通し。