ssb>> На следующей неделе (когда время будет), и если ещё будет нужно, могу расписать с подробностями, примерами и пояснениями...
Bredonosec> был бы благодарен, иногда требуется.
Bredonosec> Хоть всякие примочки с резервированием особо важного добра используются, но иногда спрашивают на тему вытащить что-то из умершего или умирающего зверька.
Итак, попробую хоть как-то [частично] выполнить обещание, несмотря на перманентный
writer's block
Я не буду рассматривать все возможные случаи, иначе придётся написать статью на десяток страниц.
На мой взгляд, наиболее универсальной и предпочтительной процедурой[1] при обнаружении битых секторов aka бэдблоков является следующая
последовательность действий:
(0). Заготовить инструмент:
а) исправный диск с достаточным свободным местом для сохранения образа данных
б) загрузочный диск (любой: hdd/cd/флешка) с софтом[2], а именно: пропатченным[3] ядром linux и программой
dd_rescue, а также утилитами smartmontools.
(1). Загрузиться в linux, убедиться через dmesg в том, что оба диска, ремонтируемый и свободный подключились. Назовём для определённости ниже их sda и sdb соответственно.
(2). Выполнить короткий селфтест:
smartctl -t short /dev/sda
Он займёт пару минут.
(3). После окончания теста: проверить SMART информацию с подозреваемого:
smartctl -a /dev/sda
Выведенная информация разбита на секции, вначале общая инфа про диск, затем параметры, затем значения счётчиков, лог ошибок и лог селфтеста.
Процедура спасения данных необходима в случае ненулевого значения следующих счётчиков:
code text
Reallocated_Sector_Ct
Reallocated_Event_Count
Current_Pending_Sector
Offline_Uncorrectable
Или же в случае завершения короткого теста с ошибкой, например:
# 1 Short offline Completed: read failure 10% 4009 252793598
В обоих случаях наверняка будет заполнен лог ошибок диска. Есть исключение, когда лог ошибок заполнен, но диск исправен и ремонта не требует — это плохой кабель или контакт разъёма. В этом случае в логе ошибок наблюдается приблизит. следующее:
84 51 00 c7 33 c1 42 Error: ICRC, ABRT at LBA = 0x02c133c7 = 46216135 + код типа команды "READ FPDMA QUEUED". Ремонт заключается в разборке компа, замене ide/sata кабеля и аккуратной и тщательной сборке.
Также из вывода smartctl определяем физический размер сектора для команды dd_rescue ниже, это или
512 (у старых) или
4096 (у новых дисков).
(4). В случае подтверждения повреждения поверхности диска требуется сохранение данных. Сначала монтируем свободный раздел командой типа:
mount /dev/sdb1 /mnt
Затем запускам собственно сохранение данных командой dd_rescue из пакета
ddrescue (sic):
nohup dd_rescue -A -b 524288 -B РАЗМЕРСЕКТОРА -y 0 -d /dev/sda /mnt/disk.img &. Наблюдаем за процессом:
tail -f nohup.out.
Обращаю внимание что критически важны опции -A, -B и -d: опция -A указывает dd_rescue записывать нули в в образ вместо непрочитанных секторов. Иначе полученный образ будет непригоден для извлечения из него данных. Опция -B указывает корректный размер физического сектора, а опция -d указывает dd_rescue вести чтение непосредственно с диска, а не через page cache. Иначе этим самым page cache будет автоматически выполнено множество повторов в случае ошибок, что резко снижает шансы на успех.
Также можно добавить опции к dd_rescue:
-l /mnt/disk.log -b /mnt/disk.bb для сохранения лога и списка обнаруженных при чтении бэдов. Это полезно в безнадёжных случаях.
(5). Процедура завершена, отмонтируем диск с сохранёнными данными:
umount /mnt. Выключаем комп, отсоединяем пострадавший диск и кладём на полку. На всякий пожарный можно сделать вторую копию с образа, и дальнейшую работу по извлечению данных вести с ней. Как работать с образом диска отдельно расписывать не буду — можно или записать его целиком на другой диск требуемого объёма, либо подмонтировать напрямую через -o loop. Желательно перед этим сделать fsck прямо на образе.
Примечания:
[1] Данная процедура оптимальна в случае сильно посыпавшихся дисков, которые уже невозможно прочитать обычными средствами. В случае пары битых секторов это перебор, а в случае полного отказа диска данный метод конечно уже не поможет. Ну и на всякий случай уточню, что на SSD этот метод не испытывался и для них не предназначался.
Для ntfs мною написана более совершенная утилитка для снятия образа диска, которая читает только задействованные файловой системой сектора. Для использования широкой публикой я эту тулзень не публиковал, ежели кому очень понадобится — обращайтесь тут.
[2] Рекомендую
pld rescue как неоднократно опробованный, но годится, наверно, любой загрузочный линух с необходимыми ddrescue и smartmontools.
[3] Патч для linux, резко повышает шансы на успех операции в запущенных случаях, применим ко всем версиям. Как патчить/компилировать/изготовить загрузочный диск с собственным ядром не указываю — слишком много писать, извините. )
code text
---
drivers/scsi/sd.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: linux/drivers/scsi/sd.h
===================================================================
--- linux.orig/drivers/scsi/sd.h
+++ linux/drivers/scsi/sd.h
@@ -23,7 +23,7 @@
/*
* Number of allowed retries
*/
-#define SD_MAX_RETRIES 5
+#define SD_MAX_RETRIES 0
#define SD_PASSTHROUGH_RETRIES 1
/*
[4] На усмотрение пользователя: сохранять можно не весь диск, а только один раздел с ценной инфой.