Kvm安装
kvm虚拟机管理
一、环境
role hostname ip OS
kvm_server target 192.168.32.40/24 rhel6.0_x64
vir_guest1 node4 192.168.32.34/24 rhel5.5_i386
vir_guest2 node5 192.168.32.35/24 rhel5.5_i386
manager manager 192.168.32.33/24 rhel5.5_i386
ESXi ESXi 192.168.2.251/24 ESXi 3.5
三.安装要用的软件
安装kvm模块
#yum install qemu-kvm.x86_64
安装kvm调试工具(可以不安装)
#yum install qemu-kvm-tools.x86_64
安装python组件,主要用来记录创建vm时的xml文件
#yum install python-virtinst.noarch
安装qemu组件,使用qemu命令来创建磁盘,启动虚拟机等(这个可能在安装时qemu-kvm.x86_64已安装)
#yum install qemu-img.x86_64
安装网络支持工具
#yum install bridge-utils.x86_64
安装虚拟机管理工具,使用virsh来管理虚拟机
#yum install libvirt
#lsmod | grep kvm
会显示两个模块
kvm_intel/ kvm_amd
kvm
[root@target ~]# modprobe kvm #加载kvm内核
[root@target ~]# modprobe kvm-intel #intel cpu加载kvm-intel内核,要支持全虚拟化,必须开启;要求cpu支持,通过bios可设置。
[root@target ~]# modprobe kvm-amd #amd cpu加载kvm-intel
[root@target ~]# modprobe -ls | grep kvm #查看内核是否开启
kernel/arch/x86/kvm/kvm.ko
kernel/arch/x86/kvm/kvm-intel.ko
kernel/arch/x86/kvm/kvm-amd.ko
[root@target ~]# modprobe -ls | grep kvm-intel
kernel/arch/x86/kvm/kvm-intel.ko
/etc/init.d/libvirtd start 开启服务
virsh list显示正常就OK 了
KVM 客户机网络连接有两种方式:
- 用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。NAT方式。
- 虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。Bridge方式。
Bridge方式原理
Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。
桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。
如上图,网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据。
Bridge方式的适用范围
服务器主机虚拟化。
网桥方式配置步骤
1、编辑修改网络设备脚本文件,增加网桥设备br0
vi /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Ethernet
ONBOOT=yes
TYPE="Bridge"
BOOTPROTO=static
TYPE=Ethernet
IPADDR=113.31.89.200
NETMASK=255.255.255.224
GATEWAY=113.31.89.193
DNS1=202.106.0.20
DNS2=8.8.8.8
ONBOOT=yes
2、编辑修改网络设备脚本文件,修改网卡设备em1
DEVICE=em1
HWADDR=B8:2A:72:DF:51:27
TYPE=Ethernet
UUID=f11163d8-f3f0-46ce-a5e7-17c3ace47e2a
ONBOOT=yes
NM_CONTROLLED=no
BRIDGE=br0
#BOOTPROTO=static
#IPADDR=113.31.89.200
#NETMASK=255.255.255.224
#GATEWAY=113.31.89.193
#DNS1=202.106.0.20
#DNS2=8.8.8.8
#ONBOOT=yes
NM_CONTROLLED这个属性值,根据redhat公司的文档是必须设置为“no”的(这个值为“yes”表示可以由服务 NetworkManager来管理。NetworkManager服务不支持桥接,所以要设置为“no”。),但实际上发现设置为“yes”没有问题。 通讯正常。
注释:最好是把NetworkManager这个服务停止了有可能在重启网络的时候报错。
禁用网络管理器
# chkconfig NetworkManager off
# service NetworkManager stop
3、重启网络服务
#service network restart
4、校验桥接接口
#brctl show
三、安装guest虚拟机
A.text mode
文本安装,不需要宿主机提高图像接口,操作复杂
[root@dlp ~]#
mkdir -p /data/kvm/images
# create a new Storage Pool
[root@dlp ~]#
virt-install \
--name centos7 \
--ram 4096 \
--disk path=/data/kvm/centos7.img,size=30 \
--vcpus 2 \
--os-type linux \
--os-variant rhel7 \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://yum.120ask.com/RHEL7' \
--extra-args 'console=ttyS0,115200n8 serial'
Starting install...
# start installation
退出按^]
进入
virsh console centos7
如果是在安装的时候没有选择输出的终端(--extra-args 'console=ttyS0,115200n8 serial')需要用console连接
参考下面连接
http://www.aikaiyuan.com/5084.html
virt-install 说明参考
http://www.linux78.com/kvm-virt-install-command-option-parameters.html
选择文本安装模式
Text mode
Unable to read group information from repositories.
This is a problem with the generation of your install tree.
之前报这个错,是因为网络安装中yum 用的仓库重新加载过
解决办法:还原镜像中repodata下的repomd.xml文件,如果你有自定义的rpm包加入源,然后createrepo --update 后再用ks安装系统就会出现这种情况。 一般用新的镜像挂载到新的目录下来就好了。
|
|
安装好以后直接用 virsh clonse centos7 连接,优化好可以用SSH 连接。
参考连接 http://www.server-world.info/en/note?os=CentOS_7&p=kvm&f=2
B.装图像界面远程用VNC 访问
http://wenzhang.baidu.com/page/view?key=599e618ec601ae9e-1427289083
参考文档中VNC 的安装,或者搜索
1、直接通过virt-manager安装、管理虚拟机(略)
2、通过命令行安装guest虚拟机
[root@target ~]# yum install virt-viewer #开启图形控制台安装虚拟客户机需要,
[root@target ~]# virt-install \ #安装选项可用virt-install --help查看
--name node4 \ #虚拟机名
--ram=1024 \ #分配内存大小,MB
--arch=x86_64 \ #模拟的CPU 构架
--vcpus=1 \ #配置虚拟机的vcpu 数目
--check-cpu \ #检查确定vcpu是否超过物理 CPU数目,如果超过则发出警告。
--os-type=linux \ #要安装的操作系统类型,例如:'linux'、'unix'、'windows'
--os-variant=rhel5 \ #操作系统版本,如:'fedora6', 'rhel5', 'solaris10', 'win2k'
--disk path=/virhost/node7.img,device=disk,bus=virtio,size=20,sparse=true \ #虚拟机所用磁盘或镜像文件,size大小G
--bridge=br0 \ #指定网络,采用透明网桥
--noautoconsole \ #不自动开启控制台
--pxe #网络安装
四、利用virsh对虚拟机管理
1、开关机
[root@target ~]# virsh start node4 #开机
[root@target ~]# virsh create /etc/libvirt/qemu/node4.xml #直接通过主机配置文档启动主机
[root@target ~]# virsh shutdown node4 #关机
[root@target ~]# virsh destroy node4 #强制关闭电源
[root@target ~]# virsh list --all #查看虚拟机状态
Id 名称 状态
----------------------------------
18 node4 running
- node5 关闭
- win8 关闭
2、添加删除虚拟机
[root@target ~]# virsh define /etc/libvirt/qemu/node5.xml #根据主机配置文档添加虚拟机
[root@target ~]# virsh list --all #node5已经添加
Id 名称 状态
----------------------------------
18 node4 running
- node5 关闭
- win8 关闭
[root@target ~]# virsh undefine node5 #移除虚拟机
[root@target ~]# ls /etc/libvirt/qemu
networks node4.xml win8.xml
[root@target ~]# virsh list --all #node5已经被移除
Id 名称 状态
----------------------------------
18 node4 running
- win8 关闭
3、远程管理虚拟机(qemu+ssh连接)
[root@target ~]# yum install virt-viewer
[root@target ~]# export DISPLAY=192.168.40.18:0.0
[root@target ~]# virt-viewer -c qemu///system node4 #本地管理虚拟机,system:获取system权限,注意qemu后是三个/
[root@manager ~]# virt-viewer -c qemu+ssh://root@192.168.32.40/system node4 #远程linux通过virt-viewer+ssh管理虚拟机
Xlib: extension "RANDR" missing on display "192.168.40.18:0.0".
root@192.168.32.40's password:
root@192.168.32.40's password:
#会弹出virt-viwer的gtk管理界面
4、使用已存在的虚拟机配置文档安裝新的虚拟机
[root@target ~]# qemu-img create -f qcow2 /virhost/kvm_node/node6.img 20G
#为新建虚拟机生产磁盘镜像文件
[root@target ~]# virsh list
[root@target ~]# virsh dumpxml node4 >/etc/libvirt/qemu/node6.xml
#导出虚拟机node6的硬件配置信息为/etc/libvirt/qemu/node6.xml
[root@target ~]# vim /etc/libvirt/qemu/node6.xml
<domain type='kvm' id='20'> #修改node6的id号
<name>node6</name> #虚拟机node6的name
<uuid>4b7e91eb-6521-c2c6-cc64-c1ba72707fc7</uuid> #uuid必须修改,否则会和node4的冲突
<memory>524288</memory>
<currentMemory>524288</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='x86_64' machine='rhel5.4.0'>hvm</type>
<boot dev='network'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<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='qcow2' cache='none'/>
<source file='/virhost/node4.img'/> #指定新虚拟机的硬盘文件
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<mac address='54:52:00:69:d5:c7'/>
<source bridge='br0'/>
<target dev='vnet0'/>
<model type='virtio'/>
</interface>
<interface type='bridge'>
<mac address='54:52:00:69:d5:d7'/>
<source bridge='br0'/>
<target dev='vnet1'/>
<model type='virtio'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/4'/>
<target port='0'/>
</serial>
<console type='pty' tty='/dev/pts/4'>
<source path='/dev/pts/4'/>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='5900' autoport='yes' keymap='en-us'/>
</devices>
</domain>
[root@target ~]# virsh define /etc/libvirt/qemu/node6.xml
#使用虚拟描述文档建立虚拟机,可用virsh edit node6修改node6的配置文件
[root@target ~]# virsh start node6
#启动虚拟机
5 为虚拟机开启vnc
[root@target ~]# virsh edit node4 #编辑node4的配置文件;不建议直接通过vim node4.xml修改。
<graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'/>
#port='-1' autoport='yes':port自动分配,监听回环网络(virt-manager管理需要listen='127.0.0.1'),无密码
改为
<graphics type='vnc' port='5904' autoport='no' listen='0.0.0.0' keymap='en-us' passwd='xiaobai'/>
#固定vnc管理端口5904,不自动分配,vnc密码xiaobai,监听所有网络
2. 远程vnc访问地址:192.168.32.40:5904
五、存储池和存储卷的管理
1.创建 KVM主机存储池
1).创建基于文件夹(目录)的存储池
[root@target virhost]# virsh pool-define-as vmware_pool --type dir --target /virhost/vmware
#定义存储池vmware_pool
或
[root@target virhost]# virsh pool-create-as --name vmware_pool --type dir --target /virhost/vmware
#创建存储池vmware_pool,类型为文件目录,/virhost/vmware,与pool-define-as结果一样
2).创建基于文件系统的存储池
[root@target virhost]#virsh pool-define-as --name vmware_pool --type fs --source-dev /dev/vg_target/LogVol02 --source-format ext4 --target /virhost/vmware
或
[root@target virhost]#virsh pool-create-as --name vmware_pool --type fs --source-dev /dev/vg_target/LogVol02 --source-format ext4 --target /virhost/vmware
3).查看存储池信息
[root@target virhost]# virsh pool-info vmware_pool #查看存储域(池)信息
名称: vmware_pool
UUID: 2e9ff708-241f-fd7b-3b57-25df273a55db
状态: running
Persistent: no
自动启动: no
容量: 98.40 GB
分配: 18.39 GB
可用: 80.01 GB
4).启动存储池
[root@target virhost]# virsh pool-start vmware_pool #启动存储池
[root@target virhost]# virsh pool-list
名称 状态 自动开始
-----------------------------------------
default 活动 yes
virhost 活动 yes
vmware_pool 活动 no
5)销毁存储域,取消存储池
[root@target virhost]# virsh pool-destroy vmware_pool #销毁存储池
[root@target virhost]# virsh pool-list --all
名称 状态 自动开始
-----------------------------------------
default 活动 yes
virhost 活动 yes
vmware_pool 不活跃 no
[root@target virhost]# virsh pool-undefine vmware_pool #取消存储池的定义
[root@target virhost]# virsh pool-list --all
名称 状态 自动开始
-----------------------------------------
default 活动 yes
virhost 活动 yes
2.创建了存储池后,就可以创建一个卷,这个卷是用来做虚拟机的硬盘
[root@target virhost]# virsh vol-create-as --pool vmware_pool --name node6.img --capacity 10G --allocation 1G --format qcow2
#创建卷 node6.img,所在存储池为vmware_pool,容量10G,初始分配1G,文件格式类型qcow2
[root@target virhost]# virsh vol-info /virhost/vmware/node6.img #查看卷信息
名称: node6.img
类型: 文件
容量: 10.00 GB
分配: 136.00 KB
3.在存储卷上安装虚拟主机
[root@target virhost]#virt-install --connect qemu:///system \
-n node7 \
-r 512 \
-f /virhost/vmware/node7.img \
--vnc \
--os-type=linux \
--os-variant=rhel6 \
--vcpus=1 \
--network bridge=br0 \
-c /mnt/rhel-server-6.0-x86_64-dvd.iso
六、虚拟机的迁移(vmware 2 kvm)
1.安装软件
[root@target ~]# yum install -y virt-v2v.x86_64
[root@target ~]# rpm -ivh libguestfs-winsupport-1.0-7.el6.x86_64.rpm virtio-win-1.2.0-1.el6.noarch.rpm
#虚拟机为windows时需要libguestfs-winsupport 包来支持 NTFS 文件系统和 virtio-win 包来支持 Windows para-virtualized 存储和网络设备驱动
2.创建 KVM 主机存储域(略)
virt-v2v 在迁移虚拟机的过程中,需要拷贝被迁移虚拟机到 KVM 主机预先定义的存储池中。
3.创建 KVM 主机网络接口(略)
虚拟机在迁移之后将连接 KVM 主机网络, 因此主机必须有一个与之相匹配的网络接口,比如说网桥。
4.在 KVM 主机上创建或修改 $HOME/.netrc 文件,添加 VMware ESXi 服务器的用户名和密码。
[root@target ~]# cat ~/.netrc
machine 192.168.2.251 login root password xxxxxx
[root@target ~]# chmod 0600 ~/.netrc
5.Vmware ESXi到KVM的迁移
[root@target ~]# virt-v2v -ic esx://192.168.2.251/?no_verify=1 -op virhost -b br0 ipserver
** HEAD https://192.168.2.251/folder/tserver21/RHEL4.6-flat.vmdk?dcPath=ha-datacenter&dsName=ESX35-bak%3Astorage1 ==> 401 Unauthorized
** HEAD https://192.168.2.251/folder/tserver21/RHEL4.6-flat.vmdk?dcPath=ha-datacenter&dsName=ESX35-bak%3Astorage1 ==> 200 OK
** GET https://192.168.2.251/folder/tserver21/RHEL4.6-flat.vmdk?dcPath=ha-datacenter&dsName=ESX35-bak%3Astorage1 ==> 200 OK (2084s)
unknown filesystem /dev/hda
unknown filesystem /dev/fd0
virt-v2v: Installation failed because the following files referenced in the configuration file are required, but missing: rhel/4/kernel-smp-2.6.9-89.EL.i686.rpm
virt-v2v: 非 virtio 驱动程序配置的 tserver21
#所有选项可通过配置文件/etc/virt-v2v.conf来指定
#-op:指定用于转换后的存储域(pool),virhost
#-b:指定网络为网桥br0
#-ic:指定要转换的源地址
[root@target kvm_node]# virsh list --all
Id 名称 状态
----------------------------------
1 node4 running
- node5 关闭
- tserver21 关闭
- win8 关闭
[root@target kvm_node]# virsh start tserver21
6.KVM到KVM迁移
[root@target kvm_node]# virt-v2v -ic qemu+ssh://192.168.32.179/system -op virhost -b br0 node6
root@192.168.32.179's password:
root@192.168.32.179's password:
unknown filesystem label SWAP-vda3
virt-v2v: The connected hypervisor does not support a machine type of rhel5.4.0. It will be set to the current default.
virt-v2v: virtio 驱动程序配置的 node6
[root@target kvm_node]# virsh list --all
Id 名称 状态
----------------------------------
1 node4 running
- node5 关闭
- node6 关闭
- tserver21 关闭
- win8 关闭
[root@target kvm_node]# virsh start node6
显示虚拟机屏幕:
virt-viewer vm1
克隆虚拟机:
virt-clone -o vm1 -n vm5 -f /var/ftp/xen/vm5.img -d
远程起动VM1:
virt-viewer -c xen+ssh:192.168.1.188 vm1
device eth0 does not seem to be present, delaying initialization
KVM虚拟机启动出错,就把这个虚拟机删除掉重新建立,系统虚拟硬盘使用之前的,启动系统后不能上网,通过ifconfig查看网卡没启动,遂启动网卡服务,但是出错,就是:device eth0 does not seem to be present, delaying initialization,然后想到是不是ifcfg-eth0的配置文件里保存了以前的MAC地址,就把这一行删除掉在重启网卡,还是一样的错误,随后网上查了下资料,把/etc/udev/rules.d/70-persistent-net.rules 删除后重启机器就可以了,因为这个文件绑定了网卡和mac地址,所以换了网卡以后MAC地址变了,所以不能正常启动,也可以直接编辑这个配置文件把里面的网卡和mac地址修改乘对应的,不过这样多麻烦,直接删除重启,它会自动生成个。
Vim /etc/sysconfig/network-scripts/ifcfg-eth0
ifcfg-eth0的配置文件里保存了以前的MAC地址,就把这一行删除掉在重启网卡
/etc/udev/rules.d/70-persistent-net.rules 删除后重启机器
因为这个文件绑定了网卡和mac地址,所以换了网卡以后MAC地址变了,所以不能正常启动,也可以直接编辑这个配置文件把里面的网卡和mac地址修改乘对应的,不过这样多麻烦,直接删除重启,它会自动生成个。
qcow2磁盘损坏,无法启动kvm虚机
进入到虚机disk的目录下,执行qemu-img check disk,检查镜像数据的一致性,发现很多error,执行qemu-img check -r all disk命令,对磁盘镜像进行修复,最后重启虚机即可
qemu-img check命令详解
qemu-img check [-f fmt] [--output=ofmt] [-r [leaks | all]] filename
对磁盘镜像文件进行一致性检查,查找镜像文件中的错误,目前仅支持对“qcow2”、“qed”、“vdi”格式文件的检查。其中,qcow2是QEMU 0.8.3版本引入的镜像文件格式,也是目前使用最广泛的格式。qed(QEMU enhanced disk)是从QEMU 0.14版开始加入的增强磁盘文件格式,为了避免qcow2格式的一些缺点,也为了提高性能,不过目前还不够成熟。而vdi(Virtual Disk Image)是Oracle的VirtualBox虚拟机中的存储格式。
参数-f fmt是指定文件的格式,如果不指定格式qemu-img会自动检测,filename是磁盘镜像文件的名称(包括路径)。
如果指定了“-r”,qemu-img将尝试修复在检查时发现的任何非一致性。在使用qemu-img check -r 命令执行,最好对磁盘文件进行备份,-r leaks 仅修复集群损坏。
-r all修复各种类型的错误,该命令执行后,会有一个退出码,不同的数字,表示不同的检测结果
0 检查完成,镜像(现在)是一致的
1 检查由于内部错误而未完成
2 检查完成,镜像已损坏
3 检查完成,镜像已泄漏集群,但没有损坏
63 镜像格式不支持检查
参考链接:
https://lvjianzhao.gitee.io/lvjianzhao/2021/02/04/qcow2%E7%A3%81%E7%9B%98%E6%8D%9F%E5%9D%8F%EF%BC%8C%E6%97%A0%E6%B3%95%E5%90%AF%E5%8A%A8kvm%E8%99%9A%E6%9C%BA/