Назад | Перейти на главную страницу

Очень странная ошибка повреждения диска

У меня есть сервер, на котором я удалил большой файл. Назовем это ~/tempfile.txt. Каким-то образом удаление не сработало должным образом, и диск был поврежден, то есть du -hs * не показывает, что файл существует. Но df -h показывает, что корневой раздел заполнен.

Оказывается, это известная проблема, которая может произойти из-за того, что к «удаленному» файлу обращается запущенный процесс. Ответ stackoverflow предложил запустить lsof +L1 чтобы получить список таких файлов. Что ж, запуск дает следующую запись:

COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF NLINK  NODE NAME
none    2241 root txt    REG    0,5     8560     0 52453 / (deleted)

Пара странностей:

  1. «Имя» должно быть «~ / tempfile.txt», но это не так.
  2. Номер inode - 52453 указывает на другой файл: /usr/src/linux-azure-headers-5.0.0-1025/include/uapi/video/sisfb.h.
  3. Процесс с PID 2241 не существует.

Стандартная процедура - убить PID, обращающийся к этому файлу, но такого процесса нет.

Я попытался перезагрузиться, но это не вернуло свободное пространство (что должно быть, если процесс обращается к файлу). Вместо этого бег lsof +L1 снова дал запись, но на этот раз номер inode и pid были другими, но поле «Имя» было таким же (/).

Я подумал о запуске fsck. Сначала запустил его непосредственно в режиме пробного запуска, используя fsck.ext4 -nvf /dev/sda1 и в выходных данных говорилось, что есть некоторые проблемы: «Свободные блоки подсчитываются неправильно, Свободные inodes подсчитываются неправильно, Различия в битовых картах блоков» и т.д. .

Хорошо. fsck.ext4 -nvf /dev/sda1 показал, что нет ничего плохого! Итак, я попробовал бежать lsof +L1, и сюрприз, сюрприз. Никаких файлов-призраков! Свободно ли теперь место на диске? df -h - по-прежнему 100% использование диска.

Я попытался перезагрузиться с помощью rw-монтирования корневого раздела и fsck & lsof +L1 снова пожаловался.

Это продолжает происходить детерминированно - режим только для чтения не показывает ошибок, тогда как монтирование чтения-записи показывает ошибки диска.

Я понятия не имею, что происходит. Есть ли у кого-нибудь разумное предположение, в чем может быть проблема?

У меня есть резервные копии данных, поэтому я могу просто запустить другой сервер с данными, но это очень странно, и я хотел бы понять, что происходит.

Создайте образ диска, чтобы иметь копию для работы.

Просмотрите использование диска в верхней части дерева, чтобы узнать, где используется большая часть хранилища. (Или нет, если дентри не может перечислить проблемный файл.) ncdu это программа, которая визуализирует использование пространства дерева.

fsck блочное устройство при чтении, записи и отключении (и сохраните вывод). Это звучит как rootfs, и в этом случае рассмотрите возможность подключения диска к другому экземпляру и fsck там. В противном случае настройте среду ранней загрузки на всегда fsck, а затем перезагрузитесь. Как это сделать, зависит от дистрибутива, например systemd выполняет ранний fsck иначе, чем предыдущие сценарии инициализации. В любом случае, проверьте такие вещи, как осиротевшие inodes, которые могут получить ссылку в lost+found.

lsof имеет ограниченное использование, если файл еще не открыт. Возможно, вы видите несвязанные открытые несвязанные файлы.


При наличии резервной копии восстановление или новый экземпляр - это быстрое восстановление. Насколько далеко вы хотите исследовать, зависит от вашего любопытства и от того, может ли эта проблема возникнуть снова.