一、虛擬化技術(shù)之KVM
KVM 是Kernel-based Virtual Machine的簡稱,是一個開源的系統(tǒng)虛擬化模塊,自Linux 2.6.20之后集成在Linux的各個主要發(fā)行版本中。它使用Linux自身的調(diào)度器進(jìn)行管理,所以相對于Xen(https://zhuanlan.zhihu.com/p/33324585),其核心源碼很少。KVM目前已成為學(xué)術(shù)界的主流VMM之一。 KVM的虛擬化需要硬件支持(如Intel VT技術(shù)或者AMD V技術(shù))。是基于硬件的完全虛擬化。而Xen早期則是基于軟件模擬的Para-Virtualization,新版本則是基于硬件支持的完全虛擬化。但Xen本身有自己的進(jìn)程調(diào)度器,存儲管理模塊等,所以代碼較為龐大。廣為流傳的商業(yè)系統(tǒng)虛擬化軟件VMware ESXI系列是Full-Virtualization,IBM文檔:http://www.ibm.com/developerworks/cn/linux/l-using-kvm/
1.Guest:客戶機(jī)系統(tǒng),包括CPU(vCPU)、內(nèi)存、驅(qū)動(Console、網(wǎng)卡、I/O 設(shè)備驅(qū)動等),被KVM置于一種受限制的CPU模式下運行.
2.KVM:運行在內(nèi)核空間,提供 CPU 和內(nèi)存的虛級化,以及客戶機(jī)的 I/O攔截,Guest的部分I/O被KVM攔截后,交給 QEMU處理。
3.QEMU:修改過的被KVM虛機(jī)使用的QEMU代碼,運行在用戶空間,提供硬件I/O虛擬化,通過IOCTL/dev/kvm設(shè)備和KVM交互,但是,KVM本身不執(zhí)行任何硬件模擬,需要用戶空間程序通過 /dev/kvm 接口設(shè)置一個客戶機(jī)虛擬服務(wù)器的地址空間,向它提供模擬I/O,并將它的視頻顯示映射回宿主的顯示屏。目前這個應(yīng)用程序是QEMU。

1.1 環(huán)境準(zhǔn)備
1.1.1 CPU開啟虛擬化
KVM需要宿主機(jī)CPU必須支持虛擬化功能,因此如果是在vmware workstation上使用虛擬機(jī)做宿主機(jī),那么必須要在虛擬機(jī)配置界面的處理器選項中開啟虛擬機(jī)化功能。

1.1.2 確認(rèn)CPU指令集
1、查看主機(jī)的CUP是否開啟了虛擬化支持
[root@centos7 ~]# grep -E "vmx|svm" /proc/cpuinfo | wc -l(顯示物理核心CPU的指令集)
2
1.1.3 查看Linux內(nèi)核中KVM的模塊
[root@centos7 ~]# lsmod | grep kvm
kvm_intel 183621 0
kvm 586948 1 kvm_intel
irqbypass 13503 1 kvm
1.1.4 安裝KVM的管理命令
1.安裝kvm的管理命令
[root@centos7 ~]# yum install qemu-kvm qemu-kvm-tools libvirt virt-manager virt-install
說明:
模擬器,模擬鼠標(biāo)、鍵盤等:qemu-kvm qemu-kvm-tools
啟動虛擬機(jī)的一個主程序,用來管理虛擬機(jī):libvirt
使用WEB界面遠(yuǎn)程管理虛擬機(jī):virt-manager
2.啟動libvirtd服務(wù)
[root@centos7 ~]# systemctl start libvirtd
[root@centos7 ~]# systemctl enable libvirtd
[root@centos7 ~]#
3.生成NAT網(wǎng)卡“virbr0”(可以訪問其他主機(jī),但其他主機(jī)訪問不了本機(jī)“virbr0”的IP地址)
[root@centos7 ~]# ifconfig virbr0
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:93:29:ff 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
[root@centos7 ~]#
4.查找“virbr0”網(wǎng)卡的配置文件
[root@centos7 ~]# grep 192.168.122.1 /etc/ -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'>
[root@centos7 ~]#
說明:
“/etc/libvirt/qemu/networks/autostart/default.xml”文件是“/etc/libvirt/qemu/networks/default.xml”文件的軟連接
5.修改“virbr0”網(wǎng)卡的配置文件
[root@centos7 ~]# vim /etc/libvirt/qemu/networks/default.xml
說明:
“ip address”項可修改IP地址
“DHCP”項修改:動態(tài)分配給kvm虛擬機(jī)的IP地址

1.2 創(chuàng)建虛擬機(jī)
創(chuàng)建虛擬機(jī)的步驟:
安裝kvm管理命令-->查看CPU指令、內(nèi)存容量是否滿足條件-->創(chuàng)建虛擬機(jī)使用的網(wǎng)卡-->創(chuàng)建虛擬機(jī)的磁盤(重點)-->準(zhǔn)備虛擬機(jī)所使用的ISO鏡像
注意:"KVM的NAT網(wǎng)絡(luò)虛擬機(jī)",只能連接宿主機(jī)外的其他虛擬機(jī),而宿主機(jī)外的其他虛擬機(jī)不能連接到這個“NAT虛擬機(jī)”。(想實現(xiàn)這個效果,可用KVM的橋接網(wǎng)絡(luò)虛擬機(jī))
1.2.1 虛擬機(jī)磁盤的格式
1.根據(jù)存儲數(shù)據(jù)方式的不同可以分為兩種格式,一種是稀疏模式。一種是全鏡像模式,全鏡像模式無法做快照,IO層面是有qemu模擬的,CPU和內(nèi)存是有KVM實現(xiàn)的,以下是KVM的功能:
KVM 所支持的功能包括:
1. 支持CPU 和 memory 超分(Overcommit)
2. 支持半虛擬化I/O (virtio)
3. 支持熱插拔 (cpu,塊設(shè)備、網(wǎng)絡(luò)設(shè)備等)
4. 支持實時遷移(Live Migration)
5. 支持 PCI 設(shè)備直接分配和 單根I/O 虛擬化 (SR-IOV)
6. 支持 內(nèi)核同頁合并 (KSM )
7. 支持 NUMA (Non-Uniform Memory Access,非一致存儲訪問結(jié)構(gòu) )
2.KVM工具集合
1. libvirt:操作和管理KVM虛機(jī)的虛擬化 API,使用 C 語言編寫,可以由 Python,Ruby, Perl, PHP, Java 等語言調(diào)用??梢圆僮靼?KVM,vmware,XEN,Hyper-v, LXC 等 Hypervisor。
2. Virsh:基于 libvirt 的 命令行工具 (CLI)
3. Virt-Manager:基于 libvirt 的 GUI 工具
4. virt-v2v:虛機(jī)格式遷移工具
5. virt-* 工具:包括 Virt-install (創(chuàng)建KVM虛機(jī)的命令行工具), Virt-viewer (連接到虛機(jī)屏幕的工具),Virt-clone(虛機(jī)克隆工具),virt-top 等
6. sVirt:安全工具
3.磁盤格式
(1)raw:指定多大就創(chuàng)建多大,直接占用指定大小的空間
老牌的格式,用一個字來形容就是裸,你隨便dd一個file就模擬了一個raw格式的鏡像。由于裸的徹底,性能上來說的話還是不錯的。目前來看,KVM和XEN默認(rèn)的格式好像還是這個格式。因為其原始,有很多原生的特性,例如直接掛載也是一件簡單的事情。裸的好處還有就是簡單,支持轉(zhuǎn)換成其它格式的虛擬機(jī)鏡像對裸露的它來說還是很簡單的(如果其它格式需要轉(zhuǎn)換,有時候還是需要它做為中間格式),空間使用來看,這個很像磁盤,使用多少就是多少(du -h看到的大小就是使用大?。绻阋颜麎K磁盤都拿走的話得全盤拿了(copy鏡像的時候),會比較消耗網(wǎng)絡(luò)帶寬和I/O。接下來還有個有趣的問題,如果那天你的硬盤用著用著不夠用了,你咋辦,在買一塊盤。但raw格式的就比較犀利了,可以在原來的盤上追加空間:
dd if=/dev/zero of=zeros.raw bs=1024k count=4096(先創(chuàng)建4G的空間)
cat foresight.img zeros.raw > new-foresight.img(追加到原有的鏡像之后)
當(dāng)然,好東西是吹出來的,誰用誰知道,還是有挺多問題的。由于原生的裸格式,不支持snapshot也是很正常的。傳說有朋友用版本管理軟件對raw格式的文件做版本管理從而達(dá)到snapshot的能力,估計可行,但沒試過,這里也不妄加評論。但如果你使用LVM的裸設(shè)備,那就另當(dāng)別論。說到LVM還是十分的犀利的,當(dāng)年用LVM做虛擬機(jī)的鏡像,那性能杠杠的。而且現(xiàn)在好多兄弟用虛擬化都采用LVM來做的。在LVM上做了很多的優(yōu)化,國外聽說也有朋友在LVM增量備份方面做了很多的工作。目前來看LVM的snapshot、性能、可擴(kuò)展性方面都還是有相當(dāng)?shù)男Ч摹D壳皝砜吹脑?,備份的話也問題不大。就是在虛擬機(jī)遷移方面還是有很大的限制。但目前虛擬化的現(xiàn)狀來看,真正需要熱遷移的情況目前需求還不是很強(qiáng)烈。雖然使用LVM做虛擬機(jī)鏡像的相關(guān)公開資料比較少,但目前來看犧牲一點靈活性,換取性能和便于管理還是不錯的選擇。對于LVM相關(guān)的特性及使用可以參考如下鏈接:
http://www.ibm.com/developerworks/linux/library/l-lvm2/index.html
(2)cow
···
曾經(jīng)qemu的寫時拷貝的鏡像格式,目前由于歷史遺留原因不支持窗口模式。從某種意義上來說是個棄嬰,還沒得它成熟就死在腹中,后來被qcow格式所取代。
···
(3)qcow
一代的qemu的cow格式,剛剛出現(xiàn)的時候有比較好的特性,但其性能和raw格式對比還是有很大的差距,目前已經(jīng)被新版本的qcow2取代。其性能可以查看如下鏈接:
http://www.linux-kvm.org/page/Qcow2
(4)qcow2(推薦)
是openstack默認(rèn)也是比較推薦的格式,將差異保存在一個文件,文件比較小而且做快照也比較小,空間是動態(tài)增長的
現(xiàn)在比較主流的一種虛擬化鏡像格式,經(jīng)過一代的優(yōu)化,目前qcow2的性能上接近raw裸格式的性能,這個也算是redhat的官方渠道了,對于qcow2的格式,幾點還是比較突出的,qcow2的snapshot,可以在鏡像上做N多個快照:更小的存儲空間,即使是不支持holes的文件系統(tǒng)也可以(這下du -h和ls -lh看到的就一樣了),支持多個snapshot,對歷史snapshot進(jìn)行管理,支持zlib的磁盤壓縮,支持AES的加密
(5)vmdk
VMware的格式,這個格式說的蛋疼一點就有點牛X,原本VMware就是做虛擬化起家,自己做了一個集群的VMDK的pool,做了自己的虛擬機(jī)鏡像格式。又拉著一些公司搞了一個OVF的統(tǒng)一封包。從性能和功能上來說,vmdk應(yīng)該算最出色的,由于vmdk結(jié)合了VMware的很多能力,目前來看,KVM和XEN使用這種格式的情況不是太多。但就VMware的Esxi來看,它的穩(wěn)定性和各方面的能力還是可圈可點。
(6)vdi
VirtualBox 1.1 compatible image format, for exchanging images with VirtualBox.SUN收購了VirtualBox,Oracle又收購了SUN,這么說呢,vdi也算虛擬化這方面的一朵奇葩,可惜的是入主的兩家公司。SUN太專注于技術(shù)(可以說是IT技術(shù)最前端也不為過),Oracle又是開源殺手(mysql的沒落)。單純從能力上來說vdi在VirtualBox上的表現(xiàn)還是不錯的。也是不錯的workstation級別的產(chǎn)品。
4.磁盤格式的轉(zhuǎn)換
(1)raw轉(zhuǎn)換為qcow2
此步驟使用qemu-img工具實現(xiàn),如果機(jī)器上沒有,可以通過rpm或yum進(jìn)行安裝,包名為qemu-img。
qemu-img是專門虛擬磁盤映像文件的qemu命令行工具。
具體命令如下:
qemu-img convert -f raw centos.img -O qcow2 centos.qcow2
參數(shù)說明:convert 將磁盤文件轉(zhuǎn)換為指定格式的文件
-f 指定需要轉(zhuǎn)換文件的文件格式
-O 指定要轉(zhuǎn)換的目標(biāo)格式
轉(zhuǎn)換完成后,將新生產(chǎn)一個目標(biāo)映像文件,原文件仍保存。
(2)qcow2轉(zhuǎn)換為raw
qemu-img convert -O qcow2 my.raw myqow.qcow
(3)VMDK轉(zhuǎn)換為qcow2
qemu-img convert -f vmdk -O qcow2 xxx.vmdk xxx.img
參考鏈接:http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/index.html
1.2.2 創(chuàng)建磁盤
qemu-img命令
一般使用“qemu-img命令”創(chuàng)建(create)、轉(zhuǎn)換(convert)磁盤的格式
使用“qemu-img -h”可查看此命令的使用幫助
1.默認(rèn)保存虛擬機(jī)磁盤的路徑
[root@centos7 ~]# ll /var/lib/libvirt/images/
總用量 0
[root@centos7 ~]#
2.創(chuàng)建一個格式為raw大小為10G的裸磁盤文件
[root@centos7 ~]# qemu-img create -f raw /var/lib/libvirt/images/centos.raw 10G
Formatting '/var/lib/libvirt/images/centos.raw', fmt=raw size=10737418240
[root@centos7 ~]#
3.查看這個文件占多大的系統(tǒng)空間
[root@centos7 ~]# ll -h /var/lib/libvirt/images/centos.raw
-rw-r--r-- 1 root root 10G 6月 17 20:31 /var/lib/libvirt/images/centos.raw
[root@centos7 ~]#
4.創(chuàng)建一個格式為qcow2大小為10G的磁盤文件
[root@centos7 src]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos.qcow2 10G
Formatting '/var/lib/libvirt/images/centos.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
[root@centos7 src]#
5.查看這個文件占多大的系統(tǒng)空間
[root@centos7 src]# ll -h /var/lib/libvirt/images/centos.qcow2
-rw-r--r-- 1 root root 193K 6月 17 21:31 /var/lib/libvirt/images/centos.qcow2
[root@centos7 src]#
1.2.3 準(zhǔn)備虛擬機(jī)所使用的ISO鏡像(一般用最小化的鏡像)
一般放到“/usr/local/src/”目錄里
[root@centos7 ~]# cd /usr/local/src/
[root@centos7 src]# ll
總用量 940032
-rw-r--r-- 1 root root 962592768 6月 17 21:17 CentOS-7-x86_64-Minimal-1810.iso
[root@centos7 src]#
1.2.4 創(chuàng)建虛擬機(jī)所使用的命令“virt-install”
[root@centos7 ~]# virt-install -h
usage: virt-install --name NAME --memory MB STORAGE INSTALL [options]
使用指定安裝介質(zhì)新建虛擬機(jī)。
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
--connect URI 使用 libvirt URI 連接到 hypervisor
通用選項:
-n NAME, --name NAME 客戶端事件名稱
--memory MEMORY 配置虛擬機(jī)內(nèi)存分配。例如:
--memory 1024 (in MiB)
--memory 512,maxmemory=1024
--vcpus VCPUS 為虛擬機(jī)配置的 vcpus 數(shù)。例如:
--vcpus 5
--vcpus 5,maxcpus=10,cpuset=1-4,6,8
--vcpus sockets=2,cores=4,threads=2,
--cpu CPU CPU 型號及功能。例如:
--cpu coreduo,+x2apic
--cpu host
--metadata METADATA 配置虛擬機(jī)元數(shù)據(jù)。例如:
--metadata name=foo,title="My pretty title",uuid=...
--metadata description="My nice long description"
安裝方法選項:
--cdrom CDROM 光驅(qū)安裝介質(zhì)
-l LOCATION, --location LOCATION
安裝源(例如:nfs:host:/path、http://host/path 或 ftp://host/path)
--pxe 使用 PXE 協(xié)議從網(wǎng)絡(luò)引導(dǎo)
--import 在磁盤映像中構(gòu)建虛擬機(jī)
--livecd 將光驅(qū)介質(zhì)視為 Live CD
-x EXTRA_ARGS, --extra-args EXTRA_ARGS
附加到使用 --location 引導(dǎo)的內(nèi)核的參數(shù)
--initrd-inject INITRD_INJECT
使用 --location 為 initrd 的 root 添加指定文件
--os-variant DISTRO_VARIANT
在其中安裝 OS 變體的虛擬機(jī),比如:'fedora18'、'rhel6'、'winxp' 等等
--boot BOOT 配置虛擬機(jī)引導(dǎo)設(shè)置。例如:
--boot hd,cdrom,menu=on
--boot init=/sbin/init (for containers)
--idmap IDMAP 為 LXC 容器啟用用戶名稱空間。例如:
--idmap uid_start=0,uid_target=1000,uid_count=10
設(shè)備選項:
--disk DISK 使用不同選項指定存儲。例如:
--disk size=10 (new 10GiB image in default location)
--disk /my/existing/disk,cache=none
--disk device=cdrom,bus=scsi
--disk=?
-w NETWORK, --network NETWORK
配置虛擬機(jī)網(wǎng)絡(luò)接口。例如:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--network none
--network help
--graphics GRAPHICS 配置虛擬機(jī)顯示設(shè)置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--controller CONTROLLER 配置虛擬機(jī)控制程序設(shè)備。例如:
--controller type=usb,model=ich9-ehci1
--input INPUT 配置虛擬機(jī)輸入設(shè)備。例如:
--input tablet
--input keyboard,bus=usb
--serial SERIAL 配置虛擬機(jī)串口設(shè)備
--parallel PARALLEL 配置虛擬機(jī)并口設(shè)備
--channel CHANNEL 配置虛擬機(jī)溝通頻道
--console CONSOLE 配置虛擬機(jī)與主機(jī)之間的文本控制臺連接
--hostdev HOSTDEV 將物理 USB/PCI/etc主機(jī)設(shè)備配置為與虛擬機(jī)共享
--filesystem FILESYSTEM 將主機(jī)目錄傳遞給虛擬機(jī)。例如:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
--sound [SOUND] 配置虛擬機(jī)聲音設(shè)備模擬
--watchdog WATCHDOG 配置虛擬機(jī) watchdog 設(shè)備
--video VIDEO 配置虛擬機(jī)視頻硬件。
--smartcard SMARTCARD 配置虛擬機(jī)智能卡設(shè)備。例如:
--smartcard mode=passthrough
--redirdev REDIRDEV 配置虛擬機(jī)重定向設(shè)備。例如:
--redirdev usb,type=tcp,server=192.168.1.1:4000
--memballoon MEMBALLOON 配置虛擬機(jī) memballoon 設(shè)備。例如:
--memballoon model=virtio
--tpm TPM 配置虛擬機(jī) TPM 設(shè)備。例如:
--tpm /dev/tpm
--rng RNG 配置虛擬機(jī) RNG 設(shè)備。例如:
--rng /dev/random
--panic PANIC 配置虛擬機(jī) panic 設(shè)備。例如:
--panic default
虛擬機(jī)配置選項:
--security SECURITY 設(shè)定域安全驅(qū)動器配置。
--numatune NUMATUNE 為域進(jìn)程調(diào)整 NUMA 策略。
--memtune MEMTUNE 為域進(jìn)程調(diào)整內(nèi)粗策略。
--blkiotune BLKIOTUNE 為域進(jìn)程調(diào)整 blkio 策略
--memorybacking MEMORYBACKING 為域進(jìn)程設(shè)置內(nèi)存后備策略。例如:
--memorybacking hugepages=on
--features FEATURES 設(shè)置域 <features> XML。例如:
--features acpi=off
--features apic=on,eoi=on
--clock CLOCK 設(shè)置域 <clock> XML。例如:
--clock offset=localtime,rtc_tickpolicy=catchup
--pm PM 配置 VM 電源管理功能
--events EVENTS 配置 VM 生命周期管理策略
--resource RESOURCE 配置 VM 資源分區(qū)(cgroups)
虛擬化平臺選項:
-v, --hvm 客戶端應(yīng)該是一個全虛擬客戶端
-p, --paravirt 這個客戶端一個是一個半虛擬客戶端
--container 這臺虛擬機(jī)需要一個容器客戶端
--virt-type HV_TYPE 要使用的管理程序名稱(kvm、qemu、xen等等)
--arch ARCH 模擬的 CPU 構(gòu)架
--machine MACHINE 要模擬的機(jī)器類型
其它選項:
--autostart 引導(dǎo)主機(jī)時自動啟動域。
--wait WAIT 等待安裝完成的分鐘數(shù)。
--noautoconsole 不要自動嘗試連接到客戶端控制臺
--noreboot 完成安裝后不要引導(dǎo)虛擬機(jī)。
--print-xml [XMLONLY] 輸出所生成域 XML,而不是創(chuàng)建虛擬機(jī)
--dry-run 完成安裝步驟,但不要創(chuàng)建設(shè)備或者定義虛擬機(jī)。
--check CHECK 啟用或禁用驗證檢查。例如:
--check path_in_use=off
--check all=off
-q, --quiet 禁止無錯誤輸出
-d, --debug 輸入故障排除信息
說明:
使用 '--option=?' 或者 '--option help' 查看可用子選項
有關(guān)示例及完整選項語法,請查看 man page。
1.2.5 虛擬機(jī)管理命令
[root@s1 src]# virsh list #列出當(dāng)前開機(jī)的
[root@s1 src]# virsh list --all 3列出所有
[root@s1 src]# virsh shutdown CentOS-7-x86_64 #正常關(guān)機(jī)
[root@s1 src]# virsh start CentOS-7-x86_64 #正常關(guān)機(jī)
[root@s1 src]# virsh destroy centos7 #強(qiáng)制停止/關(guān)機(jī)
[root@s1 src]# virsh undefine Win_2008_r2-x86_64 #強(qiáng)制刪除
[root@s1 src]# virsh autostart centos7 #設(shè)置開機(jī)自啟動
2 創(chuàng)建默認(rèn)網(wǎng)絡(luò)(NAT)虛擬機(jī)
說明:
1.指定虛擬機(jī)名稱:"--name"
2.指定虛擬機(jī)CPU多少核:"--vcpus"
3.指定內(nèi)存大?。?--ram"或者“--memory”
4.指定ISO鏡像在什么地方:"--cdrom="
5.指定磁盤文件:"disk path="
6.指定虛擬機(jī)網(wǎng)絡(luò):"--network"(企業(yè)中“橋接網(wǎng)絡(luò)”用的最多,“NAT網(wǎng)絡(luò)是默認(rèn)網(wǎng)絡(luò),用‘default’表示”看情況使用;使用哪種網(wǎng)絡(luò)需要知道它們的名稱)
7.指定虛擬機(jī)圖形界面:"--graphics"(通常使用“VNC”,缺點:虛擬機(jī)不能復(fù)制;桌面虛擬化使用“spice”,對配置要求很高,尤其顯卡;兩種方式的端口都可以自己指定)
8.指定鍵盤、鼠標(biāo)等(一般不用指定):“--input ”
9.指定控制接口(一般不用指定):“--console”
10.指定CPU架構(gòu)(看情況指定,x86、x64):“--arch”
11.指定虛擬機(jī)類型“kvm、qemu、xen”(默認(rèn)是KVM):“--virt-type”
12.指定“宿主機(jī)重啟后”,虛擬機(jī)是否自動開機(jī)(可選項,一般設(shè)置為自動開機(jī)):“--autostart”
創(chuàng)建默認(rèn)網(wǎng)絡(luò)(NAT)虛擬機(jī)
[root@centos7 src]# virt-install --virt-type kvm --name linux36 --ram 512 --vcpus 1 --autostart --cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1810.iso --disk path=/var/lib/libvirt/images/centos.qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
說明:
“--graphics vnc,listen=0.0.0.0 --noautoconsole”表示:
指定vnc,vnc監(jiān)聽0.0.0.0地址,不自動連接控制臺(通常是人為連接)
創(chuàng)建虛擬機(jī)后,要趕快連接虛擬機(jī)
2.1 連接“新建虛擬機(jī)”的方式
在宿主機(jī)創(chuàng)建好虛擬機(jī)后,會出現(xiàn)一個“5900”端口;如果之前創(chuàng)建了很多虛擬機(jī),那選擇“59”開頭共四位數(shù)的端口
1.通過VNC客戶端連并安裝虛擬機(jī)

2.使用kvm后臺管理窗口連接
1.此方式的連接前提:
(1).在“連接工具(我用的xshell5)”-->屬性-->隧道-->轉(zhuǎn)發(fā)X11連接到(X):"Xmanager(M)"
(2).如果使用xshell,需要是企業(yè)版
2.連接:
[root@centos7 ~]# virt-manager
2.2 在新建虛擬機(jī)界面的開機(jī)界面,指定新建虛擬機(jī)的網(wǎng)卡是“eth0”的方式
進(jìn)入開機(jī)界面后按“Tab”,在“···x64 quiet”后面輸入:
net.ifnames=0 biosdevname=0
2.3 之后按照往常一樣安裝系統(tǒng)即可。
2.4 安裝電源管理包
安裝虛擬機(jī)重啟后,有時會出現(xiàn)啟動不了的情況,那是因為沒有安裝“acpid”軟件包
通過“acpid”,我們可以對虛擬機(jī)進(jìn)行啟動和關(guān)閉等操作:
1.安裝電源管理包:
[root@centos7 ~]# yum -y install acpid
2.管理虛擬機(jī):
列出當(dāng)前已經(jīng)開啟的虛擬機(jī):
virsh list
查看已經(jīng)關(guān)閉的虛擬機(jī):
birsh list--all
正常開啟名稱為“kvm1”的虛擬機(jī)
virsh start kvm1
正常關(guān)機(jī)名稱為“kvm1”的虛擬機(jī)
virsh shutdown kvm1
強(qiáng)制關(guān)機(jī)名稱為“kvm1”的虛擬機(jī)
virsh destory kvm1
注釋:通常用于Java服務(wù)導(dǎo)致某個虛擬機(jī)僵死了。
強(qiáng)制刪除名稱為“kvm1”的虛擬機(jī)
virsh undefine kvm1
設(shè)置開機(jī)自啟動
virsh autostart kvm1
3 創(chuàng)建橋接網(wǎng)絡(luò)虛擬機(jī)(實現(xiàn)虛擬機(jī)內(nèi)外網(wǎng)隔離)
NAT網(wǎng)絡(luò)的虛擬機(jī)可以訪問宿主機(jī)外的主機(jī),但宿主機(jī)外的主機(jī)不可以訪問NAT網(wǎng)絡(luò)的虛擬機(jī)。
橋接網(wǎng)絡(luò)的虛擬機(jī),通過設(shè)置網(wǎng)卡綁定,可以反問宿主機(jī)外的主機(jī),也可以讓宿主機(jī)外主機(jī)或虛擬機(jī),訪問橋接網(wǎng)絡(luò)的虛擬機(jī)。(詳見下面的KVM虛擬機(jī)的高可用架構(gòu))
3.1 概念

1.虛擬機(jī)實現(xiàn)內(nèi)外網(wǎng)隔離的前提
宿主機(jī)最少四塊物理網(wǎng)卡,每兩塊一組,做網(wǎng)卡綁定,設(shè)置br0、br1為兩個網(wǎng)段,br0是“192.168.0.0/16”用于訪問外網(wǎng);br1是“10.20.0.0/16”用于內(nèi)網(wǎng)之間的訪問,這個網(wǎng)段需要在防火墻設(shè)置為“不能訪問外網(wǎng)”。
2.思路
根據(jù)虛擬機(jī)對網(wǎng)絡(luò)的要求(內(nèi)外網(wǎng)都訪問 或 只內(nèi)網(wǎng)之間訪問),來設(shè)置虛擬機(jī)網(wǎng)卡添加幾塊。
如內(nèi)外網(wǎng)都訪問,就添加兩塊網(wǎng)卡,一塊設(shè)置br0的網(wǎng)絡(luò),網(wǎng)關(guān)指向br0的IP地址;一塊設(shè)置br1的網(wǎng)絡(luò),網(wǎng)關(guān)指向br1的IP地址。
如只內(nèi)網(wǎng)之間訪問,就只添加一塊網(wǎng)卡,設(shè)置br1的網(wǎng)絡(luò),網(wǎng)關(guān)指向為br1的IP地址。
3.虛擬機(jī)訪問外網(wǎng)的通訊過程
當(dāng)虛擬機(jī)“kvm2”想訪問外網(wǎng),通過br0,br0指向bond0,把訪問流量轉(zhuǎn)發(fā)到宿主機(jī)的物理網(wǎng)卡"ethX"(eth0、eth1)。
物理網(wǎng)卡通過宿主機(jī)內(nèi)核中的路由,把虛擬機(jī)訪問外網(wǎng)的請求轉(zhuǎn)發(fā)到互聯(lián)網(wǎng)。
4.虛擬機(jī)內(nèi)網(wǎng)之間訪問的通訊過程
當(dāng)虛擬機(jī)(kvm1、kvm3、kvm4)想訪問內(nèi)網(wǎng)的其他虛擬機(jī)(存儲服務(wù)器、MySQL數(shù)據(jù)庫),通過br1,br1指向bond1,把訪問流量轉(zhuǎn)發(fā)到宿主機(jī)的物理網(wǎng)卡“ethX”(eth2、eth3)。
物理網(wǎng)卡通過宿主機(jī)內(nèi)核中的路由,把虛擬機(jī)訪問內(nèi)網(wǎng)的其他虛擬機(jī)的請求轉(zhuǎn)發(fā)到其他物理網(wǎng)卡,
通過bond1,在到br1,然后訪問到內(nèi)網(wǎng)其他虛擬機(jī)。如“存儲服務(wù)器”、“MySQL數(shù)據(jù)庫服務(wù)器”等。
注意:虛擬機(jī)使用br1和bond1的網(wǎng)絡(luò),是不能上外網(wǎng)的,為了服務(wù)器的安全性。
5.brX 和 bondX
通過bondX決定宿主機(jī)物理網(wǎng)卡使用哪種模式(高可用、輪詢)為虛擬機(jī)的網(wǎng)絡(luò)“brX”提供服務(wù)
高可用:如果bond0是高可用模式,虛擬機(jī)(kvm1、kvm2)的網(wǎng)絡(luò)請求,通過br0,由bond0轉(zhuǎn)發(fā)到物理網(wǎng)卡“eth0”,在轉(zhuǎn)發(fā)給宿主機(jī)內(nèi)核的路由從而訪問外網(wǎng);當(dāng)物理網(wǎng)卡“eth0”發(fā)生故障,由物理網(wǎng)卡“eth1”代替“eth0”工作。
輪詢:如果bond0是輪詢模式,虛擬機(jī)(kvm1、kvm2)的網(wǎng)絡(luò)請求,通過br0,由bond0轉(zhuǎn)發(fā)到物理網(wǎng)卡“eth0”和物理網(wǎng)卡“eth1”,在轉(zhuǎn)發(fā)給宿主機(jī)內(nèi)核的路由從而提升訪問外網(wǎng)的效率。
3.2 KVM虛擬機(jī)的高可用架構(gòu)

說明:
兩臺宿主機(jī)“172.18.200.101”、“172.18.200.102”分別有四塊網(wǎng)卡,都做了網(wǎng)卡綁定,且網(wǎng)卡綁定后的“br0”、“br1”網(wǎng)段都一樣。
在宿主機(jī)"172.18.200.101"創(chuàng)建虛擬機(jī)“vm1”、“vm2”。
在宿主機(jī)"172.18.200.102"創(chuàng)建虛擬機(jī)“vm3”、“vm4”。
通過圖片可知:
“vm1”、“vm3”都有兩塊網(wǎng)卡,網(wǎng)關(guān)分別指向自己宿主機(jī)的“br0”、“br1”,可以實現(xiàn)內(nèi)外網(wǎng)都能訪問的效果。而且,因為兩臺宿主機(jī)的網(wǎng)段相同,虛擬的bond網(wǎng)段也相同,所以“vm1”能訪問“vm3”、“vm4”;“vm3”能訪問“vm1”、“vm2”。
“vm2”、“vm4”只有一塊網(wǎng)卡,網(wǎng)關(guān)都指向自己宿主機(jī)的“br1”,可以實現(xiàn)內(nèi)網(wǎng)之間的訪問效果。而且,因為兩臺宿主機(jī)的網(wǎng)段相同,虛擬的bond網(wǎng)段也相同,所以“vm2”和“vm4”可以相互訪問,也可以訪問同網(wǎng)段的其他虛擬機(jī),但訪問不了外網(wǎng)。
總結(jié):
內(nèi)外網(wǎng)都能訪問的虛擬機(jī),可用于負(fù)載均衡服務(wù)器
只能內(nèi)網(wǎng)之間訪問的虛擬機(jī),可用于數(shù)據(jù)庫、存儲服務(wù)器等
3.3 創(chuàng)建橋接(建bridge)網(wǎng)絡(luò)虛擬機(jī)
橋接網(wǎng)絡(luò)可以讓運行在宿主機(jī)上的虛擬機(jī)使用和宿主機(jī)同網(wǎng)段IP,并且可以從外部直接訪問到虛擬機(jī),目前企業(yè)中大部分場景都使用橋接網(wǎng)絡(luò)。
3.3.1創(chuàng)建br0橋接網(wǎng)卡
1.確認(rèn)系統(tǒng)已經(jīng)安裝橋接組件,否則橋接不成功導(dǎo)致服務(wù)器遠(yuǎn)程連接不上
yum install bridge-utils
2.創(chuàng)建橋接網(wǎng)卡配置
[root@s1 network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@s1 network-scripts]# vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=172.18.200.101
NETMASK=255.255.0.0
GATEWAY=172.18.0.1
DNS1=172.18.0.1
3.配置物理網(wǎng)卡
[root@s1 network-scripts]# vim ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
4.重啟網(wǎng)絡(luò)服務(wù)使之生效
[root@s1 network-scripts]# systemctl restart network
5.查看網(wǎng)絡(luò)
[root@s1 network-scripts]# ifconfig
3.3.2 上傳鏡像并安裝虛擬機(jī)
1.查看鏡像
[root@s1 ~]# ll /usr/local/src/CentOS-7-x86_64-Minimal-1810.iso
-rw-r--r-- 1 qemu qemu 962592768 Jan 1 13:33 /usr/local/src/CentOS-7-x86_64-Minimal1810.iso
2.#創(chuàng)建磁盤:
[root@s1 ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos7-bridge.qcow2 10G
Formatting '/var/lib/libvirt/images/centos7-bridge.qcow2', fmt=qcow2 size=10737418240
encryption=off cluster_size=65536 lazy_refcounts=off
3.創(chuàng)建橋接網(wǎng)絡(luò)虛擬機(jī)
[root@s1 ~]# virt-install --virt-type kvm --name centos7-bridge --ram 1024 --vcpus 2 \
--cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1810.iso --disk path=/var/lib/libvirt/images/centos7-bridge.qcow2 \
--network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
4.使用vnc或后臺管理工具連接,創(chuàng)建虛擬機(jī)
3.3.3 驗證虛擬機(jī)網(wǎng)絡(luò)
1.查看IP地址
[root@centos7 ~]# ifconfig
2.是否能ping通百度
[root@centos7 ~]# ping www.baidu.com
3.3.4 從外部ssh虛擬機(jī)
1.ssh遠(yuǎn)程連接虛擬機(jī)
[root@s1 src]# ssh 172.18.144.43
The authenticity of host '172.18.144.43 (172.18.144.43)' can't be established.
ECDSA key fingerprint is SHA256:p4bEG12bcUs/SMkbwXcfT+idshg9+6NBB+sqF77scRk.
ECDSA key fingerprint is MD5:20:08:b7:97:c0:53:f0:26:78:0a:89:ea:89:3a:9f:cb.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.18.144.43' (ECDSA) to the list of known hosts.
root@172.18.144.43's password:
Last login: Fri Jun 14 18:38:05 2019
2.查看PCI設(shè)備
[root@localhost ~]# yum install pciutils #查看PCI設(shè)備
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Package pciutils-3.5.1-3.el7.x86_64 already installed and latest version
Nothing to do
[root@localhost ~]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:04.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller
#1 (rev 03)
00:04.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller
#2 (rev 03)
00:04.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller
#3 (rev 03)
00:04.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller
#1 (rev 03)
00:05.0 Communication controller: Red Hat, Inc. Virtio console #virtio為半虛擬化驅(qū)動
00:06.0 SCSI storage controller: Red Hat, Inc. Virtio block device
00:07.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
00:08.0 Unclassified device [00ff]: Red Hat, Inc. Virtio RNG
轉(zhuǎn)載自https://blog.csdn.net/weixin_34258838/article/details/93020810