授予用户在 btrfs 中创建快照的权限

授予用户在 btrfs 中创建快照的权限

我正在尝试允许我的备份程序拍摄文件系统的快照。目标是在备份期间创建快照以确保一致的视图,然后可以删除该快照。

然而,似乎不允许以用户身份创建备份。

% 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_FOWNERCAP_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;
}

fs/inode.c 中的 inode_owner_or_capable

相关内容