Чи є mv атомний на моєму фс?


13

Як я можу перевірити, чи mvє атомним на моєму fs (ext4)?

ОС - Red Hat Enterprise Linux Server 6.8.

Загалом, як я можу це перевірити? Я оглянувся і не знайшов, чи моя ОС стандартна POSIX.


Ви пробували strace?
Wildcard

Відповіді:


9

Досить цікаво, здається, відповідь може бути: "Це залежить".

Щоб було зрозуміло, mvвказано до

mvУтиліта виконує дії , еквівалентні rename() функції

У специфікації функції перейменування зазначено:

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

Але остання специфікація ISO C для rename()держав:

7.21.4.2 renameФункція

Конспект

#include <stdio.h>
int rename(const char *old, const char *new);

Опис

renameФункція викликає файл, ім'я якого є рядок , на яку вказує oldбуде відтепер відомий під ім'ям , заданим в рядку , що адресується new. Названий файл oldбільше не доступний цим іменем. Якщо файл, названий рядком, на який вказує, newіснує до виклику renameфункції, поведінка визначається реалізацією.

Повертається

В renameФункції повертає нуль , якщо операція пройшла успішно, відмінно від нуля , якщо це не вдається, і в цьому випадку , якщо файл раніше існував він по - , як і раніше відомий під своїм оригінальним назвою.

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

Дивіться також Чи перейменований () атомний?

На сторінці чоловіка Linux :

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

Сторінка "Людина Linux" стверджує, що заміна файла буде атомною.

Тестування та перевірка того, що атомність може бути дуже важким, хоча, якщо саме так, потрібно пройти. Вам не ясно, що ви маєте на увазі під час використання "Як я можу перевірити, чи є mv атомним". Ви хочете, щоб вимоги / специфікація / документація була атомною, чи вам потрібно її фактично перевірити ?

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


Я маю забезпечити атомний рух. чи варто тестуванню прийняти це? Я не можу сказати. Так, я працюю над тим самим fs (ext4 to ext4).
Tizianoreica

1
POSIX також не гарантує атомність, але Linux, як і більшість варіантів Unix, робить це для "рідних" файлових систем, таких як ext4.
Жил "ТАК - перестань бути злим"

1
Зважаючи на те, що ISO C визначає лише поведінку однієї програми, а не цілої системи, було б дивно говорити про renameатомність.
Жил "ТАК - перестань бути злим"

3
Я читаю "та специфікація" як посилання на попереднє речення ("Її включення сюди ... вказує поведінку, коли новий параметр називає файл, який вже існує"), в якому йдеться про більш ранні частини документа POSIX ("посилання з назвою нове повинно бути залишаються видимими для інших потоків впродовж ... і посилаються на файл, на який посилається новий чи старий ... "). Іншими словами, POSIX обіцяє впровадити стандарт ISO C та надає додаткові гарантії, що перевищують стандарт ISO. Чи допомагає це тлумачення?
SimonJ

1
@Tizianoreica Я знаю, що це давня публікація, але я щойно побачив ваш коментар і подумав, що я повинен уточнити: Фактична файлова система повинна бути однаковою, щоб перейменування було атомним. Не тільки одного типу файлової системи. наприклад, якщо у вас є /ext4 fs і /tmpяк різні ext4 fs, ви не можете атомно mv від одного до іншого.
Водін

0

mvзаснований на renameсистемному виклику і rename()є атомним. Ви можете подивитися на сторінці rename(2).

Ви можете знайти відповідь на те, чи перейменований () атомний? на stackoverflow.

Який тип fs ви використовували?


fs є ext4 - os вже вказано.
Tizianoreica

-1

Окрім перевірки системних викликів та їх атомності, можливо, inotify-toolsможе послужити і тестом, хоча я не впевнений, чи є це гарантованим доказом атомності.

Відкрийте 2 снаряди. Перегляньте цільовий каталог переміщення в одному з них:

inotifywait -m target/

Перемістіть файл до каталогу в іншому:

mv foobar target/

inotifywaitПовинен показувати тільки один рядок:

target/ MOVED_TO foobar

Це здається атомним порівняно з відповіддю на ls target/та touch target/a, які виробляють багаторядкові повідомлення типу:

# the response to ls target/
target/ OPEN,ISDIR 
target/ ACCESS,ISDIR 
target/ CLOSE_NOWRITE,CLOSE,ISDIR 

PS

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

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