После сбоя e2fsck терпит неудачу с необычно высокими номерами блоков / размерами

После отключения выключателя моя малина Pi начала останавливать загрузку с паникой ядра (то же сообщение, что и здесь ). Это Raspberry Pi, работающий на Raspbian, поэтому он работает с SD-картой, из основного раздела ext4 , который я пытался восстановить на своем ПК с помощью:

 sudo e2fsck -f -y -v /dev/sdx2 

Тем не менее, это в конечном итоге терпит неудачу с каким-то странным результатом:

 Error writing block 137439060017 (Invalid argument) while getting next inode from scan. Ignore error? yes Error reading block 183472412950529 (Invalid argument). Ignore error? yes Force rewrite? yes Error writing block 183472412950529 (Invalid argument) while getting next inode from scan. Ignore error? yes Inode 13329, i_size is 4096, should be 549755817984. Fix? yes Inode 13607, i_size is 69632, should be 137439023104. Fix? yes Error reading block 36983963385857 (Invalid argument). Ignore error? yes Force rewrite? yes Error writing block 36983963385857 (Invalid argument) while getting next inode from scan. Ignore error? yes Error reading block 179632729097217 (Invalid argument). Ignore error? yes Force rewrite? yes Error writing block 179632729097217 (Invalid argument) while getting next inode from scan. Ignore error? yes Error reading block 17592186080054 (Invalid argument) while reading directory block. Ignore error? yes Force rewrite? yes Error writing block 17592186080054 (Invalid argument) while getting next inode from scan. Ignore error? yes Error storing directory block information (inode=17449, block=0, num=134507168): Memory allocation failed /dev/sdx2: ***** FILE SYSTEM WAS MODIFIED ***** e2fsck: aborted /dev/sdx2: ***** FILE SYSTEM WAS MODIFIED ***** 

Здесь есть две вещи:

  • размеры и размеры блоков inode, которые кажутся смехотворно высокими (мы говорим об SD-карте на 16 ГБ)
  • e2fsck заканчивается e2fsck Memory allocation failed – на ПК с 32 ГБ ОЗУ, большинство из которых бесплатны. Фактически, он освобождает оперативную память до того, как она не сработает.

Я попытался настроить каталог с файлами с одинаковым результатом ( e2fsck записывает там некоторые файлы, а целевой каталог находится на монтировании с + 250 ГБ свободного места – он занимает доступную оперативную память и не работает).

Похоже, что существует некоторая коррупция в основных параметрах файловой системы на затронутом разделе. Как диагностировать и устранять это?

Я быстро просмотрел источник e2fsck , и мне кажется, что есть места, где ошибка « Ошибка распределения памяти» может возникнуть по причинам, которые на самом деле не могут быть ошибками выделения памяти.

Строка ошибки определена в [src]/lib/ext2fs/ext2_err.et.in относительно константы EXT2_ET_NO_MEMORY . Это можно вернуть из разных мест в коде в [src]/e2fsck/ . Вот пример из ea_refcount.c :

 errcode_t ea_refcount_increment(ext2_refcount_t refcount, blk_t blk, int *ret) { struct ea_refcount_el *el; el = get_refcount_el(refcount, blk, 1); if (!el) return EXT2_ET_NO_MEMORY; 

get_refcount_el() находится в одном файле:

 static struct ea_refcount_el *get_refcount_el(ext2_refcount_t refcount, blk_t blk, int create) { int low, high, mid; if (!refcount || !refcount->list) return 0; 

Это не единственная причина, по которой она вернет null, и не единственная причина, по которой она не связана напрямую с неудавшимся распределением.

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

В этом случае проблема может быть связана с неясным и непредсказуемым потенциалом сумасшедших / поврежденных контроллеров SD-карт, но все равно это ошибка в e2fsck в той мере, в какой какая-то проверка здравомыслия или что-то нужно сделать, чтобы поймать это , даже если это просто сказать: «Извините, ваше устройство завинчено» (возможно, это правда) против «Недостаточно памяти» (возможно, это неверно). Вы можете сообщить об этом ( «В случае ошибок в этих программах, пожалуйста, свяжитесь с Ted Ts'o по адресу tytso@mit.edu или tytso@alum.mit.edu» – я считаю, что TT – это ядро ​​linux), и вы можете ссылаться на этот вопрос.

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

 badblocks -v -w -b 1048576 -c 16 /dev/sdx 

Помните, что это ДЕСТРУКТИВНЫЙ тест – вы потеряете все свои данные. Badblocks не полезен для создания фактического списка badblocks для SD-карты (они не сообщают о фактических физических адресах из-за износа), но если карта укушена, это, вероятно, сообщит вам об этом. Тестирование карты 16 ГБ таким образом занимает менее часа.

Когда вы запускаете e2fsck -fy, вам действительно нужно сохранить всю транскрипцию e2fsck, а не просто показывать последние пару сообщений об ошибках. Возможно, файловая система была сильно повреждена, а опция -y означает продолжать идти независимо от того, что.

Похоже, что дескрипторы группы блоков были сильно повреждены, так что расположение таблицы inode было безумным. Вероятно, E2fsck попытался восстановить его, но по какой-то причине он не смог его исправить, а «-y» означает, что он продолжит работу, несмотря на это. Поэтому, когда люди отправляют отчеты об ошибках, я всегда предлагаю, чтобы они отправили полный транскрипт e2fsck, а не только последнюю пару ошибок.