Чому синхронізація настільки важлива при створенні завантажувального Linux Linux USB?


15

Від Arch Linux Wiki: https://wiki.archlinux.org/index.php/USB_flash_installation_media

# dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync

[...] Do НЕ промах синхронізація завершити до потягнувши диска USB.

Я хотів би знати

  • Що це робить?
  • Які наслідки можуть бути, якщо їх залишити?

Примітки

ddкоманда, що використовується з додатковою status=progress:

tar -xzOf archlinux-2016-09-03-dual.iso | dd of=/dev/disk2 bs=4M status=progress && sync

Або використовувати pvдля прогресу

tar -xzOf archlinux-2016-09-03-dual.iso | pv | dd of=/dev/disk2 bs=4M && sync

Відповіді:


19

ddНе оминає дискові кешу ядра при записі на пристрій, так що деяка частина даних можуть не бути ще написана на USBпалицю після ddзавершення. Якщо ви відключите USBпалицю в той момент, вміст на USBпалиці буде невідповідним. Таким чином, ваша система навіть не може завантажитися з цієї USBпалиці.

Sync передає на пристрій будь-які дані, що зберігаються в кеші.

Замість виклику syncви можете скористатися fdatasync ddпараметром конверсії:

fdatasync

фізично записувати дані вихідних файлів перед закінченням

У вашому випадку командою було б:

tar -xzOf archlinux-2016-09-03-dual.iso | \
dd of=/dev/disk2 bs=4M status=progress conv=fdatasync

В conv=fdatasyncмарці ddефективно називають fdatasync()системний виклик в кінці передачі безпосередньо перед ddвиходами (я перевірив це з ddджерелами «s).

Це підтверджує, що ddкеш-пам'ять не обминає і не промиває, якщо це не буде чітко прописано.


Дякую за ваш внесок, проте я не впевнений, що це твердження правильне . ddНе обходить кеш диска ядра під час запису на пристрій . Під час запису до файлу (над рівнем файлової системи ядра) кешуються речі. Однак я стурбований записом на пристрої. Будь ласка, вкажіть джерело для цього твердження, якщо можете, тому що це є основою цього питання. Якщо це правда, це дасть поважну причину для запуску syncпісля роботи на dd-пристрої .
Джонатан Комар

Так, він кешований. Кешування відбувається всередині блокової інфраструктури пристрою ядра. Самі файлові операції не кешовані. інтерфейс базового блоку пристроїв робить готівку. джерело: lxr.free-electrons.com/source/block/blk-flush.c
Серж

@ macmadness86 дивіться оновлену відповідь
Серж,

7
Я надаю перевагу використанню oflag=sync, тому прогрес видає реальну швидкість передачі, а не кешовану (таким чином, стабільні 10 МБ / с замість однієї секунди 100 МБ / с, а потім 10 секунд затримки).
Барт Полот

Запис на блоковий пристрій взагалі обходить VFS. Іншими словами: запис у файл може кешуватися ядром (а це зазвичай є), але запис на пристрій ніколи не кешується ядром (і він не може).
Ерік

0

На сторінці керівництва по синхронізації (1): "sync - Синхронізувати кешоване записування до постійного сховища". По суті, syncгарантує, що всі ваші дані записуються на паличку з кеша.


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