一. KVM安装
1. 基础安装
# 下载源
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 安装基础软件
yum -y install tree vim wget bash-completion bash-completion-extras lrzsz net-tools sysstat iotop iftop htop unzip nc nmap telnet
# 查看是否支持虚拟化
egrep 'vmx|svm' /proc/cpuinfo
# 查看物理机SN号
dmidecode -t 1
Serial Number: USE933N3P3
# 是否有KVM模块
lsmod | grep kvm
kvm_intel 188740 0
kvm 637289 1 kvm_intel
irqbypass 13503 1 kvm
# 安装
yum install -y kvm virt-* libvirt bridge-utils qemu-img acpid
# 启动
systemctl enable --now libvirtd
systemctl enable --now acpid.service
# kvm 虚拟机镜像管理工具 guestfish, 可以在虚拟机关机的情况下,对镜像内的文件系统做修改,例如,从模板机克隆了一台虚拟机,可以使用 guestfish 修改镜像里面的主机名、ip、网关等的信息,修改保存后开启虚拟机就可以ssh连接进去,对提升工作效率有很大的帮助
# 例如对磁盘文件进行修改: virt-edit -a /var/lib/libvirt/images/centos6.5-template.qcow2 /etc/hosts
yum -y install libguestfs-tools
2. VNC
# 安装VNC
yum -y install tigervnc tigervnc-server
# 复制vnc的启动操作脚本, vncserver@:1.service中的:1表示桌面号,启动的端口号就是5900+桌面号,即是5901,如果再有一个就是2啦,端口号加1就是5902,以此类推
cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
# 编辑文件,再 ExecStart 中将用户改为 root,也可以用普通用户启动
vim /etc/systemd/system/vncserver@\:1.service
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=simple
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver_wrapper root %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
[Install]
WantedBy=multi-user.target
# 设置密码, 输入2次
vncpasswd
# 选择n
Would you like to enter a view-only password (y/n)? n
# 启动
systemctl daemon-reload
systemctl enable --now vncserver@\:1.service
# 检查是否启动
netstat -lnpt | grep Xvnc
# VNC端口, 一般是5901
ps -ef | grep -i xvnc
3. 创建并绑定网桥
# 创建网桥,
brctl addbr br0
# 可以按照配置文件操作
### 给网桥绑定网卡,会导致ssh连接失败,一般需要跑机房, 3条命令一起执行
# brctl addif br0 eth0;ip addr del dev eth0 192.168.1.183/24;ifconfig br0 192.168.1.183/24 up
# 创建网桥br0的文件,复制eth0的网卡文件,然后重启, eth0网卡不能有IP地址,而是直接走网桥, ifcfg-eth0的网卡文件也不能删除
cd /etc/sysconfig/network-scripts/
[root@yeemiao-kvm-e194183-test network-scripts]# vim ifcfg-eth0
TYPE=Ethernet
BRIDGE=br0 # 给网桥绑定网卡
NAME=eth0
DEVICE=eth0
ONBOOT=yes
[root@yeemiao-kvm-e194183-test network-scripts]# vim ifcfg-br0
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
#UUID=6eb246a9-7459-4f41-ab0c-6fe22f82c08b
DEVICE=br0
ONBOOT=yes
IPV6_PRIVACY=no
IPADDR=192.168.1.183
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.1
# 全局网关文件
vim /etc/sysconfig/network
GATEWAY=192.168.1.1
# 全局DNS文件
vim /etc/resolv.conf
4. 创建虚拟机
# 创建虚拟机
virt-install --name=test --ram=8192 --vcpus=4 --os-type=linux --os-variant=centos7.0 --network bridge=br0 --graphics=vnc,password=123,port=5913,listen=0.0.0.0 --noautoconsole --accelerate --cdrom=/migrate/CentOS-7-x86_64-DVD-1804.iso --disk path=/migrate/ariot1.qcow2,device=disk,format=qcow2,bus=virtio,cache=writeback,size=100
# 克隆虚拟机
-o 被克隆虚拟机
-n 克隆后新的虚拟机
-f 克隆后新虚拟机的磁盘
# 根据磁盘文件克隆
virt-clone -o k8s-node-for-clone -n yunwei-k8s-worker33_192.168.1.45 -f /data/kvm/yunwei-k8s-worker33_192.168.1.45.img
迁移对比
二. 迁移方式
1. KVM 迁移及常用命令
# 列出虚拟机
virsh list --all
# 关机, 有些时候 shutdown 没反应 是因为Linux上没有装 acpid
virsh shutdown $name
# 克隆虚拟机
virt-clone -o base-image_192.168.1.99 -n zabbix_control_192.168.1.208 -f /data/kvm/zabbix_control_192.168.1.208.qcow2
# 安装 acpid, acpid是一个用户空间的服务进程,充当Linux内核与应用程序之间通信的接口,负责将kernel中的电源管理事件转发给应用程序
yum install acpid -y
systemctl enable acpid; systemctl start acpid
# 然后再关机
virsh shutdown $name
# 如果还不行那就拔虚拟机电源
virsh destroy $name
# 备份虚拟机配置,这里以 Server2016_jenkins 虚拟机为例
virsh dumpxml Server2016_jenkins >Server2016_jenkins.xml
# 暂停的虚拟机恢复
virsh resume kvm-CentOS-7-130
# 找到虚拟机的磁盘路径
virsh domblklist Server2016_jenkins
# 查看该虚拟机的磁盘格式
[root@centos18 ~]# qemu-img info /virmachine/Server2016_jenkins
image: /virmachine/Server2016_jenkins
file format: qcow2
virtual size: 256G (274877906944 bytes)
disk size: 256G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
# 创建虚拟磁盘
qemu-img create -f qcow2 /home/kvm/sonarqube_192.168.204.44-1.qcow2 150g
# 复制磁盘文件到
scp Server2016_jenkins 172.16.206.17:/bigdata/vmdisk/
# 修改虚拟机配置,过滤 file=, 修改他的磁盘路径,改为/bigdata/vmdisk/Server2016_jenkins
vim Server2016_jenkins.xml
<source file='/bigdata/vmdisk/Server2016_jenkins'/>
# 修改虚拟机名称, 名称最好加上虚拟机的ip,方便查找
<name>dc-biz-082ca69-test_192.168.1.207</name>
# 定义--通过xml文件创建虚拟机
virsh define Server2016_jenkins.xml
# 启动
virsh start Server2016_jenkins
# 查看虚拟机VNC号, 可以通过VNC软件连接到虚拟机
virsh vncdisplay Server2016_jenkins
# 物理机进入虚拟机console
virsh console Server2016_jenkins
# 修改虚拟机信息
virsh edit Server2016_jenkins
# 给虚拟机拍摄快照
virsh snapshot-create Server2016_jenkins
# 查看快照
[root@kvm-232 ~]# virsh snapshot-list zabbix_control_192.168.1.208
名称 生成时间 状态
------------------------------------------------------------
1677122883 2023-02-23 11:28:03 +0800 running
# 恢复快照, 格式: virsh snapshot-revert 【虚拟机名】 【快照名】
virsh snapshot-revert zabbix_control_192.168.1.208 1677122883
# 删除快照
virsh snapshot-delet Server2016_jenkins
## 删除虚拟机
# 先找到虚拟机的磁盘文件,然后直接删除磁盘,取消定义就可以删除
virsh domblklist Server2016_jenkins
virsh undefine Server2016_jenkins
# 虚拟机关机
virsh shutdown Server2016_jenkins
# 修改磁盘文件内容,需要等待一下,比如修改磁盘的 /etc/fstab 文件
virt-edit -a dc-biz-082ca69-test_192.168.1.207.qcow2 /etc/fstab
# 虚拟机启动CPU问题导致启动不了,将虚拟机的xml文件中CPU的配置修改为本机的(如下查询到的) <model>Broadwell-IBRS</model>
[root@kvm-232 kvm]# virsh capabilities
<capabilities>
<host>
<uuid>4c4c4544-0031-5210-8044-c7c04f375633</uuid>
<cpu>
<arch>x86_64</arch>
<model>Broadwell-IBRS</model>
<vendor>Intel</vendor>
<microcode version='218104699'/>
<counter name='tsc' frequency='2095077000' scaling='yes'/>
<topology sockets='1' cores='12' threads='2'/>
# 修改xml文件的CPU类型,过滤model
<model>Broadwell-IBRS</model>
# 给虚拟机冷加磁盘, 也可以直接修改xml文件,然后define
virsh edit dc-biz-6d58fd7-test_192.168.1.206
# 先将虚拟机关机,然后添加一段disk信息,需要修改 target 信息和磁盘路径
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback'/>
<source file='/data/kvm/dc-biz-6d58fd7-test_192.168.1.206-1.qcow2'/>
<target dev='vdb' bus='virtio'/>
</disk>
# 启动虚拟机, 然后分区==》文件系统==》挂载==》/etc/fstab
# 给虚拟机热加磁盘,virsh进入控制台,writeback 模式,唯一的缺点就是写操作的数据掉电可能丢失,无法保证数据完整性,是默认缓存模式
[root@kvm-232 kvm]# cat disk.xml
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback'/>
<source file='/data/kvm/dc-biz-6d58fd7-test_192.168.1.206-1.qcow2'/>
<target dev='vdb' bus='virtio'/>
</disk>
# 进入控制台
virsh
attach-device --persistent dc-biz-6d58fd7-test_192.168.1.206 disk.xml
# 进入后如下
virsh # attach-device --persistent dc-biz-6d58fd7-test_192.168.1.206 disk.xml
成功附加设备
# kvm虚拟机无法通过shutdown关机,是因为操作系统安装的centos为最小化安装,没有安装电源管理程序,也就是acpid
yum install acpid -y
systemctl enable --now acpid.service
- 还原结果
2. VMware迁移
● 通过克隆迁移, 克隆的虚拟机名字, 可以在后面价格后缀, 迁移成功后,删除原来的再改回来即可
● 迁移后
3. Kvm迁移Esxi
● 迁移前一定要记录该虚拟机的配置
● 风险是网卡信息没了,迁移后需要重新配置
# 关闭正在运行的虚拟机
virsh shutdown moon-mk1
# 找到磁盘文件
[root@huawei-rh2288h-v3 ~]# virsh dumpxml moon-mk1 |grep file=
<source file='/var/lib/libvirt/images/moon-mk1.qcow2'/>
# 先备份下qcow2文件, 然后将qcow2传输到VMware的机器上
# 将kvm的qcow2文件转为为VMware可识别的vmdk
qemu-img convert /var/lib/libvirt/images/moon-mk1.qcow2 -O vmdksoway1.vmdk
# 磁盘二次转换, thin的意思是 将新磁盘文件使用 精简置备模式, 如果不转换,直接就是起不来的
vmkfstools -i soway1.vmdk -d thin wayso.vmdk
# 最终得到文件
[root@localhost:/vmfs/volumes/59e733d9-f2f5d707-87a4-a0f4793694d2/soway] ls -l
total 1343488
-rw------- 1 root root 21474836480 Aug 19 14:43 wayso-flat.vmdk
-rw------- 1 root root 516 Aug 19 14:43 wayso.vmdk
# 正常启动会报错, 救援模式是可以正常启动的, 需要进入救援模式执行
chroot /mnt/sysimage
dracut --regenerate-all -f
grub2-mkconfig -o /boot/grub2/grub.cfg
exit
reboot
# 迁移后IP地址没了,但是其他资源在,需要配置IP地址信息
vim /etc/sysconfig/network-scripts/ifcfg-eth
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR=172.16.206.234
NETMASK=255.255.255.0
GATEWAY=172.16.206.1
DNS1=1.2.4.8
DNS2=114.114.114.114
# 重启
systemctl restart network
4. Esxi迁移KVM
1、 找到物理机下的真实存储磁盘
- esxiToKvm.vmdk可以看作是是esxiToKvm-flat.vmdk的链接文件
2、本地服务器和目标服务器安装转换工具
yum install libvirt* virt-* qemu-kvm* -y
3、*.vmdk转换为*.qcow2
sudo qemu-img convert -O qcow2 esxiToKvm-flat.vmdk ./etk-flat.qcow2
4、将转换好的qcow2文件传到目标服务器
scp etk-flat.qcow2 root@ip:/home
5、测试*.qcow2是否可用
qemu-img info /home/etk-flat.qcow2
6、开始安装
sudo virt-install --name=etk7 --ram=8096 --vcpus=4 --os-type=linux --os-variant=centos7.0 --network bridge=br1 --graphics=vnc,password=123,port=5911,listen=0.0.0.0 --noautoconsole --accelerate --cdrom=/migrate/CentOS-7-x86_64-DVD-1804.iso --disk path=/migrate/etk-flat.qcow2,device=disk,format=qcow2,bus=virtio,cache=writeback,size=40
7、使用vnc进行连接刚创建的etk7,进入救援模式
# 正常启动会报错, 需要进入救援模式进行一些设置,进入救援模式执行
chroot /mnt/sysimage
dracut --regenerate-all -f && grub2-mkconfig -o /boot/grub2/grub.cfg
exit
reboot
8、启动etk7,登录后核对信息