雑記 - CentOS6 で KVM Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

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,size=25 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,size=25 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 してもコンソールに接続することができない。[[こちら|http://qiita.com/falcon8823/items/cf6ace48b94946330f24]]に書かれているように、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


!参照したサイト
*[[http://www.server-world.info/query?os=CentOS_6&p=kvm&f=1]]
*[[http://dotnsf.blog.jp/archives/2751643.html]]
*[[http://dotnsf.blog.jp/tag/kvm]]
*[[http://www.cyberciti.biz/faq/linux-kvm-disable-virbr0-nat-interface/]]
*[[https://www.banym.de/linux/centos/change-network-device-name-from-eth1-back-to-eth0]]
*[[https://sites.google.com/site/learningoss/home/kvmnogesutonicentos6woinsutoru]]
*[[http://qiita.com/fetaro/items/65fa1d136406251ce898]]
*[[http://momijiame.tumblr.com/post/56612490665/centos-64-%E3%81%A7-libvirt-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-cui-%E3%81%A7%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B]]