KVM (Kernel-based Virtual Machine) は、仮想化技術の中では、ハイパーバイザーの一つに分類されます。ハイパーバイザーは、物理サーバ(ホストコンピュータと呼ぶこともあります)上で稼働し、物理サーバのリソース(CPU,メモリ,ディスクといった資源)を仮想化して、複数の仮想マシン(VM=Virtual Machine)に割り当てると共に、これらの仮想マシンを管理する機能を提供します。
もっと簡単に言うと、大きなサーバ(ホストコンピュータ)のCPUコア,メモリ,ディスクを分割して、小さなマシン(仮想マシン)を複数個作れるよ、ってことなのです。これが仮想化技術であり、仮想化を実現するためにホストコンピュータ上で動いているソフトウェアがハイパーバイザーなのです。
KVMって、どんなハイパーバイザー?
KVMはLinuxカーネルにも統合されていて、Linuxでは最もスタンダードなハイパーバイザーだと言えるでしょう。Intel VTやAMD-Vといったハードウェア側の仮想化機能とも連携するので、性能面でも安心です。Linuxで仮想マシンを使いたい、と思ったらKVMを先ず使ってみるのが良いでしょう。
Rocky Linux, Alma Linux, CentOS, RHEL だけでなく、Ubuntuでも利用できます。
仮想化すると何がうれしい..
エンジニアの仕事をしていると、仕事で使うソフトウェアの機能を事前に試したい、でもマシンがないので試せたい、ということがよくあります。マシンがあってもOSやバージョンを変えて試したいことがあります。
そんなとき、仮想マシンを使えば好きなOSを試すことができます。仮想マシンを停止すれば、ホストコンピュータのリソースは消費しない(但し、ディスクを除く)ので、順番に何種類ものOSを仮想マシンで試すことができます。
もうひとつのメリットは、バックアップが簡単だということです。仮想マシンのシステムイメージは、ホストコンピュータ上のストレージに1つのファイルとして存在するので、それをコピーしておけばバックアップはOKです。そして、バックアップだけでなく、そのシステムイメージをコピーすれば、仮想マシンの複製も簡単にできるという訳です。複製は、同じホストコンピュータ上だけでなく、KVMが稼働する他のホストコンピュータでも良いので、予め仮想マシンのイメージとして作成しておいたなんらかのシステムを、他の人に提供することも簡単にできます。
その他に期待できるメリットとしては、コストパフォーマンスでしょうか。物理サーバのspecは余裕をもって購入することが多いので、仮想マシンを複数個起動することで、物理サーバのリソースを余すことなく利用することができます。但し、CPUのコア数、メモリ容量を増やすことは、コストにも直結するので、必ずしもコストパフォーマンスが良くなるという訳でもありません。また、仮想マシンでRHELを運用する場合は、仮想マシンにインストールするRHELにもサブスクリプションが必要となってしまいますので、このこともコストパフォーマンス向上を阻害する要因になっています。
ホストコンピュータにKVMをインストールするには..
RHEL系のLinux(Rocky Linux, Alma Linux, CentOS)であれば、パッケージグループ ” Virtualization Host” をインストールすればKVMとその関連PKGがインストールされます。インストーラのGUIから、”Virtualization Host” のパッケージグループを選択しても良いですし、初回インストールで Minimal Installを選択したのであれば、以下のようにdnfコマンドを実行することでこのパッケージグループをインストールすることが可能です。
# dnf -y groupinstall “Virtualization Host”
※もし、virt-install等のコマンドがないようでしたら、dnf -y install virt-install で追加インストールを行ってください。
インストールが完了したら、libvirtd のサービスを起動しましょう。libvirtdはハイパーバイザー(KVM)本体ではなく、各種の管理コマンドとKVMを中継するサービスとのことです。難しいことは考えず、仮想マシンを実行したいなら、libvirtdを起動しておく、と覚えておけばOKです。
libvirtdを起動するには、以下のようにコマンドを実行します。
# systemctl start libvirtd
以下のコマンドも実行して、ホストコンピュータを起動したときに、libvirtdも自動起動するようにしておきましょう。
# systemctl enable libvirtd
仮想マシン(VM)にRocky Linuxをインストールする(仮想マシンの作成)
仮想マシンにOSをインストールする手順は、最初を除けば同じです。
OSのISOイメージファイルをホストマシン上に配備したら、以下の例のようにvirtinstallコマンドでインストール開始です(これはRocky8.9をインストールする例です)。
# virt-install \
--name test0 \
--ram 2048 \
--disk path=/var/lib/libvirt/images/rockylinux_test0.qcow2,size=20 \
--vcpus 1 \
--os-variant rocky8-unknown \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location /tmp/Rocky-8.9-x86_64-dvd1.iso \
--extra-args 'console=ttyS0,115200n8'
| オプション | 説明 |
| –name | 仮想マシンの名前(ドメイン名)の指定 |
| –vpus | 仮想マシンが使用するVCPU数の指定 |
| –ram | 仮想マシンが使用するメモリ容量(MB単位)の指定 |
| –disk | path=<imagepath> で仮想マシンのイメージファイルのパスを指定します。 size=<size> で 仮想マシンのイメージファイルの容量(GB単位)を指定します。 |
| –os-variant | 仮想マシンを最適化するためにOS名を指定 (指定可能なOS名は、osinfo-query os で検索することができます) |
| –network | 仮想マシンが接続するネットワークを指定します。ここでは、KVMが作成する仮想ブリッジ virbr0 にブリッジ経由で接続することを指定しています。 |
| –graphics | noneを指定してグラフィクスを使用しないことを指示します。 |
| –console | pty,target_type=serial を指定してシリアル接続することを指示します。 |
| –location | インストールメディア(ISOファイル)が存在するパスの指定 |
| –extra-args | その他のオプション指定では、console=ttyS0,115200n8 のようにコンソールのデバイスと通信速度を指定します。 |
osinfo-query os コマンドは以下のような出力が得られます。rocky8.9は無かったので、今回はrocky8-unknown を指定することにしました。
# osinfo-query os
Short ID | Name | Version | ID
-----------+-----------------+---------------------------------
almalinux8 | AlmaLinux 8 | 8 | http://almalinux.org/almalinux/8
almalinux9 | AlmaLinux 9 | 9 | http://almalinux.org/almalinux/9
~
rocky8-unknown | Rocky Linux 8 Unknown | 8-unknown | http://rockylinux.org/rocky/8-unknown
インストールはテキストモードで行われます。virt-installを実行すると、作成する仮想マシンとのコンソール接続が確立されます。インストーラに対する入力は、このコンソール画面から行います。

