普通用户为什么不能删除btrfs子卷


12

使用循环安装的用户创建的btrfs文件系统,并正确设置权限,用户可以自由创建btrfs子卷:

user@machine:~/btrfs/fs/snapshots$ /sbin/btrfs sub create newsubvol
Create subvolume './newsubvol'

但是,尝试删除新创建的子卷会导致错误:

user@machine:~/btrfs/fs/snapshots$ /sbin/btrfs sub del newsubvol
Delete subvolume '/home/user/btrfs/fs/snapshots/newsubvol'
ERROR: cannot delete '/home/user/btrfs/fs/snapshots/newsubvol'

root用户当然可以删除它:

root@machine:/home/user/btrfs/fs/snapshots# /sbin/btrfs sub del newsubvol
Delete subvolume '/home/user/btrfs/fs/snapshots/newsubvol'

创建和删除操作之间的行为差​​异似乎有些奇怪。谁能对此有所启发?

这是命令的确切顺序:

user@machine:~$ dd if=/dev/zero of=btrfs_disk bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 1.2345 s, 84.9 MB/s
user@machine:~$ mkdir mountpoint
user@machine:~$ /sbin/mkfs.btrfs btrfs_disk

WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

SMALL VOLUME: forcing mixed metadata/data groups
Created a data/metadata chunk of size 8388608
fs created label (null) on btrfs_disk
    nodesize 4096 leafsize 4096 sectorsize 4096 size 100.00MB
Btrfs Btrfs v0.19
user@machine:~$ sudo mount btrfs_disk mountpoint/
user@machine:~$ cd mountpoint/
user@machine:~/mountpoint$ /sbin/btrfs sub create test
Create subvolume './test'
user@machine:~/mountpoint$ /sbin/btrfs sub delete test
Delete subvolume '/home/user/mountpoint/test'
ERROR: cannot delete '/home/user/mountpoint/test' - Operation not permitted

这里是权限:

user@machine:~/mountpoint$ ls -la
total 4
drwxr-xr-x 1 user user    8 Set  4 09:30 .
drwx------ 1 user user 4486 Set  4 09:29 ..
drwx------ 1 user user    0 Set  4 09:38 test

和有关的行df -T

Filesystem              Type     1K-blocks      Used Available Use% Mounted on
/dev/loop0              btrfs       102400        32     98284   1% /home/user/mountpoint

该发行版是Debian Wheezy的3.2.0-4-686-pae内核v0.19btrfs-tools。这种情况仍然出现在Ubuntu Saucy,3.11.0-4-generic内核,v0.20-rc1btrfs-tools上。


根据我的理解,此文件系统类型仍处于试验阶段,尚未准备就绪。
mdpc

您可以添加的输出df -Tbtrfs version?当我尝试相同的操作时,出现以下错误“错误:无法创建子卷-权限被拒绝”
bsd 2013年

@mdpc的确如此,但是btrfs已经存在了很多年,并且在现阶段它有望保持稳定。此时,了解这是错误还是“功能”可能仍然有用。
goncalopp

@bdowning我已经添加了确切的命令顺序,df和使用的版本。
goncalopp

现在3.2内核已有一年半的历史了。如果要使用实验性文件系统,则可能要运行更新的内核。
psusi 2013年

Answers:


14

嗯,这对我来说是一次学习的经历,但最终我弄明白了。我将在这里解释我的过程,以便更轻松地了解如何自行解决这些问题(我确定您已经发现,BTRFS文档暂时还不完整)。

起初我以为创建子卷是一个ioctl带有处理程序的处理程序,该处理程序不进行任何功能检查(根据是否有逻辑,这可能是安全问题,也可能不是安全问题),而删除它则是直接修改元数据(因此用户可能需要CAP_SYS_RAWIO正常工作)。

为了验证,我打开了btrfs-utils源代码,这是我发现的内容:

Create subvolume, cmds-receive.c Line 180:
         ret = ioctl(r->dest_dir_fd, BTRFS_IOC_SUBVOL_CREATE, &args_v1);

Delete subvolume, cmds-subvolume.c Line 259:
         res = ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &args);

好吧,这无济于事,它们都是 ioctl的(有趣的旁注:由于某些原因,“快照”经常在源代码中与“子卷”互换使用)。因此,我转到了内核源代码,并在中找到了两个处理程序fs/btrfs/ioctl.c

