Mastering KVM Virtualization を読んだ感想

Table of Contents

はじめに

やっと自宅サーバでブログを動かすことができたので、ここ数ヶ月ずっと読んでいてようやく読み終わった本の感想を書こうと思います。 本のタイトルは「Mastering KVM Virtualization」というやつで、仮想化周り、特にQEMU/KVMについて詳しく知りたかったので読んでみました。 リンクを貼っておくので、気になる方は是非読んでみてください。

Amazon | Mastering KVM Virtualization

Mastering KVM Virtualization

本の概要

この本はQEMUやKVMを中心としたLinuxの仮想化機能、またそれらを管理するシステムについての概要を述べている本です。 洋書で結構分厚い本なのでかなり読み応えがあります。

全体として、各トピックについてそこそこ詳しく記載されているが、Deep Diveというほどではない感じです。 例えば、QEMUやKVMのソースコードレベルでの解説等はほとんどありません(序盤に少しだけある)。

本の構成は以下の様になっています。

  • Section 1: KVM Virtualization Basics
      1. Understanding Linux Virtualization
      1. KVM as a Virtualization Solution
  • Section 2: Libvirt and ovirt for Virtual Machine Management
      1. Installing KVM Hypervisor, libvirt, and ovirt
      1. Libvirt Networking
      1. Libvirt Storage
      1. Virtual Display Devices and Protocols
      1. Virtual Machines: Installation, Configuration, and Life Cycle Management
      1. Creating and Modifying VM Disks, Templates, and Snapshots
  • Section 3: Automation, Customization, and Orchestration for KVM VMs
      1. Cusomizing a Virtual Machine with cloud-init
      1. Automated Windows Guest Deployment and Customization
      1. Ansible and Scripting for Orchestration and Automation
  • Section 4: Sclability, Monitoring, Performance Tuning, and Troubleshooting
      1. Scaling Out KVM with OpenStack
      1. Scaling out KVM with AWS
      1. Monitoring the KVM Virtualization Platform
      1. Performance Tuning and Optimization for KVM VMs
      1. Trouble Shooting Guidelines for the KVM Platform

「Section 1: KVM Virtualization Basics」ではKVMや仮想化技術に関する基本のおさらいをしてくれます。 そもそも仮想化とは何か、なぜするのかとか、仮想化の種類、仮想化の対象、そしてLibvirtやQEMU、KVMがそれぞれ何なのかみたいなことも説明されていました。

「Section 2: Libvirt and ovirt for Virtual Machine Management」では実際にLibvirtを使い、VMに対する操作を通して様々なリソースをどの様に仮想化して扱うのか、みたいなことを話していました。 virshコマンドの使い方についてはかなり詳しく書かれていて参考になり、またvirt-managerやoVirtといったGUIからVMを管理するソフトウェアの使い方についての記載もありました。

「Section 3: Automation, Customization, and Orchestration for KVM VMs」では仮想化技術そのものではなく、cloud-initやAnsibleを使ってVMの管理の自動化やスケーリングについて語られていました。

「Section 4: Sclability, Monitoring, Performance Tuning, and Troubleshooting」も仮想化技術そのものというよりは、仮想化技術を使ってクラウド基盤を構築するソリューションについての説明といった感じでした。 OpenStackやAWSの概要、仮想化基盤のモニタリング、そして最後にパフォーマンスチューニングや仮想化基盤のトラブルシューティングの仕方についての話が続きました。

各章の感想

Section 1: KVM Virtualization Basics

正直ここが一番面白かったです。

Intel VTやAMD-VといったCPUの仮想化支援機構が一体何をしているのかとか、VMのページテーブルからのホストの物理メモリアドレスの変換機構とか、OSのリングプロテクションの概念とかは今まで聞いたことがあるけどいまいちわからない話だったのが、理解が一段と深まった気がします。

