zfs set コマンドは、NFS または SMB プロトコルを介して ZFS ファイルシステムを共有および公開するために使用します。あるいは、ファイルシステムの作成時に share.nfs または share.smb プロパティーを設定することもできます。
たとえば、tank/sales ファイルシステムを作成および共有します。デフォルトの共有アクセス権は、全員に対する読み取り/書き込みです。share.nfs プロパティーは子孫のファイルシステムに継承されるため、子孫の tank/sales/logs ファイルシステムも自動的に共有され、tank/sales/log ファイルシステムは読み取り専用アクセスに設定されます。
# zfs create -o share.nfs=on tank/sales # zfs create -o share.nfs.ro=\* tank/sales/logs # zfs get -r share.nfs tank/sales NAME PROPERTY VALUE SOURCE tank/sales share.nfs on local tank/sales% share.nfs on inherited from tank/sales tank/sales/log share.nfs on inherited from tank/sales tank/sales/log% share.nfs on inherited from tank/sales
次のように、共有ファイルシステムの特定のシステムにルートアクセスすることができます。
# zfs set share.nfs=on tank/home/data # zfs set share.nfs.sec.default.root=neo.daleks.com tank/home/data
最新のプールバージョン 34 にアップグレードされているプールでは、ZFS プロパティーの継承を使用して共有の維持を容易にする新しい共有構文を使用できます。各共有特性は、別々の share プロパティーになります。それらの share プロパティーは、share. 接頭辞で始まる名前によって識別されます。share プロパティーの例には、share.desc、share.nfs.nosuid、および share.smb.guestok などがあります。
share.nfs プロパティーは NFS 共有が有効であるかどうかを制御します。share.smb プロパティーは SMB 共有が有効であるかどうかを制御します。新しいプールでは、sharenfs は share.nfs の別名であり、sharesmb は share.smb の別名であるため、レガシー sharenfs および sharesmb プロパティー名は引き続き使用できます。tank/home ファイルシステムを共有する場合、次のような構文を使用します。
# zfs set share.nfs=on tank/home
この例では、share.nfs プロパティー値はすべての子孫ファイルシステムに継承されます。例:
# zfs create tank/home/userA # zfs create tank/home/userB # grep tank/home /etc/dfs/sharetab /tank/home tank_home nfs sec=sys,rw /tank/home/userA tank_home_userA nfs sec=sys,rw /tank/home/userB tank_home_userB nfs sec=sys,rw
古いプールでは、sharenfs および sharesmb プロパティーのみが子孫ファイルシステムによって継承されます。他の共有特性は、共有ごとに .zfs/shares ファイルに格納され、継承されません。
特別な規則は、sharenfs または sharesmb を親から継承する新しいファイルシステムを作成したときは必ず、sharenfs または sharesmb 値からそのファイルシステムのデフォルトの共有が作成されるというものです。sharenfs が単に on のときは、子孫ファイルシステムで作成されるデフォルトの共有にはデフォルトの NFS 特性のみが含まれることに注意してください。例:
# zpool get version tank NAME PROPERTY VALUE SOURCE tank version 33 default # zfs create -o sharenfs=on tank/home # zfs create tank/home/userA # grep tank/home /etc/dfs/sharetab /tank/home tank_home nfs sec=sys,rw /tank/home/userA tank_home_userA nfs sec=sys,r
名前付き共有を作成することもできます。これにより、SMB 環境でアクセス権およびプロパティーを設定する際の柔軟性が向上します。例:
# zfs share -o share.smb=on tank/workspace%myshare
前の例では、zfs share コマンドによって、tank/workspace ファイルシステムの myshare という SMB 共有が作成されます。このファイルシステムの .zfs/shares ディレクトリを介して SMB 共有にアクセスしたり、特定のアクセス権や ACL を表示または設定したりできます。各 SMB 共有は、個別の .zfs/shares ファイルで表されます。例:
# ls -lv /tank/workspace/.zfs/shares -rwxrwxrwx+ 1 root root 0 May 15 10:31 myshare 0:everyone@:read_data/write_data/append_data/read_xattr/write_xattr /execute/delete_child/read_attributes/write_attributes/delete /read_acl/write_acl/write_owner/synchronize:allow
名前付き共有は親ファイルシステムから共有プロパティーを継承します。前の例で share.smb.guestok プロパティーを親ファイルシステムに追加した場合、このプロパティーは名前付き共有に継承されます。例:
# zfs get -r share.smb.guestok tank/workspace NAME PROPERTY VALUE SOURCE tank/workspace share.smb.guestok on inherited from tank tank/workspace%myshare share.smb.guestok on inherited from tank
名前付き共有は、NFS 環境でファイルシステムのサブディレクトリに対して共有を定義するときに役立つことがあります。例:
# zfs create -o share.nfs=on -o share.nfs.anon=99 -o share.auto=off tank/home # mkdir /tank/home/userA # mkdir /tank/home/userB # zfs share -o share.path=/tank/home/userA tank/home%userA # zfs share -o share.path=/tank/home/userB tank/home%userB # grep tank/home /etc/dfs/sharetab /tank/home/userA userA nfs anon=99,sec=sys,rw /tank/home/userB userB nfs anon=99,sec=sys,rw
上記の例は、ファイルシステムの share.auto を off に設定すると、そのファイルシステムの自動共有のみが off になり、他のすべてのプロパティー継承は変更されないことも示しています。他のほとんどの共有プロパティーと異なり、share.auto プロパティーは継承可能ではありません。
名前付き共有は、公開 NFS 共有の作成時にも使用します。公開共有は、名前付きの NFS 共有でのみ作成できます。例:
# zfs create -o mountpoint=/pub tank/public # zfs share -o share.nfs=on -o share.nfs.public=on tank/public%pubshare # grep pub /etc/dfs/sharetab /pub pubshare nfs public,sec=sys,rw
NFS および SMB 共有プロパティーの詳細については、share_nfs(1M) および share_smb(1M) を参照してください。
自動共有が作成されると、ファイルシステム名から一意のリソース名が構築されます。構築される名前はファイルシステム名のコピーですが、リソース名では使用できない文字がファイルシステム名に含まれている場合、それらは下線 (_) で置き換えられます。たとえば、data/home/john のリソース名は data_home_john になります。
share.autoname プロパティー名を設定すると、自動共有の作成時にファイルシステム名を特定の名前で置き換えることができます。この特定の名前は、継承の際に先頭部分のファイルシステム名を置き換えるためにも使用されます。例:
# zfs create -o share.smb=on -o share.autoname=john data/home/john # zfs create data/home/john/backups # grep john /etc/dfs/sharetab /data/home/john john smb /data/home/john/backups john_backups smb
まだ共有されていないファイルシステムでレガシー share コマンドまたは zfs set share コマンドを使用すると、その share.auto 値は自動的に off に設定されます。レガシーコマンドは常に名前付き共有を作成します。この特別な規則によって、自動共有が作成中の名前付き共有を妨害するのを防ぐことができます。
ファイル共有プロパティーの値を表示するには、zfs get コマンドを使用します。次の例は、単一ファイルシステムの share.nfs プロパティーを表示する方法を示しています。
# zfs get share.nfs tank/sales NAME PROPERTY VALUE SOURCE tank/sales share.nfs on local
次の例は、子孫ファイルシステムの share.nfs プロパティーを表示する方法を示しています。
# zfs get -r share.nfs tank/sales NAME PROPERTY VALUE SOURCE tank/sales share.nfs on local tank/sales% share.nfs on inherited from tank/sales tank/sales/log share.nfs on inherited from tank/sales tank/sales/log% share.nfs on inherited from tank/sales
zfs get all コマンド構文では、共有プロパティーの拡張情報は利用できません。
NFS または SMB 共有に関する詳細を表示するには、次の構文を使用します。
# zfs get share.nfs.all tank/sales NAME PROPERTY VALUE SOURCE tank/sales share.nfs.aclok off default tank/sales share.nfs.anon default tank/sales share.nfs.charset.* ... default tank/sales share.nfs.cksum default tank/sales share.nfs.index default tank/sales share.nfs.log default tank/sales share.nfs.noaclfab off default tank/sales share.nfs.nosub off default tank/sales share.nfs.nosuid off default tank/sales share.nfs.public - - tank/sales share.nfs.sec default tank/sales share.nfs.sec.* ... default
共有プロパティーの数が多いため、デフォルト以外の値でプロパティーを表示することを検討してください。例:
# zfs get -e -s local,received,inherited share.all tank/home NAME PROPERTY VALUE SOURCE tank/home share.auto off local tank/home share.nfs on local tank/home share.nfs.anon 99 local tank/home share.protocols nfs local tank/home share.smb.guestok on inherited from tank
共有プロパティー値を変更するには、ファイルシステム共有で新規または変更されたプロパティーを指定します。たとえば、ファイルシステムの作成時に読み取り専用プロパティーを設定した場合、そのプロパティーを off に設定できます。
# zfs create -o share.nfs.ro=\* tank/data # zfs get share.nfs.ro tank/data NAME PROPERTY VALUE SOURCE tank/data share.nfs.sec.sys.ro * local # zfs set share.nfs.ro=none tank/data # zfs get share.nfs.ro tank/data NAME PROPERTY VALUE SOURCE tank/data share.nfs.sec.sys.ro off local
SMB 共有を作成した場合は、NFS 共有プロトコルを追加することもできます。例:
# zfs set share.smb=on tank/multifs # zfs set share.nfs=on tank/multifs # grep multifs /etc/dfs/sharetab /tank/multifs tank_multifs nfs sec=sys,rw /tank/multifs tank_multifs smb -
SMB プロトコルを削除します。
# zfs set share.smb=off tank/multifs # grep multifs /etc/dfs/sharetab /tank/multifs tank_multifs nfs sec=sys,rw
名前付き共有の名前を変更できます。例:
# zfs share -o share.smb=on tank/home/abc%abcshare # grep abc /etc/dfs/sharetab /tank/home/abc abcshare smb - # zfs rename tank/home/abc%abcshare tank/home/abc%a1share # grep abc /etc/dfs/sharetab /tank/home/abc a1share smb -
名前付き共有を破棄しないで一時的に共有解除するには、zfs unshare コマンドを使用します。例:
# zfs unshare tank/home/abc%a1share # grep abc /etc/dfs/sharetab # # zfs share tank/home/abc%a1share # grep abc /etc/dfs/sharetab /tank/home/abc a1share smb -
zfs unshare コマンドを発行すると、すべてのファイルシステム共有が共有解除されます。これらの共有は、そのファイルシステムに対して zfs share コマンドを発行するか、そのファイルシステムに対して share.nfs または share.smb プロパティーを設定するまで共有解除のままです。
zfs unshare コマンドを発行しても定義された共有は削除されず、次回そのファイルシステムに対して zfs share コマンドを発行するか、そのファイルシステムに対して share.nfs または share.smb プロパティーを設定したときに再度共有されます。
ファイルシステム共有を共有解除するには、share.nfs または share.smb プロパティーを off に設定します。例:
# zfs set share.nfs=off tank/multifs # grep multifs /etc/dfs/sharetab #
名前付き共有を完全に削除するには、zfs destroy コマンドを使用します。例:
# zfs destroy tank/home/abc%a1share
Oracle Solaris 11 以降、Oracle Solaris の非大域ゾーン内で NFS 共有を作成して公開できます。
ZFS ファイルシステムは、非大域ゾーンでマウントされて使用できるようになれば、そのゾーン内で共有できます。
ファイルシステムは、非大域ゾーンに委任されておらず、かつ非大域ゾーンにマウントされていない場合に、大域ゾーン内で共有できます。ファイルシステムを非大域ゾーンに追加した場合、レガシー share コマンドを使用することによってのみそれを共有できます。
たとえば、/export/home/data および /export/home/data1 ファイルシステムは、zfszone で使用できます。
zfszone# share -F nfs /export/home/data zfszone# cat /etc/dfs/sharetab
zfszone# zfs set share.nfs=on tank/zones/export/home/data1 zfszone# cat /etc/dfs/sharetab