インストールの方法は、通常のテキストモードにおける手順と同じなのでここでは省略します。
仮想マシンの管理
仮想マシンの一覧表示
先程、OSのインストールを完了した仮想マシン test0 が起動しているはずなので、virsh list コマンドで確認してみましょう。running と表示されていれば起動しています。
# virsh list
Id Name State
----------------
~
8 test0 running
~
停止している仮想マシンも含めて表示したい場合は、–all オプションを付けます。
停止中の仮想マシン test1 が存在することが確認できます(もちろん前に作っています)。
# virsh list --all
Id Name State
----------------
~
8 test0 running
~
test1 shut off
~
仮想マシンの停止
仮想マシンを通常の方法で停止(shutdown)するには、virsh shutdown コマンドを使用します。
# virsh shutdown test0
Domain 'test0' is being shutdown
virsh shutdown で停止できない場合は、強制終了のための virsh destroy コマンドもあります。但し、この方法では仮想マシンのシステムイメージを破壊する可能性があるので、できれば避けたほうが良いでしょう。
仮想マシンの起動
停止中の仮想マシンを起動するには、virsh start コマンドを使用します。
# virsh start test0
Domain 'test0' started
仮想マシンへのコンソール接続
今回作成した仮想マシン test0 を作成したときに、シリアルコンソール接続可能なように設定しているので、virsh console コマンドで仮想マシンのコンソールに接続することができます。
以下は、コンソール接続、rootによるログイン~ログアウト、コンソール切断 までの操作のログです。
(test0ではなくて、過去に作成したtest1の例でゴメンナサイ..)
# virsh console test1
Connected to domain 'test1'
Escape character is ^] (Ctrl + ])
Rocky Linux 8.7 (Green Obsidian)
Kernel 4.18.0-425.19.2.el8_7.x86_64 on an x86_64
Activate the web console with: systemctl enable --now cockpit.socket
test1 login: root
パスワード:
前回のログイン: Fri Jun 21 12:12:20 接続元: 192.168.122.1
[root@test1 ~]# exit
ログアウト
Rocky Linux 8.7 (Green Obsidian)
Kernel 4.18.0-425.19.2.el8_7.x86_64 on an x86_64
Activate the web console with: systemctl enable --now cockpit.socket
test1 login:
留意すべき点は、コンソールを切断するときに、Ctrlキー と ] キーを同時に入力することです。表示にも「(Ctrl + ])」と記載されていますね。
仮想マシンの削除
仮想マシンを作成すると、仮想マシンのイメージファイルだけでなく、XML設定ファイルも作成されます。仮想マシンを削除すると共に、イメージファイルもXML設定ファイルも含めて全てのファイルを削除するには以下のようにコマンドを実行します。
# virsh undefine test0 --remove-all-storage
イメージファイルを残しておきたい場合は、以下の通りコマンドを実行します。
# virsh undefine test0
仮想マシンのバックアップと複製(クローン)
仮想マシンのシステムイメージは1つのファイルに格納されているので、バックアップがとても簡単です。以下の図は、ホストコンピュータ上における、仮想マシンの設定ファイルとイメージファイルの格納先を表しています。

