FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (1)

ZFS

ZFS ファイルシステムで利用できる機能は多岐にわたります.今回はファイルシステム (と ZVOL) が持つ機能について説明を行います.
マニュアルをベースに抜粋してなるべく見やすいように記載をしているつもりです.
なお,マニュアルの参照元は zfsprops(7) です.

ZFS ファイルシステムプロパティ

作成済みの ZFS ファイルシステムのプロパティを表示するとこのように沢山の項目が表示されます.

# zfs get all pool0
NAME   PROPERTY              VALUE                  SOURCE
pool0  type                  filesystem             -
pool0  creation              Mon Dec 18 18:35 2023  -
pool0  used                  10.0G                  -
pool0  available             375G                   -
pool0  referenced            32.0K                  -
pool0  compressratio         1.00x                  -
pool0  mounted               yes                    -
pool0  quota                 none                   default
pool0  reservation           none                   default
pool0  recordsize            128K                   default
pool0  mountpoint            /pool0                 default
pool0  sharenfs              off                    default
pool0  checksum              on                     default
pool0  compression           off                    default
pool0  atime                 on                     default
pool0  devices               on                     default
pool0  exec                  on                     default
pool0  setuid                on                     default
pool0  readonly              off                    default
pool0  jailed                off                    default
pool0  snapdir               hidden                 default
pool0  aclmode               discard                default
pool0  aclinherit            restricted             default
pool0  createtxg             1                      -
pool0  canmount              on                     default
pool0  xattr                 on                     default
pool0  copies                1                      default
pool0  version               5                      -
pool0  utf8only              off                    -
pool0  normalization         none                   -
pool0  casesensitivity       sensitive              -
pool0  vscan                 off                    default
pool0  nbmand                off                    default
pool0  sharesmb              off                    default
pool0  refquota              none                   default
pool0  refreservation        none                   default
pool0  guid                  1264596009273225631    -
pool0  primarycache          all                    default
pool0  secondarycache        all                    default
pool0  usedbysnapshots       0B                     -
pool0  usedbydataset         32.0K                  -
pool0  usedbychildren        10.0G                  -
pool0  usedbyrefreservation  0B                     -
pool0  logbias               latency                default
pool0  objsetid              54                     -
pool0  dedup                 off                    default
pool0  mlslabel              none                   default
pool0  sync                  standard               default
pool0  dnodesize             legacy                 default
pool0  refcompressratio      1.00x                  -
pool0  written               32.0K                  -
pool0  logicalused           206K                   -
pool0  logicalreferenced     12.5K                  -
pool0  volmode               default                default
pool0  filesystem_limit      none                   default
pool0  snapshot_limit        none                   default
pool0  filesystem_count      none                   default
pool0  snapshot_count        none                   default
pool0  snapdev               hidden                 default
pool0  acltype               nfsv4                  default
pool0  context               none                   default
pool0  fscontext             none                   default
pool0  defcontext            none                   default
pool0  rootcontext           none                   default
pool0  relatime              off                    default
pool0  redundant_metadata    all                    default
pool0  overlay               on                     default
pool0  encryption            off                    default
pool0  keylocation           none                   default
pool0  keyformat             none                   default
pool0  pbkdf2iters           0                      default
pool0  special_small_blocks  0                      default

自分で設定が変えられる項目,変えられない項目がありますが,以下この並びに沿って解説を入れていきます.

filesystem

値は filesystem,volume,snapshot,bookmark になります.
ここの値は zfs create で作成した種類が表示される項目になります.

used

このデータセットとそのすべての配下のファイルシステムによって消費されている使用量です.
これは,データセットの割り当てと予約に対して反映される値となります.
used で表示される使用量には,このデータセット自身の予約は含まれませんが,配下のデータセットの予約は考慮されます.

スナップショットの場合,使用済みスペース (zfsconcepts(7) の「スナップショット」セクションを参照) は、このスナップショットによって生じた差分が表示されます.
スナップショットが破棄されると,使用されていた領域が解放されます.

used,available,referenced で表示される領域は保留中の変更は考慮されません.
保留中の変更は通常は数秒以内に反映されます.
fsync(2) または O_SYNC を使用してディスクに変更をコミットしても,スペース使用量情報がすぐに更新されることが保証されるわけではありません.

available

プール内に他の影響要素がないことを前提とした,データセットとその配下のデータセットが利用できる空き領域の容量です.
スペースはプール内で共有されるため,プールサイズ,クォータ,予約,プール内のその他のデータセットなど,さまざまな要因によって空き容量が変化・制限される可能性があります.

