Как отладить эту ошибку FS на флэш-устройстве?
У меня есть консольный доступ к встроенному устройству Linux. Это устройство имеет флэш-память, часть которой разделена как файловая система FAT.
Это работает Linux-2.6.31.
Однако в эти дни я вижу эти ошибки на консоли, и файловая система FAT становится доступной только для чтения.
111109:154925 FAT: Filesystem error (dev loop0)
111109:154925 fat_get_cluster: invalid cluster chain (i_pos 0)
111109:154925 FAT: Filesystem error (dev loop0)
111109:154925 fat_get_cluster: invalid cluster chain (i_pos 0)
Я не могу понять, почему это произошло? В чем причина? И что это за исправление? Я был бы признателен за ответы, которые могут указать мне, как исследовать возможную основную причину этой проблемы на устройстве.
3 ответа
Что действительно произошло на уровне битов и байтов, так это то, что 4 байта (или больше) таблицы размещения файлов были перезаписаны 0x00
байт.
Я кратко объясню, как работает таблица размещения файлов. Его можно рассматривать как массив, значения которого являются индексами этого же массива. Так что, если мы знаем, что первый номер кластера файла i
тогда следующий номер кластера fat[i]
и следующий после этого fat[fat[i]]
, и так далее. (Это немного упрощено). Чтобы сигнализировать о достижении конца цепочки, вместо действительного номера кластера используется специальное значение EOC.
Чтобы прочитать файл FAT с диска, вам нужны номера кластеров, в которых этот файл хранится, по порядку. Запись каталога дает первый номер кластера (i
). Остальное можно найти по цепочке fat[i]
, fat[fat[i]]
и т. д., пока не будет найдено значение EOC. Затем достаточно просто вычислить положение каждого кластера на диске по номерам кластеров, прочитать каждый кластер в память и объединить их.
fat_get_cluster: invalid cluster chain
ошибка возникает, когда значение 0x00000000
встречается по такой цепочке. Этого не должно быть. Это должен быть либо новый действительный номер кластера, либо значение EOC. Когда это происходит, файл больше не может быть прочитан, так как нет возможности следовать далее по цепочке. (The 0x00000000
значение используется, чтобы пометить кластер как свободный. кластер 0
никогда не используется для хранения данных, поэтому нет никакой двусмысленности)
Ваш случай может быть особым случаем, так как i_pos
дается как 0. Когда я получил это сообщение, это было большое число. Источник ядра говорит:
loff_t i_pos; /* on-disk position of directory entry or 0 */
Таким образом, i_pos - это не номер кластера, а позиция на диске. Что это значит, когда это ноль, я не знаю.
РЕДАКТИРОВАТЬ: Что касается того, что могло вызвать это, я могу только строить догадки, но вот некоторые возможности:
- Ошибка драйвера FAT.
- Космические лучи
- Вирус или другое вредоносное программное обеспечение.
- Возможно, если две программы / драйверы по какой-то причине одновременно пишут и читают в один и тот же FAT, они могут споткнуться друг о друга. Не знаю, возможно ли это.
- Отключение питания в неподходящий момент. Флэш-накопители должны обнулить блок перед записью изменений, поэтому теоретически отключение питания сразу после стирания может привести к такому результату. Тем не менее, на большинстве накопителей есть сбои, предотвращающие это.
- Ошибка пользователя или саботаж (например,
dd if=/dev/zero of=/dev/sda1 bs=512 count=1 seek=32
- не пробуй это дома!)
Драйверы файловой системы FAT фактически поддерживают две таблицы FAT в актуальном состоянии для избыточности, вторая лежит сразу после первой. Проверка того, что они идентичны, может дать понять, что могло произойти. Я думаю, что если бы они различались только по значению, которое нарушает цепочку кластеров, это сделало бы прямое вмешательство в какую-либо форму более вероятным, поскольку следует ожидать, что по крайней мере 1 и 3 будут выполнять работу "должным образом".
Тем не менее, мне кажется, что большинство современных драйверов хранят всю таблицу FAT в оперативной памяти и записывают части, которые изменяются, на обе копии на диске. Таким образом, даже если бы когда-то было различие, оно могло бы быть быстро и бесшумно "исправлено" при обычном использовании. Обратите внимание, что это только обоснованное предположение.
В конце концов, очень трудно знать с какой-либо определенностью без дополнительной информации об обстоятельствах, и даже тогда это, вероятно, догадки. Идеальные обстоятельства были бы, если бы вы могли надежно воссоздать проблему. Затем я сравнил бы таблицы "до" и "после" FAT (и заголовки FAT), чтобы увидеть, что именно было изменено и на что, в поисках подсказок по размещению и содержанию изменений.
Ваш FAT32 был поврежден по какой-то причине. Моя флешка часто заканчивается поврежденной FS, потому что в настоящее время я отлаживаю проблему хоста usb на платформе ARM. После тестов я запускаю следующие команды со своего настольного компьютера (Ubuntu 11.04):
$ sudo fsck.msdos -aw /dev/sdb1
Ссылка: https://askubuntu.com/questions/31614/how-to-delete-edit-files-from-readonly-filesystem
Ошибки, которые вы получаете, неверная цепочка кластеров и ошибка файловой системы ясно показывают, что это ошибка файловой системы.
Запись в Википедии о FAT гласит:
Разделение делится на кластеры одинакового размера, небольшие блоки смежного пространства. Размеры кластера варьируются в зависимости от типа используемой файловой системы FAT и размера раздела, обычно размеры кластеров лежат где-то между 2 кБ и 32 кБ. Каждый файл может занимать один или несколько из этих кластеров в зависимости от его размера; таким образом, файл представлен цепочкой этих кластеров (именуемой односвязным списком). Однако эти кластеры не обязательно хранятся рядом друг с другом на поверхности диска, а часто вместо этого фрагментируются по всей области данных.
Таблица размещения файлов (FAT) представляет собой список записей, которые сопоставляются с каждым кластером в разделе. Каждая запись записывает одну из пяти вещей:
- номер кластера следующего кластера в цепочке
- специальная запись конца цепочки кластера (EOC), которая указывает конец цепочки
- специальная запись, чтобы отметить плохой кластер
- ноль, чтобы отметить, что кластер не используется
По этой ссылке написано, что кто-то решил похожую проблему с картой памяти с помощью fsck.