Чи реалізує будь-яка файлова система Копіювання механізму запису для CP


16

Ми бачили, як ОС робить оптимізацію копіювання при записі під час розгортання процесу. Причина полягає в тому, що більшість випадків форк обробляється exec, тому ми не хочемо нести витрати на розміщення сторінок і копіювання даних з адресного простору абонента без потреби.

Так це трапляється і при роботі CP на linux з файловими системами ext4 або xfs (журнал). Якщо цього не відбувається, то чому б і ні?


Сподіваюся, хтось відповість на це цікаве запитання
Карім Манауїл

Однак я не думаю, що так, наприклад, копіювання великого файлу зайняло б значно більше часу (копіювання даних у нові блоки). Якщо в таких файлових системах була COW (принаймні, ext3 / ext4), ви б не помітили затримки часу (можливо, у такому випадку лише реплікація inode без покажчиків на блоки даних та позначення деякого прапора COW).
Карім Манауїл

Copy-on-Write реалізований на ZFS, і він має дуже дешеві клони файлової системи / обсягу. Я думаю, що ext4 / xfs мають надто примітивний формат на диску, щоб це підтримати
myaut

Відповіді:


7

Ключове слово для пошуку reflink. Він нещодавно був реалізований у XFS.

EDIT: Реалізація XFS спочатку була позначена ЕКСПЕРИМЕНТАЛЬНО. Це попередження було видалено у версії ядра 4.16, через кілька місяців після того, як я написав вище :-).


11

З cp чоловічої сторінки :

Коли вказано --reflink [= завжди], виконайте легку копію, де блоки даних копіюються лише при зміні. Якщо цього неможливо, копія не вдається, або якщо вказано --reflink = auto, поверніться до стандартної копії.

Це працює у файлових системах, які підтримують Copy-on-Write ( reflink ), головним чином BTRFS на даний момент. Реалізація XFS reflink знаходиться на стадії розробки [1] [2] .


1
Деякі мережеві файлові системи, такі як NFS, CIFS, OCFS2, можуть також передавати ці сервери.
Stéphane Chazelas

2

У Linux є системний виклик, який дозволяє процесам простору користувачів повідомляти ядро ​​робити копію на копії файлів для запису. FICLONERANGE та FICLONE, що використовуються як параметри для ioctl, дозволяють робити копії на копії записів файлів та діапазони у файлах.

Це використовується cp --reflink для створення копій, де файлова система підтримує це.


1

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

Тепер, якщо ви "копіюєте" файли (їх багато), додавши ще один клон / знімок файлової системи в, скажімо, BTRFS, ситуація інша: тепер ви "скопіювали" всі файли у файлову систему та будь-які зміни в вони будуть копіюватися під час запису. Це існує, але не в ext4.

"Journalling" - це абсолютно незалежне від цього поняття, це адміністративні структури для файлів, які враховуються.


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

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