1坝初、虛擬化技術(shù)簡(jiǎn)介
libvirt是提供了一個(gè)方便的方式來管理虛擬機(jī)和其他虛擬化功能的軟件的集合,如存儲(chǔ)和網(wǎng)絡(luò)接口管理。這些軟件包括一個(gè)API庫份汗,一個(gè)守護(hù)進(jìn)程(Libvirtd)绊起,和一個(gè)命令行實(shí)用程序(virsh)精拟。
- 主機(jī)虛擬化的類型:
TYPE-I:
硬件級(jí)別直接運(yùn)行hypervisor;
xen, vmware ESX/ESXI
TYPE-II:
于硬件級(jí)別運(yùn)行一個(gè)OS(Host OS)勒庄,而此OS上運(yùn)行一個(gè)VMM串前;
vmware workstation, virtualbox, kvm
Linux目前流行的開源虛擬化技術(shù)解決方案:
主機(jī)虛擬化:xen, kvm, virtualbox
容器級(jí):lxc, libcontainer, runC, openvz
模擬器:qemu -
cpu的環(huán)0、環(huán)1实蔽、環(huán)2荡碾、環(huán)3
image.png
cpu從內(nèi)到外被分成環(huán)0-環(huán)3使用,環(huán)1和環(huán)2一般情況下不會(huì)使用局装,環(huán)0運(yùn)行的是一些特權(quán)指令坛吁,環(huán)3運(yùn)行的是一些普通指令,用戶空間運(yùn)行的一些普通指令铐尚,比如1+1等于幾拨脉,用戶空間直接操縱cpu的環(huán)3去運(yùn)行此指令,如果要進(jìn)行IO操作宣增,比如把1+1的運(yùn)算結(jié)果保存到磁盤玫膀,此時(shí)用戶空間沒有權(quán)限去執(zhí)行,就會(huì)進(jìn)行系統(tǒng)調(diào)用爹脾,進(jìn)入內(nèi)核空間帖旨,操縱cpu的環(huán)0去執(zhí)行這些特權(quán)指令。
cpu的硬件虛擬化指在環(huán)0內(nèi)部再加一個(gè)環(huán)-1灵妨,環(huán)0留給虛擬機(jī)的操作系統(tǒng)(GuestOS)解阅,環(huán)-1留給宿主機(jī)的操作系統(tǒng)(HostOS),虛擬機(jī)是建立在宿主機(jī)之上的泌霍。判斷一個(gè)主機(jī)是否支持虛擬化就是看cpu是否有環(huán)-1 - 虛擬化技術(shù)的分類:
(1) 模擬:Emulation:cpu的環(huán)0和環(huán)3都是虛擬的
Qemu, PearPC, Bochs, ...
(2) 完全虛擬化:Full Virtualization货抄,Native Virtualization:cpu的環(huán)0是虛擬的,環(huán)3是真實(shí)的
BT/hvm
VMWare Workstation, VirtualBox, VMWare Server, Parallels Desktop, KVM(hvm), XEN(hvm)
(3) 半虛擬化:Para-Virutalization
特點(diǎn):GuestOS(運(yùn)行在虛擬機(jī)上的操作系統(tǒng))明確知道自己運(yùn)行在虛擬機(jī)之上朱转,并且明確知道要執(zhí)行某個(gè)特權(quán)指令時(shí)不去找環(huán)0蟹地,而是找虛擬機(jī)管理器去提供一個(gè)環(huán)0的功能接口
xen, UML(user-mode linux)
(4) 容器級(jí)虛擬化:
LXC, OpenVZ, libcontainer, runC, rkt, Linux V Servers, Virtuozzo, ...
(5) 庫級(jí)別虛擬化:
wine
(6) 程序級(jí)虛擬化
jvm, pvm, ... - 虛擬化需要安裝的軟件包
先安裝kvm模塊modprobe kvm
yum install qemu-kvm libvirt-daemon-kvm virt-manager
2、使用virt-manager管理KVM
使用virt-manager管理KVM就是在圖形界面下快速創(chuàng)建虛擬機(jī)藤为、安裝操作系統(tǒng)锈津。
首先要將虛擬機(jī)設(shè)置成如下圖所示才能支持虛擬化,也就是在虛擬機(jī)上安裝虛擬機(jī)
[root@node3 network-scripts]#grep -i -E "(vmx|svm|lm)" /proc/cpuinfo #首先查看主機(jī)是否支持虛擬化
vmx:是intel的cpu硬件虛擬化標(biāo)識(shí)凉蜂,也就是有環(huán)-1
svm:是amd的cpu硬件虛擬化標(biāo)識(shí)琼梆,也有環(huán)-1
lm:longmode性誉,確保是x86_64的架構(gòu),也就是要確保是64位系統(tǒng)茎杂,因?yàn)樘摂M化功能要在64位系統(tǒng)上
[root@node3 network-scripts]#modprobe kvm #安裝kvm模塊
[root@node3 ~]# modprobe kvm-intel
[root@node3 ~]# lsmod |grep kvm
kvm_intel 55432 0
kvm 346318 1 kvm_intel
[root@node3 network-scripts]#ll /dev/kvm
crw-rw-rw-. 1 root kvm 10, 232 Nov 29 17:33 /dev/kvm #發(fā)現(xiàn)生成了此字符文件
[root@node3 network-scripts]#yum install qemu-kvm libvirt-daemon-kvm virt-manager #安裝軟件包
[root@node3 network-scripts]#systemctl start libvirtd #啟動(dòng)服務(wù)
[root@node3 network-scripts]#systemctl status libvirtd
[root@node3 network-scripts]#cdnet
[root@node3 network-scripts]#cp ifcfg-ens33 ifcfg-br0
[root@node3 network-scripts]#vim ifcfg-br0 #創(chuàng)建一個(gè)物理網(wǎng)橋错览,并配置原來物理網(wǎng)卡的ip地址
DEVICE=br0
TYPE=bridge
IPADDR=172.18.21.100
PREFIX=16
GATEWAY=172.18.0.1
DNS1=172.18.0.1
[root@node3 network-scripts]#vim ifcfg-ens33 #將物理網(wǎng)卡中的ip地址去掉,變成物理的交換機(jī)
DEVICE=ens33
BRIDGE="br0" #將物理交換機(jī)和物理網(wǎng)橋連接
這樣相當(dāng)于物理網(wǎng)橋和物理的網(wǎng)卡交換位置了煌往,物理網(wǎng)卡充當(dāng)物理交換機(jī)倾哺,物理網(wǎng)橋充當(dāng)宿主機(jī)的一個(gè)虛擬網(wǎng)卡和外部通訊
[root@node3 network-scripts]#systemctl restart network
[root@node3 network-scripts]#ip a
[root@node3 network-scripts]#brctl show #查看網(wǎng)橋的連接情況,此命令來自于bridge-utils軟件包
bridge name bridge id STP enabled interfaces
br0 8000.0050562375d6 no ens33
在圖形界面下輸入如下命令就可以創(chuàng)建虛擬機(jī)刽脖,并安裝操作系統(tǒng)了羞海,這里使用的是PXE安裝,需要事先搭建好PXE的環(huán)境曲管。將虛擬機(jī)的網(wǎng)絡(luò)和PXE主機(jī)的網(wǎng)絡(luò)放在同一網(wǎng)段却邓,并且不使用vmware workstation的dhc分配ip地址,而使用PXE環(huán)境中的dhcp分配ip地址
brctl用來管理網(wǎng)橋的命令院水,來自bridge-utils軟件包
[root@node3 images]#lsmod |grep bridge #查看橋模塊是否加載
bridge 107106 0
[root@node3 network-scripts]#brctl help #查看幫助
[root@node3 network-scripts]#brctl addbr br1 #添加一個(gè)網(wǎng)橋
[root@node3 network-scripts]#brctl show #查看網(wǎng)橋
[root@node3 network-scripts]#ip link set br1 up #開啟網(wǎng)橋
[root@node3 ~]#brctl addif br1 ens37 #把網(wǎng)卡添加到網(wǎng)橋上
[root@node3 ~]#ip link set br1 down
[root@node3 ~]#brctl delbr br1 #刪除網(wǎng)橋之前要先把網(wǎng)橋設(shè)置為down狀態(tài)
### 3腊徙、使用磁盤鏡像文件來安裝虛擬機(jī)
1、查看磁盤鏡像文件支持的格式
[root@node3 ~]#qemu-img -h #查看磁盤鏡像文件支持的格式及創(chuàng)建的時(shí)候的幫助信息檬某,如何創(chuàng)建
一般創(chuàng)建的時(shí)候使用qcow2格式撬腾,表示寫時(shí)復(fù)制格式,co=copy恢恼,
w=write民傻,是一種非常高級(jí)的格式,支持鏡像文件的壓縮场斑、加密漓踢、快照
等各種高級(jí)功能,并且qemu-img這個(gè)工具支持使用http和簸、ftp等協(xié)議去
加載另外一個(gè)服務(wù)器上的文件當(dāng)做磁盤鏡像文件彭雾。
如果使用vmware創(chuàng)建虛擬機(jī)碟刺,還可以使用vmdk格式
[root@node3 app]#mkdir /app/vm/images -pv
[root@node3 app]#qemu-img creat -f qcow2 -o ? /app/vm/images/test.qcow2 #創(chuàng)建磁盤鏡像文件時(shí)需要帶選項(xiàng)如何查幫
助锁保,-o后面加個(gè)?半沽,-o指要帶的選項(xiàng)爽柒,一般帶preallocation這個(gè)選項(xiàng),
表示創(chuàng)建的時(shí)候給這個(gè)磁盤鏡像文件預(yù)分配哪些空間者填,怎么分配的,值
有off表示不分配任何內(nèi)容,用的時(shí)候再分配白嘁,metadata表示只分配磁盤
鏡像文件的元數(shù)據(jù),full表示指定多大將分配多大空間酿矢,一般情況下使
用metadata
[root@node3 app]#qemu-img create -f qcow2 -o size=120G,preallocation=metadata /app/vm/images/test.qcow2 #開始創(chuàng)建,注意這里創(chuàng)建的只是一個(gè)裸的虛擬磁盤怎燥,里面并沒有操作系統(tǒng)
[root@node3 app]#cd /app/vm/images/
[root@node3 images]#ll -h
total 23M
-rw-r--r--. 1 root root 121G Nov 30 10:24 test.qcow2 #發(fā)現(xiàn)大小為121G瘫筐,1G是元數(shù)據(jù),另外120G是可用的大小
[root@node3 images]#du -sh test.qcow2 #但用此命令發(fā)現(xiàn)真正的大小只有23M铐姚,ll命令是會(huì)欺騙你的策肝,這就是稀疏格式
23M test.qcow2
[root@node3 images]#qemu-img info /app/vm/images/test.qcow2
image: /app/vm/images/test.qcow2
file format: qcow2
virtual size: 120G (128849018880 bytes)
disk size: 23M
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
依然選擇PXE安裝,然后指明磁盤鏡像文件的路徑就可以在這個(gè)磁盤鏡像文件上安裝操作系統(tǒng)了
https://launchpad.net/cirros/ 此網(wǎng)站提供了磁盤鏡像文件隐绵,可以直接從此處下載創(chuàng)建好的磁盤鏡像文件之众,這些磁盤鏡像文件中已經(jīng)安裝好了操作系統(tǒng),導(dǎo)入后不用安裝操作系統(tǒng)可以直接使用依许,可以用于云環(huán)境下測(cè)試用
[root@node3 images]#ll -h #下載一個(gè)磁盤鏡像文件并上傳
total 9.4M
-rw-r--r--. 1 root root 9.4M Nov 30 10:50 cirros-0.3.0-x86_64-disk.img
[root@node3 images]#cp cirros-0.3.0-x86_64-disk.img c1.img
[root@node3 images]#cp cirros-0.3.0-x86_64-disk.img c2.img
[root@node3 images]#ls #將這個(gè)磁盤鏡像文件復(fù)制兩份
c1.img c2.img cirros-0.3.0-x86_64-disk.img
[root@node3 images]#qemu-img info c1.img
image: c1.img
file format: qcow2 #發(fā)現(xiàn)格式也是qcow2的
virtual size: 39M (41126400 bytes)
disk size: 9.3M
cluster_size: 65536
Format specific information:
compat: 0.10
從上圖我們發(fā)現(xiàn)這已經(jīng)是一個(gè)很小的虛擬機(jī)了棺禾,并且里面是一個(gè)很小的操作系統(tǒng),可以用c2.img再創(chuàng)建一個(gè)虛擬機(jī)悍手,讓這兩個(gè)虛擬機(jī)可以相互通訊了
4帘睦、如何使用qeum-kvm來手動(dòng)安裝虛擬機(jī)實(shí)例
kvm只能虛擬化cpu和內(nèi)存,需要qemu來輔助虛擬化IO等其他設(shè)備
qemu-kvm可以實(shí)現(xiàn)字符界面下手動(dòng)創(chuàng)建虛擬機(jī)實(shí)例
Qemu:處理器模擬器
仿真各種IO設(shè)備坦康、將仿真設(shè)備連接至主機(jī)的物理設(shè)備竣付、提供用戶接口
qemu-kvm命令語法:
qemu-kvm [options] [disk_image]
選項(xiàng)有很多類別:
標(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來獲取列表筛璧,用于指定模擬的主機(jī)類型逸绎;
-cpu cpu:-cpu help來獲取列表;用于指定要模擬的CPU型號(hào)夭谤;
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虛擬機(jī)上vcpu的數(shù)量及拓?fù)涔啄粒籹ockets表示有個(gè)插槽,也就是幾顆cpu朗儒,cores表示一顆cpu是幾核颊乘,threads表示以核支持多少個(gè)線程,所以最后的虛擬cpu數(shù)量相當(dāng)于這個(gè)三個(gè)數(shù)量相乘
-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表示光盤只在第一次引導(dǎo),下次就硬盤引導(dǎo)了
-m megs:虛擬機(jī)的內(nèi)存大锌也弧檩小;
-name NAME:當(dāng)前虛擬機(jī)的名稱,要惟一烟勋;
塊設(shè)備相關(guān)的選項(xiàng):
-hda/-hdb file:指明IDE總線類型的磁盤映射文件路徑规求;第0和第1個(gè)筐付;
-hdc/-hdd file:第2和第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[,...]]]]:?jiǎn)?dòng)一個(gè)vnc server來顯示虛擬機(jī)接口徒溪; 讓qemu進(jìn)程監(jiān)聽一個(gè)vnc接口忿偷;
display:
(1) HOST:N
在HOST主機(jī)的第N個(gè)桌面號(hào)輸出vnc;
5900+N
(2) unix:/PATH/TO/SOCK_FILE
(3) none
options:
password:連接此服務(wù)所需要的密碼臊泌;
-monitor stdio:在標(biāo)準(zhǔn)輸出上顯示monitor界面鲤桥;
Ctrl-a, c:在console和monitor之間切換;
Ctrl-a, h
網(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,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網(wǎng)絡(luò)接口連接至vlan n;
script=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:自定義接口名稱;
/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)行雇庙;
示例
此示例是在上面的基礎(chǔ)上完成的谓形,也就是安裝好了軟件包,創(chuàng)建好了物理網(wǎng)橋等前期的操作
[root@node3 images]#rpm -ql qemu-kvm #發(fā)現(xiàn)此命令不在PATH路徑下
/usr/libexec/qemu-kvm
[root@node3 images]#ln -s /usr/libexec/qemu-kvm /usr/bin/ #創(chuàng)建一個(gè)軟鏈接到PATH路徑下就可以使用此命令了
[root@node3 images]#cp cirros-no_cloud-i386.img c1.img
[root@node3 images]#cp cirros-no_cloud-i386.img c2.img
[root@node3 images]#ls /app/vm/images/ #此實(shí)驗(yàn)的磁盤鏡像文件
cirros-no_cloud-i386.img是老師經(jīng)過處理的状共,去掉了里面的一些腳本套耕,
便于實(shí)現(xiàn)時(shí)可以快速顯示登錄信息谁帕,不必等到超時(shí)
c1.img c2.img cirros-no_cloud-i386.img
[root@node3 ~]#qemu-kvm -name c2 -m 64 -smp 4,sockets=2,cores=2 -drive file=/app/vm/images/c2.img,if=virtio,media=disk -nographic #使用此命令創(chuàng)建虛擬機(jī)峡继,if=virtio表示塊設(shè)備總線類型為半虛擬化,一般使用此類型
有的時(shí)候要等很長(zhǎng)時(shí)間才能完成安裝匈挖,超時(shí)連接30次之后才能顯示登錄信息碾牌,此實(shí)驗(yàn)使用的磁盤鏡像文件是處理過的康愤,很快就會(huì)顯示登錄信息
要想關(guān)閉虛擬機(jī),可以使用poweroff舶吗,或者可以先ps aux查看一下進(jìn)程編號(hào)征冷,然后使用kill命令就可以關(guān)閉
- 如何使用vnc來顯示虛擬機(jī)接口
[root@node3 images]#yum install tigervnc #要安裝tigervnc軟件包,就可以在vnc上顯示虛擬機(jī)了
[root@node3 images]#qemu-kvm -name c2 -m 64 -smp 4,sockets=2,cores=2 -drive file=/app/vm/images/c2.img,if=virtio,media=disk -vnc :0 --daemonize #-vnc :0 表示監(jiān)聽在vnc的0號(hào)桌面誓琼,也就是5900端口检激,--daemonize表示
后臺(tái)運(yùn)行,5900表示vnc的0號(hào)桌面腹侣,5901表示1號(hào)桌面叔收,5902表示2號(hào)
桌面,如果不指明默認(rèn)也是以nvc打開圖形界面的
[root@node3 images]#ss -nlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 *:5900 *:*
[root@node3 images]#ps aux #發(fā)現(xiàn)程序在后臺(tái)運(yùn)行了
root 11190 6.3 6.2 657656 62076 ? Sl 14:54 0:05 qemu-kvm -name c2 -m 64 -smp 4,sockets=2,cores=2 -drive file=/app/vm/images/c2.img,if=virti
此時(shí)在圖形界面下vncviewer :0命令就可以看到vnc打開的圖形界面
5傲隶、使用網(wǎng)絡(luò)選項(xiàng)創(chuàng)建虛擬機(jī)
在vmware workstation中網(wǎng)絡(luò)連接模式有三種
這三種分別是什么含義呢
示例1:特定虛擬網(wǎng)絡(luò)模式饺律,也就是不能和物理機(jī)通訊,只能兩臺(tái)虛擬機(jī)相互通訊
[root@centos7 ~]#grep -i -E "(vmx|svm|lm)" /proc/cpuinfo
[root@centos7 app]#modprobe kvm
[root@centos7 app]#lsmod |grep kvm
[root@centos7 app]#yum install qemu-kvm tigervnc -y
[root@centos7 ~]#brctl addbr vnet0 #創(chuàng)建一個(gè)私有網(wǎng)橋跺株,也就是虛擬的交換機(jī)
[root@centos7 ~]#brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400c04670 yes virbr0-nic
vnet0 8000.000000000000 no
[root@centos7 ~]#ip link set vnet0 up #激活此交換機(jī)
[root@centos7 app]#ln -s /usr/libexec/qemu-kvm /usr/bin
[root@centos7 app]#vim /etc/qemu-ifup #創(chuàng)建一個(gè)添加虛擬機(jī)網(wǎng)卡到網(wǎng)橋的啟動(dòng)腳本
#!/bin/bash
#
bridge=vnet0
if [ -n "$1" ];then #如果虛擬網(wǎng)卡存在
ip link set $1 up #就激活此虛擬網(wǎng)卡
sleep 1
brctl addif $bridge $1 #將虛擬網(wǎng)卡連接到網(wǎng)橋上复濒,也就是連接到虛擬交換機(jī)上
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "no interface specified"
exit 2
fi
[root@centos7 app]#chmod a+x /etc/qemu-ifup
[root@centos7 app]#bash -n /etc/qemu-ifup
[root@centos7 app]#vim /etc/qemu-ifdown #創(chuàng)建一個(gè)摘除虛擬機(jī)網(wǎng)卡到網(wǎng)橋的腳本
#!/bin/bash
#
bridge=vnet0
if [ -n "$1" ];then
brctl delif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "no interface specified"
exit 2
fi
[root@centos7 app]#chmod a+x /etc/qemu-ifdown
[root@centos7 app]#bash -n /etc/qemu-ifdown
[root@centos7 app]#qemu-kvm -name c1 -m 64m -smp 2 -drive file=/app/c1.img,if=virtio,media=disk -vnc :0 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:01 -net tap,script=/etc/qemu-ifup,ifname=eth0 #macaddr=52:54:00:00:00:01,前三個(gè)是固定的乒省,后面三個(gè)自己設(shè)置巧颈,ifname指明虛擬機(jī)網(wǎng)卡的名字
[root@centos7 app]#qemu-kvm -name c2 -m 64m -smp 2 -drive file=/app/c2.img,if=virtio,media=disk -vnc :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:02 -net tap,script=/etc/qemu-ifup,ifname=eth1
[root@centos7 app]#ps aux
[root@centos7 app]#ss -nlt #可以發(fā)現(xiàn)5900和5901端口已經(jīng)打開
[root@centos7 app]#ip a #可以發(fā)現(xiàn)虛擬機(jī)的網(wǎng)卡有一半也在宿主機(jī)上顯示
[root@centos7 app]#brctl show #發(fā)現(xiàn)兩個(gè)虛擬機(jī)的網(wǎng)卡都連接到虛擬交換機(jī)上了
bridge name bridge id STP enabled interfaces
virbr0 8000.525400c04670 yes virbr0-nic
vnet0 8000.062ae11d546e no eth0
eth1
測(cè)試:在兩臺(tái)虛擬主機(jī)上配置好ip地址,發(fā)現(xiàn)可以相互ping通了袖扛,注意配置ip地址時(shí)要sudo su root才有權(quán)限修改
示例2:僅主機(jī)模式
[root@centos7 app]#ifconfig vnet0 10.0.0.254/24 #將虛擬交換機(jī)添加一個(gè)ip地址洛二,相當(dāng)于在宿主機(jī)上添加了一個(gè)虛擬網(wǎng)卡,這樣虛擬機(jī)就可以和宿主機(jī)通訊了
測(cè)試:發(fā)現(xiàn)可以ping通了
在虛擬機(jī)上將網(wǎng)關(guān)指向宿主機(jī)的虛擬網(wǎng)卡地址攻锰,就可以和宿主機(jī)的真實(shí)網(wǎng)卡通訊了晾嘶,但ping不通外網(wǎng)
示例3 NAT模式
[root@centos7 app]#cat /proc/sys/net/ipv4/ip_forward #查看是否開啟路由功能,如果沒有要開啟路由功能
1
在宿主機(jī)上添加iptables的SNAT規(guī)則
[root@centos7 app]#iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 172.18.21.107
此時(shí)可以ping通外網(wǎng)了
總結(jié):半虛擬化:virtio建議:Network IO, Disk IO使用virtio娶吞,性能會(huì)有顯著提升垒迂。
6、如何實(shí)現(xiàn)給虛擬機(jī)自動(dòng)分配地址
上面測(cè)試的時(shí)候都是給虛擬主機(jī)手動(dòng)配置的地址妒蛇,如何能實(shí)現(xiàn)自動(dòng)給它們分配地址呢机断,需要進(jìn)行如下操作
[root@centos7 ~]#yum install dnsmasq
[root@centos7 ~]#dnsmasq --listen-address=10.0.0.254,127.0.0.1 --dhcp-range=10.0.0.1,10.0.0.50,48h --dhcp-option=3,10.0.0.254 #48小時(shí)指的是地址有效期,--dhcp-option=中的3表示此選項(xiàng)是網(wǎng)關(guān)
[root@centos7 ~]#ss -unlp #發(fā)現(xiàn)udp的67端口已經(jīng)監(jiān)聽
[root@centos7 ~]#ps aux #發(fā)現(xiàn)dnsmasq進(jìn)程已經(jīng)運(yùn)行
發(fā)現(xiàn)可以自動(dòng)獲取ip地址了
7绣夺、將虛擬機(jī)的網(wǎng)卡和物理橋橋接吏奸,直接就可以和外部通訊
1、創(chuàng)建一個(gè)物理橋
[root@centos7 network-scripts]#cp ifcfg-ens37 ifcfg-br0
[root@centos7 network-scripts]#vim ifcfg-br0
DEVICE=br0
DEVICE=br0
TYPE=bridge
IPADDR=172.18.21.107
REFIX=16
GATEWAY=172.18.0.1
DNS1=172.18.0.1
[root@centos7 network-scripts]#vim ifcfg-ens37
DEVICE=ens37
BRIDGE=br0
[root@centos7 network-scripts]#systemctl restart network
[root@centos7 network-scripts]#ip a
[root@centos7 network-scripts]#brctl show
2陶耍、修改啟動(dòng)腳本奋蔚,將虛擬機(jī)的網(wǎng)卡和物理橋連接
[root@centos7 network-scripts]#vim /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 "no interface specified"
exit 2
fi
3、啟動(dòng)一個(gè)虛擬機(jī)實(shí)例
[root@centos7 network-scripts]#qemu-kvm -name c2 -m 64m -smp 2 -drive file=/app/c2.img,if=virtio,media=disk -vnc :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:02 -net tap,script=/etc/qemu-ifup,ifname=eth1
[root@centos7 network-scripts]#ss -nlt
[root@centos7 network-scripts]#ps aux
4、測(cè)試
發(fā)現(xiàn)直接分配的就是外網(wǎng)的地址泊碑,說明將虛擬機(jī)的網(wǎng)卡和物理橋連接后直接可以訪問外網(wǎng)坤按,不需要設(shè)置SNAT地址轉(zhuǎn)換也可以實(shí)現(xiàn),就是將虛擬機(jī)的網(wǎng)卡和物理網(wǎng)卡橋接馒过,而物理網(wǎng)卡和物理橋是連接的臭脓,vmware workstation中的橋接就是這種模式的
8、網(wǎng)絡(luò)名稱空間
[root@node3 images]#ip netns add router0 #添加一個(gè)網(wǎng)絡(luò)名稱空間
[root@node3 images]#ip netns list
router0
[root@node3 images]#ip link add myeth1 type veth peer name myeth2 #添加一對(duì)虛擬網(wǎng)卡腹忽,veth代表網(wǎng)卡類型為以太網(wǎng)網(wǎng)卡来累, peer name表示對(duì)端的名字是什么,這一對(duì)網(wǎng)卡相當(dāng)于一根網(wǎng)線的兩頭
[root@node3 images]#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 state UP qlen 1000
link/ether 00:50:56:23:75:d6 brd ff:ff:ff:ff:ff:ff
inet 172.18.21.100/16 brd 172.18.255.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe23:75d6/64 scope link
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:33:fb:70 brd ff:ff:ff:ff:ff:ff
inet 192.168.25.30/24 brd 192.168.25.255 scope global dynamic ens37
valid_lft 38162sec preferred_lft 38162sec
inet6 fe80::250:56ff:fe33:fb70/64 scope link
valid_lft forever preferred_lft forever
18: myeth2@myeth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 6e:bb:a2:10:76:6a brd ff:ff:ff:ff:ff:ff
19: myeth1@myeth2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether c6:ea:cf:41:60:f6 brd ff:ff:ff:ff:ff:ff
[root@node3 images]#ip link set dev myeth2 netns router0 #將其中一個(gè)虛擬網(wǎng)卡加入到新建的名稱空間內(nèi)
[root@node3 images]#ip a
[root@node3 images]#ip a #發(fā)現(xiàn)看不到myeth2網(wǎng)卡了窘奏,在另外一個(gè)空間里了
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 state UP qlen 1000
link/ether 00:50:56:23:75:d6 brd ff:ff:ff:ff:ff:ff
inet 172.18.21.100/16 brd 172.18.255.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe23:75d6/64 scope link
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:33:fb:70 brd ff:ff:ff:ff:ff:ff
inet 192.168.25.30/24 brd 192.168.25.255 scope global dynamic ens37
valid_lft 37776sec preferred_lft 37776sec
inet6 fe80::250:56ff:fe33:fb70/64 scope link
valid_lft forever preferred_lft forever
19: myeth1@if18: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether c6:ea:cf:41:60:f6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
[root@node3 images]#ip netns exec router0 ip a #只有在此名稱空間內(nèi)才能看到myeth2網(wǎng)卡
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
18: myeth2@if19: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 6e:bb:a2:10:76:6a brd ff:ff:ff:ff:ff:ff link-netnsid 0
[root@node3 images]#ip netns exec router0 ip link set dev myeth2 name eth0 #可以修改網(wǎng)卡的名字
[root@node3 images]#ip netns exec router0 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
18: eth0@if19: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 6e:bb:a2:10:76:6a brd ff:ff:ff:ff:ff:ff link-netnsid 0
[root@node3 images]#ip netns exec router0 ifconfig eth0 10.0.0.200/24 #配置一個(gè)ip地址
[root@node3 images]#ip netns exec router0 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
18: eth0@if19: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN qlen 1000
link/ether 6e:bb:a2:10:76:6a brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
[root@node3 images]#ifconfig myeth1 10.0.0.100/24 #給myeth1也配置一個(gè)ip地址
[root@node3 images]#ping 10.0.0.200 #發(fā)現(xiàn)兩者可以互相通訊了
PING 10.0.0.200 (10.0.0.200) 56(84) bytes of data.
64 bytes from 10.0.0.200: icmp_seq=1 ttl=64 time=0.218 ms
64 bytes from 10.0.0.200: icmp_seq=2 ttl=64 time=0.098 ms
64 bytes from 10.0.0.200: icmp_seq=3 ttl=64 time=0.035 ms
^C
--- 10.0.0.200 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.035/0.117/0.218/0.075 ms
總結(jié):在linux系統(tǒng)上構(gòu)建一個(gè)虛擬的網(wǎng)絡(luò)名稱空間后可以當(dāng)做一個(gè)虛擬機(jī)來用佃扼,并且這個(gè)虛擬機(jī)和宿主機(jī)還可以相互通訊,這個(gè)功能屬于容器型虛擬化蔼夜。
9兼耀、使用virsh命令管理虛擬機(jī)
虛擬機(jī)的生成需要依賴于預(yù)定義的xml格式的配置文件,其生成工具有兩個(gè):virt-manager, virt-install求冷。前面已經(jīng)展示了如何使用virt-manager圖形工具創(chuàng)建虛擬機(jī)瘤运。
示例:1
[root@centos7 ~]#yum install libvirt-daemon-kvm virt-install qemu-kvm
[root@centos7 app]#systemctl start libvirtd
[root@centos7 app]#systemctl status libvirtd
vim /etc/libvirt/qemu.conf
user = "root"
group = "root"
dynamic_ownership = 0
systemctl restart libvirtd
[root@centos7 app]#virt-install -h
[root@centos7 app]#virt-install -n c1 --vcpus 2 --memory 64 -w bridge=br0 --import --disk /app/c1.img,format=qcow2 --dry-run #創(chuàng)建虛擬機(jī),先干跑一下
[root@centos7 app]#virt-install -n c1 --vcpus 2 --memory 64 -w bridge=br0 --import --disk /app/c1.img,format=qcow2 #正式安裝匠题、創(chuàng)建虛擬機(jī)拯坟,發(fā)現(xiàn)是前臺(tái)運(yùn)行的
[root@centos7 ~]#ps aux #在打開的一個(gè)窗口,查看進(jìn)程是否已經(jīng)運(yùn)行
[root@centos7 ~]#virsh list
Id Name State
----------------------------------------------------
1 c1 running
[root@centos7 ~]#virsh #發(fā)現(xiàn)virsh是一個(gè)交互式的命令
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # help #查看幫助
virsh # help console #查看各子命令的幫助韭山,注意幫助里面所說的domain指的就是一個(gè)虛擬機(jī)
virsh # console c1 #連接至虛擬機(jī)c1的控制臺(tái)郁季,要按一下enter鍵才能進(jìn)入登錄
cirros login: cirros #登錄
Password:
$ sudo su root
$ ip a #可以查看ip
用ctrl+右中括號(hào)可以切換回宿主機(jī)
virsh # destroy c1 #強(qiáng)行關(guān)機(jī),拔電源的方式
virsh # list --all #查看所有的連接和關(guān)閉狀態(tài)的虛擬機(jī)
Id Name State
----------------------------------------------------
- c1 shut off
virsh # start c1 #啟動(dòng)虛擬機(jī)
virsh # shutdown c1 #正常關(guān)機(jī)
[root@centos7 ~]#virsh dumpxml c1 > /app/c2.xml #可以把此虛擬機(jī)的
xml文件保存到一個(gè)文件中钱磅,就可以利用此xml格式的配置文件創(chuàng)建一個(gè)
虛擬機(jī)了梦裂,這樣就不用手寫xml文件了
[root@centos7 ~]#vim /app/c2.xml 更改配置文件
<domain type='kvm' id='3'> #id
<name>c2</name>#名字
<uuid>b5dbf131-790e-4ec4-bd4d-79e875264ca9</uuid> #uuid
<disk type='file' device='disk'>
<source file='/app/c2.img'/> #換一個(gè)磁盤鏡像文件
<mac address='52:54:00:10:b9:e7'/>#mac地址不同沖突
[root@centos7 ~]#virsh create /app/c2.xml --console #利用xml格式的配置文件創(chuàng)建虛擬機(jī),--console指創(chuàng)建后直接連接到控制臺(tái)盖淡,就可以登錄了
[root@centos7 ~]#ls /etc/libvirt/qemu #發(fā)現(xiàn)前面創(chuàng)建的c1虛擬機(jī)的xml格式的配置文件放在此目錄下年柠,因此剛才創(chuàng)建的c2虛擬機(jī)最好也把c2.xml文件也放到此目錄下
c1.xml networks
virsh # undefine c1 #刪除虛擬機(jī)
virsh # suspend c1 #將虛擬機(jī)暫停于內(nèi)存中
virsh # resume c1 #從內(nèi)存中恢復(fù)
virsh # save c1 /app/c1.bin #保存虛擬機(jī)的當(dāng)前狀態(tài)至文件中,相當(dāng)于vmware workstation中的掛起
virsh # list --all
Id Name State
----------------------------------------------------
3 c2 running
- c1 shut off
virsh # restore /app/c1.bin --running #從文件中恢復(fù)
Domain restored from /app/c1.bin
virsh # list
Id Name State
----------------------------------------------------
3 c2 running
4 c1 running
[root@centos7 app]#qemu-img create -f qcow2 -o preallocation=metadata,size=10G /app/c4.img #創(chuàng)建一個(gè)磁盤鏡像文件
[root@centos7 app]#qemu-img info /app/c4.img
image: /app/c4.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 2.2M
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
[root@centos7 app]#virsh help attach-disk
[root@centos7 app]#virsh attach-disk c1 /app/c4.img vda #給虛擬機(jī)插入一塊硬盤褪迟,支持熱插拔
Disk attached successfully
[root@centos7 app]#virsh domblklist c1
Target Source
------------------------------------------------
hda /app/c1.img #hda時(shí)IDE硬盤冗恨,在這里不支持熱插拔
vda /app/c4.img #注意vda格式的是半虛擬化的支持熱插拔
[root@centos7 app]#virsh detach-disk c1 /app/c4.img #拆除硬盤
Disk detached successfully
[root@centos7 app]#virsh domblklist c1
Target Source
------------------------------------------------
hda /app/c1.img
[root@centos7 app]#virsh domiflist c1
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 bridge br0 rtl8139 52:54:00:11:b9:e5
[root@centos7 app]#virsh attach-interface c1 bridge br0 #也支持網(wǎng)絡(luò)即接口的熱插拔, 注意 :無須事先創(chuàng)建網(wǎng)絡(luò)接口設(shè)備味赃,會(huì)自動(dòng)創(chuàng)建
Interface attached successfully
[root@centos7 app]#virsh domiflist c1
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 bridge br0 rtl8139 52:54:00:11:b9:e5
vnet2 bridge br0 rtl8139 52:54:00:e1:8c:dc
[root@centos7 app]#virsh detach-interface c1 bridge --mac 52:54:00:e1:8c:dc #熱拆除網(wǎng)絡(luò)接口
Interface detached successfully
圖形管理工具:
kimchi:基于H5研發(fā)web GUI; virt-king掀抹;
OpenStack: IaaS
oVirt: