次の設定があるとします。
2 つの KVM VM ( VM1とVM2 )、仮想ブリッジvirbr、および 2 つのブリッジ タップvTAP1とvTAP2を実行するホスト。VM はそれぞれ vTAPS に接続されます。
ブリッジ上のさまざまな負荷メトリックを測定するアプリケーションをホスト上で実行しています。これを実現するには、測定のためにブリッジを介して vTAP 間でパケットをストリーミングするために、vTAPS を取得する必要があります。問題
は
、ioctl TUNSETIFF syscall がEBUSY errnoで失敗するため、vTAPS を取得できないことです。アプリケーション(ホスト上で実行される)がタップ(VMが所有する)の所有者ではない
ために発生すると思います。VM vTAPS 間のフローを直接測定したい場合があるため、測定用に新しい一時ブリッジ vTAPS を追加することが常に解決策になるとは限りません。試みられた解決策:あります
マルチキュー tuntap インターフェイス:
Linux は、複数のファイル記述子 (キュー) を使用してパケットの送受信を並列化できるマルチキュー tuntap をサポートしています。デバイスの割り当ては以前と同じで、ユーザーが複数のキューを作成したい場合は、同じデバイス名の TUNSETIFF を IFF_MULTI_QUEUE フラグで何度も呼び出す必要があります。
IFF_MULTI_QUEUEを使用すると、ioctlがEBUSY errno で失敗することはなくなりましたが、vTAP への書き込みシステムコールでEINVAL errno で失敗し始めました。それで根本的な解決にはなりませんでした。
助けていただければ幸いです、ありがとう。