Есть ли более быстрый способ проверить, полностью ли обнулён диск?

Есть ли более быстрый способ проверить, полностью ли обнулён диск?

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

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

Я решил запустить несколько бенчмарков, чтобы протестировать несколько инструментов, с которыми я столкнулся. Я засек время для каждого инструмента в серии из 3 отдельных запусков, проверяющих очистку одного и того же диска объемом 1 ТБ, причем каждый запуск выполнялся в течение ночи при одинаковой нагрузке на систему. Чтобы справиться с кэшированием, каждый запуск запускал инструменты в случайных позициях с засыпанием не менее 500 секунд между каждым.

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

От себя:

time hexdump /dev/sda

0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
e8e0db6000

real    284m35.474s
user    223m4.261s
sys     2m49.729s

ОтГордон Дэвиссон:

time od /dev/sda

0000000 000000 000000 000000 000000 000000 000000 000000 000000
*
16434066660000

real    148m34.707s
user    77m10.749s
sys     2m54.611s

ОтНил:

time cmp /dev/zero /dev/sda 

cmp: EOF on /dev/sda

real    137m55.505s
user    8m9.031s
sys     3m53.127s

ОтБородатый:

time badblocks -sv -t 0x00 /dev/sda

Checking blocks 0 to 976762583
Checking for bad blocks in read-only mode
Testing with pattern 0x00: done
Pass completed, 0 bad blocks found. (0/0/0 errors)

real    137m50.213s
user    5m19.287s
sys     4m49.803s

ОтХеннес:

time dd if=/dev/sda status=progress bs=4M | tr --squeeze-repeats "\000" "D"

1000156954624 bytes (1.0 TB, 931 GiB) copied, 8269.01 s, 121 MB/s
238467+1 records in
238467+1 records out
1000204886016 bytes (1.0 TB, 932 GiB) copied, 8269.65 s, 121 MB/s
D
real    137m49.868s
user    27m5.841s
sys     28m3.609s

ОтБоб1 :

time iszero < /dev/sda

1000204886016 bytes processed
0 nonzero characters encountered.

real    137m49.400s
user    15m9.189s
sys     3m28.042s

Даже самый быстрый из протестированных инструментов, похоже, укладывается в отметку 137 минут, что составляет 2 часа 16 минут, тогда как полная очистка диска в среднем занимает всего 2 часа 30 минут.

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

Существует ли альтернативное, более быстрое решение вышеизложенной проблемы?

В идеальном мире решение, которое я ищу, считывало бы весь диск и печатало бы все найденные ненулевые символы, как в программе Боба на C++. Это позволило бы мне вернуться назад и выборочно стереть любые ненулевые байты, а не весь диск. Однако это не было бы строгим требованием, если бы инструмент считывал диск очень быстро.


1. Это программа на C++, написанная Бобом, с размером буфера, увеличенным до 4194304 (4 МБ) и скомпилированная с помощью:

g++ -Wl,--stack,16777216 -O3 -march=native -o iszero iszero.cpp

решение1

Скорости чтения и записи магнитных жестких дисков примерно одинаковы. То же самое касается ленточных накопителей, оперативной памяти, CD-/DVD-/BD-R и даже дискет. В случае с вращающимися носителями это в основном функция того, насколько быстро данные перемещаются под головками (или лазерными узлами для оптических приводов). Если бы чтение и запись не шли с одинаковой скоростью, вам пришлось бы раскручивать (или замедлять) носитель, чтобы перейти от чтения к записи и обратно.

Значительно более быстрое чтение, чем запись, — это особенность флэш-памяти.

Связанный контент