Jaka jest różnica między „bs”, „count” i „seek” w poleceniu dd?

24

Czytałem wiele przewodników i wpisy na forum opisujące jak korzystać dd, ale jedno zauważyłem jest to, że ludzie zawsze wykorzystują różne wartości dla bs=, count=i seek=przełączników.

Proszę, ktoś może wyjaśnić, co dokładnie robią te przełączniki (strona podręcznika nie jest bardzo szczegółowa), i wyjaśnić, jakie są najlepsze dla nich ustawienia dla różnych zadań, takich jak tworzenie plików z / dev / random lub / dev / zero i nadpisywanie partycje i dyski zewnętrzne.

Eric
źródło
Wypróbuj dokumentację GNU dla wersji dd lub POSIX .
jw013

Odpowiedzi:

27

Naprawdę nie wiem, jak to wyjaśnić lepiej niż strona podręcznika.

bs=ustawia rozmiar bloku, na przykład bs=1Mbyłby to rozmiar bloku 1 MB.

count=kopiuje tylko tę liczbę bloków (domyślnie dd kontynuuje pracę w nieskończoność lub do momentu wyczerpania danych wejściowych). Idealnie bloki są bs=wielkości, ale mogą być niepełne odczyty, więc jeśli używasz count=do skopiowania określonej ilości danych ( count*bs), powinieneś również podać iflag=fullblock.

seek= szuka takiej liczby bloków na wyjściu, zamiast pisać na samym początku urządzenia wyjściowego.

Na przykład kopiuje wartość 1 MB y\ndo pozycji 8 MB pliku wyjściowego. Tak więc całkowity rozmiar pliku wyniesie 9 MB.

$ yes | dd bs=1M count=1 seek=8 iflag=fullblock of=outputfile
$ ls -alh outputfile
9.0M Jun  3 21:02 outputfile
$ hexdump -C outputfile
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00800000  79 0a 79 0a 79 0a 79 0a  79 0a 79 0a 79 0a 79 0a  |y.y.y.y.y.y.y.y.|
*
00900000

Ponieważ wspominasz /dev/randomi zastępujesz partycje ... to potrwa wieczność, ponieważ /dev/random(jak również /dev/urandom) jest po prostu zbyt wolne. Możesz po prostu użyć shred -v -n 1zamiast tego, to jest szybkie i zwykle dostępne w dowolnym miejscu.

frostschutz
źródło
21

Ok, powiedziałeś, że strony podręcznika nie są szczegółowe, więc wyjaśnię ich znaczenie łatwymi do zrozumienia metaforami o poruszającym się facecie (tak się nazywa dd):

   bs=BYTES
          read and write up to BYTES bytes at a time

ddpodnosi coś (pudła, wazony, łóżka, ryż itp.), przesuwa się tam, gdzie musi być i upuszcza. Dopóki nie zrzuci ładunku, nie zbierze nic innego. Teraz, kiedy musisz powiedzieć mu dokładnie, ile przedmiotów powinien wybrać na podróż, to właśnie to bsrobi. Ustawiasz ilość danych, które będzie czytać i zapisywać. Jest to prawie obowiązkowe we wszystkich przydatnych i powszechnych poleceniach.

   count=N
          copy only N input blocks

To określa całkowitą liczbę pól, które on poruszy. Pudełka w tym kontekście to bloki na dysku . Mówisz mu, żeby przesunął 5 pudełek, on porusza tylko 5 pudełkami, nawet jeśli jest ich więcej niż 5 (jeśli jest ich mniej niż 5, weźmie znaleziony wazon obok pudeł, aby je dodać). Jeśli powiesz dddo counttylko 5, a następnie zapisz go gdzieś, mógłby skopiować pierwszych 5 bloków on widzi i zapisać je tam, gdzie chcesz.

   seek=N skip N obs-sized blocks at start of output

Facet zwykle znajduje pierwsze dostępne miejsce do zrzucenia ładunku, zwykle na początku (dysku) i kontynuuje napełnianie do końca. Cóż, dzięki temu mówisz, ddaby zacząć dalej, powiedzmy zamiast przedpokoju, zacznij w jednym z pokoi w głębi. Po prostu „pomija” bloki startowe.

Teraz, w zależności od tego, co robisz, będziesz potrzebować różnych kombinacji w zależności od źródła i miejsca docelowego, a także formatu, w jakim będą odczytywane i zapisywane. Polecam poszukać ich oddzielnie.

Braiam
źródło
„weźmie wazon, który znalazł oprócz pudeł, aby go dodać”. Co oznacza ta metafora?
Ini
1
@Ini Że jeśli istnieje sąsiadujący blok, który nie należy do if read, dd go przeczyta i przeniesie. Wazon nie jest pudełkiem, ale dd go przenosi.
Braiam,