このプロパティは,短縮された列名 avail によって参照することもできます.

referenced

このデータセットが参照されているデータの量です.
プール内の他のデータセットと共有される場合と共有されない場合があります.
スナップショットまたはクローンが作成されると,その内容は同一であるため,最初は作成元のファイル システムまたはスナップショットと同じ量のスペースを参照します.

compressratio

このデータセットの使用スペースに対して反映されている圧縮率が乗数で表示されます.
使用されるプロパティには配下のデータセットが含まれますが,クローンの場合は元のスナップショットと共有されるスペースは含まれません.
スナップショットの場合,圧縮率は refcompressratio プロパティと同じになります.

圧縮は,zfs set compression=on を実行することで有効ににできます.compression のデフォルト値は off です.

mounted

ファイル システムの場合,ファイルシステムが現在マウントされているかどうかを表しています.
このプロパティは,yes または no のいずれかになります.

quota

値は size または none になります.

データセットとその配下が利用できる領域を制限します.
このプロパティは,使用できる領域に厳しい制限を適用します.
これには,ファイルシステムやスナップショットなど,配下で消費されるすべての領域が含まれます.
すでにクォータが設定されているデータセットの配下にクォータを設定した場合,上位のクォータは上書きされず,配下のデータセットに追加の制限が課されます.

reservation

値は size または none になります.

データセットとその配下に対して保証される最小領域を設定できます.
使用されているデータ量がこの値を下回っている場合,データセットは予約で指定された領域を占有しているかのように扱われます.
予約は,親データセットの使用領域で考慮され,親データセットのクォータと予約に対してカウントされます.

このプロパティは,短縮された列名 reserv によって参照することもできます.

recordsize

値は size です.

ファイルシステム内のファイルの推奨ブロックサイズを指定します.
このプロパティは,固定サイズのレコード内のファイルにアクセスするデータベース ワークロードでのみ使用するように設計されています.
ZFS は,一般的なアクセスパターンに最適化された内部アルゴリズムに従ってブロックサイズを自動的に調整します.

データベースなどで非常に大きなファイルを作成するけど,それらのファイルにランダムな小さな塊でアクセスする場合,これらのアルゴリズムは最適ではない可能性があります.
データベースのレコードサイズ以上のレコード サイズを指定すると,パフォーマンスが大幅に向上する可能性があります.
このプロパティを汎用的なファイルシステムに使用することは推奨しません.パフォーマンスに悪影響を与える可能性があります.

指定するサイズは,512 B 以上 128 KiB 以下の 2 のべき乗である必要があります.
プールで large_blocks 機能が有効になっている場合,1MiB まで設定することが可能です.
ZFS 機能フラグの詳細については,zpool-features(7) を参照してください.

ファイルシステムのレコードサイズを変更すると,それ以降に作成されたファイルにのみ影響し,既存のファイルは影響を受けません.

このプロパティは,短縮された列名 recsize によって参照することもできます.

mountpoint

値は path,none,legacy です.

ファイルシステムに使用されるマウントポイントを制御します.このプロパティの使用方法の詳細については,zfsconcepts(7) の「mountpoint」セクションを参照してください.

ファイル システムのマウントポイントプロパティが変更されると,ファイルシステムとマウントポイントを継承するすべての配下のデータセットがアンマウントされます.
新しい値が legacy の場合,それらはアンマウントされたままになります.
それ以外の場合やプロパティが以前 legacy であった場合,またはプロパティが none だった場合は,新しい場所に自動的に再マウントされます.
さらに,共有ファイルシステムは共有解除されて新しい場所で共有されます.

mountpoint プロパティを zfs set -u で設定すると,マウントポイントプロパティは更新されますが,データセットはマウントまたはアンマウントされずに以前の状態のままになります.

sharenfs

値は on,off,オプション になります.

ファイルシステムを NFS 経由で共有するかどうか,およびどのオプションを使用するかを制御します.


sharenfs プロパティーが off のファイルシステムで NFS 共有を行う場合は exportfs(8) コマンドと /etc/exports ファイル内のエントリーを使用して管理されます.
それ以外の場合,ファイルシステムは zfs share および zfs unshare コマンドを使用して自動的に共有および共有解除されます.
このプロパティが on に設定されている場合,データセットはデフォルトのオプション「sec=sys,rw,crossmnt,no_subtree_check」を使用して共有されます.

オプションは,exports(5) にあるオプションとは異なり,カンマで区切られていることに注意してください.これは,引用符の必要性をなくし,スクリプトによる解析を容易にするために行われます.

