一、准备3台虚拟机
1. 准备3台统一网段的虚拟机
3台虚拟机信息如下:
编号 | IP | 安装程序 | 作用 |
kvm1 | 192.168.153.129 | kvm、qemu、liblibvirt、virt-install、virt-manager等 | kvm宿主机,安装虚拟机及演示迁移 |
kvm2 | 192.168.153.139 | kvm、qemu、liblibvirt、virt-install、virt-manager等 | kvm宿主机,安装虚拟机及演示迁移 |
kvm3 | 192.168.153.149 | nfs | kvm虚拟机的NFS服务器2 |
2. 修改hostname
3. 配置虚拟机网络信息
4. 安装依赖的程序
注意:使用VMware安装时,需要开启虚拟化,才能使用kvm功能,如下图所示。使用lsmod |grep kvm查看加载模块信息时,如果只查看到kvm_intel,没有kvm,则需要更新系统内核。例如:yum -y update。
默认情况下,kvm、qemu、liblibvirt、virt-install、virt-manager等模块都已安装,可以使用rpm -qa|grep app的方式确认是否已安装。
二、使用一台虚拟机作为NFS服务器
1. 安装NFS
yum install nfs-utils
2. 查看是否安装成功
rpm -qa|grep nfs
3. 创建共享目录
在/root目录下新建kvmpool目录
mkdir kvmpool
4. 配置并启动NFS
vim /etc/exports
填入
/root/kvmpool *(rw,sync,no_root_squash)
5. 重启rpcbind服务,并将rpcbind服务设置为开机自启动
systemctl restart rpcbind
systemctl enable rpcbind
6. 启动nfs服务,并将nfs服务设置为开机自启动
systemctl restart nfs-server
systemctl enable nfs-server
7. 开放防火墙相关服务
firewall-cmd --add-service=rpc-bind
firewall-cmd --add-service=rpc-bind --permanent
firewall-cmd --add-service=nfs
firewall-cmd --add-service=nfs --permanent
firewall-cmd --add-service=mountd
firewall-cmd --add-service=mountd --permanent
没有加 --permanent,重启后,防火墙将不再开放相关服务
8. 开放端口
使用rpcinfo -p查看相关端口信息
iptables -A INPUT -p TCP --dport 111 -m state --state NEW -j ACCEPT
iptables -A INPUT -p UDP --dport 111 -m state --state NEW -j ACCEPT
iptables -A INPUT -p TCP --dport 2049 -m state --state NEW -j ACCEPT
iptables -A INPUT -p UDP --dport 2049 -m state --state NEW -j ACCEPT
9. 在kvm机器上查看NFS服务器的共享信息
showmount -e 192.168.153.149
10. 在kvm机器上创建挂载NFS共享目录
创建nfs目录,两台kvm机器的NFS共享目录的路径要求一样。
注意:一般使用root用户启动虚拟机管理工具,所以建议用root用户创建nfs共享目录,否则,可能会出现访问权限不够的问题。例如在/root目录下创建共享目录。
mkdir nfs
mount -t nfs 192.168.153.149:/root/kvmpool ./nfs
使用df -h可以查看挂载信息
注意:kvm虚拟机重启后,挂载的目录将失效,需要重新挂载。
三、创建虚拟机
1. 在kvm机器上配置机器别名
配置/etc/libvirt/libvirt.conf
2. 使用virt-manager打开虚拟机管理工具
3. 配置文件路径
在虚拟机管理工具的"edit->connection Details”界面中,创建镜像文件
4. 新建虚拟机
5. 选择挂载的镜像
6. 设置CPU和内存
7. 设置镜像文件
设置镜像文件大小时,镜像文件大小建议比可使用空间小1.5G以上,否则,可能会出现空间不够而导致安装过程中卡死的现象出现。
8. 设置虚拟机名称
修改名称,点"finish"开始创建虚拟机
9. 配置虚拟机参数
设置root密码,其它都默认
10. 安装完成后,重启虚拟机。
四、测试虚拟机热迁移
1. 登录虚拟机
使用账号登录虚拟机
2. 创建一个循环进程
虚拟机默认安装了python,创建一个python程序。例如,创建一个每3秒写当前时间到文件中的程序:
import time
import datetime
def log_time():
while True:
with open('log.txt', 'a') as f:
print(datetime.datetime.now())
f.write(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + '\n')
time.sleep(3) # 等待3秒
if __name__ == '__main__':
log_time()
3. 使用virsh工具
在root用户下,执行virsh进入工具界面
4. 编辑虚拟机参数
使用list --all查看现有虚拟机,然后使用edit vm_name编辑虚拟机参数。如下:
修改虚拟机磁盘cache选项,writeback和writethrough模式不支持动态迁移。如下:
5. 关闭目标机器的防火墙
systemctl stop firewalld
不关闭可能会出现No route to host的情况,也可以通过打开指定防火墙端口的方式解决。
6. 执行迁移操作
virsh migrate <domain> --desturi <desturi> --persistent --undefinesource --offline
--desturi:迁移目的的URI,如:qemu+ssh://192.168.153.139/system
--persistent: 永久迁移(将虚拟机的配置文件复制到迁移目的节点)
--undefinesource: 在源节点中反定义虚拟机(删除源节点的虚拟机配置文件)
--live: 虚拟机在线迁移(动态迁移)
--offline: 虚拟机离线迁移(静态迁移)
例如:
virsh migrate subcentos --desturi kvmlab2 --live
或者
virsh migrate subcentos --desturi qemu+ssh://root@192.168.153.139/system --live
注意:没有加--persistent参数,迁移到目标机器上后,子虚拟机关停服务,会自动删除虚拟机。
附录:安装过程中遇到的问题
KVM安装过程中遇到的问题
1. 虚拟机管理工具报错:内部错误:没法找到适合 x86_64 的模拟器
安装完 KVM 以后,使用virt-manager启动虚拟机管理工具,管理工具报错:内部错误:没法找到适合 x86_64 的模拟器,使用命令systemctl status libvirtd查看日志。
过滤出关键信息为:symbol SSL_CONF_CTX_set_ssl_ctx, version libssl.so.10 not defined in file libssl.so.10 with link time reference
解决方法:
(1)安装openssl
yum -y install openssl
(2)重启libvirtd
systemctl restart libvirtd
(3)查看libvirtd状态日志
systemctl status libvirtd
日志异常信息不再出现。
2. 系统内核没有kvm模块
VMware安装完centos系统后,使用lsmod |grep kvm 查看kvm模块时,没有kvm模块,如下图所示:
这是因为centos安装包内核版本太低原因导致的,使用yum -y update 更新内核后
出现了kvm模块
注意,没有kvm模块,使用kvm的虚拟机管理工具创建虚拟机时,会创建失败。
3. 虚拟机管理工具报错:配置完虚拟机参数,创建虚拟机时,界面卡死
虚拟机管理工具创建虚拟机过程中,配置完虚拟机的内存、CPU和磁盘空间等参数后,创建虚拟机时,界面卡死,没有异常信息。
使用 virt-install命令安装,创建失败时,会打印创建失败的原因,有利于解决创建失败的问题。例如:
virt-install --name subcentos --memory 2048 --vcpus 2 \
--disk path=/home/zqs/Img/subcentos.qcow2,size=7 --cdrom /home/zqs/Share/CentOS-7.2-x86_64-DVD-1511.iso \
--graphics vnc,port=5900,listen=0.0.0.0,password=123456 \
其中:
-n NAME, --name=NAME:虚拟机名称,需全局惟一;
-r MEMORY, --ram=MEMORY:虚拟机内在大小,单位为MB;
--vcpus=VCPUS[,maxvcpus=MAX][,sockets=#][,cores=#][,threads=#]:VCPU个数及相关配置;
--cpu=CPU:CPU模式及特性,如coreduo等;可以使用qemu-kvm -cpu ?来获取支持的CPU模式;
-c CDROM, --cdrom=CDROM:光盘安装介质;
--disk=DISKOPTS:指定存储设备及其属性;格式为--disk /some/storage/path,opt1=val1,opt2=val2等;常用的选项有:
device:设备类型,如cdrom、disk或floppy等,默认为disk;
bus:磁盘总结类型,其值可以为ide、scsi、usb、virtio或xen;
perms:访问权限,如rw、ro或sh(共享的可读写),默认为rw;
size:新建磁盘映像的大小,单位为GB;
cache:缓存模型,其值有none、writethrouth(缓存读)及writeback(缓存读写);
format:磁盘映像格式,如raw、qcow2、vmdk等;
sparse:磁盘映像使用稀疏格式,即不立即分配指定大小的空间;
--nodisks:不使用本地磁盘,在LiveCD模式中常用;
--graphics TYPE,opt1=val1,opt2=val2:指定图形显示相关的配置,此选项不会配置任何显示硬件(如显卡),而是仅指定虚拟机启动后对其进行访问的接口;
TYPE:指定显示类型,可以为vnc、sdl、spice或none等,默认为vnc;
port:TYPE为vnc或spice时其监听的端口;
listen:TYPE为vnc或spice时所监听的IP地址,默认为127.0.0.1,可以通过修改/etc/libvirt/qemu.conf定义新的默认值;
password:TYPE为vnc或spice时,为远程访问监听的服务进指定认证密码
-w NETWORK, --network=NETWORK,opt1=val1,opt2=val2:将虚拟机连入宿主机的网络中,其中NETWORK可以为:
bridge=BRIDGE:连接至名为“BRIDEG”的桥设备;
network=NAME:连接至名为“NAME”的网络;
--livecd: 把光盘当作LiveCD;
--os-type=DISTRO_TYPE:操作系统类型,如linux、unix或windows等;
-l LOCATION, --location=LOCATION:安装源URL,支持FTP、HTTP及NFS等,如ftp://172.16.0.1/pub;
4. 使用virt-install安装虚拟机报错,提示:Permission denied
使用root权限创建虚拟机时,提示权限不够。如下图:
切换到普通用户zqs下,创建虚拟机。或者修改/home/zqs目录的权限。
5. 使用virt-install安装虚拟机报错,提示:Guest Is already in use
使用virsh undefine subcentos(subcentos是虚拟机名字)
6. 热迁移过程中提示不安全迁移,cache不为None
报错信息如下:
解决方法:
使用list --all查看现有虚拟机,然后使用edit vm_name编辑虚拟机参数。如下:
修改虚拟机磁盘cache选项,writeback和writethrough模式不支持动态迁移。如下:
重启虚拟机
7. 热迁移过程中,提示目的主机的hostname为localhost,但是需要为FQDN
报错信息如下:
修改kvm源节点和目的节点的主机名
vi /etc/hostname
重启kvm虚拟机
8. 热迁移过程中,提示不能进入共享的存储文件
报错信息如下:
解决方法:
vim /etc/libvirt/qemu.conf
把user和group的注释去掉,放开root权限
重启libvirt
systemctl restart libvirtd.service
9. 热迁移过程中,提示不能打开共享的存储文件
报错信息如下:
解决方法:
vim /etc/libvirt/qemu.conf
把user和group的注释去掉,放开root权限
重启libvirt
systemctl restart libvirtd.service
10. 热迁移过程中,提示Name or service not known
报错信息如下:
解决方法:
vi /etc/hosts
为kvmlab2关联ip
11. 热迁移过程中,提示No route to host
报错信息如下:
解决方法:
设置ssh免密码登录。
如果上述方法不行,关闭目标机器的防火墙
systemctl stop firewalld