
У меня есть машины FreeNAS (11.1-U1) и FreeBSD (11.1-RELEASE-p6). На FreeNAS я хотел бы zfs receive
рекурсивно делать снимки как не-root пользователь с делегированными привилегиями. Похоже, это хорошо работает для большинства дочерних наборов данных. Но наборы данных iocage data
, которые можно смонтировать в jail и администрировать оттуда, терпят неудачу:
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 и, в более общем плане, есть ли способ заставить его zfs receive
выдавать более подробное сообщение об ошибке, в котором будет указано, какого разрешения не хватает?
решение1
При устранении неполадок с разрешениями, возникающих в результате zfs
выполнения команд, проанализируйте zfs
операцию с точки зрения ее составляющих этапов.
Пример команды zfs receive -duvF
unpacks в несколько шагов. Два из этих флагов не относятся к каким-либо специальным разрешениям:
-d влияет на наименование нового набора данных (если таковой имеется)
-v включает подробный вывод
Остальные двое — да.
-F означает, что файловая система будет откачена к начальному снимку инкрементной передачи до начала приема.
-u означает, что файловая система не будет смонтирована после завершения приема.
Я подозреваю, что у вас отсутствует разрешение на откат. Флаг -F в вашей команде подразумевает, что zfs rollback
будет выполнено a, а ваш 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
разрешение)
Четвертый шаг — повторное монтирование вновь названной файловой системы в ее новой, возможно, измененной точке монтирования, которая снова использует разрешение 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
.
Похоже, что на томе он установлен правильно, но на снимке отсутствует.