Почему опция синхронизации используется с командой `dd`?


13

Следуя инструкциям на этой странице, страница показала ddкоманду и syncопцию в конце. Команда следующая:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M sync

Я знаю, что ddи как это работает, но я никогда не слышал и не использовал эту syncопцию, и ее страница руководства выглядит так:

sync   pad every input block with NULs to  ibs-size;  when  used  with
       block or unblock, pad with spaces rather than NULs

К чему NULи почему он добавляется ibs-size, и зачем мешать заполнять блоки данных и использовать эту syncопцию вместе с ddкомандой? Почему бы не сделать это простым и легким?

Когда я пытаюсь выполнить syncкоманду как есть, с соответствующим расположением и значениями, я получаю следующую ошибку:

dd: unrecognized operand ‘sync’
Try 'dd --help' for more information. 

Ответы:


21

Вы неправильно читаете команду. Это:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M 
sync

syncэто отдельная команда, здесь. Смотрите man 1 sync:

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

DESCRIPTION
       Force changed blocks to disk, update the super block.

В некотором роде очевидно, почему он используется, когда вы думаете о кешировании.

Что же касается ddварианта , когда Вы читаете, это значение в convопции :

Each CONV symbol may be:
   ascii  from EBCDIC to ASCII
   ...
   sync   pad every input block with NULs  to  ibs-size;  when  used  with
          block or unblock, pad with spaces rather than NULs

Если бы он использовался (а это не так), он был бы использован таким образом:

dd ... conv=sync

3
Хороший ответ, очень подробный. Приятно, что ты даже описал dd ... conv=syncаргумент.
Byte Commander

Не позволяйте им издеваться над вами! ;-) Хороший ответ: вы заметили проблему, которую я даже не видел. > :-) +1
Fabby

1
Также из описания conv=syncопции кажется вполне понятным, почему она не используется для этого. В лучшем случае это ничего не сделает, в худшем - испортит изображение во время копирования.
kasperd

5
На самом деле инструкции должны вызывать опцию dd oflag=fsync(которая сбрасывает вывод, записанный dd) вместо syncкоманды (которая сбрасывает все в системе.
psusi

Этот ответ вводит в заблуждение. С dd syncявляется аргументом для обоих convпараметров iflagили oflag.
Дэн Левенхерц

3

По умолчанию dd будет считывать данные по одному блоку за раз, возможно, читая в более коротком блоке, чем указанный пользователем, либо в конце файла, либо из-за поведения исходного устройства; это называется частичной записью . Затем он запишет блок, размер которого равен сумме прочитанного.

Dd будет повторять это до тех пор, пока не будет достигнут указанный счет, или пока он не увидит eof на входе, или ошибку на входе или выходе. Когда он заканчивается, dd сообщает количество полных и частичных записей, которые он прочитал и написал.

Такое поведение подходит для копирования обычного файла в файловой системе или по сетевому соединению TCP, поскольку это считается потоком байтов. Но другим объектам файловой системы, таким как необработанные DVD-диски и магнитная лента, требуются размеры записи, которые находятся в определенных пределах и кратны некоторому количеству (например, 512 или 2048 байт). Например, если у вас есть образ диска, который состоит из 255 дорожек из 63 512-байтовых секторов, и вы хотите записать на ленту, для которой требуется размер блока 1024 байт, вам нужно сделать что-то вроде

dd if=disk.img of=/dev/rmt0 bs=1k conv=sync

чтобы убедиться, что dd не пытается записать 512-байтовый блок в конце. Более короткий блок в конце будет дополнен нулями или пробелами. Заполнение нулями является безопасным, распространенным выбором. Опция для dd для заполнения пробелами полезна в другой ситуации - преобразование файла, содержащего строки переменной длины, в файл со строками фиксированной длины.


0

Я обнаружил, что система linux, а не dd, кэширует буферы. Поэтому, когда команда dd завершена, я запускаю синхронизацию как

sudo dd if=my.downloaded.iso of=/dev/sd(?) bs=1M && sync

Я не использовал внутреннюю опцию dd, чтобы вызвать сброс буфера. Обычно, когда я создаю USB-версию дистрибутива, я единственный на компьютере, поэтому у меня нет сомнений, что моя опубликованная команда причинила вред. Поскольку я запускаю синхронизацию как &&, синхронизация выполняется с правами sudo, и я уверен, что созданный USB-накопитель завершен.


0

Вы можете использовать syncопцию для вывода, которая включена в ddкоманду, по oflagсимволу:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M oflag=sync
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.