Tuesday, May 8, 2012

vir*工具管理KVM虚拟机

manage-kvm-machine-with-vir*-tools

manage-kvm-machine-with-vir*-tools

1 用vir*工具管理KVM虚拟机

1.1 使用virt-install安装虚拟机

  • 你可能需要安装python-virtinst才可以使用virt-install
    yum -y install python-virtinst
    
  • 安装例子
    virt-install \
        --name kvm-test-centos-6.2-x64 \
        --ram 1024 \
        --vcpus 4 \
        --cdrom /opt/isos/CentOS-6.2-x86_64-bin-DVD1.iso \
        --network bridge:virbr0 \
        --vnc --vncport=5910 --vnclisten=localhost \
        --disk /opt/images/kvm-test-centos-6.2-64bit.img,size=20
    
  • 如果磁盘文件不存在,会自动创建(需要size参数),默认创建是raw磁盘镜像
  • 可以用qemu-img手动创建磁盘文件
    qemu-img create -f raw kvm-test-centos-6.2-64bit.img 20G
    
  • 这里磁盘格式常见的有两种,raw和qcow2(还有qed正在开发中,据说性能更好)
  • raw的读写性能要比qcow2好,但如果你需要快照等高级特性,可以选择qcow2
  • 如果使用qcow2,加上preallocation性能会有所提升
    qemu-img create -f qcow2 -o preallocation=metadata kvm-test-centos-6.2-64bit.img 20G
    
  • 不同的bus类型,cache类型和aio选择都会有性能有影响,所以你可希望把这些也加进去
  • 格式类似这样
    ...
        --disk path=/opt/images/kvm-test-centos-6.2-64bit.img,size=20,bus=virtio,cache=none,aio=threads,format=qcow2 \
    ...
    
  • 这里可供选择的参数有
    bus: virtio, ide
    cache: unsafe, none, writeback, writethrough, directsync
    aio: threads, native
    
  • 不同的网卡驱动类型会影响到虚拟机的网络性能,可以这样指定
    ...
        --network bridge:virbr0,model=e1000 \
    ...
    
  • 可供选择的参数有
    # 可以通过qemu-system-x86_64 -net nic,model=?查到支持的参数
    model:  ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio
    
  • virbr0是系统自动创建的桥,可以手动创建桥接设备然后指定虚拟机使用
  • 如果你的虚拟机是windows并且想使用virtio做为硬盘驱动和网卡驱动,你需要下载两个驱动文件
  • 这两个文件可以从这里下载
    磁盘驱动
    http://ishare.iask.sina.com.cn/f/24109437.html
    网卡驱动
    http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/
    virt-install \
        --name kvm-test-win2003 \
        --ram 1024 \
        --vcpus 1 \
        --cdrom /opt/isos/cn_win_srv_2003_r2_enterprise_x64_with_sp2_vl_cd1_X13-47314.iso \
        --network bridge:virbr0,model=virtio \
        --vnc \
        --disk path=/opt/images/kvm-test-win2003.img,bus=virtio,cache=none,format=qcow2,size=20 \
        --disk path=/opt/drivers/virtio-win-1.1.16.vfd,device=floppy \
        --disk path=/opt/drivers/virtio-win-0.1-12.iso,device=cdrom,perms=ro
    
  • 如果不出问题,应该可以看到安装窗口了(需要安装virt-viewer)
  • 如果没有安装virt-viewer或者你在没有安装图形的服务器上操作
    你仍然可以通过以下方法访问到安装窗口
    vncviewer vnclisten:vncport
    
  • 前面的–vnclisten就不能写localhost了
    第二种方法是:
    virt-viewer --connect qemu+ssh://user@ip_address:port/system name_of_instance
    
  • kickstart安装也可以用在virt-install中
    apt-get install apache2
    mkdir /var/www/centos
    mount -o loop /opt/isos/CentOS-6.2-x86_64-bin-DVD1.iso /var/www/centos
    cp /root/ks.cfg /var/www/centos
    
    virt-install \
        --name kvm-test-centos-6.2-x64 \
        --ram 1024 \
        --vcpus 4 \
        --location http://192.168.122.1/centos/
        --network bridge:virbr0 \
        --vnc --vncport=5910 --vnclisten=localhost \
        --disk /opt/images/kvm-test-centos-6.2-64bit.img,size=20
        --extra-args "ks=http://192.168.122.1/ks.cfg ip=192.168.122.10 ip=192.168.122.10 netmask=255.255.255.0 gateway=192.168.122.1 dns=8.8.8.8"
    
  • 安装好之后,就可以使用virsh对虚拟做一些操作了
  • virt-install的更多参数可以参考这个链接:
    http://my.oschina.net/williamherrychina/blog/56463

1.2 操作虚拟机

  • 列出正在运行的虚拟机
    virsh list
    
  • 关闭虚拟机
    virsh shutdown name_of_vm # 不会强制关闭
    # 或
    virsh destroy name_of_vm  # 强制关闭(但不会删除)
    
  • 修改虚拟机
    virsh edit name_of_vm
    
  • 会打开定义虚拟机的xml文件,修改完保存即可(如果所做的修改不正确,不会保存修改)
    应该使用这种方法修改虚拟机而不是直接编辑xml文件
    修改完后可以用virsh start name_of_vm启动虚拟机
  • 删除虚拟机
    virsh undefine name_of_vm
    
  • 删除虚拟机实际只是删除了/etc/libvirt/qemu/下的xml文件,磁盘镜像文件并没有删除

