VIM を使用して保存されたファイルは短時間で失われます。

VIM を使用して保存されたファイルは短時間で失われます。

VIM、Linux VFSキャッシュ、ecryptfs、および/またはファイルシステムに関連しているために発生すると思われる奇妙な問題が発生しました。

  1. VIMでファイルを開き、変更して保存します。
  2. ファイルにアクセスしようとしています。

予想される動作

:wレポートファイルが作成されたら、ファイルにアクセスできる必要があります。

実際の行動

ファイルが存在しません。

しばらく(通常1秒未満)待つと、ファイルが表示されます。

これは、Pythonコードとレガシーpycファイルを扱うときに特に問題になります。新しいpyファイルがまだ準備されていないため、古いコードを実行することがよくあります。最近export PYTHONDONTWRITEBYTECODE=1コードを追加した.bashrcため、古いコードを実行するのではなく意味のあるエラーメッセージが表示されます。私が変更したファイルは短時間で失われるため、自動リロードコード(Djangoのコードなど)が5〜10回ごとに再ロードされないため、まだ厄介です。ファイルがpyc適切な場所にあると、自動リローダーは時々古いファイルをロードしますが、ファイルが変更されたことを確認pycできず、別の再ロードをトリガーします。py

システムの詳細と構成

私のコンピュータには十分なRAM(32GiB)とSSDがあり、ほとんどアイドル状態です。したがって、遅いI / Oがこの問題の原因であるとは思わない。ファイルは非常に小さく(1KiB未満)、空のファイルでもこの​​現象が発生します。暗号化にecryptfsを使用しているので、$HOMEこれが問題の一部である可能性があります。ファイルシステムを/tmp使用してインストールすると、この問題は再現できません。tmpfs

VIM設定

ファイルが移動され、新しいファイルに置き換えられたのは、VIM設定によるものです。

set backup
set backupskip=
set backupdir=$HOME/.vimbackup
set writebackup

newVIMは、ファイルが作成されたことを報告したらすぐにファイルにアクセスできるようにしたいです。私は遅延書き込みのヒントがあるかどうかVIM文書を確認しましたが、何も見つかりませんでした。シェルコマンドを使用してそれを再現することはできないため、VIMmvは他の操作を実行しているようcpですrm


また何がこの問題を引き起こす可能性がありますか?この問題をどのように解決できますか?

答え1

これはバグですが、Aaronがリンクしたバグとは何の関係もありません。現時点では再現できないので、ここに新しいバグを提出することができます。https://bugs.launchpad.net/ecryptfs/+filebug

上記の説明をコピーして貼り付けることができますが、使用しているLinuxディストリビューションとカーネルバージョンについても詳しく知っておく必要があります。ありがとうございます!

答え2

これはecryptfsのバグ/設計の欠陥である可能性があります。これを見てランチパッドエラー報告

つまり、ecryptfs はファイルをディスクにすぐに書き込むことはありません。私はこれが暗号化オーバーヘッドのためだと推測します(ファイルシステムはおそらくバックグラウンドスレッドのデータを暗号化し、完了したときにのみ書き込みます)。

このバグは2009年に発生し、優先順位は「ウィッシュリスト」(「低」より低い)です。どうすればいいのか少し心配です。企業そして、私が見つけたように、振る舞いが混在しており、多くのコードはファイルを保存してすぐに利用できると期待しています。

試してみてください真の秘密代わりに。

答え3

私の考えでは、あなたが見ている動作はVimのバックアッププロセスが遅いからだと思います。私のデフォルトのExt4システムでは、この問題はコンパイラの「ファイルが空です」エラーとして表示されます。

時間を確認するために、次のBashシーケンスを使用しました。

strace -tt -o /dev/stdout gvim --nofork main.cxx | grep 'main.cxx\|close'

バックアップを開いた後、ファイルが消えるのと最後の保存の間に200ミリ秒の間隔があることがわかりました。

09:06:49.587341 rename("main.cxx", "main.cxx~") = 0
09:06:49.668654 open("main.cxx", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 12
09:06:49.755454 close(12)               = 0

set nowritebackup私でこれを使用すると、.vimrcファイル名が変更されずに開いて閉じるだけです。

09:19:45.731416 open("main.cxx", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 12
09:19:45.815763 close(12)               = 0

これがあなたが経験している問題の良い説明ですか?


PS:オンラインでこの問題に対する他の言及が見つかりません。Vim 課題トラッカー、またはVimから開発者/ユーザーメーリングリストにないため、Vimチームがバックアップシステムの呼び出し順序の変更を検討するかどうかは不明です。

関連情報