Не могу удалить файл как root

422
Adam Griffin

Обычное обновление системы (Linux Mint 19) завершилось ошибкой из-за невозможности сделать резервную копию файла. У файла очень странный владелец, группа и странное поведение lsattr. Невозможно удалить файл как root.

$ ls -lah total 64K drwxr-xr-x 2 root root 4.0K Sep 14 00:41 . drwxr-xr-x 15 root root 4.0K Jul 20 06:18 .. -rw-r--r-- 1 root root 18K Jul 17 03:41 cs-xlet-danger.svg -rw-r--r-- 1 root root 13K Jul 17 03:41 cs-xlet-running.svg -rw-r--r-- 1 root root 19K Jul 17 03:41 cs-xlet-system.svg -rw-r--r-- 1 2558197760 2848915456 0 Jul 17 03:41 cs-xlet-update.svg $ sudo rm -f cs-xlet-update.svg  rm: cannot remove 'cs-xlet-update.svg': Operation not permitted $ lsattr . --------------e--- ./cs-xlet-danger.svg --------------e--- ./cs-xlet-system.svg lsattr: No data available While reading flags on ./cs-xlet-update.svg --------------e--- ./cs-xlet-running.svg 

Затем я загружаюсь в live CD для проверки файловой системы.

$ sudo e2fsck -f /dev/sda1 e2fsck 1.44.1 (24-Mar-2018) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/sda1: 291836/1310720 files (0.4% non-contiguous), 2935417/5242624 blocks 

После подтверждения правильности файловой системы я монтирую диск и пытаюсь удалить файл с операционной системы Live CD (Linux Mint).

$ ls -lah total 64K drwxr-xr-x 2 root root 4.0K Sep 14 04:41 . drwxr-xr-x 15 root root 4.0K Jul 20 10:18 .. -rw-r--r-- 1 root root 18K Jul 17 07:41 cs-xlet-danger.svg -rw-r--r-- 1 root root 13K Jul 17 07:41 cs-xlet-running.svg -rw-r--r-- 1 root root 19K Jul 17 07:41 cs-xlet-system.svg -rw-r--r-- 1 2558197760 2848915456 0 Jul 17 07:41 cs-xlet-update.svg $ sudo rm -f cs-xlet-update.svg  rm: cannot remove 'cs-xlet-update.svg': Operation not permitted $ lsattr . --------------e--- ./cs-xlet-danger.svg --------------e--- ./cs-xlet-system.svg lsattr: No data available While reading flags on ./cs-xlet-update.svg --------------e--- ./cs-xlet-running.svg 

Наконец, я пытаюсь удалить его по индоду безуспешно:

$ ls -i cs-xlet-update.svg  220926 cs-xlet-update.svg $ find . -inum 220926 -exec sudo rm -i {} \; rm: remove regular empty file './cs-xlet-update.svg'? y rm: cannot remove './cs-xlet-update.svg': Operation not permitted 

Как я могу избавиться от этого файла?

1
На самом деле (принудительно) не проверял файловую систему, без флага -f e2fsck просто бросил быстрый взгляд и сказал, что он не помечен как грязный. И был ли он установлен для записи (RW)? Xen2050 5 лет назад 0
@ Xen2050 Отличная идея! К сожалению, ничего не нашел. Я отредактировал мою строку e2fsck с результатами -f. И да, файловая система смонтирована как rw. Adam Griffin 5 лет назад 0

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

0
Xen2050

После форсирования fsck (с его -fфлагом), и он все еще выглядит чистым ... Номера пользователей / групп необычны, обычно они меньше 10000, я думаю, два миллиарда выглядят неправильно, и они равны нулю байтов .. что-то смешное Могут также быть некоторые расширенные атрибуты, чтобы проверить, если они не работают.

Может быть, попробуйте листинг по индоду

ls -il 

а затем удалить с помощью inode с помощью команды find и rm

find . -inum [inode-number] -exec rm -i {} \; 

или другой пример рекомендовал некоторые найти "безопасность" и найти -delete

find . -maxdepth 1 -type f -inum [inode-number] -delete 

для еще большей «безопасности» сначала проверьте, какой файл найден, опуская -delete, используя «print» по умолчанию

find . -inum [inode-number] 

Если они все еще не работают, debugfsесть некоторые команды, которые должны, и многие из этих команд принимают inode в качестве аргумента

 rm pathname Unlink pathname. If this causes the inode pointed to by pathname to have no other references, deallocate the file. This command functions as the unlink() system call. 

или, может быть

 unlink pathname Remove the link specified by pathname to an inode. Note this does not adjust the inode reference counts. 

И даже если расширенные атрибуты вызывают проблемы, вы можете попытаться getfaclперечислить их и setfaclизменить, эта -b, --remove-allопция кажется удобной. Или в attrпакете есть getfattrи setfattr.

Или debugfs также имеет некоторые расширенные команды атрибутов, такие как:

 ea_get [-f outfile] filespec attr_name Retrieve the value of the extended attribute attr_name in the file file‐ spec and write it either to stdout or to outfile.  ea_list filespec List the extended attributes associated with the file filespec to stan‐ dard output.  ea_set [-f infile] filespec attr_name attr_value Set the value of the extended attribute attr_name in the file filespec to the string value attr_value or read it from infile.  ea_rm filespec attr_names... Remove the extended attribute attr_name from the file filespec. 
Мой оригинальный вопрос показал, что удаление по inode также не удалось. Однако, кажется, что debugfs, использующий путь к файлу rm, сработал. Это не дало никаких причин, почему это работало или почему rm не работало, но, похоже, я снова в деле. Спасибо! Adam Griffin 5 лет назад 0
Я не был уверен, что это просто проблемы, возможно, найти `-delete 'могло бы что-то другое. В конечном итоге это сработало, и другие (в старых постах, может быть, когда ext была менее стабильной?) Предположили, что использование fsck - хорошая идея после использования debugfs Xen2050 5 лет назад 0

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