KVM使い方(Ubuntu 22.04)

Ubuntu 20.04からのアップグレードでvirshが動かなくなった。修復するには次のパッケージのインストールが必要。

% sudo apt install libvirt-daemon-system

KVM使い方(Ubuntu 18.04)

Ubutnu18.04でネットワーク周りの設定に変更があった。それも含めて設定方法を書いているリンクを以下にペースト。

DHCPで固定IPが割り振られる時は、br0のmacaddressを実際のネットワークデバイス(以下の場合eno1)のものにする必要がある。

network:
  version: 2
  ethernets:
    eno1:
      dhcp4: false
      dhcp6: false
  bridges:
    br0:
      dhcp4: true
      macaddress: xx:xx:xx:xx:xx:xx
      interfaces:
      - eno1

ufwでNATの設定をしている場合は、/etc/ufw/before.rulesのデバイス名の変更(-> br0)が必要。

KVM使い方(Ubuntu 16.04)

virt-installVMの作成、virshでVMの管理ができる。

KVMのインストール

% sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils virtinst

ubuntu22.04の場合

% sudo apt install qemu-kvm libvirt-daemon-system virtinst libvirt-clients bridge-utils

ブリッジネットワークデバイスの作成と物理ネットワークデバイスとの関連付け

ホストと同じネットワークの固定IPをふるためにはブリッジを作る必要があるらしい。

auto eth0
iface eth0 inet manual

iface br0 inet static
address 192.168.1.xxx
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers xxx.xxx.xxx.xxx
bridge_ports eth0
bridge_stp off
auto br0

ネットワークの再起動後、仮想ブリッジの確認

% brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.6805ca2f9aab   no      eth0
virbr0      8000.5254006ccac0   yes     virbr0-nic

/etc/sysctl.confで

net.ipv4.ip_forward=1

として、再起動(再起動したほうがいいと思う)。Ubuntu 16.04 desktopではこれを設定しないとホスト・ゲスト間でしたコミュニケーションができない。同serverではこれは設定していなくても動いている(今はこの設定が必要2019-1-10)。

VM作成

vncで接続できる状態でのインストール。Ubuntu20.04サーバのインストールCDイメージ(ubuntu-20.04.6-live-server-amd64.iso)がカレントディレクトリにあることを想定。

% sudo virt-install --name vmname --memory 4096 --disk size=50,path=/home/kvm_images/vmname.qcow2 --vcpus 1 --os-variant ubuntu20.04 --network bridge=virbr0 --noautoconsole --cdrom ubuntu-20.04.6-live-server-amd64.iso --graphics vnc,listen=0.0.0.0,password=vnc

size=50は50GB。virbr0はbr0の場合もあり。環境設定の書かれたファイルは

/etc/libvirt/qemu/vmname.xml

に作成されるが、通常はsudo virsh edit vmnameでアクセスする。

ブート時に/dev/vda1 ...だけ表示されフリーズする場合、もしかしたら以下のようにして解決できるかもしれない。 まず、vmの起動時にshiftを連打してrecoverty modeで起動できるようならば、/etc/default/grubを以下のようにしてupdate-grubする。

GRUB_CMDLINE_LINUX_DEFAULT=""

これでrebootして普通にブートすればよし。"quiet splash"のどちらか、もしくは両方が悪さをしているということになる。

Ubuntuのインストール

UbuntuのインストールはVNCを設定したならVNC経由で行える。KVMVNCの使い方は下の通り。

KVMVNC

一つ目のVMvncのデフォルトポートは5900。パスワードは次のコマンドで確認できる。

% virsh edit vmname

以下のような感じでpasswdが設定されている。

<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' passwd='hoge'/>

二つ目以降順次5901, 5902となっていく模様。5900 + xのxは次のコマンドで確認できる。

% virsh vncdisplay vmname
:1

の場合、5901がポート番号。MacOSの場合、Finder->Go->Connect to serverから

vnc://hostmachine:5901

のようにして接続できる。アクセスを拒否される場合はsshkvmサーバにX forwardして、kvmサーバ内でvinagreなんかを起動する方が良いかも。

コンソールアクセスによるVMのインストール

