Hapus 1MB terakhir dari Hard drive

25

Apakah ada perintah mudah yang dapat saya gunakan untuk menghapus 1MB hard drive terakhir?

Untuk memulai drive saya akan dd if=/dev/zero of=/dev/sdx bs=1M count=1. The seekpilihan untuk penampilan dd menjanjikan, tapi apakah seseorang memiliki cara mudah untuk menentukan dengan tepat seberapa jauh aku harus mencari?

Saya memiliki alat RAID perangkat keras, yang menyimpan beberapa konfigurasi RAID di akhir drive. Saya memerlukan alat RAID untuk melihat drive sebagai tidak dikonfigurasi, jadi saya ingin menghapus konfigurasi RAID tanpa harus menghabiskan waktu untuk melakukan penghapusan penuh drive. Saya memiliki selusin drive 2TB, dan menghapus semua drive itu akan memakan waktu lama.

Sakit kepala
sumber

Jawaban:

22

Cara paling sederhana di Linux untuk mendapatkan ukuran disk adalah dengan blockdev --getsz:

sudo -s
dd bs=512 if=/dev/zero of=/dev/sdx count=2048 seek=$((`blockdev --getsz /dev/sdx` - 2048))
psusi
sumber
Luar biasa, saya tahu pasti ada alat yang bisa mendapatkan ukuran dengan mudah.
Zoredache
1
Sementara saya suka solusinya, menggunakan sdasebagai contoh sangat berbahaya jika Anda menyalin & menempel dan mengatur agar carriage return disalin. sdxakan jauh lebih cocok. Saya mengambil tindakan pencegahan, tetapi hanya karena mereka saya tidak menghancurkan disk saya sekarang.
emk2203
@ emk2203 Poin bagus. Saya ingin tahu, tindakan pencegahan apa yang Anda lakukan untuk skenario seperti itu?
Hashim
1
Saya menggunakan satu kutipan sebelum menempel. Jika baris berisi carriage return, itu akan tertangkap oleh prompt shell karena ujung yang hilang untuk kutipan. Jika semuanya OK, saya pergi ke awal baris dengan Ctrl-A, lalu hapus kutipan, lalu kembali. Tiga penekanan tombol lagi untuk asuransi, sepadan.
emk2203
Alih-alih / dev / sdx, lihat tautan di / dev / disk / by-id / seperti nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXXXX. ls -l / dev / disk / by-id / akan menampilkan nama tautan dan / dev / sdX yang terhubung dengannya.
rcpa0
6

Ukuran setiap partisi tersedia di /proc/partitions. Perintah berikut menunjukkan ukuran sdx(dalam satuan kB):

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

Demikian:

dd if=/dev/zero of=/dev/sdx bs=1k count=1024 \
   seek=$(($(awk '$4 == "sdx" {print $3}' </proc/partitions) - 1024))
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Apa alasan untuk -1024 di akhir?
Hashim
1
@Hashim Pertanyaannya menanyakan cara menghapus 1MB terakhir. 1MB terakhir dimulai 1024kB sebelum akhirnya.
Gilles 'SO- berhenti bersikap jahat'
3

Menggunakan upaya untuk sampai ke ujung drive berfungsi dengan sangat baik, yaitu:

seek = $ (( blockdev --getsz /dev/sda- 2048))

Namun, ketika Anda menggunakan ini, saya sarankan Anda juga tahu bahwa nilai hitungan Anda sudah benar, atau tidak menggunakannya sama sekali. Alasan saya mengatakan ini adalah bahwa drive dapat memiliki sektor 512 byte atau sektor 4k, dan jika Anda menggunakan solusi ini dengan drive yang memiliki sektor 4k di dalamnya, Anda tidak akan pergi ke akhir drive dengan nilai hitungan itu, dan mungkin melewatkan informasi RAID pada akhirnya (saya telah menemukan ini).

J Akers
sumber
Bisakah Anda berbagi entah bagaimana persisnya Anda bertemu? Saya tertarik, bertanya-tanya apakah saya salah paham bagaimana ddmengatasi sektor ketika digunakan dengan bsnilai khusus yang lebih kecil / lebih besar dari ukuran sebenarnya yang dilaporkan oleh firmware perangkat atau kernel linux.
sjas
2

Anda bisa mendapatkan jumlah sektor pada disk dengan hdparm -v /dev/sdx. Coba cari number_of_sectors - 2048 (dengan asumsi sektor 512 byte).


sumber
hdparm tampaknya mudah, tetapi bagaimana saya memeriksa ukuran sektor?
Peter.O
1
/sys/block/sdx/queue/physical_block_sizemungkin memberi Anda informasi tetapi beberapa disk baru bermain cepat dan longgar dengan ukuran sektor yang mereka laporkan. Mungkin lebih baik membaca label pada disk atau mencarinya di lembar data pabrikan.
1
Terima kasih .. Saya baru saja memperhatikan bahwa hdparm -I /dev/sdamencantumkan 2 "versi" ukuran sektor: Logicaldan Physical. Apakah ini yang Anda maksud dengan "cepat-dan-longgar"? .... Saya hanya mendapatkan "perasaan" bahwa jika ada sesuatu yang akan berperilaku sedemikian rupa itu bisa menjadi sistem RAID ..
Peter.O
1
@ red: Saya tidak dapat menemukan referensi sekarang tetapi saya membaca di suatu tempat bahwa beberapa drive dengan sektor 4096 byte akan melaporkan ke sistem bahwa mereka 512byte dan kemudian berurusan dengan konversi secara internal.
1

Anda dapat menggunakan dddan mendapatkan ukuran perangkat melalui 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

Saya tidak menggunakan blocksize 1m untuk menghindari kesalahan pembulatan.

Atau, Anda bisa menulis program C kecil (atau skrip) yang memanggil lseekfungsi dengan SEEK_ENDdan offset negatif 1mb dan kemudian memanggil write.

maxschlepzig
sumber