Що станеться, якщо файл буде змінено під час його копіювання?


19

Який ефект від копіювання файлу скажіть fileA.big (900mb) з місця B у locationC. Якщо під час цієї операції cp, скажімо, 35% через процес, файлA.big додається з новою інформацією і зростає з 900mb до 930mb.

Який результат кінцевої копії (тобто fileA.big у locationC)?

Що робити, якщо копія становить приблизно 70%, а вихідний файл оновлюється, але цього разу обрізається до 400 Мб (тобто хід копії виходить за межі точки укорочення), що є результатом кінцевої копії?

Посилання на ОС Linux у файловій системі ext3 / ext4. Без магічної тіні магії тощо. Просто звичайний старий cp. Цікавість викликала копіювання живих файлів couchdb для резервного копіювання, але більше цікавить загальні сценарії, а не конкретні випадки використання.


Дякуємо, що запитали цього. Мої «знання» здебільшого були здогадом ... до цих пір.
thepang

Відповіді:


10

Якщо fileA.bigпід час копіювання вирощується, копія буде містити дані, які були додані.

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


27

У Патріка це більш-менш правильно, але ось чому. Спосіб копіювання файлу під UNIX працює так:

  1. Спробуйте прочитати кілька (більше) байт з fileA.
  2. Якщо нам не вдалося отримати байти, тому що ми знаходимося (або минулі) в кінці файлу, ми закінчили; кинути.
  3. В іншому випадку запишіть байти до fileBта поверніть цикл назад до кроку 1.

Знаючи це і знаючи, що це так просто, дозволяє нам побачити деякі кутові випадки.

Як тільки ми знайдемо кінець файлу, копія робиться. Скажімо, наш файл зростає під час копіювання, але зростає повільніше, ніж ми його копіюємо. Програма копіювання продовжуватиме перевищувати оригінальний розмір файлу, оскільки до того моменту, як він потрапить, до файлу є більше. Але в якийсь момент він наздоганяє кінець файлу, і він знає, що в кінці, тому що не може прочитати більше байтів зараз . Тож він закривається прямо там, навіть якщо файл збирається рости далі.

Якщо файл врізаний, програма копіювання говорить "Ого, я минув кінець файлу!" і кидає.

І якщо фрагменти файлу оновлюються випадковим чином, скажімо, програмою бази даних :-), то ваша копія буде деяким поєднанням старих і нових даних, оскільки дані не всі копіюються одночасно. Результатом, ймовірно, стане пошкоджена копія, тому загалом не годиться робити копії живих баз даних.

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


Гарне пояснення. До речі, це мене завжди дивувало, чому це можливо в ОС, схожих на UNIX, без отримання типового повідомлення про помилку, відомого з Windows ("Не вдається отримати доступ до файлу - файл використовується"). Ви навіть не могли відтворити MP3-файл, який вже був видалений під час гри. У Unix ви можете (на диво) - без проблем. Я думаю, що ОС на основі UNIX завжди працюють із резервними копіями файлів, тому це можливо.
синтаксис-помилка

1
Насправді, можливість читати видалений файл походить з іншої функції UNIX: під UNIX файли та назви файлів - це різні речі. Коли ви видаляєте файл, ви дійсно робите видалення названого "посилання" на файл. Коли програма відкриває файл, він також вважається посиланням. Система видалить сам файл лише тоді, коли у нього не залишиться посилань.
Джендер

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