虚拟化技术就是对资源的抽象,如虚拟机,虚拟内存等
虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System370 系列中逐渐流行起来,这些机器通过一种叫**虚拟机监控器(Virtual Machine Monitor,VMM)**的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机(Virtual Machine)实例
VMM虚拟机监控器也叫做Hypervisor,就是为了虚拟化而引入的一个软件层。它向下掌控实际的物理资源,向上呈现出N份逻辑资源。
虚拟机监控器运行的实际物理环境,称为宿主机;其上虚拟出来的逻辑主机,称为客户机。
分类
从资源提供角度分
从虚拟化实现方式分
Hypervisor管理工具的对比
工具 | 厂商 | 主CPU | 目标CPU | 主系统 | 目标系统 |
---|---|---|---|---|---|
qemu | Febrice,Bellard | Inter,AMD,ARM | x86/x86-64/ARM | Windows,Linux,Mac OS | Linux |
kvm | Red Hat | Inter/AMD | x86/x86-64 | Linux | Windows/Linux |
Xen | 剑桥大学,Inter/AMD | Inter/AMD | x86/x86-64 | Windows/Linux/Solaris | Windows/Linux |
Hyper-V | 微软 | Inter/AMD | x86/x86-64 | Windows | Windows/Linux |
VMware ESXi Server | VMware | Inter/AMD | x86/x86-64 | 裸机安装 | Windows/Linux |
Oracle VM | Oracle | Inter/AMD | x86/x86-64 | 裸机安装 | Windows/Linux |
QEMU是用户态工具,可以为客户机提供设备模拟的功能,包括模拟BIOS、数据总线、磁盘、网卡、显卡、声卡、键盘、鼠标等。
我们知道KVM只负责CPU和内存的虚拟化,加载了它以后,用户就可以进一步通过工具创建虚拟机(KVM提供接口),但仅有KVM还是不够的,用户无法直接控制内核去做事情(KVM只提供接口,怎么创建虚拟机,分配vCPU等并不在它上面进行),还必须有个运行在用户空间的工具才行,KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,并对其进行了修改,最后形成了QEMU-KVM。
在QEMU-KVM中,KVM运行在内核空间,QEMU运行在用户空间,实际模拟创建,管理各种虚拟硬件,QEMU将KVM整合了进来,通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但kvm不能虚拟其他硬件设备,因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。但是,由于qemu模拟io设备效率不高的原因,现在常常采用半虚拟化的virtio方式来虚拟IO设备。
KVM负责提供对cpu,内存的虚拟
QEMU负责除CPU和内存外的其他设备的虚拟以及对各种虚拟设备的创建与调用
最小化——>图形
yum groupinstall -y “GNOME 桌面”
重启
startx临时开启终端(不推荐)
systemctl set-default graphical.targer
[root@server1 ~]# systemctl get-default
graphical.target
[root@server5 ~]# lscpu|grep '虚拟化'
虚拟化: VT-x
虚拟化类型: 完全
[root@server5 ~]# grep -E 'svm|vmx' /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat pku ospke md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities
清理干净KVM相关的预装环境
[root@server5 ~]# yum remove `rpm -qa |egrep 'qemu|virt|kvm'`
[root@server5 ~]# rm -rf /var/lib/libvirt/
[root@server5 ~]# rm -rf /etc/libvirt/
查看分组
[root@server5 ~]# yum grouplist
安装kvm分组(可译为虚拟化的包都会被安装)
[root@server5 ~]# yum install *qemu* *virt* librbd1-devel -y
开启libvirt
[root@server5 ~]# systemctl start libvirtd
[root@server5 ~]# systemctl enable libvirtd
[root@server5 ~]# systemctl status libvirtd
[root@server5 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
确保kvm模块已被加载
[root@server5 ~]# lsmod |grep kvm
kvm_intel 188740 0
kvm 637515 1 kvm_intel
irqbypass 13503 1 kvm
设置防火墙规则
[root@server5 ~]# systemctl start firewalld.service
[root@server5 ~]# systemctl enable firewalld.service
[root@server5 ~]# firewall-cmd --zone=public --add-masquerade --permanent
success
[root@server5 ~]# firewall-cmd --zone=public --add-masquerade
success
[root@server5 ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@server5 ~]# virt-manager
[root@server5 ~]# rz
[root@server5 ~]# ls
anaconda-ks.cfg 公共 视频 文档 音乐
CentOS-7-x86_64-Minimal-2009.iso 模板 图片 下载 桌面
[root@server5 ~]# virt-install --help
# 仅保留常用选型
usage: virt-install --name NAME --memory MB STORAGE INSTALL [options]
选项:
-h, --help show this help message and exit
-n NAME, --name NAME 客户机实例名称
--memory MEMORY Configure guest memory allocation. Ex:
--memory 1024 (in MiB)
--memory 512,maxmemory=1024
--vcpus VCPUS Number of vcpus to configure for your guest. Ex:
--vcpus 5
--vcpus 5,maxvcpus=10,cpuset=1-4,6,8
--cdrom CDROM 光驱安装介质
--disk DISK 指定存储的各种选项。例如:
--disk size=10 (在默认位置创建 10GiB 镜像)
--disk /my/existing/disk,cache=none
--disk device=cdrom,bus=scsi
--disk=?
-w NETWORK, --network NETWORK
配置客户机网络接口。例如:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network
--graphics GRAPHICS 配置客户机显示设置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--arch ARCH 模拟 CPU 架构
--autostart 主机启动时自动启动域。
--noautoconsole 不要自动尝试连接到客户端控制台
[root@server5 ~]# virt-install \
--name=centos7.6-1 \
--vcpus=1 \
--ram=1024 \
--arch=x86_64 \
--os-type=linux \
--os-variant=rhel7 \
--graphics vnc,listen=0.0.0.0,port=5901,keymap=en-us \
--disk path=/var/lib/libvirt/images/centos7.6-1.img,size=3,format=qcow2 \
--cdrom=/home/CentOS-7-x86_64-Minimal-2009.iso \
--network bridge=virbr0
选型(为空表示可追加) | 可更换为 |
---|---|
–graphics vnc,listen=0.0.0.0, port=5901,keymap=en-us |
–nographics |
–noautoconsole | |
–network bridge=virbr0 | –bridge=virbr0 |
–ram=1024 | –memory 512,maxmemory=1024 |
–vcpus=1 | –vcpus 1,maxvcpus=4 |
–autostart |
查看正在运行的虚拟机
[root@server5 ~]# virsh list
Id 名称 状态
----------------------------------------------------
查看所有虚拟机
[root@server5 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- centos7.6-1 关闭
查看域信息
[root@server5 ~]# virsh dominfo centos7.6-1
Id: 1
名称: centos7.6-1
UUID: 92891b9c-37cc-4511-9bf6-59a8170c434c
OS 类型: hvm
状态: running
CPU: 1
CPU 时间: 20.5s
最大内存: 1048576 KiB
使用的内存: 1048576 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
查看虚拟机资源占用情况
[root@server5 ~]# virt-top
启动虚拟机
[root@server5 ~]# virsh start centos7.6-1
域 centos7.6-1 已开始
[root@server5 ~]# virsh list
Id 名称 状态
----------------------------------------------------
1 centos7.6-1 running
设置开机自启
[root@server5 ~]# virsh autostart centos7.6-1
域 centos7.6-1标记为自动开始
[root@server5 ~]# virsh dominfo centos7.6-1
Id: 1
名称: centos7.6-1
UUID: 92891b9c-37cc-4511-9bf6-59a8170c434c
OS 类型: hvm
状态: running
CPU: 1
CPU 时间: 20.7s
最大内存: 1048576 KiB
使用的内存: 1048576 KiB
持久: 是
自动启动: 启用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
文件位置/etc/libvirt/qemu/centos7.6-1.xml
[root@server5 ~]# head -20 /etc/libvirt/qemu/centos7.6-1.xml
<domain type='kvm'>
<name>centos7.6-1name>
<uuid>92891b9c-37cc-4511-9bf6-59a8170c434cuuid>
<memory unit='KiB'>1048576memory>
<currentMemory unit='KiB'>1048576currentMemory>
<vcpu placement='static'>1vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvmtype>
<boot dev='hd'/>
os>
<features>
<acpi/>
<apic/>
[root@server5 ~]# virsh edit centos7.6-1
[root@server5 ~]# cd /etc/libvirt/qemu/networks/
[root@server5 networks]# ls
autostart default.xml
<network>
<name>defaultname>
<uuid>481578d7-6728-48fa-8569-09eac31a0273uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:61:66:bb'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
dhcp>
ip>
network>
[root@server5 ~]# cd /etc/libvirt/storage/
[root@server5 storage]# ls
autostart home.xml
[root@server5 storage]# vim home.xml
<pool type='dir'>
<name>homename>
<uuid>74ccd74f-30ea-4462-bc85-ca363520a1cfuuid>
<capacity unit='bytes'>0capacity>
<allocation unit='bytes'>0allocation>
<available unit='bytes'>0available>
<source>
source>
<target>
<path>/homepath>
target>
pool>
[[email protected] ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 1
On-line CPU(s) list: 0
命令行添加
[root@server5 ~]# virsh setvcpus centos7.6-1 2 --live
[[email protected] ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
KVM内存气球技术可以对虚拟机使用的内存按需调节,从而提高内存的利用率。linux默认就支持内存气球
半虚拟化驱动
全虚拟化驱动
半虚拟化驱动
通过驱动对操作系统进行了修改,即Virtio技术,,虚拟机直接访问虚拟化层,步骤减少,转化效率高
配置半虚拟化驱动
[root@server5 ~]# virt-what
kvm
[root@server5 ~]# ethtool -i eth0
driver: virtio_net
version: 1.0.0
firmware-version:
expansion-rom-version:
bus-info: 0000:00:03.0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
[root@localhost network-scripts]# cp ifcfg-eth0 ifcfg-ens9
修改相应的配置文件
确保客户机运行
[root@server5 ~]# virsh list
Id 名称 状态
----------------------------------------------------
1 centos7.6-1 running
查看已有网卡
[root@server5 ~]# virsh domiflist centos7.6-1
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge virbr0 virtio 52:54:00:65:4d:a5
vnet1 network default rtl8139 52:54:00:9a:18:f7
添加网卡
[root@server5 ~]# virsh attach-interface centos7.6-1 \
--type network \
--source default \
--model virtio \
--config
成功附加接口
[root@server5 ~]# virsh domiflist centos7.6-1
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge virbr0 virtio 52:54:00:65:4d:a5
vnet1 network default rtl8139 52:54:00:9a:18:f7
重启(需要先关机,再开机,才能生效)
[root@server5 ~]# virsh domiflist centos7.6-1
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge virbr0 virtio 52:54:00:65:4d:a5
vnet1 network default rtl8139 52:54:00:9a:18:f7
vnet2 network default virtio 52:54:00:83:7b:f1
配置文件地址
[root@server5 ~]# cd /etc/libvirt/qemu/
[root@server5 qemu]# vim centos7.6-1.xml
</interface>
type='network'>
'52:54:00:83:7b:f1'/>
virt-manager添加网络
[root@server5 ~]# ip a
8: virbr1: -CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:b6:35:e2 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.1/24 brd 192.168.10.255 scope global virbr1
valid_lft forever preferred_lft forever
查看ip地址
[root@localhost ~]# ip a
1: lo: ,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: eth0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:80:94:b0 brd ff:ff:ff:ff:ff:ff
3: eth1: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:da:57:16 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.150/24 brd 192.168.10.255 scope global noprefixroute dynamic eth1
valid_lft 2714sec preferred_lft 2714sec
inet6 fe80::82c0:907:6163:5dd8/64 scope link noprefixroute
valid_lft forever preferred_lft forever
查看网关
[root@localhost ~]# ip route
default via 192.168.10.1 dev eth1 proto dhcp metric 100
192.168.10.0/24 dev eth1 proto kernel scope link src 192.168.10.150 metric 100
ping网关
[root@localhost ~]# ping 192.168.10.1150
ping宿主机
[root@localhost ~]# ping 192.168.139.50
ping宿主机的网关
[root@localhost ~]# ping 192.168.139.2
ping域名
[root@localhost ~]# ping www.baidu.com
虚拟机连接
[root@server5 ~]# ssh [email protected]
The authenticity of host '192.168.10.150 (192.168.10.150)' can't be established.
ECDSA key fingerprint is SHA256:0j755uJHNYtgaiAvD5muWjnq1Qxtuvo83VBMx2a85Wc.
ECDSA key fingerprint is MD5:17:5d:03:0d:b8:f5:6d:86:06:6e:35:1d:51:e7:56:a9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.150' (ECDSA) to the list of known hosts.
[email protected]'s password:
Last login: Sun Jan 2 19:48:52 2022
[root@localhost ~]#
通过配置文件生成网络
获得网络编写模板文件
[root@server5 ~]# cd /etc/libvirt/qemu/networks/
[root@server5 networks]# cp network1.xml network2.xml
[root@server5 networks]# ls
autostart default.xml network1.xml network2.xml
生成UUID
[root@server5 networks]# uuidgen
e63b6f45-8c1a-4378-8d46-18c8faab3271
生成MAC地址
[root@server5 networks]# openssl rand -hex 6 |sed -r 's/(..)/\1:/g;s/.$//'
25:a4:ac:61:62:96
# 该设备名为52:54:00:xx:xx:xx,可以只更改后面部分
修改配置文件
[root@server5 networks]# vim network2.xml
network2</name> 自定义
e63b6f45-8c1a-4378-8d46-18c8faab3271</uuid> 自生成
'nat'/> 网络模式
'virbr2' stp='on' delay='0'/> 自定义网桥名称
'52:54:00:61:62:96'/> 自生成
'network2'/> 同自定义name
'192.168.20.1' netmask='255.255.255.0'>
start='192.168.20.10' end='192.168.20.250'/>
</dhcp>
</ip>
</network>
[root@server5 networks]# virsh net-define network2.xml
从 network2定义网络network2.xml
开启网络
[root@server5 networks]# virsh net-start network2
网络 network2 已开始
开机自启
[root@server5 networks]# virsh net-autostart network2
网络network2标记为自动启动
查看
[root@server5 networks]# virsh net-list --all
名称 状态 自动开始 持久
----------------------------------------------------------
default 活动 否 否
network1 活动 是 是
network2 活动 是 是
桥接模式
[root@server5 ~]# systemctl stop NetworkManager
[root@server5 ~]# systemctl disable NetworkManager
[root@server5 ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /root/
[root@server5 ~]# cd /etc/sysconfig/network-scripts/
[root@server5 network-scripts]# ls ifcfg-br1
ifcfg-br1
[root@server5 network-scripts]# cat ifcfg-br1
DEVICE="br1"
ONBOOT="no"
HOTPLUG="yes"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="192.168.139.50"
NETMASK="255.255.255.0"
GATEWAY="192.168.139.2"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0.0"
[root@server5 network-scripts]# cat ifcfg-ens33
DEVICE="ens33"
ONBOOT="no"
HOTPLUG="yes"
BRIDGE="br1"
# 该文件被修改了,所以之前要备份
修改网卡文件
[root@localhost~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vim ifcfg-eth0
[root@localhost network-scripts]# systemctl restart network
桥接模式改为net模式
[root@server5 network-scripts]# rm -rf ifcfg-br1
[root@server5 network-scripts]# rm -rf ifcfg-ens33
[root@server5 network-scripts]# mv /root/ifcfg-ens33 ./
重启网络
[root@server5 network-scripts]# systemctl restart network
启动NetworkManager
[root@server5 network-scripts]# systemctl start NetworkManager
[root@server5 network-scripts]# systemctl enable NetworkManager
virt-manager图形化添加
[root@guest ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 5G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 4G 0 part
├─centos-root 253:0 0 3.5G 0 lvm /
└─centos-swap 253:1 0 512M 0 lvm [SWAP]
vdb 252:16 0 2G 0 disk
virsh命令添加
[root@server5 ~]# virsh list
Id 名称 状态
----------------------------------------------------
1 my1 running
[root@server5 ~]# virsh domblklist my1
目标 源
------------------------------------------------
vda /var/lib/libvirt/images/my1.qcow2
vdb /var/lib/libvirt/images/my1-1.qcow2
hdb -
创建磁盘
[root@server5 ~]# qemu-img create -f qcow2 /root/disk.img 1G
Formatting '/root/disk.img', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 lazy_refcounts=off
# 或者使用dd命令模式 dd if=/dev/zero of=/root/disk.img bs=1M count=1024
附加磁盘
[root@server5 ~]# virsh attach-disk my1 --source=/root/disk.img --target vdc --cache writeback --subdriver qcow2
成功附加磁盘
查看
[root@guest ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 5G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 4G 0 part
├─centos-root 253:0 0 3.5G 0 lvm /
└─centos-swap 253:1 0 512M 0 lvm [SWAP]
vdb 252:16 0 2G 0 disk
vdc 252:32 0 1G 0 disk
[root@server5 ~]# virsh detach-disk my1 vdc
成功分离磁盘
[root@server5 ~]# virsh attach-disk my1 --source=/root/disk.img --target vdc --cache writeback --subdriver qcow2 --persistent
成功附加磁盘
删除
[root@server5 ~]# virsh detach-disk my1 vdc
成功分离磁盘
查看存储池
[root@server5 ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
root 活动 是
添加本地存储池
[root@server5 ~]# mkdir /home/storage
添加网络存储池
网络存储端
[root@server1 ~]# yum install -y nfs-utils.x86_64
[root@server1 ~]# systemctl start nfs-server
[root@server1 ~]# mkdir /home/nfs-storage
[root@server1 ~]# vim /etc/exports
[root@server1 ~]# cat /etc/exports
/home/nfs-storage 192.168.139.0/24(rw,sync,no_root_squash)
KVM虚拟机
[root@server5 ~]# showmount -e 192.168.139.10
Export list for 192.168.139.10:
/home/nfs-storage 192.168.139.0/24
[root@server5 ~]# mkdir /home/remote-storage