Навіщо вказувати розмір блоку при копіюванні пристроїв обмеженого розміру?


14

В онлайн-підручниках часто пропонується використовувати наступну команду для копіювання CDROM на ізо-зображення:

$ dd if=/dev/dvd of=foobar.iso bs=2048

Чому повинен бути вказаний розмір байта? Я зауважую, що насправді 2048 - це стандартний розмір байтів для зображень CDROM, але здається, що ddбез вказівки bs=чи count=роботи також.

За яких обставин було б проблематично не вказати bs=або count=копіювати з пристрою обмеженого розміру?

Відповіді:


12

Коли DD підходить для копіювання даних? (або, коли read () і write () часткові) вказує на важливий застереження при використанні count: ddможе копіювати часткові блоки, тож коли countце буде припинено після заданої кількості блоків, навіть якщо деякі блоки були неповними. Тому ви можете bs * countскопіювати менше байтів, скопійованих, якщо не вказати iflag=fullblock.

Типовий розмір блоку для dd - 512 байт. countє межа; так як ваше запитання натякає, що воно не потрібно при копіюванні пристрою обмеженого розміру, і воно дійсно призначене для копіювання лише частини пристрою.

Я думаю, що тут слід врахувати два аспекти: продуктивність та відновлення даних.

Що стосується продуктивності, то в ідеалі ви хочете, щоб розмір блоку був принаймні рівним і кратним основного фізичного розміру блоку (отже, 2048 байт при читанні CD-ROM). Насправді нині ви можете також вказати більші розміри блоків, щоб дати можливість базовим системам кешування шафікувати речі для вас. Але збільшити розмір блоку означає, ddщо потрібно використовувати набагато більше пам’яті, і це може бути контрпродуктивно, якщо ви копіюєте через мережу через фрагментацію пакетів.

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


2
Особливості роботи; напишіть зображення розділу на SD-карту, наприклад, використовуючи dd bs=4m iflag=fullblockvs dd bs=1111і помітьте значно більшу швидкість передачі даних, яку вам дасть перша. Це відбувається тому, що перший вирівнюється з натуральними розмірами блоків на SD-картці, а другий вимагає, щоб контролер SD робив багато читання, копіювання та перепрошивки для запису часткових фізичних блоків. До fullblockречі, важливість не слід недооцінювати, оскільки без неї bsє лише максимум, і часткове читання може призвести до стійких подальших невідповідностей.
Джейсон C

6

Навколо є трохи вантажного культу dd. Спочатку було дві помилки, cpщо спричинило проблеми: Це було б неправильне виявлення файлів як рідкісних, коли повідомлялося з розміром блоку, відмінним від 512 (Linux використовував розмір блоку 1024), і він не очищав порожні блоки від місця призначення під час копіювання з розріджений файл на блочному пристрої.

Ви можете знайти деякі посилання на це в архівах раннього списку розсилки Linux .

Тож люди звикли до того, що дд є правильним способом поводження з зображеннями дисків, а cp впав убік. А оскільки dd використовує стандартний розмір блоку 512, це повільно (повільніше, ніж cp у сучасних системах). Але не очевидно, який розмір блоку ви повинні використовувати. Напевно, у вашому випадку хтось прочитав, що 2048 - це "природний" розмір блоку для компакт-диска (це означає, що CD-ROM поділено на 2352 байт-сектори, що містять 2048 байт даних разом із інформацією про виправлення помилок) і вирішив, що це - це "правильний" розмір для використання з dd, коли насправді ви, швидше за все, отримаєте швидші результати, якби використовували (помірно) більший розмір блоку. Насправді GNU cp з цієї причини використовує стандартний розмір блоку 64k.

tl; dr: cp /dev/dvd foobar.iso повинен добре працювати. За замовчуванням розмір блоку dd- 512. Єдиний ефект, який залишає його в спокої, швидше за все, матиме в більшості сучасних обставин - це зробити процес копіювання повільнішим.


це могло змінитись, так чи інакше GNU cp використовує розмір блоку 128k за замовчуванням (не 64k), див. eklitzke.org/efficient-file-copying-on-linux
apurkrt

5

Зміна розміру блоку - це хороший спосіб змінити кількість буферизації або прочитати / записати за один раз.

Насправді не стосується того, чи справжній блоковий пристрій, чи нескінченний / віртуальний. Йдеться про те, скільки ви хочете зберегти в пам’яті, перш ніж ddперейти до її запису. bs=встановлює як ibs=(скільки даних читається за один раз), так і obs=(скільки даних виписується за один раз). Чим вище, тим obs=більше ітерацій ibs=буде потрібно, перш ніж у вас буде достатньо даних, ddщоб почати писати до пункту призначення.

count=також не залежить від нічого, крім того, що ви хочете зробити. Він контролює, скільки «блоків» (як вимірюється ibs=) буде потрібно для того, ddщоб вважати свою роботу виконаною.


Зверніть увагу на те, що Стівенс ddкопіює часткові блоки - це не завжди bs * count.
Драв Слоун

Зауважте, що в деяких системах unix ви повинні прочитати кратне значення нативного блоку; ddбез bs=2048або декілька з них може призвести до помилки при зчитуванні з блокового накопичувача CD-пристроїв.
Вуртель

2

Використовуючи параметр blockize на, ddефективно вказує, скільки даних буде скопійовано в пам'ять з вхідної підсистеми вводу / виводу, перш ніж намагатися записати назад у вихідну підсистему вводу / виводу. Вихід такий самий (як і весь диск копіюється), шматки просто читаються в іншому розмірі, який ви задаєте (більшість ddреалізацій мають розмір блоку за замовчуванням 512 байт).

Якщо у вас є велика кількість запасної пам’яті і збільшується блокчейн, то більше великі шматки даних можна читати послідовно, завантажувати та передавати до вихідного пункту призначення. Менший розмір блоку вимагає більше накладних витрат з точки зору кожного окремого lseek, memset тощо.

Ваш пробіг може варіюватися в залежності від того, де if=і of=встановлено, і яке обладнання ви проходите, якщо у вас є мало пам'яті і так далі.


1

У шс = представляє собою розмір блоку для читання або запису. Залишаючи поле недоторканим або не вказуючи, воно може здатися виконувати таку ж роботу копіювання, але є прихований факт його використання. Наприклад,

  • Маючи 1000000000000000 файлів з кожним лише 1 ~ 10 кб.
  • Маючи один файл на 10 гб

У першому випадку було встановлено, що використання нижчого розміру блоку збільшує швидкість копіювання. В той час як в останньому, вищий розмір блоку був кращим варіантом, оскільки збільшує розмір сектора, залишаючи меншу кількість sector changeкоманд, що, як правило, призводить до швидших операцій вводу / виводу.

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