% virt-install --name vmname --memory 4096 \
--disk path=/vmdir/vmname.qcow2,size=50,format=qcow2 \
--vcpus 1 --os-type linux --os-variant ubuntu16.04 \
--network bridge=br0 --location ubuntu-16.04.5-server-amd64.iso \
--extra-args 'console=ttyS0,115200n8 serial' \
--console pty,target_type=serial \
--graphics vnc,listen=0.0.0.0,password=vnc
% virsh console vmname

KVMメモリサイズ変更

% virsh edit mydata

KVM仮想マシンをプライベートネットワークに入れる(NAT)

virsh editbridgevirbr0にする。普通はIPアドレスDHCPで配られるようになっている。KVM仮想マシンのプライベートネットワーク内でのIPアドレスDHCPで固定で振るにはvirsh net-edit defaultmacアドレスipアドレスを設定すれば良い。以下のように書き換える。

    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
      <host mac='xx:xx:xx:xx:xx:xx' name='hostname' ip='192.168.122.2'/>
    </dhcp>

設定後は次のようにしてKVMネットワークの再起動が必要。

virsh net-destroy default
virsh net-start default

この場合、全てのVMを止める必要がある。追加するだけなら次のようにしてシステムを止めずに設定することができる。

sudo virsh net-update default add-last ip-dhcp-host '<host mac="xx:xx:xx:xx:xx:xx" name="addedhostname" ip="192.168.122.8"/>' --live --config --parent-index 0

KVM仮想マシンの削除

Undefineしたのちimageファイルをrmで削除。

sudo virsh undefine <vm-name>

仮想マシンがものすごく遅い。

virsh edit vmnameで一番最初の行がこうなっているか確認。

<domain type='kvm'>

ものすごく遅い仮想マシンではこうなっていた。

<domain type='qemu'>

kvmに書き換えて仮想マシンを起動しようとすると、Check that virtualization is enabled in the host BIOS、というメッセージがでた。そういうことなのか。

rootでvirshが使えない

/etc/libvirt/qemu.confをいじる。

user = "root"
group = "root"

既存KVMイメージのインポート

sudo virt-install --name mynewvm --ram 8192 --disk path=/home/kvm_images/myimage.qcow2 --vcpus 2 --os-type linux --os-variant ubuntu18.04 --network bridge=virbr0 --noautoconsole --graphics vnc,listen=0.0.0.0,password=vnc --import

VirtualboxからKVMへの移行

参考

qemu-img convert -O raw vmname.vdi vmname.img
% sudo virt-install \
--name vmname \ 
--ram 1024 \
--disk path=/var/lib/libvirt/images/vmname.img,bus=sata,format=raw \
--vcpus 1 \
--os-type linux \
--os-variant ubuntutrusty \
--network bridge=br0 \
--noautoconsole \
--graphics vnc,listen=0.0.0.0,password=vnc \
--import

VMをコピーして別のVMとして使う

  • virt-cloneする(次のセクション参照)
  • DHCPサーバから見えてるならDHCPにする。virt-edit -d vmname /etc/netplan/01-netcfg.yamlVMイメージ内のファイルを編集する。virt-editに関しては↓。
  • virsh net-dhcp-leases defaultIPアドレスをチェックしてsshログインする。sshが通らない場合はvncで様子をチェックする。
  • IPアドレスが振られていない場合はデバイス名が変わっている可能性あり。virt-edit -d vmname /etc/netplan/01-netcfg.yamlVMイメージ内のファイルを編集する。virt-editに関しては↓。
  • DHCP固定でIPアドレスを振りたい場合は、virsh net-edit defaultする。この場合は全VMを止める必要がある。virsh net-update default add ip-dhcp-hostというのもある。これなら他のVMを止める必要がない。virsh edit vmnamemac addressを変えるのもあり。

VMファイルシステムをホストから編集する(virt-edit)

virt-editという便利コマンドがあるらしい。libguestfs-toolsをインストールすれば良い。

IP addressは以下のような方法で探すことができる。

VMの移行 or コピー

virt-cloneというコマンドがあるらしい。

% sudo virt-clone --original myoldvm --name mynewvm --file /kvm_images/mynewvm.qcow2

他の方法。