Чому параметр синхронізації використовується з командою `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аргумент.
Байт-командир

Не дозволяйте їм насміхатися! ;-) Гарна відповідь: ви помітили проблему, яку я навіть не бачив. > :-) +1
Fabby

1
Крім того, з опису conv=syncпараметра видно цілком зрозуміло, чому він для цього не використовується. У кращому випадку це нічого не зробить, в гіршому випадку зіпсує зображення під час копіювання.
kasperd

5
Дійсно, інструкція повинна вимагати опції dd oflag=fsync(яка вимикає дані, записані DD), а не syncкоманди (яка промиває все в системі.
psusi

Ця відповідь вводить в оману. З dd, syncє аргументом convі варіантів, iflagі oflagваріантів.
Dan Loewenherz

3

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

Dd буде повторювати це, поки не буде досягнуто заданого підрахунку, або він не побачить eof на вході або помилку на вході чи виході. Коли він закінчується, АД повідомляє про кількість прочитаних та записаних повних та часткових записів.

Така поведінка чудово підходить для копіювання звичайного файлу у файлову систему або через мережеве з'єднання 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.