Невозможно удалить каталог как `root`, даже после` chattr -i`

702
Harry

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

3
Вы пробовали "chown root: root foo" и "chmod 555 foo", чтобы вы могли удалить его? Сдается мне, что папка сломана. : P Не то чтобы это сильно помогло. cengbrecht 7 лет назад 0
@cengbrecht Я пробовал `chown 'ранее, но на этот раз попытка` chmod` тоже не сработала. Кстати, см. Мой РЕДАКТИРОВАТЬ выше через секунду. Harry 7 лет назад 0
что насчет ls -lah cengbrecht 7 лет назад 0
как насчет fsck, вы проверили диск? (Просто бросаю то, что я делаю, на мои серверы у тебя) cengbrecht 7 лет назад 0
Нету. `btrfsck` не сообщил об ошибках. `ls -lah` в родительском элементе` foo` сообщает 0 байтов для `foo`; внутри `foo` он перечисляет только каталоги` .` и `..`, с дополнительным разрешением` + `для` .`. Harry 7 лет назад 0

1 ответ на вопрос

4
Kamil Maciorowski

Моя ставка в том, что ваш каталог на самом деле является подуровнем 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вместо @подсоба в качестве корневой файловой системы. Затем из вновь работающей системы я делаю:

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

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

Это сработало, спасибо тонну. Но я потрясен, узнав, как подобъем btrfs (который сам по себе является файловой системой) способен противостоять командам `root`` `rm -f` и` chattr -i`. Где я могу найти более подробную информацию об этом и других подобных шокерах о btrfs? Был бы рад, если бы вы немного уточнили это в своем ответе, который я уже отметил как окончательный. Harry 7 лет назад 0
@ Гарри, я расширил свой ответ. Kamil Maciorowski 7 лет назад 1

Похожие вопросы