■はじめに
ZFSストレージでシェア領域を作成し、OSからNFSマウントして利用する際のちょっとした注意点について、
今回はお伝えしようと思います。
【環境情報】
ZFSストレージ :ZFS Storage ZS9-2
OS :RedHat Enterprise Linux 8.6
NFSバージョン :最小NFSv3 最大NFSv4
※上記以外の環境では異なる結果となる可能性がある点、予めご了承ください。
■マウントオプションの差異による、lsコマンド表示結果の違い
ZFSのシェア領域をNFSマウントする際、
マウントオプションによってlsコマンドでの照会結果が異なります。
パターン1
[root@testvm01 ~]# mount -t nfs -o rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600 192.168.5.100:/export/nfs01 /mnt
[root@testvm01 ~]# ls -l /mnt/zfs.file-rw-r--r--+ 1 root root 0 Sep 1 20:52 /mnt/zfs.file
パターン2
[root@testvm01 ~]# mount -t nfs -o rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600,noacl 192.168.5.100:/export/nfs01 /mnt
[root@testvm01 ~]# ls -l /mnt/zfs.file
-rw-r--r-- 1 root root 0 Sep 1 20:52 /mnt/zfs.file
パターン1と2の違いについて分かったでしょうか?
lsコマンドのパーミッション部分末尾をご覧いただけると分かりますが、パターン1は末尾に「+」が付いています。
パターン2ではマウントの際に明示的にオプションを指定しているため、「+」が付いていません。
■「+」の有無による違い
端的に申し上げると、「+」が付いているファイルは拡張ACLという設定が有効になっています。拡張ACLについては少し長くなるので後述しますが、「通常のパーミッションやオーナーとは別で個別に指定できる権限設定」と思っていただければ良いです。
拡張ACLが有効になっていると申し上げましたが、本来ZFSストレージは拡張ACLをサポートしていない様です。であるのにも関わらず、明示的に無効化しないと「+」が表示されてしまうことが分かりました。
基本的には「+」が付いていても支障ないのですが、-pオプション付きのcpコマンド(mvコマンド)にて、オーナー情報などを含めてコピーを試みる際に、以下のエラーが出力する場合があります。
cpコマンド実施時のエラー
[root@testvm01 ~]# cp -p /mnt/zfs.file /mnt/zfs.file.copy
cp: preserving permissions for '/mnt/zfs.file.copy': Operation not supported
エラー回避のためには
先述したパターン2のように、NFSマウントの際に "noacl" を指定して明示的に拡張ACLを無効化してあげればこの事象は回避できます。
また、-p オプション無しでのcpコマンドは問題なく通ります。
今後どうなるかは分かりませんが、少なくとも現時点でZFSストレージは拡張ACL非対応のようですので、NFSマウントを利用する際は "noacl" オプションを付けてあげるのが無難でしょうか。
cpコマンド成功時("noacl" 指定してマウント)
[root@testvm01 ~]# mount -t nfs -o rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600,noacl 192.168.5.100:/export/nfs01 /mnt
[root@testvm01 ~]# ls -l /mnt/zfs.file
-rw-r--r-- 1 root root 0 Sep 1 20:52 /mnt/zfs.file
[root@testvm01 ~]# cp -p /mnt/zfs.file /mnt/zfs.file.copy
[root@testvm01 ~]# ls -l /mnt
-rw-r--r-- 1 root root 0 Sep 1 20:52 /mnt/zfs.file
-rw-r--r-- 1 root root 0 Sep 1 20:54 /mnt/zfs.file.copy
■補足 拡張ACLについて
ACLと聞いてまず思い浮かぶのがAccess Control List という方もいるかと思いますが、今回のお話でのACLは異なります。ネットワークに関するあれこれではありません。
Linuxの権限設定には「基本ACL」と「拡張ACL」が存在します。
基本ACLとは 皆さんがよく lsコマンドで目にするパーミッションやオーナーの部分です。
基本ACLのみ
[root@testvm01 ~]# ls -l /tmp/local.file
-rw-r--r-- 1 root root 0 Sep 1 20:52 /tmp/local.file
そして前述した通り、lsコマンド照会の際にパーミッション末尾に「+」が付いているファイルは拡張ACLが有効になっています。
拡張ACLあり
[root@testvm01 ~]# ls -l /tmp/local.file
-rw-r--r--+ 1 root root 0 Sep 1 20:52 /tmp/local.file
拡張ACLを付与すると、任意の個別のユーザーに対してアクセス権限を付与することが可能です。以下に拡張ACLの照会コマンド「getfacl」実施時のログを記します。
getfacl 照会結果
[root@testvm01 ~]# getfacl /tmp/local.file
getfacl: Removing leading '/' from absolute path names
# file: tmp/local.file
# owner: root
# group: root
user::rw-
user:test:rw-
group::r--
mask::rw-
other::r--
/tmp/local.file の所有ユーザーは root ですが、上記の例では test ユーザーに対して個別に rw権限を付与しています。
私はまだ経験が無いですが、運用上このような指定を用いたいお客様もいるかもしれませんね。
■最後に
今回はZFSストレージを用いてNFSマウントする際の注意点について記しました。
cpコマンドを使った際の挙動については、構築期間では気づきづらいかもしれません。お客様の運用が始まってから「ファイルコピーが出来なくて困っている!」と言われると大変かと思いますので、本記事にてそういった事象を防げれば幸いです。