Kiedy ustawienia bs i count dla dd są nieprawidłowe?

1

(Przez zło mam na myśli „zniszczy rzeczy”.)

Załóżmy, że mamy zamiar użyć dd. Wybraliśmy poprawny zestaw if, ofi ewentualnie seeka skip. Dokładnie upewniliśmy się, że polecenie nie zapisuje poza naszym zamierzonym regionem wyjściowym.

Jak możemy teraz subtelnie niszczyć, wybierając złą kombinację bsi count? Skąd mielibyśmy wiedzieć?

Powodem, dla którego pytam, jest to, że wydają się pojawiać preferowane przez magię wartości. Na przykład w tym pytaniu o generowanie losowego pliku 1G, pierwsze dwie odpowiedzi użyć if=/dev/urandom, of=sample.txt, bs=64M, i count=16.

Jak utworzyć losowy plik 1 GB w systemie Linux?

Oczywiście nie są to jedyne prawidłowe ustawienia, ale obie odpowiedzi wykorzystały te ustawienia, co sugeruje, że ten wybór jest szczególnie dobry i uzasadniony. Zwłaszcza w takim przypadku, w którym nie ma systemu plików ani nawet dysku fizycznego, nie jest dla mnie jasne, czy wybór ustawień może być zły - nie tylko nieefektywny, ale zły . Domyślam się, że ddmusi zapisywać całkowitą liczbę bloków na raz, więc wraz ze bswzrostem zwiększa się użycie pamięci i te wartości wpływają tylko na wydajność.

Ten przykład jest tylko przykładem i nie jest czymś, co szczególnie mnie interesuje, więc napisz przypadki, w których to, co jest kopiowane, ma system plików.

Używanie dd jest dla mnie zawsze przerażającym skokiem wiary.

Praxeolitic
źródło
To tylko niektóre osobiste preferencje. Wartość bs nie może być zbyt mała lub nastąpi poważne pogorszenie wydajności - wydajność losowa / 4K jest zawsze znacznie wolniejsza niż sekwencyjna, więc musimy ustawić wartość bs wystarczająco dużą, aby była sekwencyjna. W przeciwnym razie nie ma dużej różnicy: bs = liczba liczników 64 = 16, bs = liczba liczników 16 = 64 lub bs = liczba liczników 1 = 1024.
Chris.C
Podejrzewam, że tak, i jeśli byłbym bardzo szczęśliwy, mogąc przyjąć odpowiedź na ten temat pochodzącą od osoby, która jest tego pewna i potrafi krótko wyjaśnić, dlaczego. Kiedy chciałbym sprecyzować moje obawy, kiedy dd mógłby uszkodzić system plików, czytając lub pisząc „pokrojone” bloki systemu plików? Czy byłoby to oczywiste, gdyby tak się stało?
Praxeolitic
Istnieje różnica w korzystaniu ze starych napędów taśm, ale dzisiaj, przynajmniej w przypadku plików, nie ma różnicy w końcowym wyniku. W przypadku (nowoczesnych) surowych urządzeń zakładam to samo, ale nie mogę być w 100% pewien.
Chris.C
@ Chris.CI z pewnością nie można prosić o 100% pewności, w końcu nie można udowodnić negatywności. Chcę tylko wiedzieć, czy jest coś, czego jestem całkowicie nieświadomy. Nie używam ddzbyt często, ale kiedy to robię, stawki są wysokie i to jest przerażające! Wygląda na to, że jest to obszar Twojej wiedzy. Zapraszam do odpowiedzi.
Praxeolitic,
imho, nie możesz zepsuć rzeczy, kiedy plik jest ... kiedy plik jest urządzeniem, czy naprawdę zależy ci na oryginalnej treści? najgorszym scenariuszem jest pisanie ponownie.
Chris.C

Odpowiedzi:

3

Wsparcie! ddjest straszne!

Nie jesteś sam. Z porad dla systemu Linux :

Polecenie „dd” jest jednym z oryginalnych narzędzi uniksowych i powinno znajdować się w skrzynce narzędziowej wszystkich osób. Niektórzy uważają, że dd oznacza „Zniszcz dysk” lub „Usuń dane”, ponieważ jeśli zostanie niewłaściwie użyte, partycja lub plik wyjściowy mogą zostać zniszczone bardzo szybko. Ponieważ dd jest narzędziem używanym do zapisywania nagłówków dysków, rekordów rozruchowych i podobnych obszarów danych systemowych, niewłaściwe użycie dd prawdopodobnie zniszczyło wiele dysków twardych i systemów plików.

Ale nie martwcie się. Gdy dowiesz się o jego zawiłościach, będziesz przywoływał ddspokojną grację kowboja rodeo.

Czy to się zepsuje? Co to jest counting bs?

Najpierw zajmiemy się pierwszym pytaniem.

Jak możemy teraz subtelnie niszczyć, wybierając złą kombinację bsi count? Skąd mielibyśmy wiedzieć?

