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?
command-line
bash
Kirill Ivlev
źródło
źródło
sync
?sync
może poczekać.dd
ma również kilka opcji synchronizacji, na przykładconv=fsync
. To powiedziawszy, nigdy nie musiałem używać go z/dev/sd*
napędami. Gdybyście dosłownie użyli/dev/sdx
mojego przypuszczenia, to mielibyście teraz bezużyteczny plik 959 MB w/dev
(ramdysku) ...Odpowiedzi:
Pomimo powszechnego przekonania,
dd
jest to zupełnie zwyczajne polecenie, nie jest ono bardziej niskie niżcat
lubcp
. 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
. Poleceniesync
opróżnia wszystkie bufory wyjściowe na dyski. Gdysync
polecenie powróci, dane zostały w pełni zapisane.Przez większość czasu nie trzeba dzwonić
sync
, ponieważ odmontowanie systemu plików wykonuje to samo zadanie. Gdyumount
polecenie 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
dd
moż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 .źródło
sudo tee /dev/sdx >/dev/null
, w przeciwnym razie proces kopiowania byłby nadal bardzo powolny z powodu zapisywania danych na wyjściu konsoli.sync
polecenia, ale wykonują tę samą pracę pod maską.conv=fdatasync
tegodd
polecenie nie czeka na zakończenie, dopóki dane nie zostaną zapisane na dysku, zgodnie z żądaniem OP. Ponadtosync
polecenie planuje operację synchronizacji, ale natychmiast powraca; nie czeka na powrót, dopóki dane nie zostaną zapisane na dysku.dd
, nie będziesz czekał na wyczyszczenie pamięci podręcznej bezconv=fdatasync
itd., ale w nie-starożytnym Linuksie nie masz racjisync
. Możesz zobaczyć, jak coreutilssync(8)
robi połączeniesync(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ęcsync(8)
nie powróci, dopóki dysk nie potwierdzi zapisów (lub wystąpi błąd).Spróbuj tego:
conv=fdatasync
Mówidd
użyć specjalnych opcji, aby upewnić się, że dane są zapisywane na urządzeniu fizycznym.źródło