最终,我将其追溯到btrfs_ioctl_snap_destroy()2116行:

     if (!capable(CAP_SYS_ADMIN)){

具体来说,这是对他们是否不具备此功能的检查,但是如果他们确实具有该功能,则逻辑将直接跳过以执行该操作。if语句的主体检查是否是该子卷的inode的所有者是普通用户,并且USER_SUBVOL_RM_ALLOWEDBTRFS选项启用了它继续执行该处理程序。如果它们均不存在,则ioctl处理程序将退出并显示错误。

因此,看起来要销毁“快照”(又称“子卷”)通常需要具有的用户CAP_SYS_ADMIN(或USER_SUBVOL_RM_ALLOWED要启用该功能,并且用户“拥有”给定的子卷)。太好了,如何创建快照/卷?

ioctl的btrfs_ioctl_snap_create()处理程序似乎是此处理程序似乎不包含capable()直接或间接调用。因为这是访问代理的主要方式,所以我要说这意味着子卷创建总是成功的。这在功能级别上解释了为什么您看到自己看到的内容。

在BTRFS的主要用例之外,对于用户访问受限的服务器,为什么我不认为这是可取的。这还不够,但是我没有看到任何代码实际停止该操作。如果找不到原因的答案(并且很想得到答案),则可能需要在内核邮件列表中询问。

结论

我的研究似乎表明,任何人都可以创建子卷,但是要删除子卷,您要么需要拥有,CAP_SYS_ADMIN要么需要真正做到的是,调用用户是子卷inode的所有者并已USER_SUBVOL_RM_ALLOWED启用。

子卷的创建没有任何意义,因此我可能会丢失一些间接拒绝操作的方式,因为这似乎是对系统进行DoS的一种简便方法。

注意:我不在可以验证此功能的地方,但是一旦回到家,就可以设置setcap魔术是否可以预测此功能。


如果rmdir允许在空子卷上使用,则有意义的方式(关于您的DoS关注)。然后rm -r将透明地工作。不幸的是,代码还没有被开发出来。似乎有人在2010年进行了3次尝试,然后放弃了:(。spinics.net/lists/linux-btrfs/msg06499.html
sourcejedi

5

删除子卷可以使某人取消链接他们不拥有的文件。在我看来,特权用户在特权较低的用户选择的位置写入的文件是公平的游戏,但是贡献非root用户删除功能的人可能对这些语义的安全性和内容安全性没有足够的信心。提交它们作为新的挂载选项(mount -o user_subvol_rm_allowed)。


1
令人惊讶的是,在UNIX®中,您可以轻松地取消链接您不拥有的文件-您只需要在其目录中具有写许可权即可。
poige

我在fedora 20上有同样的问题,我在一个子卷中有/ home,我使用的是root用户,但是无论如何,我无法删除/ home
c4f4t0r 2014年

poige,如果有问题的文件在您不拥有的文件夹中,则无法取消链接,也无法取消链接文件夹本身,因为它仍然包含内容。您只能在此文件夹上执行非破坏性操作,例如移动它或重命名它。
sleblanc

-1

“无法删除/ home”(@ home)。

除非您创建了/ home_snapshot_yymmdd快照来替换/ home,否则为什么要删除/ home /帐户所在的子卷?

我是使用btrfs的新手,但这是我发现的内容:@ /和@home(/和/ home)是btrfs在将HDR作为文件系统安装时创建的。据我了解,除非您要从以前的快照还原/ home,否则您将不知所措。

但是,您可以使用mount / dev / sa / mnt /(或正在运行的btrfs系统所在的设备)以AS ROOT方式挂载/ home所在的设备,然后将CD cd到/ mnt /,然后从此处发出delete命令。 @家。然后,您可以使用mv命令将@home_snapshot_yymmdd(或您命名的任何内容)移动到@home。根据@home的大小,移动可能需要几个小时。然后将CD返回到您自己的帐户并发出sudo umount / mnt /您从未真正注销或关闭系统。这是btrfs的优点。


似乎他们已经这样做了。除非您告诉Btrfs这样做,否则Btrfs不会生成@和@home(或像Ubuntu这样的发行版会为您这样做)。
Anthon 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.