Эта команда забивает бэд 0
hdparm --write-sector 326116096 --yes-i-know-what-i-am-doing /dev/sdc
Эта команда проверяет что получилось с выводом на экран 0
hdparm --read-sector 326116096 /dev/sdc
По части проверки результата, кроме вывода на экран, сразу после выполнения каждой Shell команды в переменной $? содержится "код возврата" команды. Работают с ним примерно так, как ниже. Но, мне негде проверить, hdparm может использовать этот код не для отчёта о успехе/неуспехе чтения/записи из/в сектор.
hdparm --read-sector 326116096 /dev/sdc
isHaveFailureCode=$? # Код возврата важно сохранить сразу после выполнения команды, т.к. следующая команда сразу же установит уже свой код.
if test "$isHaveFailureCode" -eq 0 ; then
echo "Код успеха."
else
echo "Код ошибки = $isHaveFailureCode."
fi
Если код возврата неудобно или невозможно использовать, то к выводу в консоли применяют grep (egrep), awk, sed. Для них не нужно каких-то специальных знаний, можно применять пяток скромных, однотипных приёмов и этого хватает на многое. Хотя сами эти sed, awk и т.д. умеют сложное и мощное (но это необязательно использовать).
Под чертой ниже прикладываю текст письма из лички.
В принципе, статья - _http://saradmin.ru/?p=583 - была найдена правильная, да.
Artif,
Могу написать макет скрипта но без синтаксиса и без знания азов прямой работы с HDD в Linux от него мало толку.
1 - Если есть текстовый "лог" софтинки, вычислившей бэды, то программно разобрать такой лог и сделать на каждый круг цикла переменные с нужными данными из лога - это относительно просто (для тех знает базовое). Дайте лог, накропаю скрипт, который будет из этих переменных печатать на экран.
2 - Это довольно легко обернуть в циклы для многократной записи и т.д. Если есть набор нужных команд для одного прохода по сектору. Замер времени на отклик - не представляю себе как это сделать просто и на скриптовых языках. Но есть спец. утилиты, упомянутые ниже. Поэтому, если есть список команд для ком.строки, которыми один раз производится нужное в отношении какого-то сектора, то остальное очень просто.
3 - Видимо, dd не подошла как инструмент записи. Т.е., видимо, нужен более низкоуровневый доступ. Типа: прямо писать "в порт" HDD команды. dd, действительно, работает довольно высоко-уровнево. Я думал будет достаточно вычислить 100-200кб, в которые попадает сектор и дальше надо туда записать, считать и проверить (вычислить CRC32, MD5...). dd позволяет сделать это:
skip=... seek=.... Т.е. это не работа с конкретным сектором, сектор всего-то только попадает в эту область. Но этот же сектор, пока он сбойный, провалит проверку данных. Контрольная сумма по всей области не будет сходится, если сектор сбоит.
Арифметика в примерах есть вот тут -
http://linoxide.com/linux-how-to/how-to-fix-repair-bad-blocks-in-linux/Или в гугло-переводе -
https://translate.google.com/translate?hl=en&ie=UTF8&prev=_t&sl=en&tl=ru&u=http://linoxide.com/linux-how-to/how-to-fix-repair-bad-blocks-in-linux/Я пробежал глазами, там даны примеры, как вычислять все эти размеры блоков, чтобы знать смешение, по которому записывать, считывать. Там же, кстати, дан пример использования dd.
Далее:
Вот тула проверки на беды -
https://wiki.archlinux.org/index.php/Badblocks- У неё есть опция -p - гонять до тех пор, пока указанное число, подряд идущих, проходов не будет успешным.
- Умеет записать в файл "адреса" найденных бедов - опция -o.
- Она умеет использовать списки
уже найденных бедов просто секторов - опция -i. Дальше - бубен в руки - список должен быть списком _хороших_ секторов. См. её ман. Она скипает при проверке сектора из этого списка. А нам как раз нужно пропустить хорошие сектора. Придётся как-то в Libre Office Calc или скриптом сгенерить этот огромный список (список всех секторов, за вычетом бэдов). Будет ли размер списка проблемой по времени - не знаю, не пробовал. Могу написать, это довольно легко, скрипт выдачи хороших секторов, имея только список плохих (и номер самого последнего сектора).
- Если этого окажется мало и надо лезть глубже, то это тула имеет исходники - http://sourceforge.net/projects/e2fsprogs/ Тула эта стандартная, есть в составе Ubuntu, а значит есть исходники, которые легко собрать под Ubuntu (src deb пакеты). Ну, тут уже программистская работа. Если там код написан ясно и красиво, а мозги склонны к этому, то разобраться и чуть пильнуть под себя (при проверке по списку проверять те, что в списке, вместо пропускания) будет возможно и самому.
Есть другие тулы, типа
hdparm и т.д.
Если дадите файл лога со списком бедов, и - одну badblocks команду со всеми нужными аргументами, нужную Вам в отношении конкретной строки лога, и - укажите, в какой строке лога инфа, нужная для badblocks запуска. То я оберну это в цикл, читающий из файла (если это вообще нужно), запускающий команды. Если badblocks решает вопрос, то там полшага до нужного. Кстати, может быть скрипт уже существует, я уверен, что такой вопрос бывал уже раньше.
Можете дать несколько подряд идущих команд, которые нужны, чтобы вручную проделать один проход в отношении одного бэда.
P.S. Выше было пожелание - желательно штатными средствами Убунты 10.4 сервер. Но, если иначе делать, в принципе, в принципе, есть ведь FreeDOS (
http://www.freedos.org/). М.б. все эти 25-ти летней давности утилиты можно запускать на современном железе в родной среде, м.б. там в комплекте есть нужное... Если утилиты хороши, а такие бывали, то я бы изучил вопрос. Уходя ещё дальше, есть ещё виртуалки (KVM+QEmu, но я не знаю, можно ли в них прокидывать "аппаратный доступ").