Wyczyść ostatnie 1 MB dysku twardego

25

Czy istnieje proste polecenie, którego można użyć do wyzerowania ostatniego 1 MB dysku twardego?

Na początek chciałbym dd if=/dev/zero of=/dev/sdx bs=1M count=1. seekRozwiązaniem dla dd wygląda obiecująco, ale czy ktoś ma łatwego sposobu, aby dokładnie określić, jak daleko mam szukać?

Mam sprzętowe urządzenie RAID, które przechowuje niektóre ustawienia RAID na końcu dysku. Potrzebuję urządzenia RAID, aby zobaczyć dyski jako nieskonfigurowane, więc chcę usunąć konfigurację RAID bez konieczności poświęcania czasu na pełne wyczyszczenie dysków. Mam kilkanaście dysków 2 TB, a ich pełne usunięcie zajmie dużo czasu.

Zoredache
źródło

Odpowiedzi:

22

Najprostszym sposobem uzyskania rozmiaru dysku w systemie Linux jest blockdev --getsz:

sudo -s
dd bs=512 if=/dev/zero of=/dev/sdx count=2048 seek=$((`blockdev --getsz /dev/sdx` - 2048))
psusi
źródło
Doskonale, wiedziałem, że musi istnieć narzędzie, które może łatwo uzyskać rozmiar.
Zoredache
1
Chociaż podoba mi się to rozwiązanie, użycie sdajako przykładu jest strasznie niebezpieczne, jeśli skopiujesz i wkleisz i uda Ci się skopiować kopię karetki. sdxbyłoby znacznie lepiej dostosowane. Podejmuję środki ostrożności, ale tylko z ich powodu nie zniszczyłem teraz dysku.
emk2203
@ emk2203 Dobry punkt. Ciekawe, jakie masz środki ostrożności dla takich scenariuszy?
Hashim
1
Używam jednego cytatu przed wklejeniem. Jeśli wiersz zawiera znak powrotu karetki, zostaje złapany przez monit powłoki z powodu brakującego końca cytatu. Jeśli wszystko jest w porządku, przechodzę do początku linii za pomocą Ctrl-A, następnie usuwam cytat i wracam. Trzy kolejne naciśnięcia klawiszy dla ubezpieczenia, warto.
emk2203
Zamiast / dev / sdx, spójrz na linki w / dev / disk / by-id /, takie jak nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXX. ls -l / dev / disk / by-id / wyświetli nazwę dowiązania i plik / dev / sdX, do którego prowadzi.
rcpa0
6

Rozmiar każdej partycji jest dostępny w /proc/partitions. Następujące polecenie pokazuje rozmiar sdx(w jednostkach kB):

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

A zatem:

dd if=/dev/zero of=/dev/sdx bs=1k count=1024 \
   seek=$(($(awk '$4 == "sdx" {print $3}' </proc/partitions) - 1024))
Gilles „SO- przestań być zły”
źródło
Jaki jest powód -1024 na końcu?
Hashim,
1
@Hashim Pytanie dotyczy sposobu wyczyszczenia ostatniego 1 MB. Ostatni 1 MB zaczyna 1024 kB przed końcem.
Gilles „SO- przestań być zły”
3

Korzystanie z funkcji poszukiwania do końca dysku działa bardzo dobrze, tj .:

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

Jednak gdy go używasz, zalecam albo wiedzieć, że twoja wartość zliczania jest poprawna, albo w ogóle jej nie używać. Mówię, że dlatego, że dyski mogą mieć 512 bajtów sektorów lub sektory 4k, a jeśli użyjesz tego rozwiązania z dyskiem, który ma sektory 4k, nie przejdziesz do końca dysku z tą liczbą zliczeń, i na końcu może mi brakować informacji RAID (natknąłem się na to).

J Akers
źródło
Czy mógłbyś jakoś podzielić się tym, na co dokładnie wpadłeś? Jestem zaintrygowany, zastanawiam się, czy źle zrozumiałem, w jaki sposób ddadresuje sektory, gdy są używane z niestandardowymi bswartościami mniejszymi / większymi niż rzeczywisty rozmiar bloku zgłaszany przez oprogramowanie układowe urządzenia lub jądro Linuksa.
sjas 27.04.17
2

Możesz uzyskać liczbę sektorów na dysku za pomocą hdparm -v /dev/sdx. Spróbuj wyszukać numer_sektorów - 2048 (przy założeniu 512 bajtów sektorów).


źródło
hdparm wydaje się przydatny, ale jak mam sprawdzić rozmiar sektora?
Peter.O
1
/sys/block/sdx/queue/physical_block_sizemoże dostarczyć informacji, ale niektóre nowsze dyski odtwarzają się szybko i luźno w zależności od wielkości sektora, który zgłaszają. Prawdopodobnie lepiej jest przeczytać etykietę na dysku lub sprawdzić ją w karcie danych producenta.
1
Dzięki .. Właśnie zauważyłem, że hdparm -I /dev/sdazawiera 2 „wersje” wielkości sektora: Logicali Physical. Czy to rozumiesz przez „szybkie i luźne”? .... Mam wrażenie, że jeśli coś będzie się zachowywać w taki sposób, może to być system RAID ..
Peter.O
1
@red: Nie mogę teraz odnieść się do referencji, ale gdzieś przeczytałem, że niektóre dyski z sektorami 4096 bajtów zgłaszają systemowi, że mają 512 bajtów, a następnie przetwarzają wewnętrznie konwersję.
1

Możesz użyć ddi uzyskać rozmiar urządzenia poprzez 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

Nie używam wielkości bloku 1m, aby uniknąć błędów zaokrąglania.

Alternatywnie, możesz napisać mały program C (lub skrypt), który wywołuje lseekfunkcję z SEEK_ENDujemnym przesunięciem 1 MB, a następnie wywołuje write.

maxschlepzig
źródło