Protection ring Protection ring(from https://en.wikipedia.org/wiki/Protection_ring

また、仮想化の種類の話で、完全仮想化、準仮想化、ハードウェア支援仮想化それぞれの仕組みについても説明されていて、仮想化がどの様に進化を遂げてきたのかがなんとなく分かりました。

セクションの最後にはLibvirt/QEMU/KVMそれぞれの役割と関係性について述べられ、さらにソースコードを部分的に見ながらの実装レベルでの動作の説明もされていました。 ここは前提知識がないと完全に理解するのは難しいと感じましたが(自分には無理だった)、QEMUは /dev/kvm を通してKVMのAPIを操作しているんだなぁとか、VM Exit/Enterの時にどんな風にvCPUの状態を管理しているのかといったことをざっくり理解することができ、非常に読み応えがあり良かったです。

ここら辺は、自分の理解が深まった後に改めて読み直したいと感じました。

Section 2: Libvirt and ovirt for Virtual Machine Management

ここはLibvirtの使い方みたいなセクションで、Libvirtをインストールして、virt-installvirsh コマンドを使ってVMを作り、その設定をいじったり、仮想ネットワークや仮想ストレージを作成してVMに接続したりしました。

仮想ネットワークのトピックではlinuxbridgeとovsそれぞれの場合で、Linux上でのブリッジや仮想インターフェースの作成、それらを使ったLibvirtによる仮想ネットワークの作成のハンズオンができました。

仮想ストレージのトピックではLVMやNFS、iSCSI、Ceph等のストレージプールを作ってVMにボリュームをアタッチする様なハンズオンをやりました。 簡単なCephクラスタの構築まで手作業でやってストレージプールを作るのは、そこまでやるのかって感じがして面白かったです。

また、VMのイメージファイルをホストから直接編集するツール群の説明や、VMイメージのスナップショット(qcow2を使ったinternal-snapshotと汎用的なexternal-snapshot)などの話も今まで知らなかったので面白かったです。

全体を通してハンズオンがかなり丁寧に記載されており、普段使っているOpenStackでは内部でこういうコマンドを叩いているんだなぁと感じ、少しOpenStackの気持ちを理解できた気がして嬉しかったです。

また筆者は結構oVirt推しなのか、oVirtでの操作の説明が随所に記載されていました。 自分はGUIからの操作にあまり興味なかったので読み飛ばしてしまいましたが、使う機会があったらまた読み直してみたいと思います。

Section 3: Automation, Customization, and Orchestration for KVM VMs

ここからはもうほとんどKVM自体の話は無く、VMの管理の自動化やオーケストレーションの話になってきます。

メインはcloud-initとAnsibleの話で、それぞれの用途や使い分け、またハンズオン形式で使い方の説明がされていました。 Ansibleを使ってVMの構成管理をするだけでなく、VM自体をAnsibleで作る様なハンズオンもあって面白かったです。

また途中にWindows VMの管理についての章もあったんですが、あんまり興味なかったので読み飛ばしてしまいました、、、。 もし読んだ方いたらぜひ感想聞かせてください。

Section 4: Sclability, Monitoring, Performance Tuning, and Troubleshooting

最後のセクションは、実際にVM基盤を運用していくにあたって必要なソフトウェアやノウハウについてでした。

最初はOpenStackとAWSに関する説明で、ここら辺は概要的な話で大体知っていたのでさらっと読みました。 1つ印象に残ったのは「Eucalyptus」というAWS互換のプライベート・ハイブリッドクラウドを管理できるOSSで、これを使うとAWSライクなクラウド基盤をオンプレミスに作成できたり、オンプレミスのリソースと同じ様にAWSのリソースを管理してハイブリッドクラウドを構築できるらしいです。Java製のソフトウェアで最終リリースが2021年なので少なくとも今は利用されてなさそうですが、概念としては非常に面白いなと思いました。

後はVM基盤のモニタリングの文脈でELKスタック(Elasticsearch, Logstash, Kibana)の説明やハンズオンがあったり、VMのパフォーマンスチューニングの仕方についての説明があったりしました。 後者についてはCPU pinningやNUMA、hugepagesやKSM (Kernel Same-Page Merging)の話もあり、VM基盤を運用していく上で結構実用的な話を学ぶことができたと思います。

まとめ

もともと仮想化やQEMU/KVM周りの技術的な理解を深めたくてこの本を読み始め、特にSection 1でそれを割と達成できたので非常に満足しました。 QEMU/KVMの実装ベースの理解についてはコードリーディングやVMMの自作等を通して今後さらに深く学んでいきたいです。 また、Section2移行でも仮想化基盤に関連するソフトウェアの使い方や、仮想化基盤の運用のノウハウを学ぶことができて良かったです。

もし仮想化技術に興味があれば、Section 1だけでもぜひ読んでみることをお勧めします!