Протрите последние 1 МБ жесткого диска


25

Есть ли простая команда, которую я могу использовать, чтобы обнулить последние 1 МБ жесткого диска?

Для начала езды я бы dd if=/dev/zero of=/dev/sdx bs=1M count=1. seekВариант для дд выглядит многообещающим, но кто - то есть простой способ , чтобы определить, насколько далеко я должен искать?

У меня есть аппаратное устройство RAID, которое хранит часть конфигурации RAID в конце диска. Мне нужно, чтобы устройство RAID считало диски неконфигурированными, поэтому я хочу удалить конфигурацию RAID, не тратя время на полную очистку дисков. У меня дюжина дисков по 2 ТБ, и полное стирание всех этих дисков заняло бы много времени.

Ответы:


22

В Linux самый простой способ получить размер диска - это blockdev --getsz:

sudo -s
dd bs=512 if=/dev/zero of=/dev/sdx count=2048 seek=$((`blockdev --getsz /dev/sdx` - 2048))

Отлично, я знал, что должен быть инструмент, который мог бы легко получить размер.
Зоредаче

1
Хотя решение мне нравится, использование в sdaкачестве примера ужасно опасно, если вы копируете и вставляете и получаете возможность скопировать возврат каретки. sdxбудет гораздо лучше подходит. Я принимаю меры предосторожности, но только из-за них я не уничтожил свой диск прямо сейчас.
emk2203

@ emk2203 Хороший вопрос. Мне любопытно, какие меры предосторожности вы используете для таких сценариев?
Хашим

1
Я использую одну цитату перед вставкой. Если строка содержит возврат каретки, она перехватывается приглашением оболочки из-за отсутствия конца предложения. Если все в порядке, я иду в начало строки с помощью Ctrl-A, затем удаляю кавычку и возвращаюсь. Еще три нажатия клавиш для страховки, стоит того.
emk2203

Вместо / dev / sdx посмотрите ссылки в / dev / disk / by-id /, такие как nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXX. ls -l / dev / disk / by-id / покажет имя ссылки и / dev / sdX, на которые она ссылается.
rcpa0

6

Размер каждого раздела доступен в /proc/partitions. Следующая команда показывает размер sdx(в килобайтах):

awk '$4 == "sdx" {print $3}' </proc/partitions

Таким образом:

dd if=/dev/zero of=/dev/sdx bs=1k count=1024 \
   seek=$(($(awk '$4 == "sdx" {print $3}' </proc/partitions) - 1024))

В чем причина -1024 в конце?
Хашим

1
@Hashim Вопрос в том, как стереть последние 1 МБ. Последний 1 МБ начинается за 1024 КБ до конца.
Жиль "ТАК - перестань быть злым"

3

Использование поиска до конца диска работает очень хорошо, а именно:

искать = $ (( blockdev --getsz /dev/sda- 2048))

Тем не менее, когда вы используете это, я рекомендую вам либо знать, что значение вашего счета является правильным, либо не использовать его вообще. Причина, по которой я говорю это, состоит в том, что диски могут иметь 512-байтовые сектора или 4-килобайтные сектора, и если вы используете это решение с диском, на котором есть 4 тыс. Секторов, вы не перейдете в конец диска с этим значением счетчика, и может пропустить информацию RAID в конце (я столкнулся с этим).


Не могли бы вы как-нибудь рассказать, с чем именно вы столкнулись? Я заинтригован, интересно, не понял ли я, как ddадресные секторы при использовании с пользовательскими bsзначениями меньше / больше, чем фактический размер блока, сообщаемый прошивкой устройства или ядром linux.
sjas

2

Вы можете получить количество секторов на диске с помощью hdparm -v /dev/sdx. Попробуйте найти число_секторов - 2048 (при условии 512-байтовых секторов).


hdparm кажется удобным, но как я могу проверить размер сектора?
Peter.O

1
/sys/block/sdx/queue/physical_block_sizeможет дать вам информацию, но некоторые новые диски воспроизводятся быстро и свободно с размером сектора, о котором они сообщают. Возможно, лучше прочитать этикетку на диске или посмотреть ее в техническом описании производителя.

1
Спасибо .. Я только что заметил, что hdparm -I /dev/sdaперечисляет 2 "версии" размера сектора: Logicalи Physical. Это то, что вы подразумеваете под «быстрым и свободным»? .... у меня возникает такое "чувство", что если что-то будет вести себя таким образом, это вполне может быть система RAID ..
Peter.O

1
@red: Я не могу найти ссылку сейчас, но где-то читал, что некоторые диски с секторами размером 4096 байт сообщат системе о том, что они имеют 512 байт, а затем обработают преобразование внутренне.

1

Вы можете использовать ddи получить размер устройства через fdisk:

dd if=/dev/zero of=/dev/sda bs=1k \
   seek=$(( (`fdisk -l /dev/sda | grep 'Disk /' | cut -d' ' -f 5` -1024*1024)/1024  )) count=1024

Я не использую размер блока 1 м, чтобы избежать ошибок округления.

В качестве альтернативы, вы можете написать небольшую C-программу (или скрипт), которая вызывает lseekфункцию с SEEK_ENDотрицательным смещением 1 Мб, а затем вызывает write.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.