Протріть останній 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_XXXXXXXXXX. 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 байтові сектори, або 4k сектори, і якщо ви використовуєте це рішення з накопичувачем, на якому є 4k сектори, ви не переходите до кінця накопичувача з таким значенням, і може пропустити інформацію про RAID наприкінці (я зіткнувся з цим).


Не могли б ви поділитися якось, на що саме ви натрапили? Мене заінтригує, цікаво, чи я неправильно зрозумів, як ddадресовані сектори, коли вони використовуються зі спеціальними bsзначеннями меншими / більшими, ніж фактичний розмір блоку, про який повідомляють прошивки пристрою або ядро ​​Linux.
sjas

2

Ви можете отримати кількість секторів на диску hdparm -v /dev/sdx. Спробуйте шукати число_of_sectors - 2048 (припустимо, 512 байтових секторів).


hdparm здається зручним, але як би я перевірив розмір сектора?
Пітер.О

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і негативне зміщення 1mb, а потім викликає write.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.