3

Я пытаюсь удалить каталог, 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 ?

Я использую Ubuntu 16.04 с ext4fs, с последними обновлениями на сегодня.

РЕДАКТИРОВАТЬ: файловая система btrfs, а не ext4fs. Это внешний жесткий диск USB, который я монтирую на /var/lib/lxd моего хоста.

1 ответ1

4

Моя ставка в том, что ваш каталог на самом деле является подуровнем btrfs. Я сделал тест. Когда я пытаюсь rm мой тестовый подтоме я получаю "Операция не допускается".

Если я прав, в вашем случае должно работать следующее:

sudo btrfs subvolume delete foo

Я понимаю, что ваш каталог уже пуст, но в общем случае вам, возможно, придется очистить его заранее.


Дальнейшее объяснение по запросу:

Подобъем - это часть файловой системы с собственной и независимой иерархией файлов / каталогов. Подобъемы могут делиться экстентами файлов.

Вы можете узнать больше из btrfs вики. Основными причинами, по которым можно создать подобъем вместо обычного каталога, являются:

  • подобъем может быть смонтирован как отдельная файловая система со своими собственными параметрами (сравните: хотя вы можете смонтировать обычный каталог с помощью bind mount, он должен существовать в уже смонтированной файловой системе; подобъем 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 вместо @ subvolume в качестве корневой файловой системы. Затем из вновь работающей системы я делаю:

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

После этого я перезагружаюсь. Система восстановлена.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .