虛擬化技術(shù)(Virtualization)
-
計(jì)算機(jī)基礎(chǔ):
- 馮諾依曼體系中計(jì)算機(jī)的五大部件:控制器、運(yùn)算器、輸入設(shè)備、輸出設(shè)備、存儲(chǔ)器
- 操作系統(tǒng)
操作系統(tǒng)就是計(jì)算機(jī)資源的虛擬化,即把底層單組架構(gòu)或單組計(jì)算機(jī)資源給虛擬化,把單核心的CPU時(shí)序復(fù)用,分成時(shí)間片來(lái)使用;把內(nèi)存空間復(fù)用,分成單獨(dú)的離散空間(頁(yè)框)使用;操作系統(tǒng)將有限的計(jì)算機(jī)資源劃分成復(fù)用的形式,虛擬化把操作系統(tǒng)這得到的資源進(jìn)行分割,使用軟件建模,用軟件模擬出一個(gè)CPU,模擬或虛擬成一個(gè)單獨(dú)的系統(tǒng)空間
-
虛擬化技術(shù)的類型
- 主機(jī)虛擬化:
- 完全虛擬化:vmware workstation、kvm、xen(hvm)
- 半虛擬化:xen、vmware vshphere、uml
- 模擬:qemu是個(gè)模擬器
- 用戶空間虛擬化(容器)
- 例如:lxc、openvz、Solaris、Containers、FresBSD jails
- 庫(kù)虛擬化:WINE、cywin
- 應(yīng)用程序虛擬化:jvm、pvm
- 主機(jī)虛擬化:
-
主機(jī)虛擬化:
-
CPU:
- 模擬:emulation, 虛擬機(jī)的arch與物理平臺(tái)的arch可以不相同;qemu;
- 虛擬:virtualization
- 完全虛擬化(full-virt)
BT: 二進(jìn)制轉(zhuǎn)換 (軟件)
HVM:硬件輔助的虛擬化(硬件): Intel(vt-x)、AMD(amd-v) - 半(準(zhǔn))虛擬化 (para-virt)
GuestOS得明確知道自己運(yùn)行于虛擬化技術(shù)
- 完全虛擬化(full-virt)
-
內(nèi)存:
- MMU virtualization:中文名是內(nèi)存管理單元,它是中央處理器(CPU)中用來(lái)管理虛擬存儲(chǔ)器、物理存儲(chǔ)器的控制線路,同時(shí)也負(fù)責(zé)虛擬地址映射為物理地址,以及提供硬件機(jī)制的內(nèi)存訪問(wèn)授權(quán),多用戶多進(jìn)程操作系統(tǒng)
- Intel: EPT, Extended Page Table
- AMD: NPT, Nested Page Table
- TLB virtualization:(Translation Lookaside Buffer)轉(zhuǎn)換檢測(cè)緩沖區(qū)是一個(gè)內(nèi)存管理單元,用于改進(jìn)虛擬地址到物理地址轉(zhuǎn)換速度的緩存。
- tagged TLB
IO:
Emulation
Para-virtualization
IO-through:IO透?jìng)?/p> - MMU virtualization:中文名是內(nèi)存管理單元,它是中央處理器(CPU)中用來(lái)管理虛擬存儲(chǔ)器、物理存儲(chǔ)器的控制線路,同時(shí)也負(fù)責(zé)虛擬地址映射為物理地址,以及提供硬件機(jī)制的內(nèi)存訪問(wèn)授權(quán),多用戶多進(jìn)程操作系統(tǒng)
-
-
主機(jī)虛擬化的類型
- (1) Type -1:在硬件上裝一個(gè)虛擬機(jī)(中間件hypervisor),所有系統(tǒng)都裝在這個(gè)hypervisor之上;例如:xen、vmware ESX/ESXI
- (2) Type -2:在硬件上安裝運(yùn)行一個(gè)OS(Host OS),而此OS上運(yùn)行一個(gè)VMM; 例如:vmware workstation,virtualbox、kvm
-
Linux目前流行的開(kāi)源虛擬化技術(shù)解決方案
- 主機(jī)虛擬化:xen、kvm、virtualbox
- 容器級(jí):lxc、libcontainer、runC、openvz
- 模擬器:qemu
KVM
-
XEN
QQ截圖20181201142323.png
xen以軟件的形式安裝后,重啟會(huì)取代linux內(nèi)核跑在硬件之上,之前的linux會(huì)成為第一個(gè)虛擬化主機(jī),被稱為特權(quán)主機(jī);xen跑在硬件之上后只驅(qū)動(dòng)CPU和內(nèi)存,I/O設(shè)備由之前的linux來(lái)驅(qū)動(dòng),其他主機(jī)驅(qū)動(dòng)I/O設(shè)備需要通過(guò)特權(quán)主機(jī),而使用CPU和內(nèi)存則通過(guò)XEN
-
KVM:Kernel-base Virtual Machine,Qumranet公司研發(fā),后來(lái)被RedHat收購(gòu)
使用于X86_64操作系統(tǒng);依賴于HVM,要求CPU必須支持虛擬化技術(shù)
KVM.png
kvm做為一個(gè)內(nèi)核模塊,安裝以后取代內(nèi)核,并把系統(tǒng)的用戶空間變?yōu)橐粋€(gè)控制臺(tái),在之上就可以安裝虛擬機(jī),優(yōu)點(diǎn):不需要重啟就可以使用
- 主要作用:運(yùn)行程序而不是運(yùn)行CPU
- KVM兩類組件:
- /dev/kvm (kvm.ko):工作為hypervisor,在用戶空間可通過(guò)系統(tǒng)調(diào)用ioct()與內(nèi)核中的kvm模塊交互,從而完成虛擬機(jī)的創(chuàng)建、啟動(dòng)、停止、刪除等各種操作
- qem-kvm進(jìn)程:工作于用戶空間,用于實(shí)現(xiàn)I/O設(shè)備模擬;用于實(shí)現(xiàn)一個(gè)虛擬機(jī)實(shí)例
- KVM模塊載入內(nèi)存之后,系統(tǒng)的運(yùn)行模式:
- 內(nèi)核模式:GuestOS執(zhí)行IO類操作時(shí),或其他的特殊治理操作時(shí)的模式;它也被稱為“Guest-Kernel”模式;
- 用戶模式:Host OS的用戶空間,用于代為GuestOS發(fā)出IO請(qǐng)求;
- 來(lái)賓模式:GuestOS的用戶模式;所有的非IO類請(qǐng)求
- KVM的特性:
- 內(nèi)存管理:
- 將分配給VM的內(nèi)存交換至swap
- 支持使用Huge Page(大內(nèi)存頁(yè))
- 支持使用Inter EPT或AMD RVI技術(shù)完成技術(shù)內(nèi)存地址映射
- 支持KSM(Kernel Same-page Merging)內(nèi)核相同頁(yè)面合并技術(shù)
- 硬件支持:取決于Linux內(nèi)核
- 存儲(chǔ):
- 本地存儲(chǔ)
- 網(wǎng)絡(luò)附加存儲(chǔ)
- 存儲(chǔ)區(qū)域網(wǎng)絡(luò)
- 分布式存儲(chǔ):GlusterFS等
- 實(shí)時(shí)遷移:live migration
- 支持GuestOS
- 設(shè)備驅(qū)動(dòng):
- 支持IO設(shè)備的完全虛擬化:模擬硬件
- 支持IO設(shè)備的版虛擬化:virtio
- virtio-blk 塊設(shè)備半虛擬化
- virtio-net 網(wǎng)絡(luò)設(shè)備半虛擬化
- virtio-pci 任何pci接口設(shè)備的半虛擬化
- 內(nèi)存管理:
- kvm管理工具:kvm有兩組工具能實(shí)現(xiàn)虛擬機(jī)管理
- 第一組工具:qemu工具
qemu是個(gè)獨(dú)立的虛擬機(jī)項(xiàng)目,其中有一個(gè)qemu-kvm分支是于kvm結(jié)合的分支,后來(lái)獨(dú)立成了一個(gè)項(xiàng)目;然后又合并到了主項(xiàng)目,主干分支支持kvm和xen,而qemu-lvm分支只支持kvm;
qemu-kvm組能件實(shí)現(xiàn)虛擬機(jī)的創(chuàng)建、啟動(dòng)管理各種接口都支持,但只是命令行接口,使用不便,而且這些組件非常底層;- qemu-kvm:專門用于管理kvm的工具
- qemu-img:管理虛擬機(jī)磁盤映像文件
- qemu-io:管理IO設(shè)備
- 第一組工具:qemu工具
- 第二組工具:C/S架構(gòu)的libvirt組件
- virsh:支持基于C/S架構(gòu),與守護(hù)進(jìn)程libvirtd同喜的命令行工具
- virtual machine manger:基于python研發(fā)的圖形界面工具,包括兩個(gè)工具:
- virt-manger:虛擬機(jī)管理器;創(chuàng)建、啟動(dòng)、刪除、停止等
- virt-viewer:虛擬機(jī)查看器
- virtinst:虛擬機(jī)創(chuàng)建、安裝工具,是命令行工具
- virt-install
- virt-clone
- virt-convert
- virt-image
- 因此,創(chuàng)建虛擬機(jī)有三種方式:
- qemu
- virtual machine manager
- virtinst
-
安裝使用KVM
- 判斷CPU是否支持硬件虛擬化:
grep -i -E '(vms|svm|lm)' /porc/cpuinfo
modinfo kvm
lsmode|grep kvm - 運(yùn)行中的kvm虛擬機(jī)就是一個(gè)qemu-kvm進(jìn)程,運(yùn)行qemu-kvm程序并傳遞給它合適的選項(xiàng)及參數(shù)技能完成虛擬機(jī)啟動(dòng),終止此進(jìn)程即關(guān)閉虛擬機(jī)
- kvm工具棧
- qemu:
- qemu-kvm
- qemu-img
- qemu-io
- libcirt:
- CUI:virt-manager,virt-viewer
- CLI: virtsh,cirt-install
- c/s:
- libvirtd
- qemu:
- 安裝:
-
(1)裝載內(nèi)核模塊
- kvm:核心模塊
- kvm-intel|kvm-amd
-
(2)使用virt-manager管理KVM
[root@kvm ~]# yum -y groupinstall "Virtualization Host" [root@kvm ~]# yum -y install qemu-kvm libvirt-daemon-kvm virt-manager [root@kvm ~]# systemctl start libvirtd.service [root@kvm ~]# ps aux |grep libvirtd [root@kvm ~]# virt-manager` 啟動(dòng) 啟動(dòng)后virt-manager顯示亂碼需要安裝字體: [root@kvm ~]# yum install dejavu-lgc-sans-fonts
-
- 判斷CPU是否支持硬件虛擬化:
使用qemu-kvm管理vms
- Qemu:
- 處理器模擬器
- 仿真各種IO設(shè)備
- 將仿真設(shè)備連接至主機(jī)的物理設(shè)備
- 提供用戶接口
- qemu-kvm命令語(yǔ)法:
qemu-kvm [option] [disk_image] - options有很多類別:標(biāo)準(zhǔn)選項(xiàng)、塊設(shè)備相關(guān)選項(xiàng)、顯示選項(xiàng)、網(wǎng)絡(luò)選項(xiàng)、...
-
標(biāo)準(zhǔn)選項(xiàng):
-
machine [type=] name:-machine help用來(lái)獲取列表;用于指定模擬的主機(jī)類型; -
-cpu cpu:-cpu help用來(lái)獲取類別;用于指定要模擬的CPU型號(hào); -
-smp n[,maxcpus=cpus] [,cores=cores] [,threads=threads] [,sockets=sockets]: 指明虛擬機(jī)上的vcpu的數(shù)量及拓?fù)洌?/li> -
-boot [order=drives] [,once=drives] [,menu=on|off] [,splash=sp_name] [,splash-time=sp_time][,reboot-timeout=rb_time] [,strict=on|off]:- order:各設(shè)備的引導(dǎo)次序;c表示第一塊硬盤,d表示第一個(gè)光驅(qū)設(shè)備;例:
-boot order=dc,once=d
- order:各設(shè)備的引導(dǎo)次序;c表示第一塊硬盤,d表示第一個(gè)光驅(qū)設(shè)備;例:
-
-m megs: 虛擬機(jī)的內(nèi)存大小 -
name NAME: 當(dāng)前虛擬機(jī)的名稱,要唯一
-
-
塊設(shè)備相關(guān)的選項(xiàng):
-
-hda/-hdb file: 指明IDE總線類型的磁盤映射文件路徑,第0個(gè)和第一個(gè) -
-hdc/-hdd file: 第2個(gè)和第3個(gè) -
cdrom file: 指定要使用光盤映像文件 -
drive [file=file][,if=type][,media=d][,index=i][,cache=writethrough|writeback|none|directsync|unsafe][,format=f]]:-
file=/PATH/TO/SOME_IMAGE_FILE:映像文件路徑; -
if=TYPE: 塊設(shè)備總線類型,ide,scsi,sd,floppy,virtio,... -
media=TYPE:介質(zhì)類型,cdrom和disk -
index=i:設(shè)定同一類型設(shè)備多個(gè)設(shè)備的編號(hào) -
cache=writethrough|writeback|none|directsync|unsafe:緩存方式 -
format=f:磁盤映像文件的格式
-
-
-
顯示選項(xiàng):
-
-display type:顯示類型,sdl,curses,none和vnc; -
nographic: 不使用圖形接口 -
vga [std|cirrus|vmware|qxl|xenfb|none]: 模擬出的顯卡的型號(hào) -
vnc display[,option[,option[,...]]]: 啟動(dòng)一個(gè)vnc server來(lái)顯示虛擬機(jī)- display:
(1) HOST:N 在host主機(jī)的第N個(gè)桌面好輸出vnc;5900+N
(2)unix:/PATH/TO/SOCK_FILE
(3)none - options:
password:連接此服務(wù)所需要的密碼
- display:
-
-monitor stdio: 在標(biāo)準(zhǔn)輸出上顯示monitor界面
-
-
網(wǎng)絡(luò)選項(xiàng):
-
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]: 為虛擬機(jī)創(chuàng)建一個(gè)網(wǎng)絡(luò)接口,并將其添加至指定的VLAN-
model=type:指明模擬出的網(wǎng)卡型號(hào),ne2k_pci,i82551,i8255b,i82559er,rt18139,e1000,pcnet,virtio net nic,model=?-
macaddr=mac:指明mac地址;52:54:00:...
-
-
-net tap[,vlan=n]][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]: 通過(guò)物理的tap網(wǎng)絡(luò)接口連接至vlan nscript=file:?jiǎn)?dòng)虛擬機(jī)時(shí)要執(zhí)行的腳本,默認(rèn)為/etc/qemu-ifup
downscript=dfile: 關(guān)閉虛擬機(jī)時(shí)要執(zhí)行的腳本,/etc/qemu-ifdown
-
ifname=NAME: 自定義接口名稱
cat /etc/qemu-ifup #!/bin/bash # bridge=br0 if [ -n "$1" ];then ip link set $1 up sleep 1 brctl addif $bridge $1 [ $? -eq 0 ] && exit 0 || exit 1 else echo "Error: no interface specified." exit 1 fi
-
-
其它選項(xiàng):
-
-daemonize: 以守護(hù)進(jìn)程運(yùn)行
-
-
示例1:
~]# qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup
示例2:
~]# qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize
虛擬化模型:
- NAT模式(相當(dāng)于僅主機(jī),默認(rèn)類型)
- libvirtd安裝啟動(dòng)后會(huì)自動(dòng)創(chuàng)建出一個(gè)virbr0的接口
- virbr0表示網(wǎng)橋設(shè)備,類似于vmware workstation中的nat類型網(wǎng)絡(luò)
- 此網(wǎng)絡(luò)模型下虛擬機(jī)可以訪問(wèn)宿主機(jī),也可以訪問(wèn)互聯(lián)網(wǎng),但是不能從網(wǎng)絡(luò)或其他的客戶機(jī)訪問(wèn)虛擬機(jī),性能較差
- Host-only模型(也叫隔離模式)
- 類似于vmware workstation中的僅主機(jī)模式
- 將所有的虛擬機(jī)組成一個(gè)局域網(wǎng),不能和外界通信,不能訪問(wèn)Internet,其他主機(jī)也不能訪問(wèn)虛擬主機(jī),安全性高
- Bridge模型(橋接接口)
- 類似于vmware workstation中的橋接
- 虛擬機(jī)與宿主機(jī)處于同一個(gè)網(wǎng)絡(luò)環(huán)境,類似于一臺(tái)真實(shí)的宿主機(jī),可以直接訪問(wèn)網(wǎng)絡(luò)資源,設(shè)置好后虛擬機(jī)與宿主機(jī),互聯(lián)網(wǎng)之間的通信很容易
示例:創(chuàng)建2個(gè)虛擬機(jī)實(shí)例演示網(wǎng)絡(luò)通信
-
隔離網(wǎng)絡(luò):只有虛擬機(jī)之間可以通信,與物理機(jī)無(wú)法通信,與外網(wǎng)也無(wú)法通信
[root@kvm ~]# yum -y groupinstall "Virtualization Host" [root@kvm ~]# yum -y install virt-manager libvirt-daemon-kvm qemu-kvm dejavu0lgc-sans-fonts [root@kvm ~]# which brctl /usr/sbin/brctl [root@kvm ~]# rpm -qf /usr/sbin/brctl bridge-utils-1.5-9.el7.x86_64 創(chuàng)建獨(dú)立的橋設(shè)備: [root@kvm ~]# ip link set br-int up或者 ifconfig br-int up #激活橋接口 [root@kvm ~]# ifconfig br-int: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::3041:11ff:fe83:15ac prefixlen 64 scopeid 0x20<link> ether 32:41:11:83:15:ac txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 6 bytes 508 (508.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
能看到br-int接口后,此時(shí)沒(méi)有ip地址,就意味著不能作為物理機(jī)的接口與外部通信;創(chuàng)建兩個(gè)虛擬機(jī)網(wǎng)卡關(guān)聯(lián)到這個(gè)橋上,然后兩個(gè)虛擬機(jī)配置同一個(gè)網(wǎng)段的ip地址,就能互相通信了;
啟動(dòng)2個(gè)虛擬機(jī)實(shí)例:
[root@kvm ~]# vim /etc/qemu-ifup
#!/bin/bash
#
bridge=br-int
if [ -n "$1" ];then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "ERROR:no interface specified"
exit 2
fi
[root@kvm ~]# bash -n /etc/qemu-ifup
[root@kvm ~]# chmod +x /etc/qemu-ifup
[root@kvm ~]# vim /etc/qemu-ifdown
#!/bin/bash
#
bridge=br-int
if [ -n "$1" ];then
brctl delif $bridge $1
ip link set $1 down
exit 0
else
echo "ERROR: no interface specified"
exit 1
fi
[root@kvm ~]# bash -n /etc/qemu-ifdown
[root@kvm ~]# chmod +x /etc/qemu-ifdown
[root@kvm ~]# mkdir -pv /vms/cirros
mkdir: created directory ‘/vms’
mkdir: created directory ‘/vms/cirros’
[root@kvm ~]# cd /vms/cirros
[root@kvm cirros]# cp /root/cirros-0.3.4-x86_64-disk.img cirros1.img
[root@kvm cirros]# cp /root/cirros-0.3.4-x86_64-disk.img cirros2.img
[root@kvm cirros]# ln -sv /usr/libexec/qemu-kvm /usr/sbin/ #qemu-kvm命令
‘/usr/sbin/qemu-kvm’ -> ‘/usr/libexec/qemu-kvm’
[root@kvm cirros]# qemu-kvm -name c1 -m 256 -smp 2 -drive file=/vms/cirros/cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :0 -daemonize
[root@kvm cirros]# qemu-kvm -name c2 -m 256 -smp 2 -drive file=/vms/cirros/cirros2.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:22 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :1 -daemonize
[root@kvm cirros]# ps aux | grep qemu-kvm
root 37969 10.6 6.3 720160 118664 ? Sl 08:59 0:12 qemu-kvm -name c1 -m 256 -smp 2 -drive file=/vms/cirros/cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :0 -daemonize
root 38025 12.4 5.4 719140 101044 ? Sl 08:59 0:11 qemu-kvm -name c2 -m 256 -smp 2 -drive file=/vms/cirros/cirros2.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:22 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :1 -daemonize
此時(shí)可以使用vncviewer連接兩個(gè)虛擬機(jī)實(shí)例
[root@kvm ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 *:5900 *:*
LISTEN 0 1 *:5901 *:*
[root@kvm ~]# vncviewer :0 &
[root@kvm ~]# vncviewer :1 &
此時(shí)2個(gè)虛擬機(jī)實(shí)例都以及啟動(dòng)起來(lái),并且br-int橋上沒(méi)有ip地址,在兩個(gè)虛擬機(jī)上配置同網(wǎng)段的IP地址后可以實(shí)現(xiàn)2個(gè)虛擬機(jī)通信:

c1:
$ sudo su - root
# ifconfig eth0 10.0.0.1/24 up
c2:
$ sudo su - root
# ifconfig eth0 10.0.0.2/24 up
# ping 10.0.0.1
64 bytes from 10.0.0.1: seq=0 ttl=64 time=12.112 ms
...
至此就完成虛擬機(jī)間通信,兩個(gè)虛擬機(jī)都橋接到同一個(gè)橋上,這個(gè)橋本身沒(méi)有ip地址,所以是隔離的網(wǎng)絡(luò)模型;
-
僅主機(jī)網(wǎng)絡(luò)模式:
每啟動(dòng)一個(gè)虛擬機(jī),tap0,tap1是兩個(gè)接口,在物理機(jī)上沒(méi)有地址,它們都是虛擬機(jī)網(wǎng)卡的后半段不需要地址,這兩個(gè)是連接虛擬交換機(jī)的(橋設(shè)備);[root@kvm ~]# brctl show
bridge name bridge id STP enabled interfaces
br-int 8000.362a10196967 no tap0
tap1
此時(shí),如果要想虛擬機(jī)與物理機(jī)通信,只需向網(wǎng)橋添加地址即可,或者是手動(dòng)創(chuàng)建添加一對(duì)兒網(wǎng)卡,一半在留在網(wǎng)橋上,一半留在物理機(jī)上;
給橋br-int添加地址:
[root@kvm ~]# ifconfig br-int 10.0.0.254/24
[root@kvm ~]# ifconfig br-int
br-int: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.254 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::3041:11ff:fe83:15ac prefixlen 64 scopeid 0x20<link>
ether 36:2a:10:19:69:67 txqueuelen 1000 (Ethernet)
RX packets 19 bytes 2704 (2.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
此時(shí)在物理機(jī)上ping虛擬機(jī)可以ping通:
[root@kvm ~]# ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=4.45 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=1.62 ms
^C
--- 10.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 1.627/3.043/4.459/1.416 ms
[root@kvm ~]# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=49.5 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=2.67 ms
在物理機(jī)上打開(kāi)核心轉(zhuǎn)發(fā)功能:
[root@kvm ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
在虛擬機(jī)上添加默認(rèn)網(wǎng)關(guān):
# route add default gw 10.0.0.254
# ping 192.168.43.33 此時(shí)與物理機(jī)ip可以通信
此時(shí)虛擬機(jī)和物理機(jī)之間可以正常通信,這就是僅主機(jī)模式。
-
NAT模式:
# ping 61.135.169.121 #此時(shí)ping外網(wǎng)(百度ip)是不通的 在物理機(jī)上是用tcpdump監(jiān)控網(wǎng)卡發(fā)現(xiàn):,虛擬機(jī)可以ping出去到外部的61.135.169.121主機(jī),但是,ping包不能回來(lái); [root@kvm ~]# tcpdump -i ens33 -nn icmp 09:30:57.006063 IP 10.0.0.1 > 61.135.169.121: ICMP echo request, id 32001, seq 0, length 64 09:30:58.007888 IP 10.0.0.1 > 61.135.169.121: ICMP echo request, id 32001, seq 1, length 64 09:30:59.010346 IP 10.0.0.1 > 61.135.169.121: ICMP echo request, id 32001, seq 2, length 64 要從虛擬機(jī)ping出去到外部的包能回來(lái),要么讓外部的主機(jī)添加能到虛擬機(jī)的路由,要么在物理機(jī)上添加iptables規(guī)則: [root@kvm ~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.43.33 在虛擬機(jī)上ping測(cè)試: # ping 61.135.169.121 查看物理網(wǎng)卡監(jiān)控: [root@kvm ~]# tcpdump -i ens33 -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes 09:35:26.191195 IP 192.168.43.33 > 61.135.169.121: ICMP echo request, id 32257, seq 0, length 64 09:35:26.212348 IP 61.135.169.121 > 192.168.43.33: ICMP echo reply, id 32257, seq 0, length 64 09:35:27.193508 IP 192.168.43.33 > 61.135.169.121: ICMP echo request, id 32257, seq 1, length 64 09:35:27.226221 IP 61.135.169.121 > 192.168.43.33: ICMP echo reply, id 32257, seq 1, length 6409:35:28.195532 IP 192.168.43.33 > 61.135.169.121: ICMP echo request, id 32257, seq 2, length 64
這就實(shí)現(xiàn)了NAT模式的網(wǎng)絡(luò)模式;但是此時(shí)可以訪問(wèn)外網(wǎng),但是外網(wǎng)是不能訪問(wèn)虛擬機(jī)的;想要外網(wǎng)能夠訪問(wèn)虛擬機(jī),需要在添加一條DNAT規(guī)則:
[root@kvm ~]# iptables -t nat -A PREROUTING -d 192.168.43.33 -j DNAT --to-destination 10.0.0.1
-
橋接模式:
把物理網(wǎng)卡當(dāng)橋使用,需要手動(dòng)配置橋接接口;
把網(wǎng)卡配置文件復(fù)制一份,并修改相關(guān)參數(shù)就可創(chuàng)建橋接口了;
但是,也有非常簡(jiǎn)潔的方法配置橋接口,如果安裝了virsh或libvirtd并且有virsh命令,因?yàn)関irsh命令自己就能創(chuàng)建橋接口,并且它能自動(dòng)創(chuàng)建一個(gè)物理橋,把物理網(wǎng)卡關(guān)聯(lián)到橋接口上去;演示手動(dòng)實(shí)現(xiàn)配置橋接接口:
]# cd /etc/sysconfig/network-scripts/ 復(fù)制網(wǎng)卡配置文件為橋設(shè)備配置文件: ]# cp ifcfg-eno16777736 ifcfg-br0 修改網(wǎng)卡配置文件為交換機(jī)使用: ]# vim ifcfg-eno16777736 修改: BOOTPROTO=none 刪除接口地址; BRIDGE="br0" 編輯橋設(shè)備配置文件: ]# vim ifcfg-br0 修改: DEVICE=br0 TYPE=Bridge 必須首字母大寫; 刪除NAME,其它地址等保留; 使用virsh命令創(chuàng)建橋設(shè)備: ]# virsh iface-list 名稱 狀態(tài) MAC 地址 --------------------------------------------------- eno16777736 活動(dòng) 00:0c:29:3f:67:86 lo 活動(dòng) 00:00:00:00:00:00 查看命令幫助: ]# virsh help iface-bridge 語(yǔ)法格式: iface-bridge <interface> <bridge> [--no-stp] [--delay <number>] [--no-start] 其中: OPTIONS [--interface] <string> 現(xiàn)有接口名稱 [--bridge] <string> 新橋接設(shè)備名稱 --no-stp 無(wú)法為這個(gè)橋接啟用 STP --delay <number> 在新連接的端口中 squelch 流量的秒數(shù) --no-start 不要立即啟動(dòng)橋接 interface:指明把哪個(gè)接口關(guān)聯(lián)到橋上; bridge:橋的名稱; --no-stp:表示不支持生成樹(shù)協(xié)議;創(chuàng)建物理橋:
注意:紅帽研發(fā)的網(wǎng)絡(luò)功能NetworkManager服務(wù)必須關(guān)閉,才能使用virsh創(chuàng)建橋;只使用network服務(wù);
centos6和7都有這兩種服務(wù)能管理網(wǎng)絡(luò)功能NetworkManager和network;如果要使用橋接接口,不能使用NetworkManager服務(wù),必須停掉,讓network來(lái)作為網(wǎng)卡管理功能;然后,還有編輯網(wǎng)卡不受nm控制;
]# systemctl stop NetworkManager.service ]# systemctl disable NetworkManager.service ]# systemctl status network.service ]# virsh iface-bridge eno16777736 br0 使用附加設(shè)備 br0 生成橋接 eno16777736 失敗 已啟動(dòng)橋接接口 br0 ]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.11.115 netmask 255.255.0.0 broadcast 172.18.255.255 inet6 fe80::20c:29ff:fe3f:6786 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:3f:67:86 txqueuelen 0 (Ethernet) RX packets 123 bytes 11913 (11.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 23 bytes 1902 (1.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 00:0c:29:3f:67:86 txqueuelen 1000 (Ethernet) RX packets 251384 bytes 87346879 (83.3 MiB) RX errors 0 dropped 527 overruns 0 frame 0 TX packets 17222 bytes 1562170 (1.4 MiB) 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:8e:05:ad txqueuelen 0 (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此時(shí),網(wǎng)卡已經(jīng)變成交換機(jī)了;橋設(shè)備獲得了ip地址;
]# virt-manager 彈出虛擬機(jī)管理界面; 創(chuàng)建新建時(shí),選橋接;

