LINUX.ORG.RU

[kernel] Обработка bad sectors?

 


0

2

Заинтересовало как в ядре организована обработка нечитающихся секторов при условии, что сектор 512 байт, а блок (блочное устройство) 1024. И, вроде как, в кеше и в остальных местах работа идёт с блоками.

Вот, если ядро не сможет прочитать первый сектор блока, то весь блок считается плохим или ядро попробует прочитать второй сектор блока?

Когда делается «dd if=... conv=noerror», то нулями будут забиты только плохие сектора или блоки по 1024 байта?

★★★★★

>Когда делается «dd if=... conv=noerror», то нулями будут забиты только плохие сектора или блоки по 1024 байта?

On success, the number of bytes read is returned (zero indicates end of file), and the file position is advanced by this number. It is not an error if this number is smaller than the number of bytes requested; this may happen for example because fewer bytes are actually available right now (maybe because we were close to end-of-file, or because we are reading from a pipe, or from a terminal), or because read() was interrupted by a signal. On error, -1 is returned, and errno is set appropriately. In this case it is left unspecified whether the file position (if any) changes.

можно заключить, что будет забито нулями не все. И, зависит конечно от самого dd. Как он обрабатывает noerror.

Но если у тебя задача вычислить точно где ошибки, то я бы рекомендовал просто менять bs в тот момент, когда читаешь битое место.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Тут не вопрос dd, это вопрос ядра. Устройство блочное и ядро хочет читать с него по блокам (1024 байта). Во всяком случае, мне кажется, что это так.

Во всяком случае, я вот запускал dd на плохом винте, и в dmesg шли сообщения об ошибках только чётных секторов (40, 62, 64). А про то, что не читается сектор 63 сообщения при запуске dd не было. Но, вот если попробовать смонтировать первый раздел на этом винте, то выскакивает сообщение об ошибке чтения сектора 63 --- первый сектор (bootsector) первого раздела. dd запускался с bs=512

Правда, я это всё делаю с ядром 2.4, может в 2.6 поменяли.

mky ★★★★★
() автор топика
Ответ на: комментарий от mky

а нумерация везде с 0 начинается?

я предположу, что в буфере после вызова read таки остаются успешно прочитанные байты. ибо смотри вырезку из man 2 read

dikiy ★★☆☆☆
()
Ответ на: комментарий от mky

dd_rescue --help
-r reverse direction copy (def=forward),

Можно ради эксперимента пройтись тогда dd_rescue -r /dev/zero /dev/XXX
Интересно, что он скажет.

Lumi ★★★★★
()

В общем, винт решил «ожить» и отдал LBA sector 63. И все остальные, кроме LBA sector 64. Снятную с него с помощью dd копию ядро поняло и смонтировало. Ядро пытается читать все сектора, просто глючило винт, и это самый злополучный сектор 63 читался через раз и по dmesg у меня возникло ложное ощущение, что ядро не пытается его читать.

dd_rescue -r /dev/zero /dev/XXX

Это же обнуление данных? Я уж тогда лучше seatools попробую.

mky ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.