自家製 Qemu KVM レシピをもっと追加! — 各 VM に独自の IP アドレスを割り当てましょう!
前回はQemuのデフォルトのslirpネットワークを使ってKVM VPsを作成しました。今回はQemuでネットワークを設定し、各仮想マシンに独自のIPアドレスを割り当てます。slirpでは、slirpがホストのIPアドレスを使って自動的に接続するため、ネットワーク設定に手を加える必要はありませんでした。
ここでは、マシンにルーティングされたIPアドレスのサブネットとブリッジがあることを前提としています。このサブネットから、作成する各VMにIPアドレスを割り当て、設定できます。追加のIPアドレスがない場合は、通常はプロバイダーから取得する必要があります。ブリッジがまだ設定されていない場合は、Linux-KVM.orgに優れたチュートリアルがあります。このLinux-KVM.orgチュートリアルでは、必要なqemu-ifupスクリプトについても説明しています。
ここで採用するアプローチは、Linuxディストリビューションのソフトウェアパッケージシステムやネットワーク設定ユーティリティにほとんど依存しないことを意図しています。また、このアプローチでは、Qemu KVMの設定に一般的に使用される優れたライブラリやユーティリティを一切使用せず、基本的な生のQemuを使用しています。言うまでもなく、このアプローチは主にローエンドのLOL(Lower End User's Console:低性能のユーザーインターフェース)とQemuの動作原理の理解を目的としています。実際の運用には適しておらず、現在開発中です。このアプローチは、VPS、専用サーバー、またはほとんどのLinuxディストリビューションが動作するローカルマシンで動作するはずです。
環境
メイソン・ロウのヤブス脚本より
ハードウェア仮想化サポートが有効になっているかどうかを確認したい場合があります。確認するためのスクリプトを以下に示します。
root@debian:~# cat cpu-virt.sh
#!/bin/bash
# From https://github.com/masonr/yet-another-bench-script/blob/master/yabs.sh
# Lines 210-212
# Thanks to Mason and yabs developers!
CPU_VIRT=$(cat /proc/cpuinfo | grep 'vmx\|svm')
[[ -z “$CPU_VIRT” ]] && CPU_VIRT=”\xE2\x9D\x8C 無効” || CPU_VIRT=”\xE2\x9C\x94 有効”
echo -e “VM-x/AMD-V : $CPU_VIRT”
ルート@debian:~#
リブバート
Libvirtには、libvirt/tools/virt-host-validate-qemu.cにKVM環境検証ユーティリティが含まれています。
Libvirt についてはここでは取り上げませんが、virt-host-validate の優れた使用例をご覧になりたい場合は、 LXC 内で KVM を実行する方法に関する Dmitrii Shcherbakov のチュートリアルをご覧ください。
Qemu をインストールまたはコンパイルする
Qemu がまだインストールされていない場合は、ディストリビューションのパッケージシステムを使ってインストールしてください。または、 Qemu.org のダウンロードページの指示に従って Qemu をコンパイルしてください。Qemu.orgのビルド手順は、 MIT の無料オンラインオペレーティングシステムコースの以前の投稿にも記載されています。
仮想マシン用のディレクトリを作成する
この VM を vm206 と呼ぶので、そのためのディレクトリを作成しましょう。
tom@darkstar:~$ mkdir vm206
tom@darkstar:~$ cd vm206/
tom@darkstar:~/vm206$
オペレーティング システム イメージのダウンロードと検証
画像を取得
tom@darkstar:~$ wget https://cloud.debian.org/images/cloud/sid/daily/latest/debian-sid-nocloud-amd64-daily.qcow2
[. . . ]
トム@ダークスター:~$
チェックサムを取得する
tom@darkstar:~/vm206$ wget https://cloud.debian.org/images/cloud/sid/daily/latest/SHA512SUMS
tom@darkstar:~/vm206$
画像を検証する
tom@darkstar:~/vm206$ sha512sum --ignore-missing -c SHA512SUMS
debian-sid-nocloud-amd64-daily.qcow2: OK
tom@darkstar:~/vm206$
イメージを起動して実行するとイメージが変更されるため、起動して実行する前に確認してください。
元に戻すを有効にする
元の状態に戻せるように画像をコピーしておきましょう。
tom@darkstar:~/vm206$ cp debian-sid-nocloud-amd64-daily.qcow2 vm206.qcow2
tom@darkstar:~/vm206$
画像のサイズを変更する
元のダウンロードイメージの仮想サイズは 2 GiB です。
tom@darkstar:~/vm206$ qemu-img info vm206.qcow2
image: vm206.qcow2
file format: qcow2
virtual size: 2 GiB (2147483648 bytes)
disk size: 864 MiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
tom@darkstar:~/vm206$
画像のサイズを変更してみましょう。
tom@darkstar:~/vm206$ qemu-img resize vm206.qcow2 +48G
Image resized.
tom@darkstar:~/vm206$
これで仮想サイズは 50 GiB になりました。
tom@darkstar:~/vm206$ qemu-img resize vm206.qcow2 +48G
Image resized.
tom@darkstar:~/vm206$ qemu-img info vm206.qcow2
image: vm206.qcow2
file format: qcow2
virtual size: 50 GiB (53687091200 bytes)
disk size: 864 MiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
tom@darkstar:~/vm206$
このサイズ変更手順では、結果に一貫性がありません。上記のように、ノード上でサイズ変更は成功しているように見えます。しかし、VMが起動する際に、内部パーティションスキームがサイズ変更を認識しているように見える場合もあれば、認識していない場合もあります。virt-resizeはDarkstarにはまだインストールされていないことに注意してください。代替手順としては、(1) ユーザーデータ用に2つ目のqcow2ファイルをアタッチする、(2) nocloudイメージを使用せず、代わりにDebianのnetinst.isoからより大きなqcow2ファイルでインストールする方法があります。
仮想マシンを起動するスクリプト
次のスクリプトを使用して vm206 を起動します。
tom@darkstar:~/vm206$ cat start-qemu-206.sh
#!/bin/bash
# Start VM on IP 206
# このスクリプトをtmux内で実行する
# IP 206のルートを追加
IPルート追加 66.11.114.206 dev br0
# qemuを起動する
/usr/local/bin/qemu-system-x86_64 \
-cpu ホスト -smp ソケット=1、コア=8、最大cpus=8 \
-enable-kvm \
-ノグラフィック\
-m 8192 \
-ドライブファイル=/home/tom/vm206/vm206.qcow2、if=virtio \
-netdev tap、id=mynet206、ifname=tap206、script=/root/qemu-ifup.sh、downscript="" \
-device virtio-net、netdev=mynet206、mac=DE:AD:00:BE:EE:06
トム@ダークスター:~/vm206$
スクリプトを使用してTmux内でVMを起動する
tom@darkstar:~/vm206$ tmux
tom@darkstar:~/vm206$ sudo ./start-qemu-206.sh
[. . . ]
[失敗] OpenBSD Secure Shell サーバーの起動に失敗しました。
[. . . ]
Debian GNU/Linux ブックワーム/sid ローカルホスト ttyS0
ローカルホストログイン: root
Linux ローカルホスト 5.17.0-3-amd64 #1 SMP プリエンプト Debian 5.17.11-1 (2022-05-26) x4
Debian GNU/Linux システムに含まれるプログラムはフリーソフトウェアです。
各プログラムの正確な配布条件については、
/usr/share/doc/*/copyright 内の個々のファイル。
Debian GNU/Linuxには、いかなる保証も一切ありません。
適用法によって許可されている。
ルート@ローカルホスト:~#
VM は、sshd サーバーが失敗し、ネットワークがない状態で起動します。
root@localhost:~# ping -c 2 www.google.com
ping: www.google.com: Temporary failure in name resolution
root@localhost:~# ping -c 2 1.1.1.1
ping: connect: Network is unreachable
root@localhost:~# ping6 -c 2 2602:ffc5:105:40f::202
ping6: connect: Network is unreachable
root@localhost:~#
VM内のネットワーク
VM 内にネットワークを追加しましょう。
IPv4 と IPv6 を起動するコマンドは次のとおりです。
ip address add 66.11.114.206/32 dev enp0s3
ip route add 66.11.114.201 dev enp0s3
ip route add default via 66.11.114.201 dev ens3
ip -6 address add 2602:ffc5:105:40f::206/64 dev enp0s3
ip -6 route add 2602:ffc5:105:40f::1 dev enp0s3
ip -6 route add default via 2602:ffc5:105:40f::1 dev enp0s3
ネットワークコマンドはスクリプトに記述できます。Debianではrc.localを有効化できると聞きました。rc.localにスクリプトを配置すれば、再起動時に自動的に実行されるようになります。この設定は別のVMで既に行っています。
DNS
この Debian VM では、/etc/resolv.conf は /run/systemd/resolve/resolv.conf へのシンボリック リンクです。
Hurricane Electric のリゾルバ IP アドレスを /etc/resolv.conf に設定しましょう。
root@localhost:~# unlink /etc/resolv.conf
root@localhost:~# echo nameserver 74.82.42.42 > /etc/resolv.conf
root@localhost:~# echo nameserver 2001:470:20::2 >> /etc/resolv.conf
root@localhost:~#
DNS と IPv4 と IPv6 の両方が動作しているようです:
root@localhost:~# ping -c 2 25230.com
PING 25230.com(2606:4700:20::681a:1d8 (2606:4700:20::681a:1d8)) 56 data bs
64 bytes from 2606:4700:20::681a:1d8 (2606:4700:20::681a:1d8): icmp_seq=1 ttls
64 bytes from 2606:4700:20::681a:1d8 (2606:4700:20::681a:1d8): icmp_seq=2 ttls
--- 25230.com ping 統計 ---
送信パケット2個、受信パケット2個、パケットロス0%、時間1001ms
rtt 最小/平均/最大/平均偏差 = 25.972/25.988/26.005/0.016 ミリ秒
root@localhost:~# ping -4 -c 2 25230.com
PING (104.26.1.216) 56(84)バイトのデータ。
104.26.1.216 からの 64 バイト (104.26.1.216): icmp_seq=1 ttl=58 time=21.6 ms
104.26.1.216 からの 64 バイト (104.26.1.216): icmp_seq=2 ttl=58 time=21.6 ms
--- ping 統計 ---
送信パケット2個、受信パケット2個、パケットロス0%、時間1001ms
rtt 最小/平均/最大/平均偏差 = 21.553/21.568/21.583/0.015 ミリ秒
ルート@ローカルホスト:~#
予想通りの IP アドレスがあるようです:
root@localhost:~# curl icanhazip.com
2602:ffc5:105:40f::206
root@localhost:~# curl -4 icanhazip.com
66.11.114.206
root@localhost:~#
ホストSSL証明書をインストールする
OpenSSHサーバーが失敗したのを覚えていますか?ホスト鍵がないことが原因です。修正しましょう。
root@localhost:~# apt-get update
Get:1 http://deb.debian.org/debian sid InRelease [165 kB]
Get:2 http://deb.debian.org/debian sid/main Sources [9744 kB]
Get:3 http://deb.debian.org/debian sid/main amd64 Packages [9204 kB]
Get:4 http://deb.debian.org/debian sid/main Translation-en [6820 kB]
Fetched 25.9 MB in 7s (3779 kB/s)
Reading package lists... Done
root@localhost:~# apt-get upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
cloud-guest-utils cloud-image-utils cloud-utils libnss-resolve
libpam-systemd libsystemd0 libudev1 systemd systemd-sysv udev
10 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 7599 kB of archives.
After this operation, 13.3 kB of additional disk space will be used.
Do you want to continue? [Y/n]
[. . . ]
root@localhost:~# dpkg-reconfigure openssh-server
[. . . ]
SSH2 ED25519 キーを作成しています。これには時間がかかる場合があります...
[. . . ]
root@localhost:~# systemctl ステータス sshd
● ssh.service - OpenBSD セキュアシェルサーバ
ロード済み: ロード済み (/lib/systemd/system/ssh.service; 有効; ベンダープリセット: e>
アクティブ: 2022-06-04 03:14:27 UTC からアクティブ (実行中)、1分57秒前
[. . . ]
ルート@ローカルホスト:~#
dpkg-reconfigure を使いたくない場合は、 ssh-keygen -A が使えるかもしれません。Ubuntu / Debian Linux で OpenSSH ホスト鍵を再生成する方法をご覧ください。
承認キーを追加する
root@localhost:~# mkdir .ssh
root@localhost:~# chmod 700 .ssh/
root@localhost:~# echo ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILySvSdulbZ4XG4K333YOoFbcwoo6ythPBOf175OIBfA chronos@localhost > .ssh/authorized_keys
root@localhost:~# chmod 600 .ssh/authorized_keys
SSH経由でログイン

辞める方法
VM を実行したまま tmux を終了するには、「Ctrl-b」と入力してから「d」と入力します。
tmux とすでに実行中の VPS に再度入るには:
tmux attach
VM を停止して tmux を終了するには:
shutdown -h now
VM のシャットダウン後にコマンド プロンプトに戻ったら、「exit」と入力します。
追加リソース
私が初めて KVM のトリックを試したとき、本当に役立ったリソースは Linux-KVM.org のネットワーク構成ページでした。
おそらく世界で最も徹底的な qemu チュートリアルはDongli Zhang によるものです。
結論
前回の記事では、QEMUのデフォルトのネットワークツールであるslirpの使い方を3つ紹介しました。今回は、個別のIPアドレスを持つKVM仮想マシンの作成方法について解説しました。
ローエンドを楽しんでください!💖