дождитесь полной записи команды 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?
Чороба
1
@choroba Имеет ли смысл запускать синхронизацию, если система уже записывает данные на флэш-диск?
Кир Ивлев
Я не уверен, что syncможет подождать.
Чороба
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
Как насчет кнопок / значков «Извлечь» или «Безопасное удаление». Не будут ли они также вызывать синхронизацию, прежде чем дать уведомление «OK to remove»?
user68186
1
Вы, вероятно, захотите использовать sudo tee /dev/sdx >/dev/null, иначе процесс копирования все равно будет очень медленным из-за записи данных в консольный вывод.
Лекенштейн
1
@ user68186 Они не вызывают syncкоманду, но выполняют ту же работу под капотом.
Жиль "ТАК - перестань быть злым"
5
Этот ответ неверен. Без conv=fdatasyncэтого ddкоманда не ожидает завершения до тех пор, пока данные не будут записаны на диск в соответствии с запросом OP. Кроме того, 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использовать специальные параметры , чтобы убедиться , что данные будут записаны на физическое устройство.

vy32
источник