Как запустить badblocks на указанной части диска

753
Hashim

При попытке ddиспользовать последние несколько блоков жесткого диска Maxtor IDE емкостью 200 ГБ я столкнулся со следующей ошибкой:

$ dd if=/dev/zero of=/dev/sdc bs=4M status=progress 203901894656 bytes (204 GB, 190 GiB) copied, 7283.07 s, 28.0 MB/s dd: error writing '/dev/sdc': Permission denied 48621+0 records in 48620+0 records out 208223076351 bytes (208 GB, 194 GiB) copied, 8379.27 s, 24.8 MB/s  

Эта ошибка сохраняется даже после попытки возобновить ddс seek=48620, где 48620 - количество пропускаемых блоков. Чтобы определить, является ли эта ошибка результатом сбойных секторов, я хотел бы выполнить badblocksтаким же образом, откуда произошел ddсбой.

Это будет переводиться в badblocksкоманду, например, так:

badblocks -svw -b 4000000 -c 500000 -p 1 -o /cygdrive/b/badblocks.txt /dev/sdc 199148543 48620 

... где -b 4000000соответствует размеру блока 4M, который я использовал при первоначальной ddзагрузке диска, а 48620 - это first_blockопция, которая задает первый блок для badblocksзапуска.

Однако это приводит к одной из двух ошибок. Либо несмертельная ошибка ...

badblocks: Invalid argument during seekrs) 

... появляется во время выполнения команды, или одна фатальная ошибка завершает ее:

Segmentation fault (core dumped) 

Выше ошибки также сохраняется даже тогда, когда -cустановлен в более здравом значение, например 2000.


Кроме того, когда я перестаю пытаться работать badblocksс точным блоком, в котором произошел ddсбой, вместо этого попробуйте просто увеличить first_blockпараметр до достаточно большого числа:

badblocks -svw -b 4000000 -c 1000000 -p 1 -o /cygdrive/b/users/hashim/desktop/maxtorbadblocks.txt /dev/sdc 199148543 12345678 

... многочисленные случаи следующей ошибки появляются без нарушения команды:

badblocks: Invalid argument during seekrs) again get several get the same error. 

Как я могу начать badblocksс указанного места на диске и тем самым сэкономить огромное количество времени, необходимое для запуска?

3
48620 - это блоки по 4 МБ. Если вы измените размер, вам нужно пересчитать сумму. Однако, как вы написали 208223076351 байт, сколько байт на жестком диске? matzeri 6 лет назад 0

1 ответ на вопрос

3
agc

Половина ответа (пока), почему это не удается.

Переключатели в этой строке неверны:

badblocks -svw -b 4000000 -c 500000 -p 1 \ -o /cygdrive/b/badblocks.txt /dev/sdc 199148543 48620 

Размер -bблока (количество байтов в блоке), который обычно кратен 512, обычно это 1024, 2048 или 4096 . Значение 4 000 000 не кратно 512 и больше, чем любой текущий жесткий диск будет использовать.

Количество -cпроверяемых блоков за раз, которое умножается на переданное значение, -bдает количество байтов, которые будут считываться за один раз - поэтому -b 4000000 -c 500000компьютер должен считывать 2 000 000 000 000 (два триллиона) байт за раз.

Что еще хуже, аргумент 199148543говорит, badblocksчто файловая система содержит по меньшей мере столько блоков, а поскольку блоки определяются -bкоммутатором, badblocksсчитается, что файловая система содержит не менее 796 594 172 000 000 байт (или 796 ТБ, почти петабайт).

Поскольку весь диск занимает 200 ГБ, badblocksостанавливается и печатается сообщение об ошибке.

Как я пытался упомянуть в этом вопросе: основываясь на моем исследовании `badblocks ', я понимаю, что` -b` относится к логическим (файловая система) секторам, а не к физическим, поэтому не к 512 байтам, что, вероятно, будет физическим значением по умолчанию для устройства, но `bs = 4M`, который я указал при первоначальном обнулении диска с помощью` dd` (который, как я предполагал, был в мегабайтах, а не в мегабайтах, следовательно, * 4 000 000 *, а не * 4 194 304 *). Я понял это, потому что я уже использовал `dd` для записи на диск с таким размером блока ... Hashim 6 лет назад 0
... Мне нужно было бы сохранить размер блока в `badblocks -b` одинаковым, чтобы количество блоков было одинаковым, и, следовательно, дойти до нужного мне блока на жестком диске. Является ли что-либо из перечисленного неверным? Hashim 6 лет назад 0
Ваше объяснение причины сообщения об ошибке имеет смысл, но это число показывается как `badblocks` и` cat / proc / partitions` как количество общих блоков для устройства - я получил его, используя [ответ здесь] ( https://superuser.com/a/693000/323079). Hashim 6 лет назад 0
@Hashim, Re "_... но ** это ** число ..._": извините, но неясно, какое число имеет в виду - пожалуйста, укажите точно, какое число. agc 6 лет назад 0
Общий размер накопителя в блоках: 199148543. Hashim 6 лет назад 0
@Hashim "Я предполагал, что было в мегабайтах, а не в мегабайтах" - неправильно. `man dd` говорит, что суффикс` M` означает `1024 * 1024`. - «Общий размер накопителя в блоках: 199148543» - В блоках какого размера? `/ proc / partitions` использует 1 КБ. В своем предыдущем вопросе вы упомянули диск объемом 200 ГБ, это почти подошло бы. Почти, потому что это нечетное число выглядит странным. Я бы ожидал 199148544 блоков 1 КБ (пронумерованы 0-199148543). Если вы скажете `badblocks` использовать блоки размером 4MiB, вам нужно пересчитать: у вас есть (примерно?) 48620,25 из них. Может ли быть `dd` под` cygwin` потерянным из-за этого последнего дробного «блока»? Kamil Maciorowski 6 лет назад 0
@Hashim Проверьте, если `dd if = / dev / zero of = / dev / sdc bs = 512 seek = 398295040` в первую очередь выдает ошибку. Это `` bs = 4M seek = 48620` пересчитано, но последний блок данных будет записан полностью (без дробной части), потому что общие размеры секторов составляют 512B и 4KiB, поэтому, так или иначе, каждый диск должен содержать некоторые целое число 512B "куски". Kamil Maciorowski 6 лет назад 0