我正在尝试允许我的备份程序拍摄文件系统的快照。目标是在备份期间创建快照以确保一致的视图,然后可以删除该快照。
然而,似乎不允许以用户身份创建备份。
% btrfs subvolume snapshot / test
Create a snapshot of '/' in './test'
ERROR: cannot snapshot '/': Operation not permitted
我尝试使用 进行安装user_subvol_rm_allowed
,但需要将 的所有者更新/
为一个特定用户。这不仅不适用于多个用户,而且还会授予他们对驱动器的写访问权限。(我的理解是,快照文件权限相同,因此实际上不会再授予任何访问权限。)即使该组对目录具有写访问权限,它似乎也不适用于组。
有没有办法让特定用户访问此卷的快照(和删除)?到目前为止,我发现的最佳选择是允许一组特定的命令,sudo
这应该可以工作,但我并不喜欢。如果有办法授予此特定功能,我会更愿意。
答案1
似乎没有任何合理的方法可以绕过这项检查。
我在源代码中找到了权限检查。它遵循inode_owner_or_capable
。
if (!inode_owner_or_capable(idmap, src_inode)) {
/*
* Subvolume creation is not restricted, but snapshots
* are limited to own subvolumes only
*/
ret = -EPERM;
}
fs/btrfs/ioctl.c 中的 __btrfs_ioctl_snap_create
inode_owner_or_capable
非常简单,只需检查当前用户是否与文件 UID 匹配或用户是否具有权限CAP_FOWNER
。CAP_FOWNER
非常强大,因此在这种情况下不是有用的绕过方法。
bool inode_owner_or_capable(struct mnt_idmap *idmap,
const struct inode *inode)
{
vfsuid_t vfsuid;
struct user_namespace *ns;
vfsuid = i_uid_into_vfsuid(idmap, inode);
if (vfsuid_eq_kuid(vfsuid, current_fsuid()))
return true;
ns = current_user_ns();
if (vfsuid_has_mapping(ns, vfsuid) && ns_capable(ns, CAP_FOWNER))
return true;
return false;
}