Dlaczego opcja synchronizacji jest używana z poleceniem `dd`?


13

Postępując zgodnie z instrukcjami na tej stronie, na końcu strony pojawiło się ddpolecenie i syncopcja. Polecenie jest następujące:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M sync

Wiem, co to jest ddi jak to działa, ale nigdy nie słyszałem o tej syncopcji ani jej nie używałem , a jej ręczne wprowadzanie strony przypomina:

sync   pad every input block with NULs to  ibs-size;  when  used  with
       block or unblock, pad with spaces rather than NULs

Co to jest NULi dlaczego jest ibs-sizewypełniane i po co zawracać sobie głowę wypełnianiem bloków danych i używać syncopcji z ddpoleceniem? Dlaczego nie zachować prostoty i łatwości?

Gdy próbuję uruchomić syncpolecenie z odpowiednią lokalizacją i wartościami, pojawia się następujący błąd:

dd: unrecognized operand ‘sync’
Try 'dd --help' for more information. 

Odpowiedzi:


21

Źle interpretujesz polecenie. Jego:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M 
sync

syncjest tutaj osobnym poleceniem. Zobacz man 1 sync:

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

DESCRIPTION
       Force changed blocks to disk, update the super block.

Trochę oczywiste, dlaczego jest używane, gdy myślisz o buforowaniu.

Co do ddopcji można przeczytać, że jest to wartość dla tej convopcji :

Each CONV symbol may be:
   ascii  from EBCDIC to ASCII
   ...
   sync   pad every input block with NULs  to  ibs-size;  when  used  with
          block or unblock, pad with spaces rather than NULs

Jeśli był używany (a nie jest), byłby używany w następujący sposób:

dd ... conv=sync

3
Dobra odpowiedź, bardzo szczegółowa. Fajnie, że nawet opisałeś dd ... conv=syncargument.
Bajt Dowódca

Nie pozwól, by cię wyśmiewali! ;-) Dobra odpowiedź: zauważyłeś problem, którego nawet nie widziałem. > :-) +1
Fabby

1
Również z opisu conv=syncopcji wydaje się całkiem jasne, dlaczego nie jest do tego używana. W najlepszym wypadku nic nie zrobiłoby, w najgorszym przypadku zniszczyłoby obraz podczas kopiowania.
kasperd

5
Naprawdę, instrukcje powinny wywoływać opcję dd oflag=fsync(która opróżnia wyjście, które napisał dd) zamiast syncpolecenia (które opróżnia wszystko w systemie.
psusi

Ta odpowiedź jest myląca. Z dd, syncjest argumentem zarówno conva iflaglub oflagopcji.
Dan Loewenherz,

3

Domyślnie dd odczytuje dane po jednym bloku na raz, być może czytając w bloku krótszym niż określony przez użytkownika, albo na końcu pliku, albo z powodu zachowania urządzenia źródłowego; nazywa się to częściowym zapisem . Następnie wypisze blok o tym samym rozmiarze co odczytana wartość.

Dd będzie to powtarzać, aż do osiągnięcia określonej liczby lub zobaczy eof na wejściu lub błąd na wejściu lub wyjściu. Po zakończeniu, dd zgłasza liczbę pełnych i częściowych zapisów, które przeczytał i napisał.

Takie zachowanie jest odpowiednie do kopiowania zwykłego pliku w systemie plików lub przez połączenie sieciowe TCP, ponieważ jest to uważane za strumień bajtów. Ale inne obiekty systemu plików, takie jak surowe dyski DVD i taśma magnetyczna, wymagają rozmiarów zapisu, które mieszczą się w określonych zakresach i są zaokrąglane o pewną wielokrotność (np. 512 lub 2048 bajtów). Na przykład, jeśli masz obraz dysku zawierający 255 ścieżek z 63 512-bajtowymi sektorami i chcesz zapisać na taśmie, która wymaga bloku o wielkości 1024 bajtów, musisz zrobić coś takiego

dd if=disk.img of=/dev/rmt0 bs=1k conv=sync

aby upewnić się, że dd nie próbuje zapisać 512-bajtowego bloku na końcu. Krótszy blok na końcu zostanie wypełniony zerami lub odstępami. Wypełnianie zerami jest bezpiecznym, powszechnym wyborem. Opcja dd do wypełniania spacjami jest przydatna w innej sytuacji - konwertowanie pliku, który ma linie o zmiennej długości, na plik o linii o stałej długości.


0

Odkryłem, że system linux, a nie dd, buforuje bufory. Dlatego po zakończeniu komendy dd uruchamiam synchronizację jako

sudo dd if=my.downloaded.iso of=/dev/sd(?) bs=1M && sync

Nie użyłem żadnej wewnętrznej opcji dd, aby spowodować opróżnienie bufora. Zazwyczaj jednak, gdy tworzę wersję dystrybucji USB, jestem jedyną na komputerze, więc nie mam wątpliwości, że moje opublikowane polecenie wyrządza szkodę. Ponieważ uruchamiam synchronizację jako &&, synchronizacja odbywa się z uprawnieniami sudo i jestem pewien, że utworzony przeze mnie USB jest kompletny.


0

Możesz użyć syncopcji wyjścia, która jest zawarta w poleceniu dd, za pomocą oflagsymbolu:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M oflag=sync
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.