Я использую команду 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 не ожидает завершения копирования. Почему это работает в фоновом режиме. И как я могу заставить его ждать?
command-line
bash
Кир Ивлев
источник
источник
sync
?sync
может подождать.dd
также имеет некоторые параметры синхронизации, напримерconv=fsync
. Тем не менее, мне никогда не приходилось использовать его с/dev/sd*
драйверами самостоятельно. Если бы вы буквально использовали/dev/sdx
моё предположение, то у вас был бы бесполезный файл размером 959 МБ в/dev
(ramdisk) сейчас ...Ответы:
Несмотря на распространенное мнение,
dd
это совершенно обычная команда, она не более низкого уровня, чемcat
илиcp
. Ваша команда читает из дискового кэша и записывает в дисковые буферы, как любая другая команда.Чтобы убедиться, что данные полностью записаны на физический носитель, вам нужно позвонить
sync
. Командаsync
сбрасывает все выходные буферы на диск (и). Когдаsync
команда возвращается, данные были полностью записаны.Большую часть времени вам не нужно звонить
sync
, потому что размонтирование файловой системы делает ту же работу. Когдаumount
команда возвращается или вы получаете подтверждающее сообщение после нажатия кнопки «Извлечь», буферы записываются на диск. Здесь вы напрямую записываете на диск, не проходя через смонтированную файловую систему, поэтому вам необходимо явно очистить буфер.Обратите внимание, что вместо
dd
, вы можете использоватьtee
. Это имеет два преимущества: меньше риска инвертировать источник и пункт назначения из-за опечатки, и это, вероятно, немного быстрее .источник
sudo tee /dev/sdx >/dev/null
, иначе процесс копирования все равно будет очень медленным из-за записи данных в консольный вывод.sync
команду, но выполняют ту же работу под капотом.conv=fdatasync
этогоdd
команда не ожидает завершения до тех пор, пока данные не будут записаны на диск в соответствии с запросом OP. Кроме того,sync
команда планирует операцию синхронизации, но она немедленно возвращается; он не ждет возврата, пока данные не будут записаны на диск.dd
, не дожидаетесь, пока кеш будет очищен без чего-либо еще,conv=fdatasync
но в не-древнем Linux вы ошибаетесь,sync
не ожидая. Вы можете видеть, как coreutilssync(8)
делаетsync(2)
системный вызов . Наsync(2)
странице руководства написано: «До версии 1.3.20 Linux не дожидалась завершения ввода-вывода, прежде чем вернуться». поэтомуsync(8)
не вернется, пока диск не подтвердит запись (или не произойдет ошибка).Попробуй это:
conv=fdatasync
Говоритdd
использовать специальные параметры , чтобы убедиться , что данные будут записаны на физическое устройство.источник