kvm虚拟化
Kvm的安装、KVM下的虚拟机安装和相互访问约束
推荐下载TightVNC
也可以使用 VNCSever
一、虚拟化产品介绍
linux类的虚拟化软件:
- qemu,软件纯模拟全虚拟化软件,特别慢!
- xen(半),性能特别好,需要使用专门修改之后的内核
- KVM,全虚拟机,它有硬件支持cpu,基于内核,而且不需要使用专门的内核
二、KVM虚拟化软件的安装和内部虚拟机的新建
(以下命令行操作,均在宿主机上利用VMnet8的虚拟网卡,打开Xshell后,sshroot@内部虚拟机IP后,远程登陆到内部虚拟机上来完成)
- 先查看是否开启硬件辅助虚拟化功能
在终端执行cat /proc/cpuinfo命令,找到flags部分,如果其中输出有vMX或SVM,即表明支持虚拟化技术。
root@kvm-node1
root@kvm-node1l
root@kvm-node1
- 若没有,请将虚拟机的设置中,把 cpu的虚拟化Intel或Amd芯片启用。
- 关闭防火墙
root@kvm-node1
root@kvm-node1
- 关闭 SELINUX
vim /etc/selinux/config
- 将
SELINUX=enforcing
改为SELINUX=disabled
,:wq!
保存后退出
- 开启路由转发功能,否则新建默认
Nat
模式的 kvm 虚拟机,不能借助宿主机(外虚拟机)的两块网卡进行数据转发,也不能访问外网。
- 临时生效:
echo"1" >/proc/sys/net/ipv4/ip_forward或sysctl -wnet.ipv4.ip_forward=1
- 永久生效:
vim proc/sys/net/ipv4/ip_forward,改为1,sysctl-p
- 安装kvm 的包,需要修改Centos 的源,最好是光盘源,建议采用阿里云镜像的基础源和扩展epel源,同时要更新源
yum clean all && yum makecache
- libvirt —— 作用是提供相关库文件或api接口
virt-manager,virt-install,virt-clone —— 作用是虚拟机各种管理
qemu-kvm —— 作用是 kvm模拟器
yum install libvirt* virt-* qemu-kvm* -y
systemctl start libvirtd.service
systemctl enable libvirtd.service
systemctl status libvirtd.service
- 准备在虚拟机 Centos7.6(外)中,利用KVM虚拟化技术新建一个内部的虚拟机Centor7.6
(地址是KVM中的dhcp分配,默认在192.168.122.X这个地址段内)。
(1)在宿主机上完成分发软件TightVNC
或者VNC Viewer 4.exe
的安装
注意只装客户端,暂时不需要装服务器端。
(2)提前做好准备工作,需要把安装内部虚拟机的ISO包,提前拷贝到外虚拟机 Centos7(外)的某个目录中,假设为/opt。
cd/opt
pwd
ls —ial
(3)利用安装好KVM以后的virt命令新建一个虚拟机
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name INCentos7 --memory 2048 --vcpus 2 --disk /opt/INCentos7.raw,format=raw,size=5 --cdrom/opt/CentOS-7-x86_64-DVD-1810.iso --network networK=default --graphics vnc,listen=0.0.0.0 --noautoconsole
注意:
- 这条命令中新建虚拟机的磁盘为raw格式,raw为原始数据格式,它不支持做快照,但访问性能好。其他磁盘格式如qcow2为压缩的支持快照,虚拟机的磁盘可以在后期进行转换。
- 这条命令按下回车健以后,请马上在宿主机 Win10上打开VNC View4软件的客户端,输入10.0.0.200:0进入KVM的内部虚拟机 Centos7的安装界面,因为是内部虚拟机仅仅做一些简要测试,在安装过在中找们选择最小化安装,以便减少硬盘的磁盘空间,
网卡etho生效且地址建议自动获取,默认地址段在192.168.122.x(后续测试要用),安装后需要点击reboot,可能会失去vnc连接。
在外虚拟机Centos7 的shell中输入virsh list -all
,继续输入virsh start
INCentos7,重新启动内虚拟机。在宿主机上继续用VNC客户端输入10.0.0.200测试连通后,以root 登陆后输入 ip addr进入内虚拟机,以root登录后输入ip addr查看ip地址,ping 10.0.0.200测试连通后,输入 shutdown -h now
把内部虚拟机关闭;然后在外部虚拟机上也输入shutdown -h now
把外部虚拟机关闭,在宿主机的VMware workstation中新建一个快照,取名为“kvm已装,并含一个Centos内虚拟机”。 - kvm的虚拟机管理的两个文件,结构简单,
虚拟机的磁盘文件
(/opt/centos7.raw
,可以用ll -h
或du -smh *
来查看大小)
也称为虚拟机的镜像文件,其存放位置、名称、磁盘类型可以自定义。可用du - sh或ls - lh或者用qemu-img info查看该磁盘文件的详细信息。
默认的配置文件
放在/etc/libvirt/qemu/
目录下的虚拟机名.xml文件中。
是系统自动产生并存储在固定路径下,有xml文件前提下,我们可以用virsh list - all命令查看到有虚拟机存在。
建议虚拟机名字和磁盘文件的取名要保持一致。
三、宿主机、外虚拟机Centos7和内虚拟机 Centos7之间的相互访问约束
研究下网络结构:
- 物理机有一块物理网卡(有线或无线),二块虚拟网卡,其中 vmware8虚拟网卡地址是10.0.0.1,可以直接访问外虚拟机 Centor7的ens33网卡10.0.0.200;
- 外虚拟机有一块ens33网卡,还有一块 Virbro-NIC的虚拟网卡桥接到KVM网桥ip默认为192.168.122.1,可以直接访问内虚拟机 Centos7的 eth0 网卡;
- 内虚拟机有一块eth0网卡,IP地址默认为192.168.122.100(最后字节随机)。
(一)宿主机访问最里面内虚拟机的两种途径方法:
方法1:
宿主机xshell里ssh root@10.0.0.200,先登录进外虚拟机 OutCentos7,然后再OutCentos7里面的/bin/bash
中输入shell命令, ssh root@192.168.122.100,可登录到最里面的内虚拟机;
方法2:
在宿主机上通过VNC 软件的客户端进行连接,外虚拟机 Centos7(IP为10.0.0.200),里面第一台内虚拟机的编号为0,在VWC中输入10.0.0.200:0,即可进入到第一个内虚拟机 Centos7中;
(二)KVM虚拟机生命周期管理
(假设虚拟机取名为vmname)
(1)查看所有虚拟机的状态: virsh list --all
(2)查看虚拟机的信息: virsh dominfo vmname
(3)手动启动虚拟机: virsh start vmname
(4)手动关闭虚拟机: virsh shutdown vmname
(5)挂起(暂停)虚拟机:virsh suspend vmname
(6)恢复挂起虚拟机: virsh resume vmname
(7)断电关闭虚拟机(野蛮,轻易不要用): virsh destroy vmname
(8〉开启启动虚拟机: virsh autostart vmname
(9)取消开机启动虚拟机:virsh autostart --disable vmname
(10)编辑虚拟机的配置文件(位于/etc/libvirt/qemu):
方法1 virsh edit vmname
,这种编辑方法操作比较安全;
方法2vim /etc/libvirt/qemu/vmname.xml
,这种编辑方法不推荐;
(11)导出(备份)虚拟机的配置文件: bashvirsh dumpxml vmname >/home/vpsback/vmname.xml
(12)删除虚拟机(前提是虚拟机先关闭)
删除之前先做虚拟机的备份:
(1)virsh dumpxml xmname > /opt/xmname.xml
(2)cp /opt/xmname.raw /opt/xmname.raw.bak
方法1:virsh undefine vmname
删除虚拟机 vmname 的配置文件,默认存储在/etc/libvirt/qemu/vmname.xml
,
删除以后虚拟机在虚拟机管理器里面查不到了。但是虚拟机的磁盘文件仍然存在。
方法2:virsh undefine vmname --storage /opt/vmname. raw
//删除虚拟机,并同时删除虚拟机的所有磁盘文件,这个命令要慎用!
(三)虚拟机磁盘的格式转换
虚拟机磁盘一般有RAW
和QCOW2
两种格式,有各自的应用场景:
- RAW格式,裸格式,访问性能好,但是它占空间大,对于RAW格式的磁盘文件的不同主机之间的拷贝时间会很长(例如你分配10G大小的raw格式文件,实际占用1.3G,但文件拷贝给其他主机,仍然是10G大小),对RAW格式的磁盘文件进行压缩的时间会很长,不支持快照;类似于我们用数码相机拍视频,默认avi格式的存储。
- QCOW2格式,磁盘存储采用稀疏文件(硬盘中没有数据的扇区不写入),支持快照,在存储和传输中有优势,但访问性能较差;类似于我们数码相机中mp4格式的视频。
虚拟机的磁盘格式转换的具体命令:
- 关闭虚拟机,
virsh shutdown vmname
,或virsh destroy vmname
- 尝试做快照,提示失败。
virsh snapshot-create vmname
- 切换到虚拟机的磁盘目录下,进行转换磁盘格式
qemu-img convert -f raw -0 qcow2 实际磁盘名.raw 实际磁盘名.qcow2
- 查看两个文件大小,
ll -h
或du -smh
,或qemu-img info 实际磁盘名.qcow2
- 若要启动带qcow2的虚拟机,必须修改在原来的配置文件进行编辑,/disk两处地方修改raw改为qcow2后保存。
- 把之前的raw文件重命名做备份:
mv 实际磁盘名.raw 实际磁盘名.raw.bak
- 重新启动qcow2格式的虚拟机:
virsh start vmname
- 允许新建一个虚拟机快照:
virsh snapshot-create vmname
(四)虚拟机的快照管理(磁盘格式必须是qcow2)
(1)先启动磁盘为qcow2格式的虚拟机,virsh start vmname
,查看现有应用。
(2)关闭内虚拟机,新建一个虚拟机快照, virsh snapshot-create vmname
,
virsh snapshot-list vmname
查看快照信息,有一个快照id号
(3)再启动内虚拟机,做一些厉害的破坏工作例如rm -rf /lib64/*
,虚拟机的环境遭到野蛮的破坏无法正常使用,发现大多数的外部命令例如mv,cp, ps -ef都不能执行,只有内部命令ls或pwd可用,系统已搞崩溃,幸亏我们之前存有快照。
(4)利用之前的快照进行恢复,virsh snapshot-revert vmname 快照ID号
,重新启动虚拟机查看效果,然后在虚拟机上新增一些应用,例如yum install httpd php php-cli -y
等,关闭虚拟机,再新建一个虚拟机快照,virsh snapshot-create vmname
,这时候我们用virsh snapshot-list
查看会有两个快照信息。
(五)虚拟机的克隆管理(磁盘格式必须是qcow2)
(1)自动克隆(当前VM必须处于关机状态)
virsh shutdown vmname
virt-clone --auto-clone -o vmname -n autonew-vmname
virsh list --all
virsh start autonew-vmname
- 通过
edit
配置文档,我们发现原虚拟机和clone后的虚拟机的uuid,mac都是不一样,但是ip地址是一样的。建议登录一个虚拟机后, Shell输入dhclient -r
//释放ip, Shell输入dhclient
//重新获取一个新的ip。或者直接修改网卡配置文件修改一个新IP地址。
(2)手工克隆(当前VM必须处于关机状态)
- 进入虚拟机的磁盘目录,复制vmname的虚拟机磁盘文件另存为handclone-vmname
cp vmname.qcow2 handclone-vmname.qcow2
- 备份vmname的虚拟机配置文件,另存为handclone-vmname
virsh dumpxml vmname > handclone-vmname. xml
- vim修改handnew一vmname 的虚拟机配置文件
- 修改name,删除mac address,修改uuid, disk虚拟机磁盘路径,其中新的uuid可以用宿主机 uuidgen自动生成
- 导入handclone-vmname。
virsh define handclone-vmname.xml
virsh list --all
KVM 的管控——内虚拟机的硬件热添加,硬盘分区格式化挂载和扩容等
(一)内虚拟机的硬盘热添加
在外虚拟机中先看看内虚拟机的硬盘概况
virsh start INCentos7
可以是在正常工作状态下,添加或拔出某些硬件。
virsh dominfo INCentos7
virsh domblklist INCentos7
cd /opt
ls -lh INCentos7.qcow2
du -sh INCentos7.qcow2
- 当内虚拟机的存储容量不够,我们可以通过以下方法来
热添加
一块新硬盘: - 在外虚拟机中先新建一个新磁盘文件,作为内虚拟机的第二块硬盘。
(1)qemu-img create -f qcow2 /opt/add01_INCentos7.qcow2 3G
将新生成的add01_INCentos7.qcow2磁盘添加到虚拟机INCentos7,并作为虚拟机的第二块磁盘 vdb ( virtual disk b),指定磁盘类型为qcow2,并且保存到配置文件中(内虚拟机重启后第二块磁盘还能识别)
(2) virsh attach-disk INCentos7 /opt/add01_INCentos7.qcow2 vdb --subdriver=qcow2 --persistent
virsh domblklist INCentos7
进入内虚拟机有两种方法:
方法1: Win10客户端 vnc登陆到内虚拟机后,ip addr查看内虚拟机 ip;
方法2: 外虚拟机 ssh root@内虚拟机 ip,登陆到内虚拟机,推荐使用。
(二)在内虚拟机中,对新挂载的硬盘进行分区、格式化和挂载等操作
以下均在内虚拟上执行的操作:
lsblk
fdisk -l
fdisk /dev/vdb
- 以win7操作系统的硬盘分区为例,主分区(系统至少一个主分区存放root,
最多4个主分区
),扩展分区(只有一个扩展分区
,不能直接格式化不能分配给用户),逻辑分区(在扩展分区里再根据需要创建多个逻辑分区
)。
对于热添加硬盘的Linux首次分区,我建议大家把这个硬盘全部用完,依次键入n,p,1,回车,回车, w
partprobe /dev/vdb
fdisk -l
fdisk -l /dev/vdb
mkfs.xfs /dev/vdb1
mkdir /seconddisk-partition
mount /dev/vdb1 /seconddisk-partition
df -h
touch /seconddisk-partition/test.txt
echo “1234” > /seconddisk-partition/test.txt
cat /seconddisk-partition/test.txt
当然,我们还可以对第二块硬盘不采取分区,而是直接对第二块磁盘进行格式化后挂载使用
,这种方法可用于第二块磁盘的扩容
。
再现有的环境下,进入内虚拟机
后:
(1) umount /seconddisk-partition #先脱载
此时若发现有挂载卸载不掉(卸载磁盘有进程在操作),提示有umount target is busy
,可按以下多种方法操作:
方法1: 使用fuser和 kill命令
yum install psmisc
fuser -mv /seconddisk-partition
kill -g 进程号
fuser -mv /seconddisk-partition
umount/seconddisk-partition
方法2: 使用lsof命令处理
lsof /seconddisk-partition
kill -g 具体进程号
umount /seconddisk-partition
方法3: 内虚拟机重新启动(之前是手工挂载,重启后会自动失效)
(2)fdisk /dev/vdb
依次键入d,w 删除分区
(3)fdisk - /dev/vdb #查看硬盘的分区,应该是没有了
(4)mkfs.xfs -f /dev/vdb #不分区,整个磁盘进行格式化
(5)mkdir /seconddisk-full
(6)mount /dev/vdb/seconddisk-full #挂载整个磁盘
(7)df -h
或者fdisk -l #查看磁盘容量或分区
( 8 ) touch /seconddisk-full/test.txt && echo “5678" > /seconddisk-full/test.txt && cat /seconddisk-full/test.txt #测试文件进行读写(同上)
(三)对新挂载的硬盘进行扩容
- 当前存储是第一块硬盘是
INCentos7.qcow2
最大容量是5G, - 第二块硬盘是add01_INCentos7.qcow2最大容量是3G。
- 两块硬盘的容量一共是8G。现在内虚拟机的存储容量用着用着还是不够,需要对第二块硬盘进行扩容,但扩容的前提是第二块硬盘事先不能分区,添加成功后直接格式化并且挂载使用,下面实验就是基于此种环境下的扩容操作。
进入内虚拟机后:
(1)umount /seconddisk-full #先脱载
进入外虚拟机后:
(2)virsh detach-disk INCentos7 vdb --persistent #移除第二块硬盘
(3) qemu-img resize /opt/add01_INCentos7.qcow2 +4G #扩容新增加4G(总容量为7G),注意如果没有+号是至扩容到4G(总容量为4G)
(4) virsh attach-disk IlNCentos7 /opt/add01_INCentos7.qcow2 vdb --subdriver qcow2 --persistent #添加硬盘至虚拟机上
切换进入内虚拟机后:
(5) mount /dev/vdb /seconddisk-full #重新挂载分区
(6) xfs_growfs /dev/vdb #扩展磁盘大小,若ext文件系统采用resize2fs /dev/vdb,扩容成功会有信息提示
(7)df-Th #查看硬盘是否成功扩容至7G 了
(8) touch /seconddisk-full/class.txt && echo “abcd" > /seconddisk-full/class.txt && cat /seconddisk-full/class.txt #测试文件进行读写(同上)
(二)KVM的管控—图形可视化管理+网络管理
(一)KVM图形化管理
之前我们安装KVM,通常需要三个包:
- qemu-kvm软件包,主要提供KVM模拟器;
- libvirt包,主要提供相关的库文件或API接口;
- virt-manager包,主要提供虚拟机管理;
yum install qemu-kvm* libvirt* virt-* -y
- 之前我们的实验都是基于命令行的方法来管理虚拟机,在实践运维管理中以命令居多,能更好掌握其内在的逻辑关系。但其实KVM虚拟机也是有图形化管理工具,建议在外虚拟机本机上打开kvm的可视化管理工具。
(二) KVM的网络管理
KVM 默认的连网方式是NAT,当安装好KVM虚拟机后,就会在宿主机上自动安装一个网桥virbr0(管理ip是192.168.122.1),此网桥会把各个虚拟机连接起来,处在同一个网段(默认是192.168.122.X),并且KVM会修改iptables
规则,让连接到此网桥的虚拟机访问外网时做一个网络地址转换NAT。
通常,设置了NAT以后,内网可以主动访问外网,但是外网不能主动访问内网。
在外虚拟机上启动两个内虚拟机以后的ip addr信息
[root@kvmnodel ~]
1: lo:〈LOOPBACK,UP,LOWER_UP〉 mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00: 00 brd 00:00: 00:00: 00: 00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft foreverinet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29: 68: ae:lf brd ff:ff:ff:ff:ff: ff
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80: : 9b6d: c6d : 66c3: d42f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0:〈BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:54:00: e6:f8: 4a brd ff: ff:ff:ff: ff: ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic:<BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DWOWNgroup default qlen 1o00
link/ether 52:54:00: e6: f8:4a brd ff:ff:ff:ff:ff:ff
5: vnet0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOonV group default qlen T000
link/ether fe:54:00:8b: b8:b7 brd ff:ff:ff:ff:ff:ffinet6 fe80: : fc54:ff: fe8b: b8b7/64 scope link
valid_lft forever preferred_lft forever
6: vnet1:〈BROADCAST,MULTICAST,UP, LOWER_UP> mtu 1500 qdisc pfifo_fast master virbrl0 state UNKAONN group default qlen 1000
link/ether fe:54:00:9c: 3d: 48 brd ff: ff: ff: ff: ff: ffinet6 fe80: :fc54:ff: fe9c : 3d48/64 scope link
valid_lft forever preferred_lft forever
然而,在很多应用场景中需要kvm内虚拟机和外虚拟机在同一个网段里,那么默认的NAT模式就不合适了,需要从默认的NAT模式切换到桥接Bridge
模式。
2.1 在网卡的配置文件目录中,配置生成一个新的配置文件ifcfg-br0
。以下操作均在外虚拟机上来完成:
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-br0
vim ifcfg-br0
TYPE=bridge
NAME=br0
DEVICE=br0
BOOTPROTO=static
DEFROUTE=yes
IPADDR=10.0.0.200
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=10.0.0.254
DNS2=8.8.8.8
ONBOOT=yes
vim ifcfg-ens33
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
systemctl restart network
ip addr
外虚拟机上新增一个网桥的网卡信息(假设当前没有开启内虚拟机)
Lroot@kvmnodel network-scripts]
1: lo:〈LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft foreverinet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33:<BROADCAST,MULTICAST,UP,LOWER_UP〉 mtu 1500 qdisc pfifo_fast master br0O state UP group default glen 100
link/ether 00:0c:29: 68:ae:1f brd ff:ff:ff:ff:ff:ff
3: br0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group
default qlen 1000
link/ether 00:0c:29:68:ae:1f brd ff:ff:ff:ff:ff:ff
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute br0valid_lft forever preferred_lft forever
inet6 fe80::6076:5eff:fede:85b8/64 scope link
valid_lft forever preferred_lft forever
4: virbr0:(NO-CARRIER, BROADCAST,MULTICAST,UP〉 mtu 1500 qdisc noqueue state DOWN group default qlen 1l000
link/ether 52:54:00:e6:f8:4a brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0valid_lft forever preferred_lft forever
5: virbr0-nic:<BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DON group default qlen 1000link/ether 52:54:00:e6:f8:4a brd ff:ff:ff:ff:ff: ff
2.2 在外虚拟机上用KVM的可视化管理工具,更改原来INCentos7
的网卡模式,从默认的NAT
切换为Bridge
在外虚拟机上启动内虚拟机 INCentos7后,登录或进入内虚拟机 INCentos7后,先查看内虚拟机INCentos7的网卡配置文件,
vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
先确保内虚拟机的网卡配置文件是DHCP的分配方式,然后内虚拟机上ip addr
查看内虚拟机的IP是10.0.0.*的地址段地址并且可以ping通114.114.114.114,而且和宿主机(外虚拟机)在同一个网段,和宿主机(外虚拟机)连接到同一个网桥上了,同时再修改虚拟机 autoclone-INCentos7的网卡模式从NAT到 bridge,查看实验情况。
至此,桥接模式的kvm虚拟机已配置完成,最后我们来看看桥接KVM虚拟机的整体网络架构图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)