无法以“root”身份删除目录,即使在“chattr -i”之后

无法以“root”身份删除目录,即使在“chattr -i”之后

我正在尝试删除一个目录,foo但完全没有其他方法可以尝试。

注意:我知道,我不应该用 删除 LxD 容器rm,但是我之前弄乱了这个目录的内容,所以rm现在可以使用。)

foo请注意, (即目录)的父级containers对其具有写权限。

[root@box /var/lib/lxd]$ ls -l
drwx--x--x 1 root root    74 Dec 24 09:09 containers
    <snip>

[root@box /var/lib/lxd]$ cd containers/
[root@box /var/lib/lxd/containers]$ ls -l
    <snip>
drwxr-xr-x+ 1 231072 231072     0 Dec 24 09:13 foo

[root@box /var/lib/lxd/containers]$ ls -l foo
total 0

[root@box /var/lib/lxd/containers]$ lsattr 
    <snip>
---------------- ./foo

[root@box /var/lib/lxd/containers]$ lsattr -d foo
---------------- foo

[root@box /var/lib/lxd/containers]$ /bin/rm -rf foo
/bin/rm: cannot remove 'foo': Operation not permitted

[root@box /var/lib/lxd/containers]$ chattr -R -ia foo
[root@box /var/lib/lxd/containers]$ lsattr -d foo
---------------- foo

[root@box /var/lib/lxd/containers]$ /bin/rm -rf foo
/bin/rm: cannot remove 'foo': Operation not permitted

[root@box /var/lib/lxd/containers]$ ls -l
    <snip>
drwxr-xr-x+ 1 231072 231072     0 Dec 24 09:13 foo

甚至chown -R root.root foo沒有幫助!

令人惊讶的是,没有显示任何在命令开始时和之后lsattr设置的附加属性。那么,为什么要显示——并且继续显示——下一个列表呢?foochattrls -l foo+foo

我正在使用带有 ext4fs 的 Ubuntu 16.04,其中包含截至今天的最新更新。

编辑:文件系统是文件系统,而不是 ext4fs。这是我安装在主机上的外部 USB 硬盘/var/lib/lxd

答案1

我敢打赌,您的目录实际上是一个 btrfs 子卷。我做了一个测试。当我尝试rm我的测试子卷时,我收到“操作不允许”的消息。

如果我是对的,那么以下方法应该适用于你的情况:

sudo btrfs subvolume delete foo

我知道您的目录已经是空的,但一般情况下您可能必须事先清空它。


根据要求进一步解释:

子卷是文件系统的一部分,具有自己独立的文件/目录层次结构。子卷可以共享文件范围。

您可以从btrfs 维基。想要创建子卷而不是常规目录的主要原因是:

  • 子卷可以像单独的文件系统一样进行挂载,具有自己的选项(比较:虽然您可以使用绑定挂载来挂载常规目录,但它必须存在于已挂载的文件系统中;btrfs 子卷可以轻松地作为根文件系统进行挂载/);
  • 可以创建一个子卷快照,它是一个单独的子卷,最初与源子卷共享所有文件范围。

实例:

我的 btrfs 文件系统具有以下内部结构(请记住,该结构与系统看到的目录结构不同;挂载点属于后者):

/                        # btrfs root filesystem mounted as /mnt/ssd/
  @                      # a subvolume I use as the root filesystem (mounted as /)
  @backups
    @-20161215-1-working # a snapshot of @ just in case

假设我想弄乱我的系统。为了以防万一,我首先创建了一个快照:

cd /mnt/ssd/@backups
sudo btrfs subvolume snapshot ../@ @-20161224-1-just_in_case

我在我的工作系统内执行此操作,无需花费时间。它最初也不占用磁盘空间。当相应的文件和目录树开始不同时,将稍后分配额外的空间。

接下来,我甚至可以破坏位于子卷内的系统@。只要@backups/@-20161224-1-just_in_case子卷完好无损,我就可以@像什么都没发生一样用此备份进行替换。在最坏的情况下,我需要从实时发行版启动才能做到这一点。但如果我的引导加载程序(GRUB2)仍然有效,我可以在启动时编辑其条目并暂时使用@backups/@-20161224-1-just_in_case@卷作为我的根文件系统。然后,在再次工作的系统中,我执行以下操作:

cd /mnt/ssd/
sudo btrfs subvolume delete @  # I may have to empty it first
sudo btrfs subvolume snapshot @backups/20161224-1-just_in_case @

之后我重新启动。系统恢复了。

相关内容