KVM虚拟机简介:
Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,目前集成在Linux的各个主要发行版本中。
KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术),是基于硬件的完全虚拟化。
Xen是基于硬件支持的完全虚拟化,但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。
广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。
1、检查cpu是否支持虚拟化
1.1如果是在VMware虚拟机中安装,检查Intel VT设置
在VMware设置中将作为宿主机的CentOS虚拟机的Intel VT或AMD-V功能打勾选中,开启VT虚拟化,才能在虚拟机中创建虚拟机。
1.2用下列指令检查cpu是否支持vt:
cat /proc/cpuinfo|egrep 'vmx|svm'
grep -Ei 'vmx|svm' /proc/cpuinfo
如果有出现vmx或者svm关键字就代表支持虚拟化,vmx代表Intel的CPU,svm代表AMD的CPU
2、关闭selinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
3、防火墙设置
如果使用VNC管理KVM虚拟机,需要开启相应的端口,VNC端口默认是从5901开始
CentOS 7.x默认使用的是firewall作为防火墙,这里改为iptables防火墙。
3.1、关闭firewall:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
systemctl mask firewalld
systemctl stop firewalld
yum remove firewalld
3.2、安装iptables防火墙
yum install iptables-services #安装
vi /etc/sysconfig/iptables #编辑防火墙配置文件
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5900:5999 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
:wq! #保存退出
systemctl restart iptables.service #最后重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动
/usr/libexec/iptables/iptables.init restart #重启防火墙
4、修改主机名
方便区分宿主机和KVM虚拟化,建议修改宿主机的主机名称
hostnamectl set-hostname kvm01
vi /etc/hostname #编辑配置文件CentOS 7.x
kvm01 #修改localhost.localdomain为kvm01
:wq! #保存退出
vi /etc/hosts #编辑配置文件
127.0.0.1 kvm01 localhost #修改localhost.localdomain为kvm01
:wq! #保存退出
5、启用网络转发,kvm使用nat方式需要开始
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
:wq! #保存退出
sysctl -p /etc/sysctl.conf
6、安装kvm
6.1使用yum安装
yum install virt-* virt-manager virt-install libvirt bridge-utils qemu-kvm qemu-kvm-tools qemu-img libvirt-client libvirt-python libguestfs-tools
#模块说明
kvm:linux内核中的一个模块,不需要安装只要加载就行,通过用户态进程来管理。
qemu:虚拟化软件,支持多种架构,可扩展,可移植
qemu-kvm:用户态管理KVM,网卡、声卡、PCI设备等的管理
libvirt:是一个虚拟化 API 和虚拟机(VMs)管理后台,支持远程或本地访问,支持多种虚拟化后端 (QEMU/KVM, VirtualBox, Xen,等等)
6.2启动kvm服务
systemctl start libvirtd
systemctl stop libvirtd
systemctl restart libvirtd
systemctl status libvirtd.service #查看状态
6.3设置为开机启动
systemctl enable libvirtd
6.4检查确认载入kvm模块
lsmod | grep kvm
brctl show
[root@kvm01 ~]# lsmod | grep kvm
kvm_intel 188740 0
kvm 637289 1 kvm_intel
irqbypass 13503 1 kvm
[root@kvm01 ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400dc6621 yes virbr0-nic
6.5创建软连接
ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
6.6查看版本
virsh --version
virt-install --version
qemu-kvm --version
7、安装vnc服务,通过vnc连接管理kvm虚拟机使用
7.1yum安装
yum install tigervnc-server tigervnc vnc vnc-server
cp /lib/systemd/system/vncserver@.service /etc/systemd/system/
cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
vi /etc/systemd/system/vncserver@:1.service
#ExecStart=/usr/bin/vncserver_wrapper <USER> %i #注释掉此行,修改为下面这一行
ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i" #添加
PIDFile=/root/.vnc/%H%i.pid #添加
:wq! #保存退出
#设置开机启动
systemctl enable vncserver@:1.service
7.2运行tigervnc-serve
vncserver
#根据提示输入远程登录的密码
[root@kvm01 ~]# vncserver
You will require a password to access your desktops.
Password:
Verify:
Would you like to enter a view-only password (y/n)? y
Password:
Verify:
xauth: file /root/.Xauthority does not exist
New 'kvm01:1 (root)' desktop is kvm01:1
Creating default startup script /root/.vnc/xstartup
Creating default config /root/.vnc/config
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/kvm01:1.log
[root@kvm01 ~]#
7.3查看vnc开启的桌面
vncserver -list
[root@kvm01 ~]# vncserver -list
TigerVNC server sessions:
X DISPLAY # PROCESS ID
:1 14222
#:1表示VNC端口号是:5901
7.4使用VNC Viewer客户端连接
下载地址:
https://www.realvnc.com/en/connect/download/viewer/
https://files02.tchspt.com/temp/VNC-Viewer-7.0.1-Windows-64bit.exe
服务器应该安装桌面系统(GNOME)之后,再通过VNC-Viewer客户端连接控制,否则连接出现蓝屏。
GNOME、KDE都是基于X-Window的桌面环境,必须先安装X-Window才能运行。
#安装X-Window
yum groupinstall "X Window System" #注意有引号
#安装GNOME桌面
#Graphical Administration Tools包相当于VMware tools,屏幕会自适应
yum groupinstall "GNOME Desktop" "Graphical Administration Tools"
systemctl stop vncserver@:1.service #停止
systemctl start vncserver@:1.service #启动
8、配置kvm网络
kvm虚拟机的网络配置有两种模式:桥接模式和NAT模式
8.1两种模式的区别
NAT模式:也是用户模式,数据包由NAT方式通过主机的接口进行传送,可以访问公网,但是无法从外部访问虚拟机网络,所以一般不会用到。
Nat模式配置比较简单,只需要在启动虚拟机后,设置ip地址为dhcp自动获得即可联网,也可以修改ip地址为固定ip,但是宿主机必须启用网络转发。
Bridge:也就是桥接模式,这种模式允许虚拟机像一个独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持,一般有线网卡都支持。
CentOS下如果安装了桌面环境,网络会由NetworkManager进行管理,NetworkManager不支持桥接,需要关闭NetworkManger
systemctl stop NetworkManager #停止此服务
chkconfig NetworkManager off
chkconfig network on service
NetworkManager stop service network start
8.2配置网卡为桥接模式Bridge
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-br0 # 拷贝当前的网卡文件,并修改名字
vi /etc/sysconfig/network-scripts/ifcfg-br0 #修改下面的配置
TYPE=Bridge #将type改为Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #修改为static一般设置为静态ip
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 #修改为br0
UUID=62e23b7e-0ab5-42d1-9b21-2b8c389fac19
DEVICE=br0 #修改为br0
ONBOOT=yes
IPADDR=192.168.21.79 #该ip将为宿主机的IP地址
PREFIXO=24
GATEWAY=192.168.21.2
DNS1=8.8.8.8
DNS2=8.8.4.4
:wq! #保存退出
vi /etc/sysconfig/network-scripts/ifcfg-ens33 #修改下面的配置
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none #将这项改为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=ens33
#UUID=62e23b7e-0ab5-42d1-9b21-2b8c389fac19 #注释掉
DEVICE=ens33
ONBOOT=yes
#IPADDR=192.168.21.79 #注释掉
#PREFIXO=24 #注释掉
#GATEWAY=192.168.21.2 #注释掉
#DNS1=8.8.8.8 #注释掉
#DNS2=8.8.4.4 #注释掉
BRIDGE=br0 #添加该行
:wq! #保存退出
systemctl restart network #重启网络
brctl show #查看桥接信息
ip addr #查看ip
[root@kvm01 network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29e4770f no ens33
virbr0 8000.525400dc6621 yes virbr0-nic
[root@kvm01 network-scripts]# systemctl restart network
[root@kvm01 network-scripts]# ip addr
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 forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
link/ether 00:0c:29:e4:77:0f brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:dc:66:21 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 DOWN group default qlen 1000
link/ether 52:54:00:dc:66:21 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:e4:77:0f brd ff:ff:ff:ff:ff:ff
inet 192.168.21.79/24 brd 192.168.21.255 scope global noprefixroute br0
valid_lft forever preferred_lft forever
inet6 fe80::aad7:fe66:8ef9:5da4/64 scope link noprefixroute
valid_lft forever preferred_lft forever
ens33网卡的IP绑定到br0上了,这样网卡就配置完成了。
9、创建kvm虚拟机
9.1创建iso和images存放目录
#创建系统镜像iso存放目录
mkdir -p /data/libvirt/iso
#创建kvm虚拟机文件存放目录
mkdir -p /data/libvirt/images
#KVM虚拟机默认image文件存放位置为/var/lib/libvirt/images
#修改为自定义路径/data/libvirt/images
vi /etc/libvirt/storage/default.xml
<path>/data/libvirt/images</path> #修改
:wq! #保存退出
systemctl restart libvirtd #重启服务
9.2上传iso镜像文件
上传系统镜像文件到存放目录/data/libvirt/iso
9.3创建kvm虚拟机
#查询kvm支持的操作系统
osinfo-query os
#创建使用vnc连接的kvm虚拟机
#CentOS系统
virt-install --name=testvnc01 --ram=1024 --vcpu=1 --os-type=linux --os-variant=rhel7 --disk path=/data/libvirt/images/testvnc01.img,size=10 --accelerate --location=/data/libvirt/iso/CentOS-7-x86_64-Minimal-2009.iso --vnc --vncport=5910 --vnclisten=0.0.0.0 --network bridge=br0,model=virtio --noautoconsole
#第一次安装完成点Reboot后服务器不会重启,需要在控制台启动
#查看虚拟机
virsh list --all
#启动虚拟机
virsh start testvnc01
#Windows系统
virt-install --name=testwin2k3 --ram=1024 --vcpu=1 --os-type=windows --os-variant=win2k3 --disk path=/data/libvirt/images/testwin2k3.img,size=10 --disk device=cdrom,path=/data/libvirt/iso/windows_server_2003.iso --vnc --vncport=5922 --vnclisten=0.0.0.0 --network bridge=br0,model=virtio --noautoconsole
#KVM下windows使用virtio驱动
KVM下windows虚拟机默认disk使用的是Qemu IDE硬盘,网卡默认是100M网卡。
为了使kvm主机在相同的配置下,有更好的效率,需要命名用半虚拟化将驱动改为为了virtio,使硬盘工作在SCSI模式,网卡为1000M
https://github.com/virtio-win/kvm-guest-drivers-windows
#支持windows server 2003系统
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.96/virtio-win-0.1.96.iso
#支持win8以上的系统
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.229-1/virtio-win.iso
#下载好virtio镜像文件,上传到宿主机iso存放目录下面
#挂载virtio镜像到虚拟机testwin2k3的虚拟光驱下
virsh attach-disk testwin2k3 /data/libvirt/iso/virtio-win-0.1.96.iso hdb --type cdrom
#新增一块虚拟机磁盘
qemu-img create -f qcow2 /data/libvirt/images/testwin2k3new.img 1G
#动态向虚拟机添加virtio磁盘
virsh attach-disk testwin2k3 --source /data/libvirt/images/testwin2k3new.img --target vdb --targetbus=virtio --persistent --driver qemu --subdriver qcow2
#使用如下命令,为虚拟机testwin2k3添加网卡:
virsh attach-interface testwin2k3 --type bridge --source br0 --model virtio
#其中testwin2k3为要添加网卡的虚拟机,--type为要添加网卡的类型,--source为使用kvm服务器的那个网卡。
#使用挂载的光驱安装硬盘和网卡驱动
#查看kvm虚拟机信息
virsh dumpxml testwin2k3
#关闭虚拟机
virsh shutdown testwin2k3
#编辑虚拟机配置文件
virsh edit testwin2k3
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none' io='native'/> #添加修改
<source file='/data/libvirt/images/testwin2k3.img'/>
<target dev='vda' bus='virtio'/> #修改
</disk>
:wq! #保存退出
#其实就是删除<address type='drive' controller='0' bus='0' target='0' unit='0'/>这一行
#在driver name这一行添加cache='none' io='native',把<target dev='hda' bus='ide'/> 修改为<target dev='vda' bus='virtio'/>
#启动kvm虚拟机
virsh start testwin2k3
Windows系统使用的磁盘设备和网卡设备都会替换成virtio,此时网络和磁盘性能将有很大提高,能明显感觉到启动速度变快了。
#同样可以把网卡的配置模式修改为<model type='virtio'/>,将网卡速度提升到1GB
virtio更快的原因:
1、kvm因为使用了硬件虚拟化,所以其cpu方面的运行效率是很高的
2、kvm在I/O虚拟化方面,传统的方式是利用QEMU纯软件的方式来模拟I/O设备
3、每次虚机发起I/O请求的时候,KVM内核模块会捕获这次请求,然后处理后将其放入I/O共享页,并通知用户空间中运行的QEMU程序
3、QEMU获得I/O操作,交由硬件模拟代码(Emulation)来模拟出本次I/O操作之后,将结果放回I/O共享页,同时通知KVM内核模块读取I/O共享页的操作结果,把结果返回给虚机。
4、由于这种方式每次I/O操作经过的路径很复杂,其效率很低。
virtio这种方案:
1、virtio其实就是一个运行于Hypervisor之上的api接口,让客户机知道自己运行于虚拟化环境中
2、进行I/O操作的时候通过virtio与Hypervisor通信,从而使虚机有更好的性能
使用vnc客户端连接虚拟机安装操作系统
#查看所有的虚拟机
virsh list --all
#启动kvm虚拟机
virsh start testwin2k3
#关闭kvm虚拟机
virsh shutdown testwin2k3
virsh destroy testwin2k3 #强制断电
#删除kvm虚拟机
virsh undefine testwin2k3
#查看磁盘信息
virsh domblklist testwin2k3
[root@kvm01 qemu]# virsh domblklist testwin2k3
目标 源
------------------------------------------------
hda /data/libvirt/images/testwin2k3.img
hdb /data/libvirt/iso/windows_server_2003.iso
vdb /data/libvirt/images/testwin2k3new.img
#从虚拟机删除磁盘
virsh detach-disk testwin2k3 /data/libvirt/images/testwin2k3new.img
[root@kvm01 qemu]# virsh detach-disk testwin2k3 /data/libvirt/images/testwin2k3new.img
成功分离磁盘
#创建快照
virsh snapshot-create-as --domain testwin2k3 --name testwin2k3_snapshot --description "system clear"
已生成域快照 testwin2k3_snapshot
#查看快照信息
virsh snapshot-list testwin2k3
名称 生成时间 状态
------------------------------------------------------------
testwin2k3_snapshot 2023-02-21 11:36:56 +0800 running
#查看快照详细信息
virsh snapshot-dumpxml --domain testwin2k3 --snapshotname testwin2k3_snapshot
#恢复快照
virsh snapshot-revert testwin2k3 testwin2k3_snapshot
#删除快照
virsh snapshot-delete --domain testwin2k3 --snapshotname testwin2k3_snapshot
已删除域快照 testwin2k3_snapshot
#kvm虚拟机克隆
virsh list --all #查看虚拟机列表
virsh shutdown testvnc01#克隆这台虚拟机前需要关闭
virsh destroy testvnc01 #强制断电
cat /etc/libvirt/qemu/testvnc01.xml #查看虚拟机配置文件
虚拟机磁盘文件: /data/libvirt/images/testvnc01.img
虚拟机名称:testvnc01
#克隆testvnc0生成新的testvnc03
virt-clone -o testvnc01 -n testvnc03 -f /data/libvirt/images/testvnc03.img
-o 被克隆虚拟机
-n 克隆后新的虚拟机
-f 克隆后新虚拟机的磁盘
至此,CentOS-7.x下安装使用KVM虚拟机完成。