зачекайте, коли команда dd повністю запише на диск


13

Я використовую команду dd для створення завантажувального usb з iso-файлу:

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

Після натискання клавіші введіть його на мить та виходить:

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

Тож це як біг у фоновому режимі, бо я бачу, що флешка працює. З часом копіювання припиниться, і я можу успішно видалити диск, але питання полягає в тому, чому команда dd не чекає завершення копіювання. Чому він працює у фоновому режимі. І як змусити його почекати?


4
Ви пробували sync?
choroba

1
@choroba Чи має сенс запускати "синхронізацію", якщо система вже записує дані на флешку?
Кирило Івлев

Я не впевнений, байт syncможе зачекати.
choroba

2
ddтакож є деякі параметри синхронізації, наприклад conv=fsync. Однак, мені ніколи не довелося використовувати це з /dev/sd*накопичувачами. Якби ви буквально використовували /dev/sdxмою здогадку, чи не було б у вас нині непотрібний файл 959 Мб в /dev(ramdisk) ...
frostschutz

1
@frostschutz Я використовував / sdc для своєї флешки
Кирило Івлев

Відповіді:


21

Незважаючи на поширену думку, ddце абсолютно звичайна команда, вона не є більш низьким рівнем catабо cp. Ваша команда зчитує з кеш-диска і записує в дискові буфери, як і будь-яка інша команда.

Для того, щоб переконатися, що дані повністю записані на фізичні носії, вам потрібно зателефонувати sync. Команда syncпередає всі вихідні буфери на диск (и). Коли syncкоманда повертається, дані повністю записані.

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

Більшу частину часу вам не потрібно дзвонити sync, оскільки демонтаж файлової системи виконує ту саму роботу. Коли umountкоманда повертається або коли ви отримуєте повідомлення про підтвердження після натискання кнопки «Витягнути», буфери були записані на диск. Тут ви безпосередньо записуєте на диск, не проходячи через змонтовану файлову систему, тому вам потрібно явно промити буфер.

Зауважте, що замість цього ddви можете використовувати tee. Це має дві переваги: ​​менший ризик перевернути джерело та місце призначення через друкарську помилку, і це, мабуть, трохи швидше .

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync

1
Як щодо кнопок / піктограм "Вийняття" або "Безпечне видалення". Чи не вони також зателефонували б синхронізуватись, перш ніж надсилати сповіщення "Добре видалити"?
user68186

1
Ви, ймовірно, хочете використовувати sudo tee /dev/sdx >/dev/null, інакше процес копіювання все ще буде дуже повільним через запис даних на консольний вихід.
Лекенштейн

1
@ user68186 Вони не викликають syncкоманду, але вони виконують ту саму роботу під кришкою.
Жил "ТАК - перестань бути злим"

5
Ця відповідь неправильна. Без conv=fdatasyncцього ddкоманда не чекає завершення, поки дані не записуються на диск, як вимагає ОП. Крім того, syncкоманда планує операцію синхронізації, але вона негайно повертається; він не чекає повернення, поки дані не будуть записані на диск.
vy32

1
@ Vy32 ви маєте рацію , ddне чекатиме , поки кеша бути скинуті без і conv=fdatasyncт.д. , але на не древнє Linux ви будете неправильно про syncне чекаєте. Ви можете бачити Coreutils, що sync(8)робить sync(2)системний виклик . На цій sync(2)сторінці написано: "До версії 1.3.20 Linux не чекав завершення вводу / виводу перед поверненням". тому sync(8)не повернеться, поки диск не підтвердить запис (або не буде запущена помилка).
Anon

13

Спробуйте це:

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

conv=fdatasyncКаже ddвикористовувати спеціальні параметри , щоб переконатися , що дані будуть записані на фізичний пристрій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.