-------------------------------------------------------------------------------------------------------------------------------------

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定义

https://www.redhat.com/zh/topics/virtualization/what-isKVM

红帽基于KVM对虚拟机的最⼤资源⽀持及限制

https://access.redhat.com/articles/rhel-kvm-limits

红帽虚拟化⼊⻔指南

https://access.redhat.com/documentation/zhcn/red_hat_enterprise_linux/7/html/virtualization_getting_started_guide/index

KVM 官⽹

https://www.linux-kvm.org/page/Virtio

libvirt

https://libvirt.org/

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

https://ubuntu.com/server/docs/virtualization-libvirt

# 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
虚拟机配置双网卡

第一块网卡:外网--用户访问
第二块网卡:内网--访问数据库,存储
第三块网卡:数据备份,但是很少

graph LR G(KVM开启ip地址转换<br>net.ipv4.ip_forward = 1) A[客户端] --> B(网桥:br0) B --> C{KVM} C --> D(网桥:br1) D --> E[虚拟机A] D --> F[虚拟机B]
# 如果是虚拟机那就设置添加一块网卡(使用仅主机,在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虚拟机磁盘⽂件,可以快速创建虚拟机

做一个虚拟机当做模板去克隆

# 进入到磁盘路径
posted @ 2021-04-26 15:59  给文明以岁月  阅读(502)  评论(0编辑  收藏  举报
----------------------------------------------------------