kvm(未完成2021-04-26)
虚拟化技术之KVM
KVM 是Kernel-based Virtual Machine的简称,是⼀个开源的系统虚拟化模块,⾃Linux 2.6.20之后集成在Linux的各个主要发⾏版本中,KVM⽬前已成为学术界的主流 VMM (virtual machine monitor,虚拟机监视器,也称为hypervisor)之⼀。
KVM (for Kernel-based Virtual Machine) is a full virtualization solution for Linux on x86 hardware containing virtualization extensions (Intel VT or AMD-V).It consists of a loadable kernel module, kvm.ko, that provides the core virtualization infrastructure and a processor specific module, kvm-intel.ko or kvm-amd.ko.
kvm定义
红帽基于KVM对虚拟机的最⼤资源⽀持及限制
红帽虚拟化⼊⻔指南
KVM 官⽹
libvirt
RedHat创建虚拟机数量限制
英特尔64和AMD64
带有KVM的Red Hat Enterprise Linux 5服务器 | 带有KVM的Red Hat Enterprise Linux 6服务器 | 带有KVM的Red Hat Enterprise Linux 7服务器 | 带有KVM的Red Hat Enterprise Linux 8服务器 | |
---|---|---|---|---|
虚拟机最大虚拟CPU数量 | 16 | 240 | 240 | 384 |
虚拟机最大内存 | 512 GB | 4 TB | 6 TB | 6 TB |
虚拟机的最小内存 | 512兆字节 | 512兆字节 | 512兆字节 | 512兆字节 |
KVM的虚拟化需要硬件⽀持(如Intel VT技术或者AMD V技术),是基于硬件的完全虚拟化,⽽Xen早期则是基于软件模拟的半虚拟化,新版本则是⽀持基于硬件⽀持的完全虚拟化,但Xen本⾝有⾃⼰的进程调度器,存储管理模块等,所以代码较为庞⼤,⼴为流传的商业系统虚拟化软件VMware ESXI系列是Full-Virtualization,IBM⽂档:http://www.ibm.com/developerworks/cn/linux/l-using-kvm/
Guest:客⼾机系统,包括CPU(vCPU)、内存、驱动(Console、⽹卡、I/O设备驱动等),被KVM置于⼀种受限制的CPU模式下运⾏。
KVM:运⾏在内核空间,提供 CPU 和内存的虚拟化,以及客⼾机的 I/O拦截,Guest的部分I/O被KVM拦截后,交给 QEMU处理。
Qemu:纯软件实现的虚拟化模拟器,⼏乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟⼀台能够独⽴运⾏操作系统的虚拟机,虚拟机认为⾃⼰和硬件打交道,但其实是和 Qemu 模拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件,正因为 Qemu 是纯软件实现的,所有的指令都要经 Qemu 过⼀⼿,性能⾮常低,所以,在⽣产环境中,⼤多数的做法都是配合 KVM 来完成虚拟化⼯作,KVM完成复杂及要求⽐较⾼的设备虚拟化,⽽Qemu完成像⿏标、键盘等设备的虚拟化。
宿主机环境准备
KVM需要宿主机CPU必须⽀持虚拟化功能,因此如果是VMware workstation上使⽤虚拟机做宿主机,那么必须要在虚拟机配置界⾯的处理器选项中开启虚拟机化功能。
CPU开启虚拟化
如果是虚拟机点击”虚拟机设置“-->”处理器“-->"虚拟化Intel VT-x/EPT或AMD-VRVI(V)"
注意:内存不能太小
CPU指令集
ARM
X86
X86/x86_64 架构
主导桌⾯与服务器芯⽚市场
1968年Intel成⽴,x86架构就是Intel研发的,并且在后来授权给AMD使⽤。2003年AMD推出64位处理器,并授权给Intel使⽤。
ARM 架构
主打低功耗高性能,主导移动端芯片市场
⼿机:华为 ⼩⽶ 三星 苹果
pad:华为 ⼩⽶ 三星 苹果
笔记本:苹果M1
机顶盒:各电视机顶盒
华为泰⼭服务器-鲲鹏系列ARM系列CPU
POWER 架构
由IBM设计,POWER系列微处理器在不少IBM服务器、超级计算机、⼩型计算机及⼯作站中,⼴泛使⽤。
RISC-V 架构
官网:https://riscv.org/
当前CPU的两⼤架构是CISC(复杂指令集)和RISC(精简指令集),x86是CISC的代表架构,占领了95%以上的桌⾯计算机和服务器市场。Arm作为RISC的⼀种,在智能⼿机、可穿戴设备等移动处理器市场占领主要地位,针对物联⽹、5G、AI新兴领域的应⽤,RISC-V和MIPS两⼤精简指令集架构再次登上历史舞台。RISC-V:1980年加州⼤学伯克利分校(Berkeley)的David Patterson(⼤卫·帕特森)教授主导了Berkeley RISC项⽬并设计了其第⼀代的处理器RISCI,2010年,Krste Asanovic(克斯特·阿萨诺维奇)教授带领的团队⼤约花了四年时间,设计和开发了⼀套完整的新的指令集,这个新的指令集叫做RISC-V,这是Berkeley从RISC I开始设计的第五代指令集架构,V还代表了变化(variation)和向量(vectors),RISC-V架构使⽤BSD开源协议给予使⽤者很⼤⾃由,允许使⽤者修改和重新发布开源代码,也允许基于开源代码开发商业软件发布和销售。
MIPS是⼀种RISC处理器,它最早是在80年代初期由斯坦福(Stanford)⼤学John L. Hennessy(约翰·亨利斯)教授领导的研究⼩组研制出来的,MIPS是出现最早的商业RISC架构芯⽚之⼀,2018年3⽉21⽇美国计算机协会(ACM)宣布将2017年度的图灵奖颁给了芯⽚界的两位⼤师:曾任斯坦福⼤学校⻓的JohnL. Hennessy和曾任加州⼤学伯克利分校教授的David A. Patterson。
MIPS计算机系统公司创建于1984年,最初的⽬的是将斯坦福⼤学MIPS CPU⼩组的研究成功商业化,商⽤MIPS CPU 增强了内存管理硬件,并于1985年末作为R2000⾯世,其后⼜相继推出了R3000、R4000、R10000等多款处理器。
RISC-V 架构参与企业
阿⾥巴巴集团 华⽶科技 阿⾥云⽞铁RISC-V
验证开启虚拟化
# 查看cpu信息
[root@localhost ~]# lscpu
Architecture(架构): x86_64 # 架构--这里的64指的位处理器
CPU op-mode(s)(): 32-bit, 64-bit
Byte Order: Little Endian # 小端法
CPU(s)(逻辑cpu颗数): 1 # cpu数量
On-line CPU(s) list: 0 # 在线的cpu数量 有些时候为了省电或者过热的时候,某些CPU会停止运行
Thread(s) per core(每个核心线程): 1 # 每个核心的线程数
Core(s) per socket(每个cpu插槽核数/每颗物理cpu核数): 1 # 每个插槽上有几个核心
CPU socket(s)(cpu插槽数): 1
NUMA node(s): 1 # NUMA 这个太复杂
Vendor ID(cpu厂商ID): GenuineIntel
CPU family(cpu系列): 6
model(型号): 142
model name(型号名称): Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
stepping(步进): 9 # 这个可以简单理解为版本号 也有A0这样的标识方式
CPU MHz(cpu主频): 2711.425
BogoMIPS: 5424.00 # MIPS是每秒百万条指令,Bogo是Bogus(伪)的意思,这里是估算MIPS值
Hypervisor vendor(虚拟机监控程序供应商): VMware
BogoMIPS: 完全
Virtualization(虚拟化,cpu支持的虚拟化技术): VT-x
L1d cache(缓存): 32K # 一级高速缓存 dcache 用来存储数据
L1i cache(缓存): 32K # 一级高速缓存 icache 用来存储指令
L2 cache(缓存): 256K
L3 cache(缓存): 3072K # 缓存速度上 L1 > L2 > L3 > DDR(内存) 内存的理论速度在几十g一秒
NUMA node0 CPU(s): 0 # 四个cpu在一个numa节点上
Flags(Flags是标识了一些cpu的特征): fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat
[root@localhost ~]# grep -E "vmx|svm" /proc/cpuinfo | wc -l
0 # 表示没有开启虚拟化,如果开启会显示cpu内核数,关机开启(虚拟机中勾选上虚拟化Intel VT-x/EPT或AMD-VRVI(V))(物理机在bios中打开虚拟化)(支持了就可以安装kvm了)
安装KVM⼯具包
Ubuntu 18.04
# apt install qemu-kvm virt-manager libvirt-daemon-system
# kvm-ok #验证是否⽀持kvm
INFO: /dev/kvm exists (存在)
KVM acceleration can be used (可以使用加速度)
## qemu-kvm KVM负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm并不能模拟其他设备,还必须有个运行在用户空间的工具才行。KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,QEMU模拟IO设备(网卡,磁盘等),对其进行了修改,最后形成了QEMU-KVM
## virt-manager 图形页面的管理工具
## libvirt-daemon-system 是一个api,使用命令行去创建kvm的时候其实都是通过libvirt去调用kvm的
CentOS 7.X
# 安装kvm
[root@localhost ~]# yum -y install qemu-kvm qemu-kvm-tools libvirt libvirtclient virt-manager virt-install
# 启动kvm(libvirtd)
[root@localhost ~]# systemctl enable --now libvirtd
# 安装完kvm后一旦启动了libvirtd,会生成一个virbr0网卡
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.127.128 netmask 255.255.255.0 broadcast 192.168.127.255
inet6 fe80::2a84:c23d:b387:68 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:7c:7a:83 txqueuelen 1000 (Ethernet)
RX packets 78458 bytes 106530207 (101.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 27340 bytes 2383694 (2.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 68 bytes 5920 (5.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 68 bytes 5920 (5.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:26:24:16 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# virbr0这个网卡的地址可以改,在/etc下的libvirt配置文件中,当然这个网卡一般我们也不用,NAT网卡它是通过地址转换,虚拟机如果要出去上外网的话,它是通过源地址转换,替换宿主机的ens33网卡上的地址的,所以说通过NAT创建的虚拟机通过外网无法访问,无法从外网直接访问到运行在当前这个宿主机上的虚拟机的
[root@localhost ~]# grep "192.168.122.1" /etc/libvirt/ -R
/etc/libvirt/qemu/networks/autostart/default.xml: <ip address='192.168.122.1' netmask='255.255.255.0'>
/etc/libvirt/qemu/networks/default.xml: <ip address='192.168.122.1' netmask='255.255.255.0'>
# 修改virbr0网卡地址(由于net无法通过外网访问内网,相当于web无法接收请求,一般不用,提供服务使用bridge桥接网络)
[root@localhost ~]# ll /etc/libvirt/qemu/networks/autostart/default.xml
lrwxrwxrwx. 1 root root 14 4月 11 11:08 /etc/libvirt/qemu/networks/autostart/default.xml -> ../default.xml
[root@localhost ~]# ll /etc/libvirt/qemu/networks/default.xml
-rw-------. 1 root root 576 4月 11 11:11 /etc/libvirt/qemu/networks/default.xml
[root@localhost ~]# vi /etc/libvirt/qemu/networks/default.xml
<uuid>8fd9fdc0-2ff8-4a7d-8d00-7b128b4bb355</uuid> # uid不要改
<mac address='52:54:00:f2:d8:18'/> # 网卡mac不要改,凡是通过kvm创建的虚拟机它的mac地址都是52:54:00,我们mac地址的前三位不就是代表厂商吗,这三位就代表kvm
<ip address='172.10.0.1' netmask='255.255.255.0'> # ip地址可以改
<range start='172.10.0.2' end='172.10.0.254'/>
# 指定地址池范围,通过dhcp会自动分配地址池的地址给kvm虚拟机
# 重启虚拟机,配置生效(重启服务,配置无法生效,或者在启动kvm之前修改网路)
[root@localhost ~]# reboot
# 查看地址是否生效(可以看到生效了,10.0.0.1这个地址就是虚拟机的网关地址,这个kvm所有创建的虚拟机网关都要指向这个地址,否者虚拟机是不能和外网通信的,指向这个地址后如果要上外网的话,需要做一个源地址转换,10.0.0.1仅是一个内网地址,把虚拟机的地址转换到宿主机的可以跟外网通信的ip地址,这个地址转换需要开启net.ipv4.ip_forward = 1,这是nat模式)
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.127.128 netmask 255.255.255.0 broadcast 192.168.127.255
inet6 fe80::2a84:c23d:b387:68 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:7c:7a:83 txqueuelen 1000 (Ethernet)
RX packets 93122 bytes 129031297 (123.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 37238 bytes 3404925 (3.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 68 bytes 5920 (5.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 68 bytes 5920 (5.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.10.0.1 netmask 255.255.255.0 broadcast 10.0.0.255
ether 52:54:00:f2:d8:18 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# virt-manager工具(安装之后默认打不开,但是它不需要你安装桌面环境)
[root@localhost ~]# virt-manager
[root@localhost ~]#
(virt-manager:3822): Gtk-WARNING **: 11:36:40.000: cannot open display: (Gtk-警告**:11:44:59.359:无法打开显示) # 如果是在winword上打不开,xshell属性-->隧道-->打开x11转发,需要安装程序,可以在ubuntu图形页面下,默认也是打不开,需要exit退出当前会话,重新连接一下
# 连接libGL错误
[root@localhost ~]# virt-manager
libGL error: unable to load driver: swrast_dri.so
(libGL错误:无法加载驱动程序:swrast_dri.so)
libGL error: failed to load driver: swrast
(libGL错误:无法加载驱动程序:swrast)
## 安装下面两个包,两个libGL错误提示就会没有
[root@localhost ~]# yum install -y mesa-libGLES-devel.x86_64 mesa-dri-drivers
# virt-manager中文小方块乱码,安装上对应的字体
## 查看系统语言(通常中文乱码的原因有以下两种可能,1,linux系统的环境语言不是以上两种,2,linux系统的语言是zh_CN.UTF-8但是系统中没有对应的语言包)
[root@localhost network-scripts]# echo $LANG
en_US.UTF-8 //英文
zh_CN.UTF-8 //中文
[root@localhost ~]# locale //确定字符集是否设置成功
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
## 确定系统中的语言包(系统中语言包位置 /usr/share/fonts)(语言包是空的,可能是最小化安装造成的,下载语言包或者从完整安装系统上打包发送过来)
[root@localhost ~]# ll /usr/share/fonts
总用量 4
drwxr-xr-x. 2 root root 4096 4月 13 08:17 dejavu
## 解压语言包(已上传到百度云)
[root@localhost ~]# tar xvf linux.fonts.tar.gz -C /usr/share/fonts/
[root@localhost fonts]# ll
总用量 20
drwxr-xr-x. 2 root root 74 6月 12 2019 abattis-cantarell
drwxr-xr-x. 2 root root 36 6月 12 2019 cjkuni-uming
drwxr-xr-x. 4 root root 51 6月 12 2019 default
drwxr-xr-x. 2 root root 4096 6月 12 2019 dejavu
drwxr-xr-x. 2 root root 4096 6月 12 2019 gnu-free
drwxr-xr-x. 2 root root 126 6月 12 2019 google-crosextra-caladea
drwxr-xr-x. 2 root root 126 6月 12 2019 google-crosextra-carlito
drwxr-xr-x. 2 root root 56 6月 12 2019 jomolhari
drwxr-xr-x. 2 root root 88 6月 12 2019 khmeros
drwxr-xr-x. 2 root root 4096 6月 12 2019 liberation
drwxr-xr-x. 2 root root 36 6月 12 2019 lklug
drwxr-xr-x. 2 root root 45 6月 12 2019 lohit-assamese
drwxr-xr-x. 2 root root 44 6月 12 2019 lohit-bengali
drwxr-xr-x. 2 root root 47 6月 12 2019 lohit-devanagari
drwxr-xr-x. 2 root root 45 6月 12 2019 lohit-gujarati
drwxr-xr-x. 2 root root 44 6月 12 2019 lohit-kannada
drwxr-xr-x. 2 root root 46 6月 12 2019 lohit-malayalam
drwxr-xr-x. 2 root root 44 6月 12 2019 lohit-marathi
drwxr-xr-x. 2 root root 43 6月 12 2019 lohit-nepali
drwxr-xr-x. 2 root root 42 6月 12 2019 lohit-oriya
drwxr-xr-x. 2 root root 44 6月 12 2019 lohit-punjabi
drwxr-xr-x. 2 root root 42 6月 12 2019 lohit-tamil
drwxr-xr-x. 2 root root 43 6月 12 2019 lohit-telugu
drwxr-xr-x. 2 root root 36 6月 12 2019 madan
drwxr-xr-x. 2 root root 101 6月 12 2019 nhn-nanum
drwxr-xr-x. 2 root root 4096 6月 12 2019 open-sans
drwxr-xr-x. 2 root root 39 6月 12 2019 opensymbol
drwxr-xr-x. 2 root root 267 6月 12 2019 overpass
drwxr-xr-x. 2 root root 48 6月 12 2019 paktype-naskh-basic
drwxr-xr-x. 2 root root 127 6月 12 2019 paratype-pt-sans
drwxr-xr-x. 2 root root 46 6月 12 2019 sil-abyssinica
drwxr-xr-x. 2 root root 39 6月 12 2019 sil-nuosu
drwxr-xr-x. 2 root root 60 6月 12 2019 sil-padauk
drwxr-xr-x. 2 root root 36 6月 12 2019 smc
drwxr-xr-x. 2 root root 114 6月 12 2019 stix
drwxr-xr-x. 2 root root 112 6月 12 2019 thai-scalable
drwxr-xr-x. 2 root root 4096 6月 12 2019 ucs-miscfixed
drwxr-xr-x. 2 root root 48 6月 12 2019 vlgothic
drwxr-xr-x. 2 root root 43 6月 12 2019 wqy-microhei
drwxr-xr-x. 2 root root 41 6月 12 2019 wqy-zenhei
# 重新打开virt-manager(正常了)
[root@localhost fonts]# virt-manager
virsh-install安装命令
# virsh-install命令使⽤帮助
[root@localhost images]# virt-install -h
usage: virt-install --name NAME --memory MB STORAGE INSTALL [options]
从指定安装源创建新虚拟机。
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit(显示程序的版本号并退出)
--connect URI 通过 libvirt URI 连接到虚拟机管理程序
通用选项:
-n NAME, --name NAME 客户机实例名称(虚拟机名称不能冲突)
--memory MEMORY Configure guest memory allocation. Ex:(配置来宾内存分配,指定内存)
--memory 1024 (in MiB)
--memory 512,maxmemory=1024
--memory 512,maxmemory=1024,hotplugmemorymax=2048,hotplugmemoryslots=2
--vcpus VCPUS Number of vcpus to configure for your guest. Ex:(指定虚拟机所能占用cpu的核心数)
--vcpus 5
--vcpus 5,maxvcpus=10,cpuset=1-4,6,8
--vcpus sockets=2,cores=4,threads=2
--cpu CPU CPU model and features. Ex:(CPU型号和功能)
--cpu coreduo,+x2apic
--cpu host-passthrough
--cpu host
--metadata METADATA 配置客户机元数据(加一些虚拟机的元信息)。例如:
--metadata name=foo,title="My pretty title",uuid=...
--metadata description="My nice long description"
安装方法选项:
--cdrom CDROM 光驱安装介质(如果是从光盘安装一定要指定)
-l LOCATION, --location LOCATION
安装源 (例如:nfs:host:/path, http://host/path,
ftp://host/path)
--pxe 使用 PXE 协议从网络引导
--import 在已有的磁盘镜像中构建虚拟机(磁盘已经有系统了,但是不想重新安装了,用它导入一下这个虚拟机就起来了)
--livecd 将光驱介质视为 Live CD
-x EXTRA_ARGS, --extra-args EXTRA_ARGS
将附加参数添加到由 --location引导的内核中(比如把网名称改成eth0)
--initrd-inject INITRD_INJECT
使用--location为initrd的root添加给定文件
--os-variant DISTRO_VARIANT
在虚拟机上安装的操作系统,例如:'fedor
a18'、'rhel6'、'winxp' 等。(指定操作系统类型)
--boot BOOT 配置客户机引导设置。例如:(第一次启动是从光盘启动,安装后它会改成硬盘启动)
--boot hd,cdrom,menu=on
--boot init=/sbin/init (针对容器)
--idmap IDMAP 为 LXC 容器启用用户名称空间。例如:
--idmap uid_start=0,uid_target=1000,uid_count=10
设备选项:
--disk DISK 指定存储的各种选项。例如:(创建的磁盘,磁盘路径在什么位置)
--disk size=10 (在默认位置创建 10GiB 镜像)
--disk /my/existing/disk,cache=none
--disk device=cdrom,bus=scsi
--disk=?
-w NETWORK, --network NETWORK
配置客户机网络接口。例如:(指定网络,它默认会用NAT)
--network bridge=mybr0 (bridge指向桥接网络mybr0)
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--network none
--network help
--graphics GRAPHICS 配置客户机显示设置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--controller CONTROLLER
配置客户机控制器设备。例如:
--controller type=usb,model=ich9-ehci1
--input INPUT 配置客户机输入设备。例如:(键盘鼠标,也不用指定,通常都是usb)
--input tablet
--input keyboard,bus=usb
--serial SERIAL 配置客户机串口设备
--parallel PARALLEL 配置客户机并口设备
--channel CHANNEL 配置客户机通信通道
--console CONSOLE 配置文本控制台连接主机与客户机
--hostdev HOSTDEV 配置物理 USB/PCI 等主机设备与客户机共享
--filesystem FILESYSTEM
传递主机目录到虚拟机(类似做共享)。例如:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
--sound [SOUND] 配置客户机声音设备仿真
--watchdog WATCHDOG 配置客户机 watchdog 设备
--video VIDEO 配置客户机视频硬件。
--smartcard SMARTCARD
配置客户机智能卡设备。例如:
--smartcard mode=passthrough
--redirdev REDIRDEV 配置客户机重定向设备。例如:
--redirdev usb,type=tcp,server=192.168.1.1:4000
--memballoon MEMBALLOON
配置客户机 memballoon 设备。例如:
--memballoon model=virtio
--tpm TPM 配置客户机 TPM 设备。例如:
--tpm /dev/tpm
--rng RNG Configure a guest RNG device. Ex:
--rng /dev/urandom
--panic PANIC 配置客户机 panic 设备。例如:
--panic default
--memdev MEMDEV Configure a guest memory device. Ex:
--memdev dimm,target_size=1024
客户机配置选项:
--security SECURITY 设置域安全驱动配置。
--cputune CPUTUNE Tune CPU parameters for the domain process.
--numatune NUMATUNE 为域进程调整 NUMA 策略。
--memtune MEMTUNE 为域进程调整内存策略。
--blkiotune BLKIOTUNE
为域进程调整 blkio 策略。
--memorybacking MEMORYBACKING
为域进程设置内存后备策略。例如:
--memorybacking hugepages=on
--features FEATURES 设置域 <features> XML。例如:
--features acpi=off
--features apic=on,eoi=on
--clock CLOCK 设置域 <clock> XML。例如:
--clock offset=localtime,rtc_tickpolicy=catchup
--pm PM 配置 VM 电源管理功能
--events EVENTS 配置 VM 生命周期管理策略
--resource RESOURCE 配置 VM 资源分区(cgroups)
--sysinfo SYSINFO Configure SMBIOS System Information. Ex:
--sysinfo emulate
--sysinfo host
--sysinfo bios_vendor=Vendor_Inc.,bios_version=1.2.3-abc,...
--sysinfo system_manufacturer=System_Corp.,system_product=Computer,...
--sysinfo baseBoard_manufacturer=Baseboard_Corp.,baseBoard_product=Motherboard,...
--qemu-commandline QEMU_COMMANDLINE
Pass arguments directly to the qemu emulator. Ex:
--qemu-commandline='-display gtk,gl=on'
--qemu-commandline env=DISPLAY=:0.1
虚拟化平台选项:
-v, --hvm 这个客户机应该是一个全虚拟化虚拟机
-p, --paravirt 这个客户机应该是一个半虚拟化虚拟机
--container 这个客户机应该是一个容器虚拟机
--virt-type HV_TYPE 要使用的管理程序名称 (kvm, qemu, xen, ...)
--arch ARCH 模拟 CPU 架构(一般是x86_64为,如果arm可以指定)
--machine MACHINE 机器类型为仿真类型
其它选项:
--autostart 主机启动时自动启动域。(随着宿主机的启动而启动,如果有一天这个虚拟机所在的客户端关机了,我希望我这个虚拟机能随着宿主机开机自动开机,否者需要手动开启虚拟机,如果不加后面也可以改)
--transient Create a transient domain.
--wait WAIT 请等待数分钟以便完成安装。
--noautoconsole 不要自动尝试连接到客户端控制台
--noreboot 安装完成后不启动客户机。
--print-xml [XMLONLY] 打印生成的 XML 域,而不是创建虚拟机。(类似于虚拟机的xml格式配置文件)
--dry-run 运行安装程序,但不创建设备或定义虚拟机。
--check CHECK 启用或禁用验证检查。例如:
--check path_in_use=off
--check all=off
-q, --quiet 抑制非错误输出
-d, --debug 输入故障排除信息
创建虚拟机
KVM管理⼯具
libvirt
使⽤最多的KVM虚拟化管理⼯具和应⽤程序接⼝,即通过libvirt调⽤KVM创建虚拟机,libvirt是KVM通⽤的访问API,其不但能管理KVM,还能管理VMware、Xen、Hyper-V、virtualBox等虚拟化⽅案
virsh:
是⼀个常⽤的管理KVM虚拟化的命令⾏⼯具,常⽤于管理运⾏在单个宿主机上的虚拟机,virsh是⼀个使⽤C语⾔编写调⽤libvirt API的虚拟化管理命令⾏⼯具。
virt-manager:
virt-manager是⼀个虚拟化管理图形软件,其底层也是调⽤libvirt API来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停⽌以及⼀些简单的监控功能等。
openstack:
openstack是⼀个开源的虚拟化编排⼯具,常⽤于构建⼤规模的虚拟化环境,⽤于管理成千上万虚拟机的创建、启动、删除等整个⽣命周期。
创建磁盘
创建虚拟机之前需要先创建磁盘,cpu和内存他可以直接调用宿主机的,但是磁盘文件我们要给他创建一个,需要指定虚拟机在创建时候的最大磁盘和最小磁盘,其实就是创建一个磁盘文件,使用 qemu-img命令,但是不同的虚拟机有不同的磁盘格式
# 默认保存虚拟机磁盘的路径(他默认会把虚拟机磁盘创建到这儿,这是qemu.conf配置文件定义的)
[root@localhost ~]# ll /var/lib/libvirt/images/
总用量 0
## KVM虚拟机默认image文件存放位置为/var/lib/libvirt/images,一般在分区时很少为/var单独划出一个大分区,这种创建的虚拟机很快会将分区吃满,所以机器要使用KVM虚拟机化的时候,请提前为/var划出一个大的分区,如果提前没有规划,后期可以通过修改配置文件方:
## mount /dev/sdb1 /var/lib/libvirt/images/如果单独挂载一个磁盘
# 切换目录
[root@localhost ~]# cd /var/lib/libvirt/images/
[root@localhost images]#
# 创建磁盘(可以看到raw和qcow2创建的磁盘文件所占用的空间的区别)(注意:重复同样的命令创建的磁盘,相当于覆盖,之前如果安装了系统数据会丢失)
## 创建raw磁盘
[root@localhost images]# qemu-img create -f raw /var/lib/libvirt/images/centos-7.raw 10G
Formatting '/var/lib/libvirt/images/centos-7.raw', fmt=raw size=10737418240
[root@localhost images]# ll -h
总用量 0
-rw-r--r--. 1 root root 10G 4月 12 10:51 centos-7.raw
## 创建qcow2磁盘(一般使用这个,动态占用实际使用磁盘空间,支持快照)
[root@localhost images]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos-7.qcow2 10G
Formatting '/var/lib/libvirt/images/centos-7.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
[root@localhost images]# ll -h /var/lib/libvirt/images/
总用量 196K
-rw-r--r--. 1 root root 193K 4月 12 10:53 centos-7.qcow2
-rw-r--r--. 1 root root 10G 4月 12 10:51 centos-7.raw
[root@localhost images]# file centos-7.raw
centos-7.raw: data # 这个是文件格式就是磁盘
[root@localhost images]# file centos-7.qcow2
centos-7.qcow2: QEMU QCOW Image (v3), 10737418240 bytes # 这个就是一个Image类似于磁盘的镜像文件一样,这个就可以理解为io虚拟化,模拟了一个磁盘,这个性能肯定不行,但是我们有驱动,在这种全虚拟化的基础之上,给他装一个半虚拟化的驱动,他的性能就会好很多
## qemu-img QEMU磁盘映像实用程序
## create 创建磁盘
## -f 指定格式,这里使用raw,也可以使用别的格式
## /var/lib/libvirt/images/centos-7.xxx # 创建磁盘名称centos-7.xxx名称需要清晰用途,后缀没有意义仅作区分标识,可以绝对路径,如果不写绝对路径他就在当前路径下创建
## 10G 指定磁盘大小
### 磁盘格式
## raw 裸磁盘,直接在宿主机占用你给他指定大小的磁盘,如果你给他分配10G他就在你的磁盘上顺序占用10G,性能最好,这种如果做数据库可以使用这种,但是如果做数据迁移,需要把这个10G全给他拷过去,这10个G就类似于一个块文件,一个整体,这个早期用的多,现在用的不多了
## qcow 瘦增长磁盘,刚创建的时候不会占用那么多磁盘,而是随着数据的增长使用磁盘,目前已经被新版本的qcow2取代
## qcow2 瘦增长磁盘,目前主流,第二代在第一代的基础上做了优化
## vmdk VMware专用
# 查看配置文件(在配置文件中我们可以了解到,创建的虚拟机其实是一个进程,会监听宿主机的某端口,这个端口从5900开始到65535这个范围,这个配置通常不用动)
[root@localhost ~]# vi /etc/libvirt/qemu.conf
#remote_display_port_min = 5900
#remote_display_port_max = 65535
创建NAT网络虚拟机
创建⼀台虚拟机,并使⽤默认的NAT⽹络,可以使虚拟机连接外⽹。
上传镜像并安装Centos 7.X虚拟机
# 提前上传安装镜像,和创建磁盘
[root@localhost src]# ll /usr/local/src/CentOS-7-x86_64-DVD-1708.iso
-rw-r--r--. 1 root root 4521459712 4月 12 11:38 /usr/local/src/CentOS-7-x86_64-DVD-1708.iso
[root@localhost images]# ll -h /var/lib/libvirt/images/
总用量 196K
-rw-r--r--. 1 root root 193K 4月 12 10:53 centos-7.qcow2
-rw-r--r--. 1 root root 10G 4月 12 10:51 centos-7.raw
# 创建默认⽹络虚拟机(默认就是NAT)
[root@localhost src]# virt-install --virt-type kvm --name centos7 --ram 1024 --vcpus 2 --cdrom=/usr/local/src/CentOS-7-x86_64-DVD-1708.iso --disk path=/var/lib/libvirt/images/centos-7.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
开始安装......
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。
## --virt-type 虚拟化类型kvm是最佳选择,默认也是kvm
## --name 虚拟机名称
## --ram 指定内存大小
## --vcpus 指定虚拟机的CPU数量,比如--vcpus 2,标识宿主机的百分之200的cpu,可能一个cpu占百分之10,一个cpu占百分之90,它是多个cpu加起来最多占百分之200,它不是占2cpu,它是多个cpu的累计值
## --cdrom 光驱提供boot.iso 镜像
## --disk 指定虚拟硬盘文件路径
## --network network:default 设置网卡(使用默认)
## --graphics 图形参数,配置虚拟机显⽰设置,是否使用 vnc 这个的 none 意思是不使用,vnc监听端口默认5900,如果想使用其他端口vnc,listen=0.0.0.0监听的地址,port=5901,另外在防火墙中加入此端口
# 查看端口号5900是否监听
[root@localhost src]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 *:5900 *:*
LISTEN 0 5 192.168.200.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
# 关闭防火墙
[root@localhost src]# systemctl stop firewalld
[root@localhost src]# setenforce 0
# 查看进程
[root@localhost src]# ps -ef | grep kvm
qemu 32466 1 30 12:58 ? 00:00:21 /usr/libexec/qemu-kvm
# 通过VNC客⼾端连接宿主机加端口号并安装虚拟机(可以使用virt-manager,但是这里windows打不开,这里使用VNC)
192.168.127.128:5900
# 连接上是图形界面,正常安装就行了(这种就是NAT虚拟机,但是生产环境中用的很少,我们生产环境中用的都是桥接网络)
创建bridge⽹络虚拟机
桥接⽹络可以让运⾏在宿主机上的虚拟机使⽤和宿主机同⽹段IP,并且可以从外部直接访问到虚拟机,⽬前企业中⼤部分场景都使⽤桥接⽹络。
(外网的请求到宿主机之后,宿主机内核一看去往哪个mac地址,它就会报文丢到哪个接口上去,其实就是通过宿主机的内核到达网桥,网桥一看去往哪个接口直接就过去了,因为这个网桥本来就是二层设备,是通过mac地址进行通信的,你每一个虚拟机都有独立的mac地址)
创建br0桥接⽹卡
Ubuntu 18.04创建桥接⽹卡
# cat /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no # dhcp关掉
dhcp6: no
bridges: # 创建一个bridges网络
br0: # br0是第一个设备
dhcp4: no # dhcp关掉
dhcp6: no
addresses: [172.18.0.20/16] # 给网桥指定地址
gateway4: 172.18.0.1 # 给网桥指定网关
nameservers: # 给网桥指定dns
addresses: [223.6.6.6] # dns地址
interfaces: # 哪个网卡
- eth0
Centos 7.X创建桥接⽹卡
# 安装网桥工具包(如果不安装是无法通过网桥通信的)
[root@localhost ~]# yum -y install bridge-utils
# 查看dns地址(配置网桥地址,这里使用静态地址,需要记录一下当前地址)
## 方法一:
### [root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.127.2 # dns地址
## 方法二:
[root@localhost ~]# nslookup www.baidu.com
Server: 192.168.127.2 # dns地址
Address: 192.168.127.2#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 110.242.68.4 # 百度地址
Name: www.a.shifen.com
Address: 110.242.68.3 # 百度地址
# 查看网关(配置网桥地址,这里使用静态地址,需要记录一下当前地址)
[root@localhost ~]# route -n
Kernel IP routing table(内核IP路由表)
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.127.2 0.0.0.0 UG 100 0 0 ens33
192.168.127.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
## Destination(目的地)
## Gateway(网关)
## Genmask(掩码)
## Flags(标志)
## 去往0.0.0.0标识任何地址,通过192.168.127.2所以192.168.127.2就是这台设备的网关
[root@localhost ~]# pwd
/etc/sysconfig/network-scripts
# 修改网卡配置文件,添加参数BRIDGE=br0
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
# PROXY_METHOD=none
# BROWSER_ONLY=no
BOOTPROTO=static # 改成静态获取ip,IP地址配置在br0网桥上
# 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=f27ca8cf-9d26-435c-a1a2-3a24494ade17
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0 # 在eth0上加一个参数BRIDGE等于br0,意思就是把eth0这个物理网卡指向br0这个网桥,br0这个网卡还没有等会自己创建一个
# 创建br0网桥(网卡)(如果虚拟机连接网桥,那么它的ip地址跟网桥同一个网段,交换机不能跨网段)
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge # 指定类型是Bridge网桥(网桥就是交换机)
BOOTPROTO=static # 地址改成静态地址
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.127.128 # 宿主机真是ip
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.127.2 # 网关
DNS1=192.168.127.2 # dns地址
# 重启网卡
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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 qlen 1000 # 宿主机的ip地址没了
link/ether 00:0c:29:7c:7a:83 brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000 # nat地址转换模式,虚拟机使用的内网地址,访问时通过地址转换成宿主机ip,能访问外网,但是外网不能访问内网服务器,在公网上找不到内网地址。
link/ether 52:54:00:f2:d8:18 brd ff:ff:ff:ff:ff:ff
inet 172.10.0.1/24 brd 10.0.0.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:f2:d8:18 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 # 宿主机的ip地址在br0这个网桥上(这个地址就相当于交换机上的WAN:接外部 IP 地址用,通常指的是出口,转发来自内部 LAN 接口的 IP 数据包)
link/ether 00:0c:29:7c:7a:83 brd ff:ff:ff:ff:ff:ff
inet 192.168.127.128/24 brd 192.168.127.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7c:7a83/64 scope link
valid_lft forever preferred_lft forever
安装虚拟机
# 镜像和磁盘文件需要创建好提前存在
[root@localhost ~]# ll /usr/local/src/
-rw-r--r--. 1 qemu qemu 4521459712 4月 12 11:38 /usr/local/src/CentOS-7-x86_64-DVD-1708.iso
[root@localhost ~]# ll /var/lib/libvirt/images/
总用量 1306624
-rw-r--r--. 1 root root 197120 4月 12 10:53 centos-7.qcow2 # 这次我们使用这个磁盘
-rw-r--r--. 1 qemu qemu 10737418240 4月 12 15:41 centos-7.raw # 虚拟机启动时会把这个磁盘文件的宿主和属组改成qemu用户
# 创建基于桥接⽹络的虚拟机(记得提前开启CPU虚拟化)
[root@localhost ~]# virt-install --virt-type kvm --name centos7-bridge --ram 1024 --vcpus 2 --cdrom=/usr/local/src/CentOS-7-x86_64-DVD-1708.iso --disk path=/var/lib/libvirt/images/centos-7.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
开始安装......
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。
## --network bridge=br0 配置虚拟机⽹络接⼝,bridge网桥使用br0就可以了
# 关闭防火墙
[root@localhost src]# systemctl stop firewalld
[root@localhost src]# setenforce 0
# 查询网桥信息
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c297c7a83 no ens33 # 可以看到br0的一端是指向ens33(ens33和vnet1是一对儿网卡,ens33一端是在网桥上,vnet1一端是在虚拟机上)
vnet1
virbr0 8000.525400bf080a yes virbr0-nic
vnet0
## bridge name 桥名
## bridge id 桥ID
## STP enabled 启用STP(STP协议(生成树协议))
## interfaces 接口
# 查看宿主机网卡
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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 qlen 1000
link/ether 00:0c:29:7c:7a:83 brd ff:ff:ff:ff:ff:ff
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 52:54:00:bf:08:0a brd ff:ff:ff:ff:ff:ff
inet 192.168.200.1/24 brd 192.168.200.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:bf:08:0a brd ff:ff:ff:ff:ff:ff
6: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN qlen 1000
link/ether fe:54:00:e1:a1:a6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fee1:a1a6/64 scope link
valid_lft forever preferred_lft forever
11: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 00:0c:29:7c:7a:83 brd ff:ff:ff:ff:ff:ff
inet 192.168.127.128/24 brd 192.168.127.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7c:7a83/64 scope link
valid_lft forever preferred_lft forever
12: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 1000
link/ether fe:54:00:eb:fe:3c brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:feeb:fe3c/64 scope link
valid_lft forever preferred_lft forever
# 查看端口,通过VNC客户端进行连接(多了一个5901端口,我们上一个是5900,这次连接5901)
[root@localhost ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 *:5900 *:*
LISTEN 0 1 *:5901
# 通过VNC客⼾端连并安装虚拟机,并配置网卡,开启sshd远程连接
192.168.127.128:5901
虚拟机配置双网卡
第一块网卡:外网--用户访问
第二块网卡:内网--访问数据库,存储
第三块网卡:数据备份,但是很少
# 如果是虚拟机那就设置添加一块网卡(使用仅主机,在vmware内部使用,内网卡),如果是物理机,那就添加一个真网卡(可以看到多了一个ens37网卡)
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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 qlen 1000
link/ether 00:0c:29:7c:7a:83 brd ff:ff:ff:ff:ff:ff
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 52:54:00:bf:08:0a brd ff:ff:ff:ff:ff:ff
inet 192.168.200.1/24 brd 192.168.200.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:bf:08:0a brd ff:ff:ff:ff:ff:ff
6: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN qlen 1000
link/ether fe:54:00:e1:a1:a6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fee1:a1a6/64 scope link
valid_lft forever preferred_lft forever
11: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 00:0c:29:7c:7a:83 brd ff:ff:ff:ff:ff:ff
inet 192.168.127.128/24 brd 192.168.127.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7c:7a83/64 scope link
valid_lft forever preferred_lft forever
12: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 1000
link/ether fe:54:00:eb:fe:3c brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:feeb:fe3c/64 scope link
valid_lft forever preferred_lft forever
13: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 # 可以看到多了一个网卡
link/ether 00:0c:29:7c:7a:8d brd ff:ff:ff:ff:ff:ff
inet 192.168.47.128/24 brd 192.168.47.255 scope global dynamic ens37
valid_lft 1743sec preferred_lft 1743sec
inet6 fe80::7e45:2281:e36b:9ac4/64 scope link
valid_lft forever preferred_lft forever
# 修改第二块网卡配置信息
[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens37
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens37
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.47.128
METMASK=255.255.255.0
BRIDGE=br1
# 创建第二个网桥
[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-br0 /etc/sysconfig/network-scripts/ifcfg-br1
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-br1
YPE=Bridge
BOOTPROTO=static
NAME=br1
DEVICE=br1
ONBOOT=yes
IPADDR=192.168.47.128
NETMASK=255.255.255.0
# 重启网络(可以看到多了一个br1网桥)
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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 qlen 1000
link/ether 00:0c:29:7c:7a:83 brd ff:ff:ff:ff:ff:ff
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 52:54:00:bf:08:0a brd ff:ff:ff:ff:ff:ff
inet 192.168.200.1/24 brd 192.168.200.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:bf:08:0a brd ff:ff:ff:ff:ff:ff
6: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN qlen 1000
link/ether fe:54:00:e1:a1:a6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fee1:a1a6/64 scope link
valid_lft forever preferred_lft forever
12: vnet1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
link/ether fe:54:00:eb:fe:3c brd ff:ff:ff:ff:ff:ff
13: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br1 state UP qlen 1000
link/ether 00:0c:29:7c:7a:8d brd ff:ff:ff:ff:ff:ff
15: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 # 新添加的br1网桥生效了
link/ether 00:0c:29:7c:7a:8d brd ff:ff:ff:ff:ff:ff
inet 192.168.47.128/24 brd 192.168.47.255 scope global br1
valid_lft forever preferred_lft forever
inet6 fe80::8c7f:a1ff:fe3b:2bc3/64 scope link
valid_lft forever preferred_lft forever
16: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 00:0c:29:7c:7a:83 brd ff:ff:ff:ff:ff:ff
inet 192.168.127.128/24 brd 192.168.127.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7c:7a83/64 scope link
valid_lft forever preferred_lft forever
# 查看地址转换是否打开
[root@localhost src]# sysctl -a | grep "net.ipv4.ip_forward = 1"
net.ipv4.ip_forward = 1
# 查看虚拟机名称
[root@localhost ~]# virsh list
Id 名称 状态
----------------------------------------------------
2 centos7 running
4 centos7-bridge running
# 查看centos7-bridge虚拟机网卡
[root@localhost ~]# virsh domiflist centos7-bridge
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet1 bridge br0 virtio 52:54:00:eb:fe:3c
# 显示物理主机的网络接口列表
[root@localhost ~]# virsh iface-list
名称 状态 MAC 地址
---------------------------------------------------
br0 活动 00:0c:29:7c:7a:83
br1 活动 00:0c:29:7c:7a:8d
lo 活动 00:00:00:00:00:00
# 添加一个接口
[root@localhost ~]# virsh attach-interface centos7-bridge --type bridge --source br1
成功附加接口
# 再次指定虚拟机名称查看网卡
[root@localhost ~]# virsh domiflist centos7-bridge
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet1 bridge br0 virtio 52:54:00:eb:fe:3c
vnet2 bridge br1 rtl8139 52:54:00:10:da:91
# 虚拟机centos7-bridge查看接口
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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
4: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:2d:79:fa brd ff:ff:ff:ff:ff:ff
inet 192.168.127.144/24 brd 192.168.127.255 scope global dynamic ens3
valid_lft 1663sec preferred_lft 1663sec
inet6 fe80::48b8:f1c7:aa58:51ce/64 scope link
valid_lft forever preferred_lft forever
5: ens9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:76:0a:36 brd ff:ff:ff:ff:ff:ff
inet 192.168.47.130/24 brd 192.168.47.255 scope global dynamic ens9
valid_lft 1728sec preferred_lft 1728sec
inet6 fe80::9d52:e2dd:dbba:47ef/64 scope link
valid_lft forever preferred_lft forever
# 切换目录
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
# 修改centos7-bridge虚拟机ifcfg-ens3网卡配置文件
[root@localhost network-scripts]# vi ifcfg-ens3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.127.200
METMASK=255.255.255.0
GATEWAY=192.168.127.2
DNS1=192.168.127.2
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=ens3
DEVICE=ens3
ONBOOT=yes
# 修改centos7-bridge虚拟机ifcfg-ens9网卡配置文件,没有配置文件复制一份(这个网卡是内网不要网关和dns了)
[root@localhost network-scripts]# cp ifcfg-ens3 ifcfg-ens9
[root@localhost network-scripts]# vi ifcfg-ens9
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.47.100
METMASK=255.255.255.0
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=ens9
DEVICE=ens9
ONBOOT=yes
# 重启网卡并查看
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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
4: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:2d:79:fa brd ff:ff:ff:ff:ff:ff
inet 192.168.127.200/24 brd 192.168.127.255 scope global ens3
valid_lft forever preferred_lft forever
inet6 fe80::248:ef7a:7108:2bd7/64 scope link
valid_lft forever preferred_lft forever
5: ens9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:76:0a:36 brd ff:ff:ff:ff:ff:ff
inet 192.168.47.100/24 brd 192.168.47.255 scope global ens9
valid_lft forever preferred_lft forever
inet6 fe80::1811:c0f8:25db:1827/64 scope link
valid_lft forever preferred_lft forever
# 给centos7-bridge虚拟机创建快照(系统初始-centos7-bridge给快照起的名字)
[root@localhost ~]# virsh snapshot-create-as centos7-bridge 系统初始-centos7-bridge
已生成域快照 系统初始-centos7-bridge
# 列出centos7-bridge虚拟机的快照
[root@localhost ~]# virsh snapshot-list centos7-bridge
名称 生成时间 状态
------------------------------------------------------------
系统初始-centos7-bridge 2021-04-12 21:19:03 +0800 running
## 其中running代表是开机状态创建的,shutoff是关机状态创建的
# 回滚(恢复)快照
[root@localhost ~]# virsh snapshot-revert --domain centos7-bridge 系统初始-centos7-bridge
# 删除快照
[root@localhost ~]# virsh snapshot-delete centos7-bridge 快照删除测试-centos7-bridge
已删除域快照 快照删除测试-centos7-bridge
## 或者
virsh snapshot-delete --domain centos7-bridge --snapshotname 快照删除测试-centos7-bridge
# 分离网卡(此mac地址是vnet2的mac地址,通过virsh domiflist centos7-bridge此命令查看)
[root@localhost ~]# virsh detach-interface centos7-bridge --type bridge --mac 52:54:00:10:da:91
成功分离接口
# 关闭虚拟机
[root@localhost src]# virsh shutdown centos7-bridge
域 centos7-bridge 被关闭
[root@localhost src]# virsh shutdown centos7
域 centos7 被关闭
[root@localhost src]# virsh list --all
Id 名称 状态
----------------------------------------------------
- centos7 关闭
- centos7-bridge 关闭
# 删除虚拟机(并删除磁盘文件)
[root@localhost src]# virsh undefine centos7
[root@localhost src]# rm -rf /var/lib/libvirt/images/centos-7.raw
安装Windows虚拟机
virtio 是⼀种 I/O 半虚拟化解决⽅案,是⼀套通⽤ I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的⼀组通⽤ I/O 设备的抽象(通常是磁盘io,和网络io,因为cpu和内存我们可以让虚拟机直接使用cpu和内存直接调用,内存和cpu不需要虚拟化,有一些cpu指令集支持虚拟机直接调用宿主机cpu和内存,如果cpu和内存做了虚拟化性能会更差),提供了⼀套上层应⽤与各 Hypervisor 虚拟化设备(Hypervisor就是KVM,Xen,VMware等)之间的通信框架和编程接⼝,减少跨平台所带来的兼容性问题,⼤⼤提⾼驱动程序开发效率,windows 系统需要单独安装virtio驱动,linux系统⾃带virtio驱动。
为了提高硬盘io和网络io的性能,出现了虚拟化解决方案; 在全虚拟化状态下,Guest OS不知道⾃⼰是虚拟机,于是像发送普通的io请求一样发送数据,被Hypervisor拦截,然后由Hypervisor在转发给真正的硬件。 在半虚拟化状态下,Guest需要安装半虚拟化驱动并且Guest os知道自己是虚拟机,所以数据直接发送给半虚拟化设备,经过驱动写入真正的硬件,典型的半虚拟化驱动由virtio和VMware Tools
Virtio 使⽤ virtqueue 来实现 I/O 机制,每个 virtqueue 就是⼀个承载⼤量数据的队列,具体使⽤多少个队列取决于需求,例如,virtio⽹络驱动程序(virtio-net)使⽤两个队列(⼀个⽤于接受,另⼀个⽤于发送),⽽virtio块驱动程序(virtio-blk)仅使⽤⼀个队列。
实现IO虚拟化主要有三种⽅式:全虚拟化、半虚拟化和透传,全虚拟化Guest OS不会感知到⾃⼰是虚拟机,也⽆需修改Guest OS,但是它的效率⽐较低,半虚拟化Guest OS知道⾃⼰是虚拟机,通过Frontend/Backend驱动模拟实现IO虚拟化,透传就是直接分配物理设备给VM⽤,但是需要解决单个硬件在多个虚拟机共享使⽤的问题。
查看lspci
# 虚拟机安装lspci命令(显示所有的pci设备信息。pci是一种总线,而通过pci总线连接的设备就是pci设备)
[root@localhost ~]# yum -y install pciutils
[root@localhost ~]# lspci
00:05.0 Communication controller: Red Hat, Inc Virtio console
00:06.0 SCSI storage controller: Red Hat, Inc Virtio block device # 半虚拟化磁盘块设备,Red Hat红帽提供的
00:07.0 Unclassified device [00ff]: Red Hat, Inc Virtio memory balloon
00:08.0 Unclassified device [00ff]: Red Hat, Inc Virtio RNG
## virtio我们叫做半虚拟化,linux是不需要安装驱动的,linux原生就支持,但是如果是安装windows系统就需要单独安装Virtio驱动
上传windows镜像和下载virtio
virtio下载地址:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/
下载stable-virtio表示稳定版
半虚拟化追求性能,生产环境中如果没有提供了主和备,没有单点故障可以使用
全虚拟化可以提供快照的功能,对我们来说带来的帮助更大
# 下载virtio(无法创建快照,无法创建快照,无法创建快照)(使用半虚拟化安装操作系统,操作系统会直接通过驱动跟硬件交互,比如磁盘和网卡,性能会有所提升但是无法创建快照,快照还是挺重要的)
[root@localhost src]# wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.185-2/virtio-win_amd64.vfd
[root@localhost src]# ll
总用量 6012348
-rw-r--r--. 1 qemu qemu 4.3G 4月 12 11:38 CentOS-7-x86_64-DVD-1708.iso
-rw-r--r--. 1 root root 6153693184 4月 12 21:55 cn_windows_10_consumer_editions_version_20h2_updated_dec_2020_x64_dvd_b7d6e09d.iso
-rw-r--r--. 1 root root 2949120 7月 21 2020 virtio-win_amd64.vfd
# 创建磁盘(创建磁盘如果两个命令一样,创建就相当于格式化,不要直接复制,可能会直接执行,之前的安装的系统就没了)
[root@localhost src]# qemu-img create -f qcow2 /var/lib/libvirt/images/Windows10.x86_64.qcow2 100G
[root@localhost src]# ll -h /var/lib/libvirt/images/
总用量 2.9G
-rw-r--r--. 1 root root 1.9G 4月 12 22:03 centos-7.qcow2
-rw-r--r--. 1 root root 10G 4月 12 22:03 centos-7.raw
-rw-r--r--. 1 root root 194K 4月 12 22:32 Windows10.x86_64.qcow2
# 使用virtio驱动半虚拟化的方式创建windows虚拟机(指定了format为qcow2也不生效,无法创建快照)
[root@localhost src]# virt-install --virt-type kvm --name Windows10.x86_64 --ram 3072 --vcpus=2 --os-type=windows --cdrom=/usr/local/src/cn_windows_10_consumer_editions_version_20h2_updated_dec_2020_x64_dvd_b7d6e09d.iso --disk path=/var/lib/libvirt/images/Windows10.x86_64.qcow2,format=qcow2,bus=virtio --disk path=/usr/local/src/virtio-win_amd64.vfd,device=floppy --network bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole
开始安装......
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。
## 创建windows的指令跟linux的指令有些许不一样,我们需要单独指定一些参数--name需要换一下,--ram内存需要调大点,--vcpus这个cpu也要换一下一核有点不合适了,--os-type操作系统类型需要换成windows,--cdrom光盘路径,--disk path磁盘路径,format磁盘格式,bus总线使用virtio是半虚拟化的,连起来的意思就是我的磁盘使用的virtio,--disk path指定vfd磁盘,这其实是一个软盘,device=floppy表示他是依附加的方式。bridge网络使用br0,model模式也是virtio,连起来的意思就是我的网络使用的virtio
## 半虚拟化安装由于直接和硬盘交互不支持快照
[root@localhost src]# qemu-img info /var/lib/libvirt/images/Windows10.x86_64.qcow2
image: /var/lib/libvirt/images/Windows10.x86_64.qcow2
file format: qcow2 # 可以看到磁盘格式已经是qcow2
virtual size: 100G (107374182400 bytes)
disk size: 13G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
[root@localhost src]# virsh snapshot-create Windows10.x86_64
错误:不支持的配置:存储类型 fda 不支持磁盘 raw 的内部快照
# 使用vnc查看ip和端口号连接安装系统或者virt-manager
[root@localhost src]# virsh list --all
Id 名称 状态
----------------------------------------------------
1 Windows10.x86_64 running
- centos7-bridge 关闭
[root@localhost src]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 *:5900 *:*
# 进行安装,安装的时候没有硬盘,原因是我们之前声明了磁盘virtio是半虚拟化,网卡也是半虚拟化,如果不安装驱动它是识别不了的,
## 点击下面加载驱动程序--> 浏览--> 软盘驱动器-->amd64-->找到对应版本的驱动-->他会自动搜索可用的系统,这里面主要两个,一个是VirtIO Ethernet Adapter这个就是网卡识别器的驱动程序,另一个是VirtIO SCSI controller这个就是磁盘io的驱动程序,把这两个都导入进来,然后就可以识别你的硬件了,--> 安装完就会发现识别了磁盘设备
############################使用全虚拟化的方式创建windows虚拟机(支持使用快照)
[root@localhost ~]# virt-install --virt-type kvm --name win10 --ram 4024 --vcpus 4 --cdrom=/usr/local/src/cn_windows_10_consumer_editions_version_20h2_updated_dec_2020_x64_dvd_b7d6e09d.iso --disk path=/var/lib/libvirt/images/win10.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
开始安装......
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。
# 查看ip和端口号使用vnc连接安装系统或者virt-manager
[root@localhost src]# virsh list --all
Id 名称 状态
----------------------------------------------------
1 Windows10.x86_64 running
- centos7-bridge 关闭
[root@localhost src]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 *:5900 *:*
# windows创建快照
[root@localhost ~]# virsh snapshot-create-as win10 系统初始-win10
[root@localhost ~]# virsh snapshot-list win10
名称 生成时间 状态
------------------------------------------------------------
系统初始-win10 2021-04-13 19:33:33 +0800 shutoff
虚拟机管理命令virsh
virt-install 命令行安装虚拟机
qeme-img 磁盘管理命令
virsh 虚拟机管理命令
virsh list #列出当前开机的
virsh list --inactive #列出关闭的虚拟机
virsh list --all #列出所有
virsh shutdown CentOS-7-x86_64 #正常关机
virsh start CentOS-7-x86_64 #正常开机
virsh destroy centos7 #强制停⽌/关机(相当于直接断电)
virsh undefine Win_2008_r2-x86_64 #强制删除
virsh autostart centos7 #设置当前虚拟机开机⾃启动
virsh detach-interface centos7-bridge --type bridge --mac 52:54:00:10:da:91 # 分离网卡
virsh domiflist centos7-bridge # 指定虚拟机名称查看网卡
virsh iface-list # 显示物理主机的网络接口列表
virsh attach-interface centos7-bridge --type bridge --source br1 # 添加一个接口
virsh snapshot-create-as centos7-bridge 系统初始-centos7-bridge # 创建快照
virsh snapshot-list centos7-bridge # 列出虚拟机的快照
virsh snapshot-revert --domain centos7-bridge 系统初始-centos7-bridge # 回滚(恢复)快照
virsh snapshot-delete centos7-bridge 快照删除测试-centos7-bridge # 删除快照
快速创建虚拟机
通过copy虚拟机磁盘⽂件,可以快速创建虚拟机
做一个虚拟机当做模板去克隆
# 进入到磁盘路径