poczekaj, aż polecenie dd całkowicie zapisze się na dysku

13

Korzystam z polecenia dd, aby utworzyć bootowalną pamięć USB z pliku ISO:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M

Po naciśnięciu enter na chwilę wychodzi i daje mi:

915+0 records in 915+0 records out 959447040 bytes (959 MB) copied,
0.539375 s, 1.8 GB/s

To tak, jakby działało w tle, ponieważ widzę, że dysk flash działa. W końcu przestanie kopiować i mogę pomyślnie usunąć dysk, ale pytanie brzmi, dlaczego polecenie dd nie czeka na zakończenie kopiowania. Dlaczego działa w tle? I jak mogę sprawić, że zaczeka?

Kirill Ivlev
źródło
4
Próbowałeś sync?
choroba
1
@choroba Czy ma sens uruchomienie synchronizacji, jeśli system już zapisuje dane na dysku flash?
Kirill Ivlev
Nie jestem pewien, byt syncmoże poczekać.
choroba
2
ddma również kilka opcji synchronizacji, na przykład conv=fsync. To powiedziawszy, nigdy nie musiałem używać go z /dev/sd*napędami. Gdybyście dosłownie użyli /dev/sdxmojego przypuszczenia, to mielibyście teraz bezużyteczny plik 959 MB w /dev(ramdysku) ...
frostschutz
1
@frostschutz Użyłem / sdc do napędu flash
Kirill Ivlev

Odpowiedzi:

21

Pomimo powszechnego przekonania, ddjest to zupełnie zwyczajne polecenie, nie jest ono bardziej niskie niż catlub cp. Twoje polecenie czyta z pamięci podręcznej dysku i zapisuje w buforach dysku, jak każde inne polecenie.

Aby upewnić się, że dane są w pełni zapisane na nośniku fizycznym, musisz zadzwonić sync. Polecenie syncopróżnia wszystkie bufory wyjściowe na dyski. Gdy syncpolecenie powróci, dane zostały w pełni zapisane.

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M; sync

Przez większość czasu nie trzeba dzwonić sync, ponieważ odmontowanie systemu plików wykonuje to samo zadanie. Gdy umountpolecenie powróci lub gdy pojawi się komunikat potwierdzający po kliknięciu „Wysuń”, bufory zostały zapisane na dysku. Tutaj piszesz bezpośrednio na dysk, nie przechodząc przez zamontowany system plików, więc musisz jawnie opróżnić bufor.

Zauważ, że zamiast ddmożesz użyć tee. Ma to dwie zalety: mniejsze ryzyko odwrócenia źródła i miejsca docelowego z powodu literówki i prawdopodobnie jest nieco szybsze .

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync
Gilles „SO- przestań być zły”
źródło
1
A może przyciski / ikony „Wysuń” lub „Bezpiecznie usuń”. Czy nie wywołaliby też synchronizacji przed powiadomieniem „OK, aby usunąć”?
user68186,
1
Prawdopodobnie chcesz użyć sudo tee /dev/sdx >/dev/null, w przeciwnym razie proces kopiowania byłby nadal bardzo powolny z powodu zapisywania danych na wyjściu konsoli.
Lekensteyn,
1
@ user68186 Nie wywołują syncpolecenia, ale wykonują tę samą pracę pod maską.
Gilles „SO- przestań być zły”
5
Ta odpowiedź jest zła. Bez conv=fdatasynctego ddpolecenie nie czeka na zakończenie, dopóki dane nie zostaną zapisane na dysku, zgodnie z żądaniem OP. Ponadto syncpolecenie planuje operację synchronizacji, ale natychmiast powraca; nie czeka na powrót, dopóki dane nie zostaną zapisane na dysku.
vy32
1
@ vy32 masz rację dd, nie będziesz czekał na wyczyszczenie pamięci podręcznej bez conv=fdatasyncitd., ale w nie-starożytnym Linuksie nie masz racji sync. Możesz zobaczyć, jak coreutils sync(8)robi połączenie sync(2)systemowe . sync(2)Człowiek-strona mówi „Przed wersją 1.3.20 Linux nie czekać na I / O, aby zakończyć przed powrotem.” więc sync(8)nie powróci, dopóki dysk nie potwierdzi zapisów (lub wystąpi błąd).
Anon,
13

Spróbuj tego:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx conv=fdatasync bs=1m

conv=fdatasyncMówi ddużyć specjalnych opcji, aby upewnić się, że dane są zapisywane na urządzeniu fizycznym.

vy32
źródło