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
自分で設定が変えられる項目,変えられない項目がありますが,以下この並びに沿って解説を入れていきます.
前回は refcompressratio まで記載しましたので,今回はその続きになります.
written
このデータセットによって参照される,直前のスナップショット以降に書き込まれた (つまり,直前のスナップショットによって参照されていない) スペースの量です.
logicalused
このデータセットとそのすべての配下によって「論理的に」消費されるスペースの量.
used プロパティも参照してください.
論理スペースは圧縮の影響を無視してプロパティに表示され,アプリケーションが認識するデータの量に近い量を与えます.
ただし,メタデータによって消費されるスペースも含まれます.
logicalreferenced
値は on,off,opts になります.
このデータセットが「論理的に」アクセスされているスペースの量。
referenced のプロパティも参照してください.
論理スペースは圧縮の影響を無視してプロパティに表示され,アプリケーションが認識するデータの量に近い量を与えます.
ただし,メタデータによって消費されるスペースも含まれます.
volmode
値は default,geom,dev,none になります.
このプロパティは,ボリュームを OS に公開する方法を指定します.
これを Full に設定すると,ボリュームが本格的なブロックデバイスとして公開され,最大限の機能が提供されます.
geom は full のエイリアスで,互換性のために保持されています.
dev に設定すると,そのパーティションが非表示になります.
プロパティが none に設定されたボリュームは ZFS の外部には公開されませんが,バックアップ目的に適したスナップショット,クローン作成,複製などが可能です.
デフォルト値は Full です.
filesystem_limit
値はcount,none になります.
データセット ツリーのこのポイントの下に存在できるファイル システムとボリュームの数を制限します.
ユーザーが制限の変更を許可されている場合,制限は強制されません.
すでに filesystem_limit を持つファイルシステムの配下に filesystem_limit を設定した場合,上位の filesystem_limit は上書きされず,追加の制限が課されます.
snapshot_limit
値は count,none になります.
データセットとその配下に対して作成できるスナップショットの数を制限します.
すでに snapshot_limit を持つデータセットの配下に snapshot_limit を設定した場合も,上位の snapshot_limit は上書きされず,追加の制限が課されます.
ユーザーが制限の変更を許可されている場合,制限は強制されません.
filesystem_count
データセットツリー内のこの場所に存在するファイルシステムとボリュームの合計数.
この値は,データセットが存在するツリー内に filesystem_limit が設定されている場合にのみ使用されます.
snapshot_count
データセットツリー内のこの場所に存在するスナップショットの総数.
この値は,データセットが存在するツリー内に snapshot_limit が設定されている場合にのみ使用されます.
snapdev
値は hidden,visible です.
/dev/zvol/<pool> の下にあるボリューム スナップショット デバイスを非表示にするか表示するかを制御します.
デフォルト値は非表示です.
acltype
値は off,nfsv4,posix です.
ACL を有効にするかどうか,有効にする場合はどのタイプの ACL を使用するかを制御します.
このプロパティが現在のプラットフォームでサポートされていないタイプの ACL に設定されている場合,動作は off に設定されている場合と同じです.
off
Linux のデフォルトでは,ファイル システムの acltype プロパティが off に設定されている場合,ACL は無効になります.
noacl
off のエイリアスです.
nfsv4
FreeBSD のデフォルトは,NFSv4 スタイルの ZFS ACL を使用する必要があることを示します.
これらの ACL は,getfacl(1) および setfacl(1) を使用して管理できます.
nfsv4 ZFS ACL タイプは Linux ではまだサポートされていません.
posix
POSIX ACL を使用する必要があることを示します.POSIX ACL は Linux に固有であり,他のプラットフォームでは機能しません.
POSIX ACL は拡張属性として保存されます.したがって,設定されている既存の NFSv4 ACL は上書きされません.
context
Linux の SELinux に向けた設定なので省略します.
fscontext
Linux の SELinux に向けた設定なので省略します.
defcontext
Linux の SELinux に向けた設定なので省略します.
rootcontext
Linux の SELinux に向けた設定なので省略します.
relatime
値は on,off です.
atime=on が設定されている場合にアクセス時間が更新される方法を制御します.
このプロパティをオンにすると,アクセス時間が修正時間または変更時間に応じて更新されます.
アクセス時刻は,以前のアクセス時刻が現在の変更時刻よりも早かった場合,または既存のアクセス時刻が過去 24 時間以内に更新されていない場合にのみ更新されます.デフォルト値はオンです.
on および off の値は,マウントオプションの relatime および norelatime と同義です.
redundant_metadata
値は all,most,some,none です.
どのタイプでメタデータを冗長的に保存するかを制御します.
ZFS はメタデータの追加のコピーを保存するため,単一のブロックが破損した場合でも,失われるユーザーデータの量は制限されます.
この追加コピーは,プールレベルで提供される冗長性 (ミラーリングや RAID-Z など) に追加され,コピープロパティで指定された追加コピー (合計 3 つのコピーまで) に追加されます.
たとえば,プールがミラー化され,copys=2,redundant_metadata=most の場合,ZFS はほとんどのメタデータのコピー 6 つと,データと一部のメタデータのコピー 4 つを保存します.
all に設定すると,ZFS はすべてのメタデータの追加コピーを保存します.
ディスク上の 1 つのブロックが破損すると,最悪の場合、ユーザー データの 1 つのブロック (recordsize のバイトの長さ) が失われる可能性があります.
most に設定すると,ZFS はほとんどのタイプのメタデータの追加コピーを保存します.
これにより,書き込む必要のあるメタデータが少なくなるため,ランダム書き込みのパフォーマンスが向上します.
実際には,ディスク上の 1 つのブロックが破損すると,最悪でも約 1000 ブロック (それぞれ recordsize バイト) のユーザー データが失われる可能性があります.
どのメタデータ ブロックが冗長的に保存されるかの正確な動作は,将来のリリースで変更される可能性があります.
some に設定すると,ZFS は重要なメタデータのみの追加コピーを保存します.
これにより,書き込む必要のあるメタデータが少なくなるため,ファイル作成のパフォーマンスが向上します.
ディスク上の 1 つのブロックが破損すると,最悪の場合,1 つのユーザーファイルが失われる可能性があります.
none に設定すると,ZFS はメタデータのコピーを冗長的に保存しません.
ディスク上の 1 つのブロックが破損すると,データセット全体が失われる可能性があります.
デフォルト値は「all」です.
overlay
値は on,off です.
使用中のディレクトリ,または既にファイルやディレクトリが含まれているディレクトリへのマウントを許可します.
これは、Linux および FreeBSD ファイル システムのデフォルトで利用可能なのマウント動作です.
これらのプラットフォームでは,このプロパティはデフォルトで on になっています.
他のプラットフォーム上の OpenZFS との一貫性を保つためにオーバーレイ マウントを無効にするには,off に設定します.
encryption
値は off,on,aes-128-ccm,aes-192-ccm,aes-256-ccm,aes-128-gcm,aes-192-gcm,aes-256-gcm です.
このデータセットに使用される暗号化スイート (ブロック暗号,キーの長さ,およびモード) を制御します.
プールで暗号化機能を有効にする必要があります.
データセットの作成時にキー形式を設定する必要があります.
データセットの作成時に encryption=on を選択すると,デフォルトの暗号化スイート (現在は aes-256-gcm) が選択されます.
一貫したデータ保護を提供するには,データセットの作成時に暗号化を指定する必要があり,後で変更することはできません.
暗号化の詳細と注意事項については、zfs-load-key(8) の「encryption」セクションを参照してください.
keylocation
値は prompt,file:///file/path,https://address,http://address です.
zfs load-key や zfs mount -l などのコマンドで,デフォルトでユーザーの暗号化キーがどこからロードされるかを制御します.
このプロパティは,暗号化ルートである暗号化されたデータセットに対してのみ設定されます.
指定しない場合のデフォルト値は prompt です.
データセットの作成後に暗号化スイートを変更することはできませんが,キーの場所は zfs set または zfs change-key のいずれかを使用して変更できます.
プロンプトが選択されている場合,暗号化されたデータにアクセスする必要がある場合,ZFS はコマンド プロンプトでキーを要求します (詳細については、zfs load-key を参照してください).
この設定では,標準入力ストリーム経由でキーを渡すこともできますが,ユーザーは秘密にしておく必要のあるキーをコマンドラインに置かないように注意する必要があります.
ファイルパスが選択されている場合,キーは指定された絶対ファイルパスからロードされます.
HTTPS または HTTP が選択された場合,コンパイル時の構成と実行時の可用性に応じて,fetch(3),libcurl,または何も使用せずに GET されます.
SSL_CA_CERT_FILE 環境変数を設定して,連結された証明書ストアの場所を設定できます.
SSL_CA_CERT_PATH 環境変数を設定すると,認証局バンドルが含まれるディレクトリの場所をオーバーライドできます.
SSL_CLIENT_CERT_FILE および SSL_CLIENT_KEY_FILE 環境変数を設定して,クライアント証明書とそのキーへのパスを構成できます.
keyformat
値は raw,hex,passphrase です.
ユーザーの暗号化キーがどの形式で提供されるかを制御します.このプロパティは,データセットが暗号化されている場合にのみ設定されます.
raw キーと hex キーの長さは 32 バイトである必要があり,ランダムに生成される必要があります.
raw キーは次のコマンドで生成できます
# dd if=/dev/urandom bs=32 count=1 of=/path/to/output/key
パスフレーズの長さは 8 ~ 512 バイトである必要があり,使用前に PBKDF2 によって処理されます (pbkdf2iters プロパティを参照してください).
データセットの作成後に暗号化スイートを変更することはできませんが,キー形式は zfs change-key を使用して変更できます.
pbkdf2iters
値は iterations です.
パスフレーズ暗号化キーを処理して暗号化キーにする際に実行する PBKDF2 の反復回数を制御します.
このプロパティは,暗号化が有効であり,パスフレーズのキー形式が選択されている場合にのみ定義されます.
PBKDF2 の目標は,ユーザーのパスフレーズを総当たり攻撃するために必要な計算の難易度を大幅に高めることです.
これは,攻撃者が結果のキーに到達する前に,計算量の多いハッシュ関数を介して各パスフレーズを何度も実行することを強制することで実現されます.
実際にパスフレーズを知っているユーザーは,このコストを一度支払うだけで済みます.
CPU の処理能力が向上するにつれて,ブルートフォース攻撃が依然として不可能であることを保証するために,この数値を上げる必要があります.
現在のデフォルトは 350000 で、最小値は 100000 です.
このプロパティは、zfs change-key を使用して変更できます.
special_small_blocks
値は size です.
この値は,小さなファイル ブロックを特別な割り当てクラスに含めるためのブロック サイズのしきい値を表します.
この値以下のブロックは特別割り当てクラスに割り当てられ,それより大きいブロックは通常クラスに割り当てられます.
有効な値は、0 または 512 から 1048576 (1 MiB) までの 2 のべき乗です.
デフォルトのサイズは 0 で,小さなファイル ブロックが特殊クラスに割り当てられないことを意味します.
このプロパティを設定する前に,特別なクラス vdev をプールに追加する必要があります.
特別な割り当てクラスの詳細については,zpoolconcepts(7) を参照してください.
以上,4回にわたって掲載してみましたが,ZFS ファイルシステムプロパティの解説になります.
マニュアルが用意されている事のありがたさを感じつつも,読んでもぱっとわからない自分の無知を呪います.
どこかのタイミングで ZFS の暗号化もやってみたいと思いますが,一旦は ZFS については一区切りにしようと考えています.
コメント