Спочатку давайте розвіємо кілька міфів.
це атомно, тому невідповідності не може відбутися
Переміщення файлу всередині однієї і тієї ж файлової системи (тобто rename
) системного виклику є атомним щодо програмного середовища. Atomicity означає, що будь-який процес, який шукає файл, буде бачити його в старому місці або в новому місці; жоден процес не зможе помітити, що файл має іншу кількість посилань або що файл присутній у вихідному каталозі після того, як він присутній у каталозі призначення, або що файл відсутній у цільовому каталозі після відсутності у джерелі каталог.
Однак якщо система виходить з ладу через помилку, помилку диска або втрату електроенергії, немає гарантії, що файлова система залишиться в послідовному стані, не кажучи вже про те, що переміщення не залишилося напівзробленим. Linux взагалі не пропонує гарантії атомності щодо апаратних подій.
спочатку ви копіюєте запис dir у новий dir, а потім стираєте запис попереднього dir, тож у вас може виникнути невідповідність того, що файл буде посилатися двічі, але кількість посилань становить 1
Це стосується конкретної техніки реалізації. Є й інші.
Так трапляється, що ext2 в Linux (на ядро 3.16) використовує саме цю техніку. Однак це не означає, що вміст диска проходить через послідовність [старе розташування] → [обидва місця] → [нове місце розташування], оскільки дві операції (додавання нового запису, видалення старого запису) не є атомними на апаратному рівні : можливо, один з них може бути перерваний, залишаючи файлову систему в непослідовному стані. (Сподіваємось, fsck виправить його.) Крім того, блок-блок може змінити порядок написання, тому перша половина може бути передана на диск безпосередньо перед збоєм, а друга половина тоді не була б виконана.
Коефіцієнт відліку посилань ніколи не буде відрізнятися від 1 до тих пір, поки система не вийде з ладу (див. Вище), але ця гарантія не поширюється на збої в системі.
він спочатку стирає вказівник, а потім скопіює покажчик, щоб невідповідність полягала в тому, що файл має посилання 0
Ще раз це стосується конкретної методики реалізації. Висячий файл не може спостерігатися, якщо система не виходить з ладу, але це можливий наслідок збою системи, принаймні в деяких конфігураціях.
Відповідно до публікації в блозі Олександра Ларссона , ext2 не дає гарантії послідовності системної аварії, але ext3 працює в data=ordered
режимі. (Зауважте, що це повідомлення в блозі не про rename
себе, а про поєднання написання у файл та виклику rename
цього файлу.)
Теодор Цьо, головний автор файлових систем ext2, ext3 та ext4, написав допис у блозі з цього ж питання . У цьому дописі в блозі йдеться про атомність (лише щодо програмного середовища) та довговічність (що є атомністю щодо аварій, плюс гарантія прихильності, тобто знання, що операція виконана). На жаль, я не можу знайти інформацію про атомність щодо аварій. Однак гарантії довговічності, надані для ext4, вимагають, щоб rename
це було атомним. Документації ядра для ext4 станів, ext4 з auto_da_alloc
опцією (яка за замовчуванням в сучасних ядрах), а також ext4, забезпечує гарантію міцності для write
подальшого аrename
, з чого випливає, що rename
це атомно по відношенню до апаратних збоїв.
Для Btrfs, що перезаписує існуючий файл гарантовано атомарні щодо аварій, але , що не перезаписати файл може привести ні файлу або обох файлів існуючих.rename
rename
Підсумовуючи, відповідь на ваше запитання полягає в тому, що не тільки переміщення файлу не є атомарним щодо збоїв на ext2, але навіть не гарантовано залишити файл у постійному стані (хоча збої, які fsck
неможливо відновити, є рідкісними) - майже нічого немає, саме тому було винайдено кращі файлові системи. Ext3, ext4 і btrfs надають обмежені гарантії.
rename
це атомно, але btrfs не відповідає вікі (див. Мою відповідь). Також можна гарантувати атомність без журналу (я не знаю прикладів в Linux, але їх може бути). У вас є достовірна інформація про ext2?