ZFS ファイルシステムで利用できる機能は多岐にわたります.今回はファイルシステム (と ZVOL) が持つ機能について説明を行います.
マニュアルをベースに抜粋してなるべく見やすいように記載をしているつもりです.
なお,マニュアルの参照元は zfsprops(7) です.
- ZFS に関するお話
- FreeBSD で ZFS を利用する – ZFS 概要
- FreeBSD で ZFS を利用する – ZFS プールの作成 (パーティション切らない編)
- FreeBSD で ZFS を利用する – ZFS プールの機能について理解する
- FreeBSD で ZFS を利用する – ファイルシステムを管理する
- FreeBSD で ZFS を利用する – send/recv を使い倒す
- FreeBSD で ZFS を利用する – RAWボリュームを切り出す & iSCSI として提供する
- FreeBSD で ZFS を利用する – ファイルシステムの圧縮を利用する・比較する
- FreeBSD で ZFS を利用する – ZFS のキャッシュの仕組みを理解する
- FreeBSD で ZFS を利用する – キャッシュを構成・設定する
- FreeBSD で ZFS を利用する – 重複排除を利用する・確認する
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (1)
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (2)
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (3)
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (4)
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 以下に圧縮する必要があります.
以上,長くなったので次回へ続きます.
コメント