Как удалить файлы после ошибки EXT4-fs: дыра в каталоге найдена
У меня есть определенный каталог, где я не могу удалить файлы или каталог. Каталог находится в файловой системе ext4, использующей RAID5 на трех дисках в QNAP NAS.
С помощью rm -f
дает мне:
rm: unable to stat `file.jpg': Input/output error
А также показывает следующее на dmesg:
EXT4-fs error (device dm-0): dx_probe:933: inode #55050534: block 3591: comm rm: Directory hole found
Поскольку "ошибка ввода / вывода" обычно означает аппаратное обеспечение, я провел несколько тестов, например, то, что я предполагаю, является версией QNAP fsck
, badblocks
, а также быстрые и длительные тесты SMART на отдельных дисках, плюс рейдовая очистка все равно периодически запускается - и все возвращаются без ошибок.
В папке много файлов, так как это черная дыра для тысяч файлов, добавляемых ежедневно / ежечасно (не в состоянии считать их как ls | wc
страдает от ошибок "Ошибка ввода / вывода" и "Ошибка дыры в каталоге") - поэтому, основываясь на аналогичном сообщении о черной дыре) Я предполагаю, что я уничтожил каталог, а не оборудование.
К сожалению, версия find на QNAP не поддерживает -exec
аргумент, и поэтому я не могу попробовать то, что было предложено в этом посте.
Вопросы:
- Что именно является "дырой в каталоге",
- Как я могу удалить каталог и файлы внутри отверстия каталога.
2 ответа
На самом деле дыры в каталогах являются функцией ext4 с 2013 года, но ядро Linux не было исправлено для ее поддержки до конца 2019 года. Однако дыры в каталогах могут образовываться только в результате запуска fsck, поэтому это может быть косвенно вызвано ошибками данных, которые заставил вас запустить fsck.
Следующая опция fsck должна удалить все дыры в каталогах:
fsck.ext4 -Df dm-0
Обязательно запускайте в несмонтированной файловой системе (также будет работать и в смонтированной файловой системе только для чтения, но существует небольшой риск того, что любой, читающий файлы во время работы fsck, получит мусор).
Имейте в виду, что это займет как минимум столько же времени, сколько и полная fsck (например,fsck.ext4 -f dm-0
), и в течение этого периода файловая система не будет доступна для использования.
Запустите команду ниже в этом каталоге. По сути, это замена -exec rm {}. Он создаст список файлов внутри dir и создаст несколько команд rm с ограничением аргументов за один запуск, равным 10
find ./ -type f|xargs -n 10 rm
Выше будут удалены все файлы в этом каталоге, если это было вашим намерением. Я, вероятно, попытался бы сначала спасти файлы, скопировав их в другой каталог.