我正在尝试删除一个目录,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
设置的附加属性。那么,为什么要显示——并且继续显示——下一个列表呢?foo
chattr
ls -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 @
之后我重新启动。系统恢复了。