Posted at

Virtioについてのまとめ

More than 3 years have passed since last update.


Virtio


  • 仮想環境におけるI/Oフレームワーク

  • virtio_netはvirtio上に構築されたネットワーク用の準仮想化デバイスドライバ

スクリーンショット 2016-07-16 16.00.35.png

(図はKVM PV DEVICESより引用)


Virtioのアーキテクチャ


  • 準仮想化デバイスドライバは共通のvirtioと呼ばれる仮想キューのインタフェースを使用して構築される

  • 仮想キューはゲストとホストOS間で共有されるメモリ上に構築されるリングキューとして実装される

  • ハイパーバイザー側にも各フロンエンドデバイスに対応するバックエンドデバイスドライバーが存在

virtio フレームワークのアーキテクチャー概要

(図はvirtio: Linux の I/O 仮想化フレームワークのvirtio フレームワークのアーキテクチャー概要より引用)


Virtioのバックエンド実装


  1. virtual queueへの通知及びデータアクセスをQEMU上で行う

  2. host側のカーネル空間からデータのアクセスを行う

  3. host上のユーザ空間のプロセスが直接ゲストOSとデータの送受信を行う

(virtio guest side implementation: PCI, virtio device, virtio net and virtqueue)

ネットワークの実装で言えば1.がvirtio_net, 2がvhost_netに該当する


パケット処理の流れ(virtio_net)

スクリーンショット 2016-07-17 0.06.44.png

(図はNetwork I/O Virtualization - Advanced Computer Networksより引用)


パケット処理の流れ(vhost_net)

スクリーンショット 2016-07-17 0.09.21.png

(図は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 introduction


  • virtioを使ったfrontendとbackendの通信に関しての資料

qemu virtio backend


  • virtio-netのソース

qemu virtio source code


  • virtioのソース

極める! KVM


  • 仮想環境のパケットの送受信(vhostについても)に発生する処理が図で分かりやすく記載されている

Hardware Accelerated VirtIO Networking for NFV


  • vhostのパケット送受信の流れが関数レベルで詳細に書かれている

Kernel-based Virtual Machine Technology


  • qemuとkvmがどう連携しているか簡潔に書かれている