qcow2では、いつディスク同期が必要ですか?

qcow2では、いつディスク同期が必要ですか?

ディスクがある仮想マシンでApacheを実行していますqcow2。 Apache は以下を実行する (コンパイルされた C++) プログラムを実行します。

  1. systemファイルを実行する別の(C ++)プログラムを呼び出します。

  2. その後、ファイルを読み取って処理しようとします。

ステップ(2)を試してみましたifstream::open。仮想マシンでプログラムを実行すると失敗し(ifstream::good戻りfalseerrno、ファイルが存在しないというメッセージが表示されます。ただし、シェルを開いてファイルを見つけると、ファイルが存在します。

プログラムは起動しなくてもqcow2(3つの異なるRedHatとUbuntuシステムで)うまく動作しますが、それが何か関連しているようです。この問題は2つの方法で解決できます。

  1. (1) と (2) の間に別のステップを追加し、呼び出しsystem("ls /foo/bar/myfile")コマンドがls失敗した場合、2 が返されます。 100回呼び出してもまだ失敗します。しかし、今(2)段階は成功します。
  2. system("sync")代わりに実行すると、system("ls")ステップ(2)が成功します。

何が起こったのか知っていますか?qcow2異常な洗浄要件がありますか?

編集 - いくつかのシステム情報を追加しました。

  • RHEL 8.5、最新
  • カーネル 4.18.0-348.12.2.el8_5.x86_64
  • pc-q35-rhel8.2.0 シミュレーション
  • 4GiB RAM、2vCPU(Skylake-Client-IBRS)を搭載したVM
  • ディスク:10 GB、35%使用、virtio、デフォルトキャッシュ、Ubuntu 20.04イメージ

私は長年にわたってWin 7およびLinuxイメージを使用してこの設定を実行してきましたが、以前は問題ありませんでした。

$ virsh version
Compiled against library: libvirt 6.0.0
Using library: libvirt 6.0.0
Using API: QEMU 6.0.0
Running hypervisor: QEMU 4.2.0

ベストアンサー1

同様の問題がありますアプリケーションイメージを含める、(Goで作成)ベアメタルにあります。この問題は、ファイルを生成したプログラムを呼び出すことでf.Sync()解決されました。

私はこれがqemuに限定されているとは思わない。私の作業理論は、ファイルがリポジトリに同期されていない場合、そのファイルを作成したプロセスにのみ表示されることです。その人が帰ってきたら、おそらく両親だろう。他の親プロセスのプロセスは、ファイルが同期されるまで待つ必要があります。

これに関する明確なリソースはなく、上記のデバッグ中に見つけたものです。

おすすめ記事