Virtio
- 仮想環境におけるI/Oフレームワーク
- virtio_netはvirtio上に構築されたネットワーク用の準仮想化デバイスドライバ
(図はKVM PV DEVICESより引用)
Virtioのアーキテクチャ
- 準仮想化デバイスドライバは共通のvirtioと呼ばれる仮想キューのインタフェースを使用して構築される
- 仮想キューはゲストとホストOS間で共有されるメモリ上に構築されるリングキューとして実装される
- ハイパーバイザー側にも各フロンエンドデバイスに対応するバックエンドデバイスドライバーが存在
(図はvirtio: Linux の I/O 仮想化フレームワークのvirtio フレームワークのアーキテクチャー概要より引用)
Virtioのバックエンド実装
- virtual queueへの通知及びデータアクセスをQEMU上で行う
- host側のカーネル空間からデータのアクセスを行う
- host上のユーザ空間のプロセスが直接ゲストOSとデータの送受信を行う
(virtio guest side implementation: PCI, virtio device, virtio net and virtqueue)
ネットワークの実装で言えば1.がvirtio_net, 2がvhost_netに該当する
パケット処理の流れ(virtio_net)
(図はNetwork I/O Virtualization - Advanced Computer Networksより引用)
パケット処理の流れ(vhost_net)
(図はNetwork I/O Virtualization - Advanced Computer Networksより引用)
- パケット送信時はvhostのworker threadがvirtqueueから読み取りtap経由でパケットを送信する
- パケット受信はvhostのworker threadがtapをpollingし、tapからデータを読み取りvirtqueueへデータをキューイングする
- QEMUのユーザ空間を介さずにguest osとhostのカーネル空間でパケットの送受信が可能なため、パケット送受信時に余計なコンテキストスイッチが走らない
(QEMU Internals: vhost architecture)
Multi-queue virtio-net
- パケットの送受信処理をゲストOSのvcpuの数にスケールさせるための技術
- ハードウェアに依存しない仕組み
(図はMultiqueue virtio-netより引用)
参考資料
virtio: Linux の I/O 仮想化フレームワーク
- virtioの概要を把握するのに丁度いいドキュメント
- FreeBSDのハイパーバイザを題材にハイパーバイザーの実装方法を説明している
- virtioを使ったfrontendとbackendの通信に関しての資料
- virtio-netのソース
- virtioのソース
- 仮想環境のパケットの送受信(vhostについても)に発生する処理が図で分かりやすく記載されている
Hardware Accelerated VirtIO Networking for NFV
- vhostのパケット送受信の流れが関数レベルで詳細に書かれている
Kernel-based Virtual Machine Technology
- qemuとkvmがどう連携しているか簡潔に書かれている