Во-первых, давайте развеем некоторые мифы.
это атомно, поэтому несоответствия не могут произойти
Перемещение файла внутри одной и той же файловой системы (т. Е. rename
Системного вызова) является атомарным по отношению к программной среде. Атомарность означает, что любой процесс, который ищет файл, увидит его в старом или новом месте; ни один процесс не сможет заметить, что файл имеет другое количество ссылок, или что файл присутствует в исходном каталоге после того, как он присутствует в целевом каталоге, или что файл отсутствует в целевом каталоге после того, как он отсутствует в источнике каталог.
Однако, если система выходит из строя из-за ошибки, ошибки диска или потери питания, нет никакой гарантии, что файловая система останется в согласованном состоянии, не говоря уже о том, что перемещение не осталось наполовину выполненным. В целом, 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 a, rename
который перезаписывает существующий файл , гарантированно является атомарным по отношению к сбоям, но a rename
, который не перезаписывает файл, может привести к тому, что ни один файл, ни оба файла не существуют.
Таким образом, ответ на ваш вопрос заключается в том, что не только перемещается файл, не являющийся атомарным в отношении сбоев на ext2, но даже не гарантируется, что файл останется в согласованном состоянии (хотя сбои, которые fsck
не могут быть исправлены, редки) - почти ничего не происходит, поэтому были изобретены лучшие файловые системы. Ext3, ext4 и btrfs предоставляют ограниченные гарантии.
rename
атомарность, но btrfs не соответствует вики (см. Мой ответ). Также возможно гарантировать атомарность без журнала (я не знаю примеров по Linux, но они могут быть). У вас есть достоверная информация о ext2?