Jeśli masz na myśli „niezamierzone konsekwencje” przez „złamanie”, to po prostu przez ich sprecyzowanie w teorii. Co mam przez to na myśli? Powiedzmy, że chcesz skopiować image.imgna kartę SD znajdującą się pod adresem /dev/sdc. Więc dopasujesz parametry w swoim przykładzie:

# dd if=/home/someone/image.img of=/dev/sdc bs=64M count=16

Czy ponowne użycie tych ustawień powinno być w porządku? Poczekajmy, ddaż skończymy ... co teraz mówi?

16+0 records in
16+0 records out
1073741824 bytes (1.1 GB) copied, 34.1303 s, 31.5 MB/s

Tylko 1,1 GB skopiowane! Ale image.imgma około 2 GB , chcę, żeby wszystko zostało skopiowane! Mówiąc, ddaby skopiować 16 partii 64M (gdzie M = 1024 * 1024, nawiasem mówiąc) określiłeś rozmiar. Będziesz wiedział po wyjściu statusu. Jeśli chcesz skopiować cały plik, dopasuj rozmiar za pomocą bsi count; lub po prostu całkowicie je pomiń:

# dd if=/home/someone/image.img of=/dev/sdc
4364864+0 records in
4364864+0 records out
2234810368 bytes (2.2 GB) copied, 45.9502 s, 48.6 MB/s

Co się stanie, jeśli staniemy się naprawdę niegrzeczni i powiedzmy, ddaby skopiować więcej danych niż jest dostępnych?

# dd if=/home/someone/image.img of=/dev/sdc bs=1M count=4096
2131+1 records in
2131+1 records out
2234810368 bytes (2.2 GB) copied, 77.9768 s, 28.7 MB/s

Ach, ddkopiuje tylko tyle bajtów, ile otrzymuje. To się przydaje.

Monitorowanie dd

Mówiąc o wyjściu statusu, dd(wariant GNU) szanuje i reaguje na sygnał INFO SIGUSR1:

# echo "In another terminal or TTY"
# pkill -USR1 -n -x dd
# echo "Printed to stdout on the terminal/tty running dd:"
534+0 records in
534+0 records out
559939584 bytes (560 MB) copied, 1.68414 s, 332 MB/s

Przydaje się do monitorowania powolnego transferu lub z jakiegoś powodu możesz się zawiesić. Dobrze się łączy watch, ale pamiętaj, aby podać watchodpowiednio długi czas przerwy.

Czy ddmam jakieś inne opcje, o których powinienem wiedzieć?

ddrzeczywiście ma inne opcje, ale w większości przypadków, jeśli będziesz musiał z nich skorzystać, będziesz wiedział, co robią. Mimo to kilka przykładów może dać ci pomysł:

  • conv=CONVS: przekonwertuj dane wejściowe zgodnie z jedną lub kilkoma opcjami konwersji
  • seek=Ni skip=N: pomiń bloki wielkości N [obs | ibs] na początku [wyjście | wejście]
  • status=X: (pomijanie wyjścia) albo noxferalbonone

Teraz czuję się znacznie lepiej dd!

Wspaniały! Wkrótce wyślesz przez Internet obraz rozruchowy, który zostanie zapisany bezpośrednio na karcie microSD przy użyciu kombinacji ddi ssh.

Ale co tak ddnaprawdę oznacza akronim?

Dobre ostatnie pytanie. W przypadku tego pytania i innych podobnych, odsyłam cię do wpisu pliku żargonu dladd .


Zachęcamy do proszenia o wyjaśnienie, czy coś jest bardziej nieprzejrzyste niż powinno!

bertieb
źródło
-3

Twoje pytanie jest wewnętrznie sprzeczne:

Dokładnie upewniliśmy się, że polecenie nie zapisuje poza naszym zamierzonym regionem wyjściowym.

Jak możemy teraz subtelnie rozbijać rzeczy, wybierając złą kombinację bs i liczyć? Skąd mielibyśmy wiedzieć?

Jeśli wybierzesz złą kombinację bsi count, jedyną rzeczą, którą możesz złamać, jest przekroczenie zamierzonego regionu wyjściowego (lub nieosiągnięcie go, co uważam za ten sam problem)

Jeśli dokładnie upewniłeś się, że polecenie nie zapisuje poza zamierzonego regionu wyjściowego, nie możesz zepsuć rzeczy, ponieważ już zapewniłeś kombinację bsi countnie jest źle. Obie nie mogą wystąpić jednocześnie. Podobnie, jeśli nie zrozumiałeś parametrów bsi count, nie możesz mieć pewności, że region wyjściowy jest poprawny.

To powiedziawszy, bsparametr jest w dużej mierze parametrem dostrajania wydajności. Jeśli określisz rozmiar bsmniejszy niż rozmiar sektora fizycznego i czytasz / piszesz w trybie surowym, lub inna całkowicie nieprecyzyjna wartość, ddpo prostu, a nie w subtelny sposób („Przerwij: błąd we / wy!”) . W przeciwnym razie wszystko będzie po prostu powoli.

qasdfdsaq
źródło