まず、いくつかの神話を払拭しましょう。
アトミックであるため、矛盾が発生することはありません
同じファイルシステム(つまり、rename
)システムコール内でファイルを移動することは、ソフトウェア環境に関してアトミックです。アトミック性とは、ファイルを検索するプロセスが古い場所または新しい場所のいずれかでファイルを表示することを意味します。ファイルのリンクカウントが異なること、ファイルが宛先ディレクトリに存在した後にソースディレクトリに存在すること、またはソースに存在せずにファイルがターゲットディレクトリに存在しないことをプロセスで確認できないディレクトリ。
ただし、バグ、ディスクエラー、または電力損失のためにシステムがクラッシュした場合、ファイルシステムが一貫した状態のままであるという保証はありません。Linuxは一般に、ハードウェアイベントに関する原子性の保証を提供しません。
最初に新しいディレクトリのディレクトリエントリをコピーしてから、前のディレクトリのエントリを消去するため、ファイルが2回参照されるという矛盾が生じる可能性がありますが、参照カウントは1です。
これは、特定の実装手法を指します。他にもあります。
Linux上のext2(カーネル3.16以降)がこの特定の手法を使用することはたまたまあります。ただし、これは、2つの操作(新しいエントリの追加、古いエントリの削除)がハードウェアレベルでもアトミックではないため、ディスクコンテンツが[古い場所]→[両方の場所]→[新しい場所]のシーケンスを経ることを意味しません:そのうちの1つが中断され、ファイルシステムが不整合な状態のままになる可能性があります。(願わくばfsckが修復します。)さらに、ブロック層は書き込みを並べ替えることができるため、前半はクラッシュの直前にディスクにコミットされ、後半は実行されませんでした。
システムがクラッシュしない限り(上記を参照)、参照カウントが1と異なることはありませんが、その保証はシステムクラッシュにまでは及びません。
最初にポインターを消去してからポインターをコピーするため、ファイルの参照が0であるという矛盾が生じます。
繰り返しますが、これは特定の実装手法を指します。システムがクラッシュしない場合、ダングリングファイルは観察できませんが、少なくともいくつかの構成では、システムクラッシュの結果である可能性があります。
Alexander Larssonのブログ投稿によると、ext2はシステムクラッシュ時の一貫性を保証しませんが、ext3はdata=ordered
モードで行います。(このブログの投稿は、rename
それ自体ではなく、ファイルへの書き込みとそのファイルの呼び出しの組み合わせに関することに注意してくださいrename
。)
ext2、ext3、ext4ファイルシステムの主要な著者であるTheodore Ts'oは、同じ問題に関するブログ投稿を書いています。このブログ投稿では、原子性(ソフトウェア環境のみ)と耐久性(クラッシュに関する原子性とコミットメントの保証、つまり操作が実行されたことの確認)について説明しています。残念ながら、クラッシュに関する原子性に関する情報は見つかりません。ただし、ext4に与えられる耐久性の保証は、それrename
がアトミックであることを要求します。ext4のカーネルのドキュメントには、ext4と同様に、auto_da_alloc
オプション(最新のカーネルのデフォルト)を使用したext4 write
が、次のrename
、これrename
はハードウェアのクラッシュに関してアトミックであることを意味します。
Btrfsのために、既存のファイルを上書きすることがクラッシュに関してアトミックであることが保証されますが、ファイルを上書きしないことは、どちらのファイルまたは既存のファイルの両方をもたらす可能性があります。rename
rename
要約すると、質問に対する答えは、ext2のクラッシュに関してアトミックではなくファイルを移動するだけでなく、ファイルを一貫した状態のままにすることさえ保証されていfsck
ないということです(修復できない障害はまれです)—ほとんど何もありません。それが、より良いファイルシステムが発明された理由です。Ext3、ext4、およびbtrfsは限定的な保証を提供します。
rename
がアトミックであることを保証すると思いますが、btrfsはWikiに従っていません(私の答えを参照)。ジャーナルなしで原子性を保証することも可能です(Linuxの例は知りませんが、いくつかあります)。ext2に関する信頼できる情報はありますか?