Чому DD іноді не чекає, поки дані не будуть записані?


20

Іноді, коли я записую зображення на флешку, це відбувається:

$ sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s

В основному, Linux кешує все, нічого не пише і ddвиходить. Після введення syncвін починає записувати дані (світлодіод флешки починає блимати).

Чому це відбувається?


3
Ви впевнені /dev/sdc, що це фактичний пристрій у вашій системі, і ви не пишете у файл /dev/sdc? Робіть ls --color /dev- /dev/sdcмає бути жовтим, якщо це пристрій.
LawrenceC

Відповіді:


21

Використовуйте це замість:

sudo dd if=install57.fs of=/dev/sdc conv=fsync

Це викликає fsync()після кожного write()системного дзвінка. Це змушує ddнічого не кешувати. Перегляньте цю частину сторінки сторінки fsync ( man 2 fsync):

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache 
pages for) the file referred to by the file descriptor fd to the disk device (or other 
permanent storage device) where that file resides. The call blocks until the device reports 
that the transfer has completed. It also flushes metadata information associated with the 
file (see stat(2)).

Це поведінка ядер за замовчуванням. Ядра Linux керують кешами запису та читання таким чином: Коли write()видається syscall, дані швидко записуються в кеш, і процес завершеного записом надсилається в процес. Коли буфер потрібен або коли на шині є вільний час, дані записуються з кеша на жорсткий диск.


1
Мені подобається, що ваша відповідь і мої стосуються майже зовсім інших підходів. Приємно, +1.
ChrisInEdmonton

1
@ChrisInEdmonton dito +1
хаос

у цьому питанні всі відповіді хороші.
Франсіско Тапія

@chaos Просто для уточнення: Це поведінка ядер за замовчуванням. - Ви маєте на увазі, що conv=fsyncце за замовчуванням під час запису на блокування пристроїв, які ddнічого не кешують? Шукаєте хорошої відповіді на це: unix.stackexchange.com/questions/312687/…
Джонатан Комар

10

Це відбувається тому, що Linux та більшість інших операційних систем кешують і читання, і запис. У більшості випадків це робить вашу операційну систему більш чутливою.

Якщо ви хочете, щоб кешовані дані були записані, ви хочете використовувати їх sync, як відомо. Linux пропонує значну кількість налаштувань, які ви також можете налаштувати. Ця стаття дає хороший огляд деяких параметрів. Ви можете встановити vm.dirty_background_bytes на 0, наприклад, щоб гарантувати, що ядро ​​негайно починає виконувати потоки потоку.


7

синхронізація (8) - Сторінка користувача Linux :

Ядро зберігає дані в пам'яті, щоб уникнути (відносно повільного) зчитування та запису диска. Це покращує продуктивність, але якщо комп'ютер виходить з ладу, дані можуть бути втрачені або в результаті пошкоджена файлова система. синхронізація гарантує, що все в пам'яті записується на диск.

Примітка: unmount(або виймання) автоматично викликає, syncщо "приховує" це при звичайному використанні файлової системи.

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