オプションの意味については,exports(5) を参照してください.


データセットの sharenfs プロパティが変更されると,そのプロパティが以前 off であった場合,またはプロパティが変更される前に共有されていた場合に限り,データセットとプロパティを継承するすべての配下が新しいオプションで再共有されます.
新しいプロパティが off の場合,ファイル システムの共有は解除されます.

sharenfs プロパティを zfs set -u で更新すると,プロパティは目的の値に設定されますが,データセットを共有,再共有,または共有解除する操作は実行されません.

checksum

値は on,off,fletcher2,fletcher4,sha256,noparity,sha512,skein,edonr です.

データの整合性を検証するために使用されるチェックサムを制御します.
デフォルト値は on で、適切なアルゴリズム (現在は fletcher4) が自動的に選択されます.

off にすると,ユーザーデータの整合性チェックを無効にします.

noparity は,整合性を無効にするだけではなく,ユーザーデータのパリティの維持も無効にします.

チェックサムを無効にすることはお勧めできません.

sha512,skein,edonr チェックサムアルゴリズムでは,プールで適切な機能を有効にする必要があります.
また,現在 FreeBSD は edonr アルゴリズムをサポートしていません.

これらのアルゴリズムの詳細については,zpool-features(7) を参照してください.
このプロパティを変更すると,新しく書き込まれたデータのみが影響を受けます.

compression

値は on,off,gzip,gzip-N,lz4,lzjb,zle,zstd,zstd-N,zstd-fast,zstd-fast-N です.

データセットに使用される圧縮アルゴリズムを制御します.

圧縮を on に設定すると,現在のデフォルトの圧縮アルゴリズム (lzjb または lz4_compress が有効な場合は lz4) が使用されます.
デフォルトでは,圧縮率と圧縮速度と解凍速度のバランスが取れており,さまざまなワークロードで適切に動作すると予想されます.
このプロパティの他のすべての設定とは異なり,on では固定圧縮タイプが選択されません.
新しい圧縮アルゴリズムが ZFS に追加され,プールで有効になると,デフォルトの圧縮アルゴリズムが変更される可能性があります.
(したがって,on ではなく明示的にアルゴリズムを指定することを推奨します)

lz4 圧縮アルゴリズムは、lzjb アルゴリズムに代わる高性能なアルゴリズムです.
lzjb よりも大幅に高速な圧縮と圧縮解除,および適度に高い圧縮率を備えています.
lz4_compress 機能が有効に設定されているプールでのみ使用できます.
ZFS 機能フラグと lz4_compress 機能の詳細については,zpool-features(7) を参照してください

lzjb 圧縮アルゴリズムは,適切なデータ圧縮を提供しながらパフォーマンスが最適化されています

gzip 圧縮アルゴリズムは,gzip(1) コマンドと同じ圧縮を使用します.
gzip レベルは,値 gzip-N を使用して指定できます.N は 1 (最速) から 9 (最高の圧縮率) までの整数です.
現在,gzip を選択すると gzip-6 を設定した事と同義となります.

zstd 圧縮アルゴリズムは,高い圧縮率と優れたパフォーマンスの両方を提供します.
zstd-N を使用して zstd レベルを指定できます.N は 1 (最速) から 19 (最高の圧縮率) までの整数です.
zstd を選択した場合,zstd-3 を指定したのと同義となります.

マイナスの zstd レベルを設定すると,圧縮率を犠牲にして高速化を要求できます.
これは,zstd-fast-N を使用して行われます。N は,マイナスの zstd レベルにマッピングされる [1-9,10,20,30,…,100,500,1000] の整数です.
レベルが低いほど圧縮速度が速くなります.-1000 は最も速い圧縮と最も低い圧縮率を提供します.
zstd-fast を設定した場合,zstd-fast-1 と同義です.

zle 圧縮アルゴリズムは,ゼロの連続を圧縮します.

このプロパティは,短縮された列名 compress によって参照することもできます.
このプロパティを変更すると,新しく書き込まれたデータのみが影響を受けます.

圧縮されるブロックは,圧縮後の元のサイズの 7/8 以下にならない場合,圧縮する価値があるとみなされず,ブロックは圧縮されずに保存されます.
論理ブロックがディスク セクターサイズの 8 倍未満の場合,必要な圧縮率が効果的に低下することに注意してください.
たとえば,4kB ディスク セクターを持つディスク上の 8kB ブロックは,元のサイズの 1/2 以下に圧縮する必要があります.

以上,長くなったので次回へ続きます.

コメント

タイトルとURLをコピーしました