VMware から KVM へのコンバート(CentOS5)

VMware から KVM への移行にあたって
CentOS5のconvertはCentOS6より手間がかかったので記録

+ Host OSはCentOS6
+ Host OSはLVMを使用していない
+ Guest OSがCentOS5.6 (kernel-2.6.18-274)
+ Guest OSでLVMを使用している
+ image形式はrawなのでそのまま使う
+ MACは手動で割当

VMwareからのイメージの取得手順は省きます。
必要なのはimagefile.vmdk
imagefile.vmx はVMware用の構成ファイルなのでKVMでは使わない。

HOST OSの作成方法も省きます。

### イメージのマウント

```
# losetup -f (空きloopback deviceを確認)
 /dev/loop0

# mv imagefile.vmdk imagefile.img
# losetup /dev/loop0 imagefile.img
# losetup -a 
 /dev/loop0: [0803]:15 (/DATA/imagefile.img)

# kpartx -a /dev/loop0 && vgchange -ay && lvscan 

# ls -l /dev/mapper/
 total 0
 crw-rw----  1 root root 10, 58 Jul  9 16:16 control
 lrwxrwxrwx  1 root root      7 Jul 10 11:07 loop0p1 -> ../dm-0
 lrwxrwxrwx  1 root root      7 Jul 10 11:07 loop0p2 -> ../dm-1
 lrwxrwxrwx  1 root root      7 Jul 10 11:07 VolGroup00 -> ../dm-2
 lrwxrwxrwx  1 root root      7 Jul 10 11:07 VolGroup01 -> ../dm-3

# fdisk -l (サイズあたりで中身を判断)

Disk /dev/mapper/loop0p1: 106 MB, 106896384 bytes
255 heads, 63 sectors/track, 12 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/loop0p2: 53.6 GB, 53579473920 bytes
255 heads, 63 sectors/track, 6514 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/VolGroup00: 47.3 GB, 47311749120 bytes
255 heads, 63 sectors/track, 5751 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/VolGroup01: 6241 MB, 6241124352 bytes
255 heads, 63 sectors/track, 758 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x30307800

# mount /dev/mapper/VolGroup00 /mnt
# mount /dev/mapper/loop0p1 /mnt/boot
# mount --bind /dev /mnt/dev
# mount --bind /sys /mnt/sys
# mount --bind /proc /mnt/proc

確認
# df
 Filesystem           1K-blocks      Used Available Use% Mounted on
 /dev/mapper/VolGroup00
                      44755372  15522320  26922908  37% /mnt
 /dev/mapper/loop0p1    101086     23562     72305  25% /mnt/boot

# mount
 /dev/mapper/VolGroup00-LogVol00 on /mnt type ext3 (rw)
 /dev/mapper/loop2p1 on /mnt/boot type ext3 (rw)
 /dev on /mnt/dev type none (rw,bind)
 /sys on /mnt/sys type none (rw,bind)
 /proc on /mnt/proc type none (rw,bind)
```

## 各ファイル編集

```
# vi /mnt/etc/sysconfig/network-scripts/ifcfg-eth0  MACアドレスやらIPアドレスやら修正
# vi /mnt/etc/sysconfig/network-scripts/ifcfg-eth1  MACアドレスやらIPアドレスやら修正
# vi /mnt/etc/sysconfig/network   GateWayやら修正
```
その他のconf等も変える必要があれば変更

## KVM Console用設定
起動後に `$ virsh conxole imagename` でログインしたいので
http://aikotobaha.blogspot.jp/2010/08/rhel-kvm-2.html もやる

```
# vi /mnt/boot/grub/grub.conf
---------
hiddenmenu
serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1 [追記]
title Red Hat Enterprise Linux Server (2.6.18-194.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/VolGroup00/LogVol00 console=ttyS0,115200n8 [追記]
---------

# vi /mnt/etc/inittab
---------
# Run gettys in standard runlevels
 S0:12345:respawn:/sbin/agetty ttyS0 115200 [追記]
---------
```

## virtIO用にkernel 再コンパイル

```
# cp -fp /mnt/etc/modprobe.conf /mnt/etc/.modprobe.conf.org
# sed -i '4i alias scsi_hostadapter1 virtio_blk' /mnt/etc/modprobe.conf

# chroot /mnt
# export _KERNEL=`ls -1 /boot/*img | sed -e's|/boot/initrd-||' -e 's|.img||'`
# echo $_KERNEL
 2.6.XX-XXX.el5

# cp -ip /boot/initrd-${_KERNEL}.img /boot/initrd-${_KERNEL}.img.org
# mkinitrd --with=virtio_pci --with=virtio_blk -v -f /boot/initrd-${_KERNEL}.img ${_KERNEL}
# exit
```

## アンマウント
```
# umount /mnt/boot /mnt/sys /mnt/dev /mnt/proc
# umount /mnt
# vgchange -an && kpartx -d /dev/loop0 && losetup -d /dev/loop0 && losetup -f
```

## KVM用設定ファイルの編集

```
# uuidgen
# vi /etc/libvirt/qemu/imagefile.xml 適当なコピーから改変。☆部分
---------
<domain type='kvm'>
  <name>imagefilename</name> ☆
  <uuid>uuidgen で作成したもの</uuid> ☆
  <memory unit='KiB'>2097152</memory> ☆
  <vcpu placement='static'>4</vcpu> ☆
  <os>
    <type arch='x86_64' machine='rhel5.5.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none'/>
      <source file='/path/imagefilename.img'/> ☆
      <target dev='vda' bus='virtio'/> ☆
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='MAC_eth0'/> ☆
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <interface type='bridge'>
      <mac address='MAC_eth1'/> ☆
      <source bridge='br1'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
  </devices>
</domain>
---------

# virsh define /etc/libvirt/qemu/imagefile.xml 
# virsh list --all
# virsh start
```

うまくいけばこれで完成。

MACアドレスをudevで認識できず
ifcfg-eth[01]がリネームされてネットワークが起動しないことがある。

/etc/sysconfig/network-scripts/ifcfg-eth0
↓ 勝手にリネーム
/mnt/etc/sysconfig/network-scripts/ifcfg-eth0.bak

そんなときは、もう一度リネームして再起動すると直る。

```
Host# virsh console imagefile
 Connected to domain pd1-azfront
 Escape character is ^]
 imagefile login: Guest OS に ログイン

Guest# cd /mnt/etc/sysconfig/network-scripts/
Guest# mv ifcfg-eth0.bak  ifcfg-eth0
Guest# shutdown -h now

ctl+]でぬける

Host# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     imagefile                     shut off

Host# virsh start imagefile
```