Son 1 MB Sabit sürücüyü sil


25

Son 1 MB sabit disk sürücüsünü sıfırlamak için kullanabileceğim kolay bir komut var mı?

Sürücünün başlangıcı için yapardım dd if=/dev/zero of=/dev/sdx bs=1M count=1. Dd seekseçeneği umut verici görünüyor, ancak birinin tam olarak ne kadar aramam gerektiğini belirlemenin kolay bir yolu var mı?

Sürücü sonunda RAID yapılandırmasının bir kısmını depolayan bir donanım RAID aygıtım var. Sürücüleri yapılandırılmamış olarak görmek için RAID cihazına ihtiyacım var, bu yüzden sürücüleri tamamen silmek için zaman harcamak zorunda kalmadan RAID yapılandırmasını kaldırmak istiyorum. Bir düzine 2TB sürücüm var ve tüm bu sürücülerin tamamen silinmesi uzun zaman alacaktı.

Yanıtlar:


22

Linux'ta diskin boyutunu almanın en basit yolu şudur blockdev --getsz:

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

Mükemmel, boyutu kolayca alabilecek bir araç olması gerektiğini biliyordum.
Zoredache,

1
Çözümü sdasevsem de, kopya döndürmek ve yapıştırmak ve taşıma iadesini kopyalamak için yönetmek, örnek olarak kullanmak çok tehlikelidir. sdxçok daha uygun olurdu. Önlemler alıyorum, ancak sadece onlar yüzünden şu an diskimi yok etmedim.
emk2203 17:17

@ emk2203 İyi nokta. Merak ediyorum, bu tür senaryolar için hangi önlemleri alıyorsunuz?
Haşim

1
Yapıştırmadan önce tek bir alıntı kullanıyorum. Satır bir satır başı içeriyorsa, teklifin eksik olması nedeniyle kabuk istemi tarafından yakalanır. Her şey yolunda giderse, Ctrl-A ile satırın başına gidip alıntıyı silip sonra geri döneceğim. Buna değer olarak sigorta için üç tuşa daha basın.
emk2203

/ Dev / sdx yerine, / dev / disk / by-id / bağlantılarında nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXX gibi bağlantılara bakın. ls -l / dev / disk / by-id / link ismini ve link verdiği / dev / sdX i gösterir.
rcpa0,

6

Her bölümün büyüklüğü mevcuttur /proc/partitions. Aşağıdaki komut, sdx(kB birim cinsinden) boyutunu gösterir :

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

Böylece:

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

Sonunda -1024'ün sebebi nedir?
Haşim

1
@Hashim Soru son 1MB'ı nasıl sileceğimi soruyor. Son 1MB, sonundan önce 1024kB başlar.
Gilles 'SO- kötü olmayı kes'

3

Sürücünün sonuna ulaşmak için arayışı kullanmak çok iyi çalışıyor, yani:

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

Ancak, bunu kullanırken sayma değerinizin doğru olduğunu bilmenizi ya da hiç kullanmamanızı öneririm. Bunun nedeninin sürücülerin 512 bayt sektör veya 4k sektöre sahip olabileceği ve bu çözümü üzerinde 4k sektörlü bir sürücü ile kullanıyorsanız, sürücünün sonuna bu sayma değeriyle gidemezsiniz. ve sonunda RAID bilgisini kaçırabilirim (buna rastladım).


Neye rastladığını bir şekilde paylaşabilir misin? Merak ediyorum, merak ediyorum merak ediyorum, ddsektörlerin bscihazların firmware veya linux çekirdeği tarafından bildirilen gerçek blok boyutundan daha küçük / daha büyük olan özel değerlerle kullanıldığında sektörleri nasıl yanlış anladığını .
sjas

2

Diskteki sektör sayısını alabilirsiniz hdparm -v /dev/sdx. Number_of_sectors - 2048 (512 bayt sektör varsayarsak) aramayı deneyin.


hdparm kullanışlı görünüyor, ancak sektör boyutunu nasıl kontrol edebilirim?
Peter.O

1
/sys/block/sdx/queue/physical_block_sizesize bilgi verebilir ancak bazı yeni diskler rapor ettikleri sektör boyutuna göre hızlı ve gevşektir. Diskin üzerindeki etiketi okumak veya üreticinin veri sayfasına bakmak daha iyi olabilir.

1
Teşekkürler .. Ben sadece hdparm -I /dev/sdasektör boyutunda 2 "sürüm" listeler: LogicalvePhysical . Hızlı ve gevşemek derken neyi kastediyorsunuz? .... Bir şeylerin böyle bir şekilde davranması halinde bir RAID sistemi olabileceğini de
düşünerek şunu hissediyorum:

1
@red: Şimdi referansı bulamıyorum, ancak 4096 bayt sektöre sahip bazı sürücülerin sisteme 512 bayt olduğunu bildireceklerini ve sonra da dahili olarak dönüşümle ilgileneceklerini okudum.

1

ddCihaz boyutunu şu şekilde kullanabilir ve alabilirsiniz 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

Yuvarlama hatalarını önlemek için 1 m blok boyutu kullanmıyorum.

Alternatif olarak, lseekişlevi çağıran küçük bir C programı (veya komut dosyası) ve 1 m'lik SEEK_ENDbir negatif kayma yazıp ardından çağırabilirsiniz write.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.