1.3 虚拟机的离线迁移

  • 虚拟机的离线迁移比较间单,拷贝镜像文件和xml文件到另一台主机,再define就可以
    拷贝之前最好pause虚拟机
    scp /opt/images/kvm-test-centos-6.2-64bit.img \
        /etc/libvirt/qemu/kvm-test-centos-6.2-64bit.xml \
        root@another_host:
    
    这时你可能会发现,前面选择qcow2会是个好主意(镜像文件会比较小) 不过没关系,可以用qemu-img convert转格式的
    qemu-img convert -f raw -O qcow2 kvm-test-centos-6.2-64bit.img kvm-test-centos-6.2-64bit.img.qcow2
    
  • 拷贝完成之后在目标机上定义
    # 使和xml文件中定义的一致
    mkdir /opt/images
    mv kvm-test-centos-6.2-64bit.img /opt/images
    # 定义虚拟机
    virsh define kvm-test-centos-6.2-64bit.xml
    
  • 我是从ubuntu迁移到centos上的,如果你和我一样遇到这个报错
    error: Failed to define domain from kvm-test-centos-6.2-x64.xml
    error: Cannot find QEMU binary /usr/bin/kvm: No such file or directory
    
  • 做个软链接就可以了
    ln -sv /usr/libexec/qemu-kvm /usr/bin/kvm
    
  • 现在通过virsh list –all应该可以看到刚定义的虚拟机了(state是shut off)
  • 用virsh start kvm-test-centos-6.2-64bit启动虚拟机
  • 我得到这样的报错(如果是相同的主机之间迁移应该不会碰到)
    error: Failed to start domain kvm-test-centos-6.2-x64
    error: internal error Process exited while reading console log output: Supported machines are:
    pc         RHEL 6.2.0 PC (alias of rhel6.2.0)
    rhel6.2.0  RHEL 6.2.0 PC (default)
    rhel6.1.0  RHEL 6.1.0 PC
    rhel6.0.0  RHEL 6.0.0 PC
    rhel5.5.0  RHEL 5.5.0 PC
    rhel5.4.4  RHEL 5.4.4 PC
    rhel5.4.0  RHEL 5.4.0 PC
    
  • 修改虚拟机,将
    ...
        <type arch='x86_64' machine='pc-1.0'>hvm</type>
    ...
    
  • 改为
    ...
        <type arch='x86_64' machine='rhel6.2.0'>hvm</type>
    ...
    

1.4 虚拟机的在线迁移

  • nfs做为共享存储
    yum -y install nfs-utils
    yum -y install rpcbind
    
    mkdir /images
    cat >> /etc/exports << EOF
    /images 192.168.0.0/24(sync,rw,no_root_squash)
    EOF
    /etc/init.d/rpcbind restart
    /etc/init.d/nfs restart
    
  • 在要迁移的原主机上挂载
    virsh destroy kvm-test-centos-6.2-64bit
    cp /opt/images/kvm-test-centos-6.2-64bit /opt
    mount -t nfs 60.12.206.101:/images /opt/images/
    cp /opt/kvm-test-centos-6.2-64bit /opt/images/
    virsh start kvm-test-centos-6.2-64bit
    
  • 在要迁移的目标上机上持载
    mkdir /opt/images
    mount -t nfs 60.12.206.101:/images /opt/images/
    
  • 开始迁移
    可以在源主机上
    virsh migrate --live --verbose kvm-test-centos-6.2-64bit qemu+ssh://60.12.206.107:59878/system
    
    或者在另外一台主机上
    # command
    virsh --connect qemu+ssh://root@60.12.206.101:59878/system \
        migrate --live --verbose kvm-test-centos-6.2-x64 \
        qemu+ssh://root@60.12.206.107:59878/system
    
    # output
    root@60.12.206.101's password: 
    root@60.12.206.107's password: 
    Migration: [100 %]
    
  • 不使用共享存储也可以,需要手动将磁盘镜像拷贝到目标主机相同的目录下
    virsh migrate有–copy-storage-all的,仍然需要在目标主机相同目录下创建镜像文件
  • 在我的测试中事先手动用scp拷贝镜像文件要快很多,虽然创建镜像文件的时候指定为20G
    但实际的大小只有1.1G(qcow2),用–copy-storage-all要拷贝20G,scp只需要拷贝1.1G
  • 如果你在运行迁移命令时遇到这个错误:
    error: internal error hostname on destination resolved to localhost, but migration requires an FQDN
    
  • 查看你的主机名是不是localhost,修改之
    这里有个图文并茂的迁移文档
    http://libvirt.org/migration.html
Date: 2012-05-09 09:06:02 CST
HTML generated by org-mode 6.33x in emacs 23

No comments:

Post a Comment