VIM、Linux VFSキャッシュ、ecryptfs、および/またはファイルシステムに関連しているために発生すると思われる奇妙な問題が発生しました。
- VIMでファイルを開き、変更して保存します。
- ファイルにアクセスしようとしています。
予想される動作
: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
new
VIMは、ファイルが作成されたことを報告したらすぐにファイルにアクセスできるようにしたいです。私は遅延書き込みのヒントがあるかどうか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チームがバックアップシステムの呼び出し順序の変更を検討するかどうかは不明です。