В ближайшие месяцы мне нужно будет обнулить много дисков. После очистки каждого диска мне нужен быстрый способ убедиться, что диск полностью заполнен нулями.
Я мог бы открыть каждый из них в шестнадцатеричном редакторе, но это позволяет мне лишь увидеть, что определенные его части обнулены, что становится все более бессмысленным по мере увеличения размера диска, поскольку это не позволяет наверняка убедиться в отсутствии на нем ненулевых символов.
Я решил запустить несколько бенчмарков, чтобы протестировать несколько инструментов, с которыми я столкнулся. Я засек время для каждого инструмента в серии из 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 и даже дискет. В случае с вращающимися носителями это в основном функция того, насколько быстро данные перемещаются под головками (или лазерными узлами для оптических приводов). Если бы чтение и запись не шли с одинаковой скоростью, вам пришлось бы раскручивать (или замедлять) носитель, чтобы перейти от чтения к записи и обратно.
Значительно более быстрое чтение, чем запись, — это особенность флэш-памяти.