一.虛擬化技術的介紹
(1)虛擬化技術類型:
1.主機虛擬化:xen,kvm.virtualbox.openv
2.系統虛擬化:wine
3.容器(用戶隔離空間):lxc(Linux container),openv
4.應用程序級虛擬化:jvm,pvm
5.模擬器:qemu
(2)主機虛擬化
1.CPU:
模擬:emulation, 虛擬機的arch與物理平臺的arch可以不相同;qemu;
虛擬:virtualization
完全虛擬化(full-virt)
BT: 二進制轉換 (軟件)
HVM:硬件輔助的虛擬化(硬件)
半(準)虛擬化 (para-virt)
GuestOS得明確知道自己運行于虛擬化技術
2.cpu環的概念
cpu環0,cpu環1,cpu環2,cpu環3
搜狗截圖20171202162920.png
解釋:cpu從里到外分為環0,環1,環2,環3,一般情況下環和環2不進行工作,環3會執行一些簡單的普通命令,而環0則執行一些特殊命令。例如執行一個計算命令2*3,該命令就會直接在環3上執行,但是一旦關機后該結果就會消失,如果想要執行io讀寫命令,此時環0就會工作,將計算結果存儲到磁盤上,這一過程的實現是通過環0能夠執行特殊指令去調用內核空間實現存儲。,而用戶空間沒有權限執行。
注意:對此引入了cpu級別的硬件虛擬化概念,就是在環0內又加入了環-1,環0用來運行虛擬機的操作系統,而環-1則運行宿主機的操作系統。因此常常以cpu環是否存在環-1來判斷該系統是否支持虛擬化
3.主機虛擬化類型
- TYPE-I:基于硬件級別直接運行hypervisor
例: xen,vmware,ESX/ESXI
Hypervisor:是一種運行在物理服務器和操作系統之間的中間軟件層,可允許多個操作系統和應用共享一套基礎物理硬件,因此也可以看作是虛擬環境中的"元"操作系統,它可以協調訪問服務器上的所有物理設備和虛擬機,也叫虛擬機監視器(Virtual Machine Monitor)。Hypervisor是所有虛擬化技術的核心。非中斷地支持多工作負載遷移的能力是Hypervisor的基本功能。當服務器啟動并執行Hypervisor時,它會給每一臺虛擬機分配適量的內存、CPU、網絡和磁盤,并加載所有虛擬機的客戶操作系統。- TYPE-II:
于硬件級別運行一個OS(Host OS),而此OS上運行一個VMM;
例:vmware workstation, virtualbox, kvm- Linux目前流行的開源虛擬化技術解決方案:
主機虛擬化:xen, kvm, virtualbox
容器級:lxc, libcontainer, runC, openvz
模擬器:qemu- KVM的組件:
kvm.ko:模塊
API:系統應用接口,系統留給應用程序的一個調用接口
qemu-kvm:用戶空間的工具程序
qemu-kvm是一個開源仿真器,為kvm虛擬機監控程序提供了硬件仿真
libvirt:是一套免費的,開源的支持linux系統的主流虛擬化工具的C函數庫,其為包括xen,kvm等各種虛擬化工具提供一套方便的可靠的編程接口,本身屬于工具,而是一種可以建立工具來管理客戶操作系統的API
4.快速使用kvm技術
首先yum install libvirt-daemonize-kvm qemu-kvm virt-manager
搜狗截圖20171202170555.png- 此時加載kvm模塊,modprobe kvm
- systemctl start libvirtd.service
grep -i -E '(vmx|svm|lm)' /proc/cpuinfo——cpu是否支持虛擬化
搜狗截圖20171202171118.pnglsmod |grep kvm——查看kvm類型
搜狗截圖20171202171426.png創建一個物理網橋
拓撲圖解釋原理:
搜狗截圖20171202174517.png
因此在創建虛擬機之前要先創建一個虛擬網卡(物理網橋),這是因為在安裝虛擬機操作系統時,需要安裝PXE系統,那么就需要該虛擬機具有外部通訊的功能,只有這樣才能DhCP獲取ip地址從而實現自動化安裝,物理網橋的作用就是一個虛擬網卡,通過物理交換機和外部進行信息的交換與通訊
- cd /etc/sysconfig/network-scripts
vim ifcfg-ens37
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=172.18.250.223——將該地址刪除,沒有ip地址就相當于一個交換機/
BRIDGE=br0——網橋為br0- Vim ifcfg-br0——創建物理網橋
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=172.18.250.223
DNS=172.18.0.1
PREFIX=16
此時br0被設置成物理網橋(虛擬網卡)重啟network
ip a
搜狗截圖20171202175618.png
brctl show
搜狗截圖20171202175749.png在 VMware Workstation上
virt-manager
搜狗截圖20171202180152.png
創建虛擬機
搜狗截圖20171202200739.png
選擇內存大小和cpu數量
搜狗截圖20171202200839.png
選擇虛擬機磁盤大小
搜狗截圖20171202200931.png
配置主機名,選擇網橋
搜狗截圖20171202201041.png
開始安裝
搜狗截圖20171202201118.png
實現快速安裝
5.總結
虛擬化技術的分類:
(1) 模擬:Emulation
Qemu, PearPC, Bochs, ...
(2) 完全虛擬化:Full Virtualization,Native Virtualization
BT/hvm
VMWare Workstation, VirtualBox, VMWare Server, Parallels Desktop, KVM(hvm), XEN(hvm)
(3) 半虛擬化:Para-Virutalization
特點:GuestOS(運行在虛擬機上的操作系統)明確知道自己運行虛擬機之上;
xen, UML(user-mode linux)
(4) 容器級虛擬化:
LXC, OpenVZ, libcontainer, runC, rkt, Linux V Servers, Virtuozzo, ...
(5) 庫級別虛擬化:
wine
(6) 程序級虛擬化
jvm, pvm, ...
二.通過磁盤鏡像文件實現虛擬機的下載
(1)鏡像文件的下載地址:https://launchpad.net/cirros/
下載的鏡像文件:http://download.cirros-cloud.net/0.3.0/cirros-0.3.0-x86_64-disk.img
(2)在宿主機上執行qemu-img -h來查看磁盤鏡像文件的格式及創建選項,一般使用qcow2格式。其中co=copy,w=write.是一種非常高級的格式,支持鏡像文件的壓縮加密及快照等功能
(3)開始創建
mkdir -pv /app/vm/images,cd到該目錄下
開始執行qemu-img create -f qcow2 -o ? /app/vm/images/test.qcow2
解釋上述命令:創建磁盤鏡像文件時需要的選項并且如何查詢幫助,-f代表文件的格式類型,-o代表選項并且后面要加?,后面要接preallocation,表示有關鏡像文件的分配,其中off表示不分配內容,使用時再分配,而metadata表示只分配元數據,full表示指定分配多大空間。一般情況下選擇metadata
具體的命令操作: qemu-img create -f qcow2 -0 size=120G,preallocation=metadata /app/vm/images/test.qcow2
創建成功后執行ll -h來查看
搜狗截圖20171202211151.png
(4)開始圖形化安裝虛擬機
virt-manager
其他選擇與之前快速安裝虛擬機類似,只是在選擇磁盤大小時選擇第二個select or create cutom storage
然后加入路徑 /app/vm/images/test.qcow2
然后其他選項不變進行安裝即可
(5)以上方式是人為自創建得一個鏡像文件,接下來通過下載的鏡像的文件來實現
(6)mkdir /app/vm/iamges2,將cirros-0.3.0-x86_64-disk.img鏡像文件下載當前目錄下,并且 cp cirros-0.3.0-x86_64-disk.img
c1.img 和c2.img
通過qemu-img info c1.img來查看信息
搜狗截圖20171202213331.png
在物理機上執行virt-manager
搜狗截圖20171202213446.png
選擇虛擬機鏡像文件路徑
搜狗截圖20171202213546.png
配置內存大小和cpu數量
搜狗截圖20171202213605.png
修改主機名,選擇網橋等選項后開始安裝
出現如圖選項后根據默認的用戶名和密碼進行登錄
搜狗截圖20171202214114.png
進行sudo su -切換成root用戶
ip a 發現已經配置好網址,此時可以利用c2.img再創建一個虛擬機進行相互之間的通訊
三.使用qemu-kvm來手動安裝虛擬機
(1)使用qemu-kvm管理vms:
Qemu:
處理器模擬器
仿真各種IO設備
將仿真設備連接至主機的物理設備
提供用戶接口
(2)標準選項的介紹
qemu-kvm命令語法:
qemu-kvm [options] [disk_image]
選項有很多類別:
標準選項、塊設備相關選項、顯示選項、網絡選項、...
- 標準選項:
-machine [type=]name:-machine help來獲取列表,用于指定模擬的主機類型;
-cpu cpu:-cpu help來獲取列表;用于指定要模擬的CPU型號;
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虛擬機上vcpu的數量及拓撲;
-boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
order:各設備的引導次序:c表示第一塊硬盤,d表示第一個光驅設備;-boot order=dc,once=d
-m megs:虛擬機的內存大小;
-name NAME:當前虛擬機的名稱,要惟一;- 塊設備相關的選項:
-hda/-hdb file:指明IDE總線類型的磁盤映射文件路徑;第0和第1個;
-hdc/-hdd file:第2和第3個;
-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:塊設備總線類型,ide, scsi, sd, floppy, virtio,...
media=TYPE:介質類型,cdrom和disk;
index=i:設定同一類型設備多個設備的編號;
cache=writethrough|writeback|none|directsync|unsafe:緩存方式;
format=f:磁盤映像文件的格式;- 顯示選項:
-display type:顯示的類型,sdl, curses, none和vnc;
-nographic:不使用圖形接口;
-vga [std|cirrus|vmware|qxl|xenfb|none]:模擬出的顯卡的型號;
-vnc display[,option[,option[,...]]]]:啟動一個vnc server來顯示虛擬機接口; 讓qemu進程監聽一個vnc接口;
display:
(1) HOST:N
在HOST主機的第N個桌面號輸出vnc;
5900+N
(2) unix:/PATH/TO/SOCK_FILE
(3) none
options:
password:連接此服務所需要的密碼
-monitor stdio:在標準輸出上顯示monitor界面;
Ctrl-a, c:在console和monitor之間切換;
Ctrl-a, h
(3)qemu-kvm的使用
1.首先如果要執行qemu-kvm命令時,要先執行 in -sv /usr/libexec/qemu-kvm /usr/bin/,鏈接到/usr/bin/的path路徑,可以讓qemu-kvm命令生效
2.開始執行命令
qemu-kvm -name c2 -m 64 -smp 2,cores=1(內核數),sockets=1(槽數) -drive file=/vm/images2/c2.img,if=virtio(半虛擬化),media=disk -nographic(不啟用圖形)
開啟之后會進行30多次的連接失敗后,才能成功登陸,然后進入虛擬機狀態
執行ctrl -a x:退出模擬器狀態
ctrl -a h :查看幫助
ctrl -a c :宿主機與虛擬機之間進行切換
3.針對上述情況如果想要快速登錄,則要在ftp上下載cirros-0.3.0-i386-disk.img(經過處理后的鏡像)
mkdir -pv /app/vm/images3/,并cd 該目錄下
cp cirros-0.3.0-i386-disk.img c1.img c2.img
4.yum install tigervnc
執行命令:qemu-kvm -name c1 -smp 2 -m 64 -drive file=/app/vm/images3/c1.img,if=virtio,media=disk -vnc :0(代表vnc監聽的端口默認為5900,其中最后一個0代表第一個終端) -daemonize
搜狗截圖20171202221302.png
在物理機上執行vncviewer :0,虛擬機登陸成功
四.網絡選項的設置
(1)網絡選項:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
為虛擬機創建一個網絡接口,并將其添加至指定的VLAN;model=type:指明模擬出的網卡的型號,ne2k_pci,i82551,i82557b,i82559er,rtl8139,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]:
通過物理的TAP網絡接口連接至vlan n;
script=file:啟動虛擬機時要執行的腳本,默認為/etc/qemu-ifup
downscript=dfile:關閉虛擬機時要執行的腳本,/etc/qemu-ifdown
ifname=NAME:自定義接口名稱;
/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
其它選項:
-daemonize:以守護進程運行;
(2)通過網絡選項實現創建虛擬機
1.cd /app/vm/images3 cp c2.img c3.img
vim /etc/qemu-ifup
#!/bin/bash
#
bridge=vnet0
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
2.創建物理網橋(虛擬網卡)
brctl addbr vnet0
ip link set vnet0 up
搜狗截圖20171202222550.png
vim /etc/qemu-ifdown——拆除網卡
#!/bin/bash
#
bridge=vnet0
if [ -n "$1" ];then
brctl delif $bridge $1
[ $? -eq 0 ]&& exit 0 || exit 1
else
echo "Error: no interface specified."
exit 2
fi
注意:兩個腳本都要加執行權限
3.執行命令
- qemu-kvm -name c1 -m 64 -smp 2 -drive file=/app/vm/images3/c1.img,if=virtio,media=disk -vnc :0 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:10(mac地址52:54:00:00為固定的) -net tap,script=/etc/qemu-ifup
qemu-kvm -name c2 -m 64 -smp 2 -drive file=/app/vm/images3/c2.img,if=virtio,media=disk -vnc :0 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11(mac地址要改變)-net tap,script=/etc/qemu-ifup
在物理機上執行vncviewer :0
搜狗截圖20171202223736.png
為了實現通訊為該虛擬機配置ip地址
ifconfig eth0 10.1.0.1/24 up
在另一臺虛擬機上 ifconfig eth0 10.1.0.2/24 up
此時兩臺虛擬機可以進行Ping命令
4.為vnet0配置ip地址
ifconfig vnet0 10.1.0.254/24 up
此時vnet0網卡既可以作為交換機,也可以作為虛擬網卡
拓撲圖解釋:
搜狗截圖20171202224837.png
在宿主機上創建了一個網橋(vnet0),如果不給這個網橋配置ip地址,那就相當于一個交換機,兩個虛擬機通過交換機可以進行ping命令,但是不能和宿主機進行通訊,因此為網橋配置ip地址后就可以實現虛擬機與宿主機之間的通訊了,此時就相當于一個僅主機模式,如果通過iptables策略開啟snat策略實現跳轉的話,就可以和外部進行通訊,此環境就相當于nat模式
5在虛擬機上分別將網關指向虛擬網卡的ip地址
ip route add default via 10.1.0.254/24
此時虛擬機和宿主機就可以實現ping命令,此時相當于一個僅主機模式,如果想要實現nat模式就要設置ipatbles策略
開啟宿主機的路由轉發功能
echo 1 > /proc/sys/net/ipv4/ip_forward
添加iptables的snat規則
iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -j SNAT --to-source 172.18.250.223
此時在虛擬機上ping 172.18.0.1可以Ping通
五.實現虛擬機的自動分配地址
(1)首先查看netns幫助
ip netns help
搜狗截圖20171203151626.png
netns主要是可以創建一個新的空間,創建一個新的網絡環境
例: ip netns add router0——創建一個名為router0的網絡空間,和宿主機無關系
使用ip netns exec router0 ifconfig -a來查看新創建的空間
搜狗截圖20171203152136.png
(2)為router0添加虛擬網卡
ip linkn add myeth1 type veth peer name myeth2
創建的網卡是成對出現
ip a查看
搜狗截圖20171203152629.png
(3)將其中一個網卡添加到router0的網絡空間中
ip link add myeth2 netns router0
搜狗截圖20171203152808.png
(4)修改網卡名
ip netns exec router0 ip link set dev myeth2 name eth0 ——將router0中的myeth2改名為eth0
搜狗截圖20171203153213.png
(5)為網卡配置ip地址
ip netns exec router0 ifconfig eth0 10.2.0.253/24 up
ifconfig myeth1 10.2.0.252/24 up
搜狗截圖20171203153718.png
ping命令測試搜狗截圖20171203153755.png
以上操作屬于容器類型的虛擬化,作為了解,下面介紹虛擬機的自動獲取ip地址的方式
dnsmasq
通過dnsmasq實現自動獲取ip地址
yum install dnsmasq
命令: dnsmasq --listen-address 10.2.0.253,127.0.0.1 --dhcp-range=10.1.0.11,10.1.0.50,24h(地址有效時間) --dhcp-option=3(就是網關的意思),10.2.0.253
qemu-kvm -name c1 -m 64 -smp 2 -drive file=/app/vm/images3/c1.img,if=virtio,media=disk -vnc :0 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:10 -net tap,script=/etc/qemu-ifup
在物理機執行vncviewer :0
就會發現ip地址已經自動獲取
如果將 /etc/qemu-ifup腳本中的bridge=vnet0改為br0,再執行 qemu-kvm -name c1 -m 64 -smp 2 -drive file=/app/vm/images3/c1.img,if=virtio,media=disk -vnc :0 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:10 -net tap,script=/etc/qemu-ifup,會發現虛擬機地址是172范圍內的
搜狗截圖20171203160127.png
六.virsh命令的應用
(1)虛擬機的生成需要依賴于預定義的xml格式的配置文件
生成工具: virt-manager,virt-install
因此要安裝 yum install virt-install virt-manager
cd /etc/libvirt/qemu/——查看xml格式的配置文件
(2)創建新的虛擬機,使用
搜狗截圖20171203161017.png
重新創建一個名為c2的虛擬機,方式同之前的方式一樣
此時在/etc/libvirt/qemu/下會有一個c2.xml配置文件
(3)通過已有的.xml文件來生成一個新的虛擬機
使用virsh命令實現
首先來介紹virsh命令的使用
搜狗截圖20171203161515.png
list --all
搜狗截圖20171203161730.png
destroy c2:執行該命令就可以將c2虛擬機關閉
start c2:執行start命令就會重新開啟虛擬機
virsh console c2:直接連到虛擬機
搜狗截圖20171203162329.png
執行ctrl ]就會剝離終端(注意是剝離終端,但是虛擬機還在運行)
搜狗截圖20171203162602.png
(4)開始手動創建xml配置文件
cd /etc/libvirt/qemu
cp c2.xml template.xml
vim template.xml
搜狗截圖20171203163042.png
virsh create template.xml --console 創建并登錄
創建并登錄成功后退出并進入virsh中,執行all --list發現沒有template虛擬機,因此要將名字改為c3后再加入進來
cp template.xml c3.xml
virsh define /etc/libvirt/qemu/c3.xml
再次list --all查看
搜狗截圖20171203163530.png
創建成功,這樣就不需要每次都執行qemu-kvm -name等操作來開啟虛擬機了,只需要進入visrh,執行start name 和destroy name來實現開啟和關閉命令
(5)其他常用命令介紹
dumpxml c2
搜狗截圖20171203163921.png
save:掛起
suspend:暫停(暫時存儲到內存中),如果關機內容就會丟失
resume:重新運行
例:suspend c2
resume c2
搜狗截圖20171203164406.png
使用save命令
開啟另一個終端
virsh console c2
執行ping 172.18.0.1,然后ctrl ]退出虛擬機終端
此時在原終端上執行 save c2 /tmp/c2.dump --running——將ping命令的狀態保存的路徑
之后只要執行restore /tmp/c2.dump --running就可以恢復之前的狀態
搜狗截圖20171203165014.png
setvcpu——增加虛擬機數量
例 setvcpu c2 2,但是并不是想設置幾個都可以,這是和之前的創建時就固定好的,使用setvcpu只是要開啟幾個cpu的意思
dominfo c2搜狗截圖20171203165415.png
實現熱插拔設備的命令操作
在正在運行的c2虛擬機上再加入一個.img的鏡像文件,打開另一個終端
cd /app/vm/images3
qemu-img create -f qcow2 -o size=20G,preallocation=metada ./test.img
回到之前的終端 執行domblklist c2
domblkinfo c2 vda——查看磁盤信息
搜狗截圖20171203170706.png
attach-disk c2 /app/vm/images3/test.img vdb
搜狗截圖20171203170717.png
執行detach-disk c2 vdb拆除該磁盤
搜狗截圖20171203170742.png
網卡熱插拔
attach-interface c2 bridge vnet0 --model virto
detach-interface bridge --mac——根據指定的mac地址來進行拆除
注意:
hda /app/c1.img #hda時IDE硬盤,在這里不支持熱插拔
vda /app/c4.img #注意vda格式的是半虛擬化的支持熱插拔