Рік тому відбулась історична суперечка між Linus'ом Torvalds'ом та іншими розробниками ядра (Ingo Molnar та Ted Ts'o) з приводу нової файлової системи ext4. Суперечка стосувалась системному виклику sync.
Суть у тому, що сучасні файлові системи не пишуть одразу дані на фізичний носій, а застосовують буферизацію. Це значно збільшує швидкодію (і строк служби flash-носіїв). Але, як завжди буває, така техніка має зворотній бік медалі: надійність.
Програма записує дані в файл, після чого виникає аварійна відсічка живлення: дані втрачено. Якщо звернутись до першоджерела (
суперечки), ext3 виконує синхронізацію з диском раз на 5 секунд, в той час як ext4 виконує цю операцію раз на 2 хвилини. Звісно, що втрата даних на ext4 більш ймовірна, але ext4 менше завантажує систему дисковими операціями (маю наголосити, що ця різниця не єдина; більш того - зовсім мізерна в порівнянні з додатковим функціоналом ext4).
Наразі я зіткнувся з цією проблемою. Є файлова система ext2. Є сервер який на ній працює. Є зовнішня утиліта-конфігуратор, яка спілкується з програмою-сервером і перезаписує файли конфігурації. Частина системи "підхоплює" нові налаштування одразу, а частина - лише після перезапуску системи. Перезапускають систему банально - відсічкою живлення. В результаті частина даних не встигає записатись на диск. Як і писав Linus Torvalds, ця задача лягає на плечі програмістів (flush + sync) або користувачів (параметри монтування розділу). Як зараз пам'ятаю обговорення цього питання з Борисом aka
stg34 коли ми їхали минулого року через міст на правий берег.
flush - скидає дані буферів із userspace до kernelspace.
sync - скидає дані буферів із kernelspace до носія.
Правда, не треба забувати що у сучасних носіїв є свій внутрішній буфер. Залишається сподіватись на ємність конденсаторів системи живлення носіїв даних :)
Upd.Забув зазначити що ситуація описана для Compact Flash, тому транзакційні файлові системи не підходять.