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

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

自分で設定が変えられる項目,変えられない項目がありますが,以下この並びに沿って解説を入れていきます.
前回は 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 については一区切りにしようと考えています.

コメント

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