
私は FreeNAS (11.1-U1) と FreeBSD (11.1-RELEASE-p6) マシンを持っています。FreeNAS では、zfs receive
委任された権限を持つ非ルート ユーザーとして再帰スナップショットを作成したいと考えています。これは、ほとんどの子データセットではうまく機能しているようです。しかし、data
jail にマウントしてそこから管理できる iocage のデータセットでは失敗します。
root@freebsd:~> zfs send -RI "dozer@2018-02-21" "dozer@2018-03-08" | ssh -T -i /root/backup_key backupuser@freenas zfs receive -dvuF neo/backups/freebsd
receiving incremental stream of dozer@2018-03-03 into neo/backups/freebsd@2018-03-03
received 312B stream in 1 seconds (312B/sec)
receiving incremental stream of dozer@2018-03-07 into neo/backups/freebsd@2018-03-07
received 312B stream in 1 seconds (312B/sec)
receiving incremental stream of dozer@2018-03-08 into neo/backups/freebsd@2018-03-08
received 312B stream in 1 seconds (312B/sec)
receiving incremental stream of dozer/ROOT@2018-03-03 into neo/backups/freebsd/ROOT@2018-03-03
.
.
.
receiving incremental stream of dozer/iocage/jails/owncloud/root@2018-03-08 into neo/backups/freebsd/iocage/jails/owncloud/root@2018-03-08
received 578MB stream in 110 seconds (5.25MB/sec)
receiving incremental stream of dozer/iocage/jails/owncloud/root/data@2018-03-03 into neo/backups/freebsd/iocage/jails/owncloud/root/data@2018-03-03
cannot receive incremental stream: permission denied
warning: cannot send 'dozer/iocage/jails/owncloud/root/data@2018-03-03': signal received
warning: cannot send 'dozer/iocage/jails/owncloud/root/data@2018-03-07': Broken pipe
warning: cannot send 'dozer/iocage/jails/owncloud/root/data@2018-03-08': Broken pipe
その特定の子の権限は、親データセットの権限とまったく同じです。
root@freenas:~ # zfs allow neo/backups/freebsd/iocage/jails/owncloud/root/data
---- Permissions on neo/backups/freebsd -----------------------------
Local+Descendent permissions:
user backupuser atime,compression,create,dedup,exec,jailed,mount,mountpoint,quota,receive,rename,reservation,setuid,userprop
zfs receive
FreeNAS 上で root として実行すると、期待どおりに動作します。
iocage の jail 化されたデータセットを受信するために、ユーザーにはどのような委任された権限が必要ですかzfs receive
。また、より一般的には、不足している権限を示すより詳細なエラー メッセージを表示する方法はありますか。
答え1
zfs
コマンドから発生する権限の問題をトラブルシューティングする場合は、zfs
操作をその構成手順の観点から分析します。
のサンプル コマンドは、zfs receive -duvF
いくつかのステップに分かれています。これらのフラグのうち 2 つは、特別な権限とは関係ありません。
-d は新しいデータセット(存在する場合)の名前に影響します
-v は詳細な出力を有効にします
他の2つはそうです。
-F は、受信開始前にファイルシステムが増分転送の初期スナップショットにロールバックされることを意味します
-u は、受信終了後にファイルシステムがマウントされないことを意味します
ロールバック権限がないのではないかと思います。コマンドの -F フラグは がzfs rollback
実行されることを意味し、 は をzfs allow
リストしませんrollback
。
一般的なケースでは、特定のコマンドに必要な権限について演繹的に推測することができますzfs
。
のマニュアルページにはzfs
次のように記載されています:
権限名は、ZFS サブコマンドおよびプロパティ名と同じです。
そして ...
権限とは、通常、ZFS サブコマンドを使用したり、ZFS プロパティを変更したりする権限です。次の権限が利用可能です。
NAME TYPE NOTES allow subcommand Must also have the permission that is being allowed clone subcommand Must also have the 'create' ability and 'mount' ability in the origin file system create subcommand Must also have the 'mount' ability destroy subcommand Must also have the 'mount' ability diff subcommand Allows lookup of paths within a dataset given an object number, and the ability to create snapshots necessary to 'zfs diff' hold subcommand Allows adding a user hold to a snapshot mount subcommand Allows mount/umount of ZFS datasets promote subcommand Must also have the 'mount' and 'promote' ability in the origin file system receive subcommand Must also have the 'mount' and 'create' ability release subcommand Allows releasing a user hold which might destroy the snapshot rename subcommand Must also have the 'mount' and 'create' ability in the new parent rollback subcommand Must also have the 'mount' ability send subcommand share subcommand Allows sharing file systems over the NFS protocol snapshot subcommand Must also have the 'mount' ability groupquota other Allows accessing any groupquota@... property groupused other Allows reading any groupused@... property userprop other Allows changing any user property userquota other Allows accessing any userquota@... property userused other Allows reading any userused@... property aclinherit property aclmode property atime property canmount property casesensitivity property checksum property compression property copies property dedup property devices property exec property filesystem_limit property logbias property jailed property mlslabel property mountpoint property nbmand property normalization property primarycache property quota property readonly property recordsize property refquota property refreservation property reservation property secondarycache property setuid property sharenfs property sharesmb property snapdir property snapshot_limit property sync property utf8only property version property volblocksize property volsize property vscan property xattr property
この例には-u
フラグが含まれているため、受信操作の終了時にファイル システムはマウントされません。ただし、フラグ-u
がない場合、ファイル システムは受信プロセスの終了時にマウントされます。つまり、receive
権限には権限が必要ですmount
。
zfs mount
操作では必要なマウントポイントが自動的に作成されるため、zfs
データセットをマウントする権限はあっても、マウントポイントを作成するためのファイルシステム権限がないユーザーがいる可能性があります。 の場合zfs mount
、マウントは失敗します。zfs create
またはrename
操作では、ファイルシステムが作成または名前変更されますが、ユーザーにマウントポイントを作成するための十分なファイルシステム権限がない場合は、マウント解除されたままになります。
同様に、zfs rename
名前変更操作のいくつかの時点で権限不足のためにコマンドが失敗する可能性があります。大まかに表現すると、コンポーネントの手順は次のようになります。
1) ファイルシステムをアンマウントする (mount
権限 )
2) 新しいファイルシステムを作成する (create
権限 )
3) ファイルシステムのメタデータを新しい名前にマップする (rename
権限 )
4 番目のステップは、新しく名前が付けられたファイルシステムを、変更された可能性のある新しいマウントポイントに再マウントすることです。この場合も、権限mount
と、場合によってはファイルシステムの権限を使用して、新しいマウントポイントが作成されます。
このようなトリックはテストしていませんが、が と の権限zfs
を区別し、と の権限も区別していることがわかります。ユーザーが新しいファイルシステムを作成できるようにすることは可能かもしれませんが、いったん作成すると、ユーザーはその名前を変更できません。継承されたマウントポイントを持つファイルシステムの場合、ファイルシステムの名前を変更すると、多くの場合、ファイルシステムのマウントポイントの名前も変更されます。たとえば、に名前を変更すると、マウントポイントが から に変更されます。create
rename
mount
mountpoint
tank/usr/local
tank/usr/local.OLD
/usr/local
/usr/local.OLD
mount
権限rename
の分離は、mountpoint
ユーザーがファイルシステムの名前を変更することはできるが、そのマウントポイントを変更することはできないことを意味します。またはその逆で、ファイルシステムがマウントされている場所を変更することはできるが、ファイルシステムの名前を変更することはできないことになります。
豊富なファイルシステム操作とそれらの操作の委任、そして権限の細分化により、zfs
多少困難ではありますが、非常に強力になります。
答え2
権限が欠落しているスナップショットがあるようです。
receive
に権限を設定してみてくださいneo/backups/freebsd/iocage/jails/owncloud/root/data@2018-03-03
。
ボリューム上では適切に設定されているように見えますが、スナップショットには設定されていません。