CentOS6 で KVM

CentOS 6.7 で KVM を使う際のメモ書き

Ubuntu server での話も少しだけ書いてある

CentOSはオワコン(古い?)なので、Ubuntu ベースで新たに書き直したほうがいいかな?(基本的には同じなんだけど)

下準備

BIOS で intel-vt 等の仮想化技術を enable に。CPU が対応しているかも確認。また、CentOS が x86_64 であることも確認 :-p

必要なものを yum で入れる

yum -y install libguestfs libvirt libvirt-client python-virtinst qemu-kvm virt-manager virt-top virt-viewer

virt-who は不要

libvirtd を on に

chkconfig libvirtd on

/etc/sysconfig/network-scripts/{ifcfg-eth0,ifcfg-br0} の修正と作成

bridge interface br0 を作るため、ifcfg-br0 を ifcfg-eth0 を元にして作成。

DEVICE=br0
TYPE=Bridge
ONBOOT=yes
...(略)...

一方 ifcfg-eth0 は

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br0

程度で ok 。

なお、ifcfg-br0 には MAC address 等の情報は外しておいた方が良いかもしれない。起動時に udev が NIC を自動認識する際に誤って、

udev: renamed network interface eth0 to br0

みたいなことをしでかしてくれて network 設定がおかしくなることがあった。

ちなみに udev による NIC 関連の rule は、/etc/udev/rules.d/70-persistent-net.rules に記述される。嵌った際には、この rule ファイルも確認修正するのが良いだろう。 一例として管理している某サーバ(NIC 二枚)の 70-persistent-net.rules :

# PCI device 0x8086:0x1502 (e1000e) (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="40:a8:f0:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth0", NAME="eth0"

# PCI device 0x8086:0x10d3 (e1000e) (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="40:a8:f0:xx:xx:xy", ATTR{type}=="1", KERNEL=="eth1", NAME="eth1"

udev が勘違いすると、ここに次のような行が加わってしまい、device がうまく認識しなくなってしまう

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="40:a8:f0:ca:0f:17", ATTR{type}=="1", KERNEL=="eth*", NAME="br0"

bridge の確認

brctl show

とすることで bridge interface を確認できる

virbr0 の削除

何でも virbr0 は性能がでないとかいうことらしいので消してしまう

virsh net-destroy default
virsh net-undefine default

とかする。

インストール

virt-install コマンドを使う。オプションについては以下を

virt-install --help

インストールは大体こんな感じ

virt-install --accelerate --hvm --connect=qemu:///system \
    --name test_server --ram 2048 --vcpus 1 --disk path=/var/kvm/disk/test_server.img,format=raw,size=25 \
    --network bridge=br0 --os-type linux --os-variant rhel5.4 --nographics \
    --location /home/iso/CentOS-5.11-x86_64-bin-DVD-1of2.iso
    --extra-args='console=tty0 console=ttyS0,115200n8'

ram の単位は MB、ディスクは GB

ubuntu の iso だと "Couldn't find hvm kernel for Ubuntu tree." と出てしまい蹴られたので、次のように

virt-install --accelerate --hvm --connect=qemu:///system \
   --name ubuntu1404 --ram 2048 --vcpus 1 --disk path=/var/kvm/disk/ubuntu1404.img,format=raw,size=25 \
   --network bridge=br0 --os-type linux --nographics \
   --location http://ftp.jaist.ac.jp/pub/Linux/ubuntu/dists/trusty/main/installer-amd64/ \
   --extra-args='console=tty0 console=ttyS0,115200n8'

切り替え

VM コンソールから抜けるには Ctrl-] を、VM コンソールに入るには virsh console vm_name

仮想ディスクサイズの拡張

対象のシステムを停止

virsh shutdown hoge

しばらくして動いてないのを virsh list とかして確認後、次のように

qemu-img resize /var/kvm/disk/hoge.img +10G

例えば 10G 増やすにはこんな感じ

仮想ディスクのマウント、アンマウント

mount:

losetup /dev/loop0 /var/kvm/disk/hoge.img
kpartx -av /dev/loop0
mount /dev/mapper/loop0pX /mnt

unmount:

umount /mnt
kpartx -dv /dev/loop0
losetup -d /dev/loop0

仮想ディスク(kvm image)に lvm volume があるときの、マウント&アンマウント

ディストリビューションによっては、/boot はそのままマウントできるが、/ や /home などは lvm でというシステムもある。その場合は、1. kpartx で loopback device に partition をマップ、2. vgscan で volume group をスキャン、3. lvscan でスキャン、4. lvchange でマウントしたい volume を active に、5. マウント、という流れ。具体的には、まず

kpartx -av /var/kvm/disk/hoge_lvm.img

のようにして、loopback device にマップします。次に

vgscan

とすると volume group を探し出すはず。次に

lvscan

を実行し、表示された device 名をみて、マウントしたい device を active にします。

lvchange --available y /dev/vg_hoge_lvm/lv_root

ここまでくればあとはマウントするだけです。

mount /dev/vg_hoge_lvm/lv_root /mnt

アンマウントは逆の操作になります。

umount /mnt
lvchange --available n /dev/vg_hoge_lvm/lv_root
kpartx -dv /var/kvm/disk/hoge_lvm.img

ubuntu 16.04 で cosole に繋げられない(ubuntu 18.04 も同様)

systemd になったことに伴い、virsh console hogehoge してもコンソールに接続することができない。こちらに書かれているように、virt-install した 16.04 内で、

systemctl enable serial-getty@ttyS0.service
systemctl start serial-getty@ttyS0.service

してやれば良い。

xml の編集

仮想マシンの設定情報は /etc/libvirt/qemu/ 内に xml ファイルで。仮想システム hogehoge のなんぞを編集する場合は、

virsh edit hogehoge

「uuid が既にある」みたいなエラーが出た場合、uuidgen コマンドで新しい uuid を生成し、それと置き換えれば良い

別のマシンへのイメージ移植

イメージファイルと上記の xml ファイルをセットで持っていって、

virsh define /etc/libvirtd/qemu/hogehoge.xml

とかすればいい。

移植する際に、ホストが CentOS じゃなくて Ubuntu server だった場合には、

virsh edit hogehoge

と設定ファイルを開き、emulator のところを

<emulator>/usr/libexec/qemu-kvm</emulator>   ← ホストが CentOS の場合
<emulator>/usr/bin/kvm</emulator>   ← ホストが Ubuntu の場合

のように変更すべし。また、type の machine を

<type arch='x86_64' machine='rhel 6.5.0'>hvm</type>  ← ホストが CentOS の場合
<type arch='x86_64' machine='pc-1.0'>hvm</type>  ← ホストが Ubuntu の場合

のように変更する必要あるが、machine を何にすべきかは次のコマンドで調べるとよい

/usr/bin/kvm -machine help  ← ホストが Ubuntu の場合
/usr/libexec/qemu-kvm -M ?  ← ホストが CentOS の場合

image format を変更するには

仮想環境で使われる image format 間の変換 qcow2, qed, raw, vdi(virtualbox), vpc(hyper-v), vmdk(vmware) に関して、次のようにすれば変換できるらしい

qemu-img convert -f raw -O qcow2 image.img image.qcow2
Last modified:2017/05/07 23:31:08
Keyword(s):[CentOS6] [KVM]
References:[CentOS]