上節(jié) 玩轉(zhuǎn)OpenStack(一)基本概念和安裝KVM 中介紹了虛擬化分為兩種類型若河,1型虛擬化和2型虛擬化。
介紹了KVM的安裝和圖形管理工具virt-manager茂蚓。
本節(jié)講介紹KVM的虛擬化原理疏咐。
一禀挫、CPU虛擬化
一個(gè)KVM虛擬機(jī)在宿主機(jī)中其實(shí)是一個(gè)qemu-kvm進(jìn)程毕籽,與其他Linux進(jìn)程一樣被調(diào)度抬闯。
可以查看上節(jié)中創(chuàng)建的kvm虛擬機(jī)。
# virsh list
Id Name State
----------------------------------------------------
2 kvm running
# ps -elf | grep kvm
1 S root 769 2 0 60 -20 - 0 rescue Feb11 ? 00:00:00 [kvm-irqfd-clean]
6 S libvirt+ 7145 1 0 80 0 - 156077 poll_s Feb11 ? 00:01:15 qemu-system-x86_64 -enable-kvm -name kvm -S -machine
pc-i440fx-trusty,accel=kvm,usb=off -m 100 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid d9b635c8-f92c-baa4-f013-6a8c2aeb8cab
-no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/kvm.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control
-rtc base=utc -no-shutdown -boot strict=on -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2
-drive file=/var/lib/libvirt/images/cirros-0.3.3-x86_64-disk.img,if=none,id=drive-ide0-0-0,format=qcow2
-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=24,id=hostnet0
-device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:72:6e:0d,bus=pci.0,addr=0x3 -chardev pty,id=charserial0
-device isa-serial,chardev=charserial0,id=serial0 -vnc 127.0.0.1:0 -device cirrus-vga,id=video0,bus=pci.0,addr=0x2
-device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5
虛擬機(jī)中的每一個(gè)虛擬vCPU對(duì)應(yīng)qemu-kvm進(jìn)程中的一個(gè)線程关筒,如下圖
在這個(gè)圖中有兩個(gè)虛擬機(jī)溶握,每個(gè)虛擬機(jī)分別有2個(gè)和4個(gè)線程在兩個(gè)物理CPU上調(diào)度。
當(dāng)前vCPU總數(shù)量是超過了物理CPU的數(shù)量蒸播,這是CPU overcommit (超配)
二睡榆、內(nèi)存虛擬化
KVM 通過內(nèi)存虛擬化共享物理系統(tǒng)內(nèi)存,動(dòng)態(tài)分配給虛擬機(jī)袍榆。
如下圖胀屿,兩臺(tái)虛擬機(jī)的情況
為了在一臺(tái)機(jī)器上運(yùn)行多個(gè)虛擬機(jī),KVM需要實(shí)現(xiàn) VA(虛擬內(nèi)存) -> PA(物理內(nèi)存) -> MA(機(jī)器內(nèi)存) 之間的地址轉(zhuǎn)換包雀。虛擬機(jī)操作系統(tǒng)控制虛擬地址到客戶內(nèi)存物理地址的映射 (VA -> PA)宿崭,但是虛擬機(jī)操作系統(tǒng)不能直接訪問實(shí)際機(jī)器內(nèi)存,因此KVM需要負(fù)責(zé)映射客戶物理內(nèi)存到實(shí)際機(jī)器內(nèi)存 (PA -> MA)馏艾。
內(nèi)存虛擬化的實(shí)現(xiàn)方式:
- 軟件方式:通過軟件實(shí)現(xiàn)內(nèi)存地址的翻譯,比如 Shadow page table (影子頁表)技術(shù)
- 硬件實(shí)現(xiàn):基于 CPU 的輔助虛擬化功能奴愉,比如 AMD 的 NPT 和 Intel 的 EPT 技術(shù)
三琅摩、存儲(chǔ)虛擬化
KVM 的存儲(chǔ)虛擬化通過存儲(chǔ)池(Storage Pool)和卷(Volume)來管理的。Volume 是在 Storage Pool 中劃分出來的一塊空間锭硼,物理機(jī)將 Volume 分配給虛擬機(jī)房资,Volume在虛擬機(jī)中看到的就是一塊硬盤。
存儲(chǔ)池(Storage Pool)類型
1. 目錄類型的 Storage Pool
KVM 將物理機(jī)目錄 /var/lib/libvirt/images/
作為默認(rèn)的 Storage Pool檀头。在這個(gè)目錄下的一個(gè)文件就是一個(gè) Volume轰异。
- Storage Pool 的默認(rèn)設(shè)置在
/etc/libvirt/storage/default.xml
文件中,內(nèi)容如下:
<pool type='dir'>
<name>default</name>
<uuid>bd7c76a4-2ec0-d7a0-dfc4-ff0cb9332ca0</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
</source>
<target>
<path>/var/lib/libvirt/images</path>
<permissions>
<mode>0711</mode>
<owner>-1</owner>
<group>-1</group>
</permissions>
</target>
</pool>
其中:
<pool type='dir'>
是 Storage Pool 的類型
<path>/var/lib/libvirt/images</path>
是目錄的路徑暑始。
使用文件做 Volume 優(yōu)點(diǎn):存儲(chǔ)方便搭独、移植性好、可復(fù)制廊镜、可遠(yuǎn)程訪問(遠(yuǎn)程文件系統(tǒng)牙肝,如NFS,分布式文件系統(tǒng),GlusterFs)配椭。
-
Volume 文件格式:
- raw 默認(rèn)格式虫溜,移植性好,性能好股缸,但是固定大小衡楞,不能節(jié)省磁盤空間。
- qcow2 推薦的格式敦姻,cow 表示 copy on write瘾境。能夠節(jié)省磁盤空間。支持AES加密替劈,支持zlib壓縮寄雀,支持多快照等。
- vmdk 是VMWare的磁盤格式陨献,也就是VMWare虛擬機(jī)可以直接在KVM上運(yùn)行盒犹。
- qed 增強(qiáng)型磁盤
- vdi 是VirtualBox的磁盤格式
2. LVM 類型的 Storage Pool
a. LVM概念和安裝
LVM 是邏輯盤卷管理(Logical Volume Manager)的簡稱。
他是磁盤管理的另一種工具眨业,就目前基本上所有操作系統(tǒng)均支持急膀,LVM是建立在硬盤和分區(qū)之上的一個(gè)邏輯層渊涝,來提高磁盤分區(qū)管理的靈活性躏啰。通過LVM系統(tǒng)管理員可以輕松管理磁盤分區(qū)。
如:將若干個(gè)磁盤分區(qū)連接為一個(gè)整塊的卷組(volume group)蜈项,形成一個(gè)存儲(chǔ)池聘殖。管理員可以在卷組上隨意創(chuàng)建邏輯卷組(logical volumes)晨雳,并進(jìn)一步在邏輯卷組上創(chuàng)建文件系統(tǒng)。
物理卷(Physical Volume)
物理卷就是指硬盤分區(qū)或從邏輯上與磁盤分區(qū)具有同樣功能的設(shè)備(如RAID)奸腺,是LVM的基本存儲(chǔ)邏輯塊餐禁,但和基本的物理存儲(chǔ)介質(zhì)(如分區(qū)、磁盤等)比較突照,卻包含有與LVM相關(guān)的管理參數(shù)帮非。卷組(Volume Group)
LVM卷組類似于非LVM系統(tǒng)中的物理硬盤,其由物理卷組成讹蘑∧┛可以在卷組上創(chuàng)建一個(gè)或多個(gè)“LVM分區(qū)”(邏輯卷),LVM卷組由一個(gè)或多個(gè)物理卷組成座慰。邏輯卷(Logical Volume)
LVM的邏輯卷類似于非LVM系統(tǒng)中的硬盤分區(qū)陨舱,在邏輯卷之上可以建立文件系統(tǒng)(比如/home或者/usr等)。
b. LVM安裝和簡單操作
- 安裝
# apt-get install lvm2
- LVM 創(chuàng)建VG
# vgcreate testvg /dev/sda5
- 查看VG信息
# vgdisplay
--- Volume group ---
VG Name testvg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 5.00 GiB
PE Size 4.00 MiB
Total PE 1279
Alloc PE / Size 0 / 0
Free PE / Size 1279 / 5.00 GiB
VG UUID UxCUXQ-dlev-Omp0-DhMf-epf8-aGjF-FNLLP7
- 刪除VG
# vgremove testvg
c. LVM 類型的 Storage Pool
物理機(jī)上 VG 中的 LV 也可以作為虛擬磁盤分配給虛擬機(jī)使用版仔。
不過隅忿,LV 由于沒有磁盤的 MBR 引導(dǎo)記錄心剥,不能作為虛擬機(jī)的啟動(dòng)磁盤,只能作為數(shù)據(jù)盤使用背桐。
LVM 類型的配置下优烧,物理機(jī)上的 VG 就是一個(gè) Storage Pool,VG 中的 LV 就是 Volume链峭。
LV 的優(yōu)點(diǎn)是由較好的性能畦娄;不足的地方是管理和移動(dòng)性方面不如鏡像文件,而且不能通過網(wǎng)絡(luò)遠(yuǎn)程使用弊仪。
在目錄/etc/libvirt/storage/
中的配置文件 如下
文件名 HostVG.xml
<pool type='logical' >
<name>HostVG</name>
<source>
<name>HostVG</name>
<format type='lvm2' />
</source>
<target>
<path>/dev/HostVg</path>
</target>
</pool>
四熙卡、網(wǎng)絡(luò)虛擬化
網(wǎng)絡(luò)虛擬化是虛擬化技術(shù)中最復(fù)雜的部分,本節(jié)從最基本的 Linux Bridge 和 VLan 開始介紹励饵。
1. Linux Bridge
Linux Bridge 是 Linux 上用來做TCP/IP 二層協(xié)議交換的設(shè)備驳癌,功能可以簡單的理解為一個(gè)二層交換機(jī)或者 Hub。
-
當(dāng)虛擬機(jī)要連接外網(wǎng)時(shí)役听,有兩個(gè)方法:
- 將物理機(jī)網(wǎng)卡直接分配給虛擬機(jī)颓鲜。但是,物理機(jī)就沒有網(wǎng)卡了典予,其他虛擬機(jī)也沒有網(wǎng)卡了甜滨。
-
給虛擬機(jī)創(chuàng)建一個(gè)虛擬網(wǎng)卡 vnet0,通過Linux Bridge -> br0 將 eth0 和 vent0 連接瘤袖。如下圖:
-
配置Linux bridge br0
編輯 /etc/network/interfaces
文件衣摩。
源文件如下
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
修改如下
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet dhcp
bridge_stp off
bridge_waitport 0
bridge_fd 0
bridge_ports eth0
- 物理機(jī)原來的網(wǎng)卡 eth0 配置是自動(dòng)獲取 ip
dhcp
,創(chuàng)建 Linux Bridge 后捂敌, IP 必須放到 br0 上了艾扮。 - 在 br0 的配置信息中注意
bridge_ports eth0
,作用是將 eth0 掛到 br0 上占婉。
重啟后執(zhí)行ifconfig
泡嘴,可以看到 IP 已經(jīng)在 br0 上面了。
root@openstack:~# ifconfig
br0 Link encap:Ethernet HWaddr 00:0c:29:45:5d:cb
inet addr:172.16.245.134 Bcast:172.16.245.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe45:5dcb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:96 errors:0 dropped:0 overruns:0 frame:0
TX packets:127 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:10632 (10.6 KB) TX bytes:17550 (17.5 KB)
eth0 Link encap:Ethernet HWaddr 00:0c:29:45:5d:cb
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:104 errors:0 dropped:0 overruns:0 frame:0
TX packets:142 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12504 (12.5 KB) TX bytes:21389 (21.3 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:16 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1184 (1.1 KB) TX bytes:1184 (1.1 KB)
virbr0 Link encap:Ethernet HWaddr f2:19:a3:76:51:6f
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
執(zhí)行brctl show
锐涯,可以看到 eth0 已經(jīng)掛到 br0 上磕诊。
root@openstack:~# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29455dcb no eth0
virbr0 8000.000000000000 yes
-
啟動(dòng)之前創(chuàng)建的虛擬機(jī)
- 修改虛擬機(jī)網(wǎng)卡配置
- 啟動(dòng)虛擬機(jī)
# virsh start kvm
- 查看 Linux Bridge填物。 會(huì)發(fā)下br0下面添加了一個(gè)設(shè)備 vnet0纹腌。
root@openstack:~# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29455dcb no eth0
vnet0
virbr0 8000.000000000000
- 查看虛擬機(jī)網(wǎng)卡
root@openstack:~# virsh domiflist kvm
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 bridge br0 rtl8139 52:54:00:c0:73:a2
-
通過 virt-manager 登錄kvm。查看ip信息滞磺。
虛擬機(jī)kvm 網(wǎng)卡信息
可以看到 IP 地址為 172.16.245.136 與物理機(jī) 172.16.245.134 在同一個(gè)網(wǎng)段升薯。
-
ping外網(wǎng)
ping外網(wǎng)
-
virbr0 網(wǎng)橋
在第一次執(zhí)行
brctl show
時(shí),會(huì)發(fā)現(xiàn)一個(gè)叫做 virbr0 的網(wǎng)橋击困。
virbr0 是 KVM 默認(rèn)創(chuàng)建的涎劈,是為讓連接在 virbr0 上的虛擬機(jī)網(wǎng)卡提供網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation广凸,縮寫為NAT 訪問)
virbr0 默認(rèn)分配的 IP 是 192.168.122.1。為讓連接在 virbr0 上的虛擬機(jī)網(wǎng)卡提供 DHCP 服務(wù)蛛枚。
-
首先將虛擬機(jī)的網(wǎng)卡連接改為 NAT 谅海。如下圖
配置NAT 啟動(dòng)虛擬機(jī)
# virsh start kvm
- 查看網(wǎng)橋。 vent0 已經(jīng)掛到 birbr0 上蹦浦。
root@openstack:~# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29455dcb no eth0
virbr0 8000.fe5400c073a2 yes vnet0
- virbr0 使用 dnsmasq 提供的 DHCP 服務(wù)扭吁,可以在物理機(jī)進(jìn)程中查到
root@openstack:~# ps -elf | grep dnsmasq
5 S libvirt+ 2235 1 0 80 0 - 7053 poll_s 14:03 ? 00:00:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf
在目錄 /var/lib/libvirt/dnsmasq/
下有一個(gè) default.leases
文件。當(dāng) 虛擬機(jī) kvm 成功獲取 DHCP 的 IP 后盲镶,文件可以查到相應(yīng)信息侥袜。
root@openstack:~# cat /var/lib/libvirt/dnsmasq/default.leases
1550388636 52:54:00:c0:73:a2 192.168.122.204 cirros 01:52:54:00:c0:73:a2
上面說 IP 192.168.122.204 已經(jīng)分配給 MAC 地址為 52:54:00:c0:73:a2 的網(wǎng)卡。
-
登錄 kvm 虛擬機(jī)溉贿,ping 外網(wǎng)
說明:
使用 NAT 的虛擬機(jī) kvm 可以訪問外網(wǎng)枫吧,但外網(wǎng)無法直接訪問 kvm。
因?yàn)?kvm 發(fā)出的網(wǎng)絡(luò)包源地址并不是 192.168.122.204宇色, 而是被 NAT 替換為宿主機(jī)的 IP 地址了九杂。
五、VLAN
有關(guān) LAN 和 VLAN的概念查看 Lan和Vlan的區(qū)別和原理代兵。
-
KVM 虛擬化環(huán)境下的 VLAN
上圖中:
eth0 是物理機(jī)上的物理網(wǎng)卡尼酿,有一個(gè)命名為 eth0.10 的子設(shè)備于之相連。
eth0.10 就是 VLAN 設(shè)備植影。他的 VLAN ID 是 VLAN 10裳擎。
eth0.10 掛在命名為 brvlan10 的 Linux Bridge 上,虛擬機(jī) kvm 的虛擬網(wǎng)卡 vent0 也掛在 brvlan10 上思币。
最終效果:
- 物理機(jī)用軟件實(shí)現(xiàn)了一個(gè)交換機(jī)(虛擬交換機(jī))鹿响,上面定義了一個(gè) VLAN10。
- eth0.10谷饿,brvlan10 和 vnet0 都分別接到 VLAN10 的 Access(Access類型端口:只能屬于 1 個(gè) VLAN惶我,一般用于連接計(jì)算機(jī)端口) 口。而 eth0 就是一個(gè) Trunk(Trunk類型端口:可以允許多個(gè) VLAN 通過博投,可以接收和發(fā)送多個(gè) VLAN 報(bào)文绸贡,一般用于交換機(jī)與交換機(jī)相關(guān)的接口) 口。
- kvm 通過 vent0 發(fā)出來的數(shù)據(jù)包被打上 VLAN10 的標(biāo)簽毅哗。
eth0.10 作用是:定義 VLAN10听怕。
brvlan10 作用是:Bridge 上的其他網(wǎng)絡(luò)設(shè)備自動(dòng)加入到 VLAN10 中。
-
配置 VLAN
- 編輯
/etc/network/interfaces
編輯前
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
編輯后
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
auto eth0.10
iface eth0.10 inet manual
vlan-raw-device eth0
auto brvlan10
iface brvlan10 inet manual
bridge_stp off
bridge_waitport 0
bridge_fd 0
bridge_ports eth0.10
auto eth0.20
iface eth0.20 inet manual
vlan-raw-device eth0
auto brvlan20
iface brvlan20 inet manual
bridge_stp off
bridge_waitport 0
bridge_fd 0
bridge_ports eth0.20
重啟系統(tǒng)
ifconfig
查看
root@openstack:~# ifconfig
brvlan10 Link encap:Ethernet HWaddr 00:0c:29:45:5d:cb
inet6 addr: fe80::20c:29ff:fe45:5dcb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:3896 (3.8 KB)
brvlan20 Link encap:Ethernet HWaddr 00:0c:29:45:5d:cb
inet6 addr: fe80::20c:29ff:fe45:5dcb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:3896 (3.8 KB)
eth0 Link encap:Ethernet HWaddr 00:0c:29:45:5d:cb
inet addr:172.16.245.134 Bcast:172.16.245.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe45:5dcb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:114 errors:0 dropped:0 overruns:0 frame:0
TX packets:239 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13040 (13.0 KB) TX bytes:36646 (36.6 KB)
eth0.10 Link encap:Ethernet HWaddr 00:0c:29:45:5d:cb
inet6 addr: fe80::20c:29ff:fe45:5dcb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:48 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:7792 (7.7 KB)
eth0.20 Link encap:Ethernet HWaddr 00:0c:29:45:5d:cb
inet6 addr: fe80::20c:29ff:fe45:5dcb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:48 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:7792 (7.7 KB)
-
brctl show
查看網(wǎng)橋配置信息
root@openstack:~# brctl show
bridge name bridge id STP enabled interfaces
brvlan10 8000.000c29455dcb no eth0.10
brvlan20 8000.000c29455dcb no eth0.20
virbr0 8000.000000000000 yes
- 配置虛擬機(jī)網(wǎng)卡
啟動(dòng)虛擬機(jī)
-
brctl show
查看結(jié)果
root@openstack:~# brctl show
bridge name bridge id STP enabled interfaces
brvlan10 8000.000c29455dcb no eth0.10
vnet0
brvlan20 8000.000c29455dcb no eth0.20
virbr0 8000.000000000000 yes
不同VLan 之間是相互隔離的虑绵。虛擬機(jī)kvm2 接入 brvlan20尿瞭。將兩臺(tái)虛擬機(jī)的ip配置在同一個(gè)網(wǎng)段,相互是不能通訊的翅睛。
下一節(jié)講介紹玩轉(zhuǎn)OpenStack(三)架構(gòu)声搁、安裝黑竞、screen