Wznawianie DD całego dysku

10

Nadpisuję mój dysk twardy losowymi danymi, używając starego dobrego dd:

dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=512

To tablica 2 TB, a mój MacBook (z systemem Linux, dobrze?) Może zapisywać dane tylko z prędkością około 3,7 MB / s, co jest dość żałosne, ponieważ widziałem, jak mój komputer stacjonarny robi prędkość 20 MB / s. Kiedy wieczorem wracam do domu, chciałbym zatrzymać ddbieg, zabrać go do domu i zobaczyć, jakie postępy można zrobić z dnia na dzień dzięki mocniejszej maszynie.

Postępy monitoruję za pomocą prostej pętli:

while true; do kill -USR1 $PID ; sleep 10 ; done

Dane wyjściowe wyglądają następująco:

464938971+7 records in
464938971+7 records out
238048755782 bytes (238 GB) copied, 64559.6 s, 3.7 MB/s

Gdybym miał wznowić ddprzepustkę w domu, jak ją zrestartować? Znam ten seekparametr, ale na co mam wskazywać, numer rekordu lub liczbę bajtów?

Naftuli Kay
źródło
1
Czy używam numeru rekordu? Czy to równa się zapisanemu blokowi?
Naftuli Kay
2
Liczba bloków = całkowita liczba bajtów / rozmiar bloku, teoretycznie powinna wynosić 238048755782/512 = 464938976, ale masz tam częściowe rekordy, więc odejmę kilka bloków od liczby, aby zachować bezpieczeństwo, np.seek=464938960
don_crissti

Odpowiedzi:

8

Jak już skomentował @don_crissti, wystarczy użyć, seek=aby wznowić.

dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=512 seek=464938971

GNU dd obsługuje także wyszukiwanie w bajtach, więc możesz wznowić dokładnie, niezależnie od rozmiaru bloku:

dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=1M \
   seek=238048755782 oflag=seek_bytes

Większy rozmiar bloku powinien pomóc w prędkościach, nawet w przypadku wolnego urządzenia, takiego jak /dev/urandom.

Jeśli szukasz szybszych alternatyw, możesz cryptsetup plainOpenużyć losowego klucza i wyzerować go, powinien bić /dev/urandomo rząd wielkości (bez AES-NI) lub nawet biegać z pełną prędkością (z AES-NI).

Możesz także użyć, shred -n 1jeśli dane pseudolosowe są wystarczające dla twojego przypadku użycia. shredpowinien być w stanie wykorzystać pełną prędkość dysku, nawet na bardzo wolnej maszynie.

frostschutz
źródło
plainOpenDo tej pory nie wiedziałem . Świetny! Zakończyłem szyfrowanie dysku 2 TB w ciągu około 4 godzin, w przeciwieństwie do 256 GB w ponad 12 przy użyciu /dev/urandom.
Naftuli Kay
4

Przypomnienie dla osób, które chciałyby skopiować, a nie tylko losowe dyski (co nie jest tak powszechne): możesz użyć, skip=BLOCKSaby rozpocząć czytanie we właściwej pozycji i seek=BLOCKSzacząć pisać we właściwej pozycji. Obie opcje używają bloków, a nie bajtów. Podczas łamania / restartowania zaleca się na wszelki wypadek usunięcie kilku bloków. Zazwyczaj warto podnieść bswartość powyżej 512, ponieważ można osiągnąć lepszą wydajność, jeśli odczytuje się dużo danych z rzędu.

W twoim przypadku jest to rzeczywiście wartość blokowa, którą musisz przekazać seek. Być może powinieneś postarać się dostosować, bsaby sprawdzić, czy możesz zwiększyć prędkość, tak jak /dev/randompowinien iść szybko (pseudolosowy i nieblokujący, gdy nie ma dostępnej entropii)

Uriel
źródło
0

ddz niewielkim rozmiarem bloku, takim jak 512 bajtów, prawdopodobnie będzie on znacznie wolniejszy niż maksymalna przepustowość dysku. Użyj większej wielkości bloku (na przeczucie powiedziałbym, że kilka MB) dla dobrej wydajności. Lub użyj cat- w systemie Linux okazało catsię, że jestem tak szybki, jak ddprzy optymalnym rozmiarze bloku, gdy zaangażowany jest pojedynczy dysk (nie wiem, czy to dotyczy również OSX).

Aby dowiedzieć się, jak daleko catdoszedł, uruchom, lsof -p1234gdzie 1234 jest identyfikatorem catprocesu.

Aby wznowić pracę z pozycji, użyj

{ dd bs=1 seek=123456; cat /dev/urandom; } >/dev/disk/…

gdzie 123456 jest przesunięciem w bajtach.

Gilles „SO- przestań być zły”
źródło
0

Klonowanie dysku:

Rozwijając odpowiedź z tego wątku, oto jak można sklonować cały dysk i wznowić:

Ten przykład jest zoptymalizowany do kopiowania z napędu obrotowego 5400 rpm na dysk SSD w określonym systemie. gddreprezentuje GNU dd:

> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' bs=4M status=progress
247426187264 bytes (247 GB, 230 GiB) copied, 2082 s, 119 MB/s
59012+0 records in
59011+0 records out
247510073344 bytes (248 GB, 231 GiB) copied, 2082.92 s, 119 MB/s

Mogę wznowić to na jeden z dwóch sposobów:

> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' \
bs=4M \
seek=59011 skip=59011 \
status=progress

Lub:

> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' \
bs=4M \
seek=247510073344 skip=247510073344 \
oflag=seek_bytes iflag=skip_bytes \
status=progress

W pierwszym przykładzie, którego używamy, 59011a nie 59012, jest 59011to, ile rekordów wielkości bloku zostało w pełni skopiowanych przed przerwaniem. (nagrywa).

hmedia1
źródło