1

私が (usr1 として) 所有している構成ファイルと、元の構成ファイルからコピーするために OS デーモンで (5 分ごとに) 作成した一時ファイルとの間にハード リンクが突然作成されたことに驚きました。

元のファイルにコピーした後、 rename(*file2, *file1); を使用します。config.txt.tmp へのトレースを強制終了する C で

ディレクトリは mnt /sram ドライブ上で所有されているルートであり、組み込みマシンに対するルート アクセス権を持つ人はいません。ストレージ メディアは、組み込み Linux 2.6.10 の NAND フラッシュ SRAM です。

ls -lショー

2 config.txt       699byte date_modify  
2 config.txt.tmp   699byte date_modify

config.txt.tmp が作成され、config.txt からコピーされ、構成パラメータが config.txt に送信され、5 ~ 7 行の C 行のみでアトミックに削除されます。

ディレクトリはルート所有であり、ハード リンクを作成する方法はありません。

低レベル関数での「ハードリンク」作成の説明はありますか? 競合状態に直面している可能性はありますか? それとも、フラッシュを介したストレージ用のカーネル コードでしょうか? それともLinuxのバグ?

私のコードは 5 年以上、100 台のマシンで実行されましたが、最近この問題が発生したのは 1 台のマシンだけでした。

4

1 に答える 1

1

次のようにして、ファイルが実際にハードリンクであるかどうかを確認します

ls -i

inode を表示します。

私の頭のてっぺんの:

  • 移動前にファイル バッファが汚れていた可能性がありますか?
  • フォークが関係している場合も、フォークの前からダーティ バッファが動作している可能性があります。
  • フラッシュ「オーバーレイ」ファイルシステム ドライバは存在しますか?
    おそらく変更され、以前は考え られなかった最適化が含まれてい ます
    • ユニオンズ
    • aufs
    • ...?

編集

FWIW: あなたのテキストから、あなたは逆のことをしているかもしれないという印象を受けます: .tmp コピーに書き込み、すべてがフラッシュされて同期されたら、「原子的に」(まあ、ファイルシステムのサポートについては指を交差させてください)および順序付けモード) 適切な名前に変更します。(ほとんどの写真はぼやけていて実際に続けることができないため、今は推測しています)

参照: fsync() なしの rename() は安全ですか?

于 2012-07-18T00:18:42.260 に答える