仮想マシンのバックアップ
仮想マシンを利用していく中で更新されたシステムの内容は、/var/lib/libvirt/images/<domain>.qcow2 に書き込まれています(<domain>は仮想マシンの名前です)。だから、このファイルをコピーしておけば、その時点でのシステムのスナップショットをバックアップすることができます(コピーする前に、仮想マシンを停止するのが良いでしょう)。
仮想マシンを使っていろいろとテストを行うなら(例えば、PKGを追加していくような操作をするなら)、過去のスナップショットに戻れるよう、定期的にバックアップをとっておくのが良いと思います。
仮想マシンの複製(クローン)
バックアップが容易であるのと同じように、同じ仕様の仮想マシンの複製を作ることも容易です。仮想マシンの複製には、virt-clone コマンドを使用します。例えば、作成済の仮想マシン test0 を複製して、新しい仮想マシン test2 を作成する場合は、以下のように virt-closeコマンドを実行します。
# virt-clone --original test0 --name test2 --file /var/lib/libvirt/images/test2.qcow2
–original には複製元の仮想マシンのドメイン名、–name には新しい仮想マシンのドメイン名、–file には新しい仮想マシンのイメージファイルのパスを指定します。複製を実行するときも、複製元の仮想マシンを停止しておくのが良いでしょう。virt-closeコマンドで複製すると、イメージファイルの他に、仮想マシンの設定ファイルも適切に変換された上でコピーされます。
作成された仮想マシンはホストコンピュータ経由で外部と接続できる
KVMをインストールすると、標準で仮想ブリッジ virtbr0 が作成されます。ホストコンピュータ上でnmcli コマンドで確認すると、TYPE=bridgeとして表示されます。
# nmcli c s
~
virbr0 d7f94fb4-6d70-4647-9c47-42db746366d0 bridge virbr0
この仮想ブリッジには IPアドレスも付与されています。標準では、192.168.122.1/24 が割り当てられるようです。
# ip a
~
8: virbr0: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:54:00:db:f9:f6 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
~
前述の仮想マシン作成の例では、–network bridge=virbr0 を指定して作成しているので、作成した仮想マシンは起動した時点から、virbr0と同じサブネットのIPアドレスに接続されます。
(IPアドレスはDHCPで自動的に割り当てられます。以下の図の例では192.168.122.2/24 が割り当てられています)
仮想マシン(VM)は、ホストコンピュータのvirbr0をゲートウェイとして外部のネットワークと接続することができます。仮想マシンは、外部ネットワークのIPアドレスを持たないので、NAT接続で外部と通信します。

従って、ホストコンピュータがインターネットに(直接でも間接でも)接続可能な状態であれば、仮想マシンがPKGの追加や、PKGの更新を行うこともできます。
でもやっぱり、物理サーバの代替として仮想マシンを利用するのであれば、物理サーバと同じように、外部ネットワークに直接接続したい(外部ネットワークのIPアドレスで接続したい)、外部ネットワークから仮想マシンに直接アクセスしたい、と思うんですよね。
次回「犬でも分かるKVM(2): 外部ネットワークとブリッジ接続する」では、外部ネットワークと同じセグメントのIPアドレスで接続するため、「ブリッジ接続」を実現する方法を解説したいと思います。
広告主へのリンク
ミニPCのお勧め
おウチでLinuxを勉強するのに、ミニPCはどうですか。
仮想環境(KVM)使えば、仮想マシンを複数起動できますし、とても安価にシステム構築の練習ができます。ミニPCはとっても静かで消費電力も小さいので部屋で常時起動させています。



コメント