KVM虛擬化介紹
阿新 • • 發佈:2018-06-29
pre images idg 分享 cow localhost inter lag viso cpu虛擬:
硬件:Intel: EPT, Extended Page Table,AMD: NPT, Nested Page Table 代替shadowMMU映射
- 宿主機:按時間切割
- 虛擬機:用軟件虛擬cpu,主要模擬環0(接口,運行在真正cpu上程序)
硬件技術:緩存通過tagged tlb區分虛擬機和宿主機
虛擬化:cpu模擬環0,保持環3 (模擬環0並不高效)
- 完全虛擬化: 宿主機運行於環-1 虛擬機運行於環0
- 半(準)虛擬化 (para-virt):cpu不用環-1 環0部分虛擬化(區分宿主機跟虛擬機) 環3全部能用
硬件虛擬化cpu 支持(AMD-V/inter-VT):通過環 -1 實現,宿主機的內核運行在環-1,虛擬機的內核運行在環0上
內存:
1.宿主機:通過MMU 技術映射內存 ,MMU是硬件技術
2.虛擬機: 內存映射需要 shadowMMU 技術來映射虛擬內存地址到真正內存地址,shadowMMU是軟件技術
硬盤:
1.宿主機:分區,文件系統模式。
2.虛擬機:用文件模擬磁盤,半虛擬化,提升效率,告訴自己的文件系統說當前不是真正意義的磁盤,通過二次轉發存到宿主機磁盤。
網絡:
1.宿主機:按時間分割。
2.虛擬機:略復雜,不光虛擬網絡接口,還要虛擬網絡。半虛擬化加速。(透傳最快,但是不適合遷移,所以一般都是用半虛擬化)
xen與kvm比較
kvm 硬件依賴
虛擬機需要cpu必須是x86_64架構,必須支持Intel VT或者AMD AMD-v
kvm兩類組件:
- (kvm.ko)/dev/kvm:工作為hypervisor,在用戶空間可通過系統調用ioctl()與內核中的kvm模塊交互,從而完成虛擬機的創建、啟動、停止、刪除等各種管理功能;
- qemu-kvm進程:工作於用戶空間,用於實現IO設備模擬;用於實現一個虛擬機實例;
virsh使用
用戶空間管理工具安裝
[root@node1 ~]# yum -y install libvirt libvirt-daemon-kvm qemu-kvm virt-manager
啟動libvirtd
[root@node1 ~]# systemctl start libvirtd [root@localhost ~]# ss -lntup|grep br udp UNCONN 0 0 * %virbr0:67 *:* users:(("dnsmasq",pid=1354,fd=3)) [root@localhost ~]# ip addr show virbr0 #默認是nat模式 4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000 link/ether 52:54:00:2b:4d:cf brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever
創建橋設備
[root@localhost ~]# virsh help iface-bridge
[root@node1 ~]# virsh iface-bridge ens34 virbr1
#如果創建失敗,手動編輯
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-virbr1
DEVICE="virbr1"
ONBOOT="no"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="192.168.1.199"
NETMASK="255.255.255.0"
GATEWAY="192.168.1.1"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0"
[root@localhost ~]# ip a virbr1
Command "virbr1" is unknown, try "ip address help".
[root@localhost ~]# ip addr show virbr1
6: virbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 82:8b:a5:4e:fa:87 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.199/24 brd 192.168.1.255 scope global virbr1
valid_lft forever preferred_lft forever
圖形化創建:
獲取幫助
[root@localhost images]# virsh help
所有主機狀態查看
[root@localhost images]# virsh list --all
Id 名稱 狀態
----------------------------------------------------
- c1 關閉
啟動並連接
[root@localhost images]# virsh start c1 --console #可以用機器名 也可以是id,都是唯一
脫離
control+]
再次連接
[root@localhost images]# virsh list
Id 名稱 狀態
----------------------------------------------------
7 c1 running
[root@localhost images]# virsh console c1
連接到域 c1
換碼符為 ^]
正常關機
[root@localhost images]# virsh shutdown #id
強行關機
[root@localhost images]# virsh destroy #id
配置文件(基於配置文件做復制)
[root@localhost images]# virsh dumpxml 7 配置文件
[root@localhost images]# cd /etc/libvirt/qemu/
[root@localhost qemu]# ls
c1.xml networks
[root@localhost qemu]# cp c1.xml /root/c2.xml
[root@localhost qemu]# vim /root/c2.xml
<name>c2</name>
<uuid>0cfe85a0-e6b9-41f1-b718-86fb8c620b8c</uuid>
<mac address=‘52:54:00:7a:33:65‘/>
<source file=‘/root/cirros2.img‘/>
[root@localhost qemu]# virsh define /root/c2.xml
[root@localhost qemu]# virsh list --all
Id 名稱 狀態
----------------------------------------------------
7 c1 running
- c2 關閉
[root@localhost qemu]# virsh start c2
[root@localhost qemu]# virsh list --all
Id 名稱 狀態
----------------------------------------------------
7 c1 running
8 c2 running
磁盤添加
[root@localhost qemu]# qemu-img create -f qcow2 -o preallocation=metadata,size=5G /vms/cirros/newdisk.qcow2
Formatting ‘/vms/cirros/newdisk.qcow2‘, fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 preallocation=‘metadata‘ lazy_refcounts=off
[root@localhost qemu]# virsh attach-disk c2 /vms/cirros/newdisk.qcow2 vdb
成功附加磁盤
查看
[root@localhost ~]# virsh domblklist c2
目標 源
------------------------------------------------
vda /root/cirros2.img
vdb /vms/cirros/newdisk.qcow2
拆除磁盤
[root@localhost ~]# virsh detach-disk c2 vdb
成功分離磁盤
[root@localhost ~]# virsh domblklist c2
目標 源
------------------------------------------------
vda /root/cirros2.img
qemu-kvm使用
[root@node1 ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/
創建磁盤獲取幫助
[root@localhost ~]# qemu-img info /vms/images/cirros.img
image: /vms/images/cirros.img
file format: qcow2
virtual size: 39M (41126400 bytes)
disk size: 13M
cluster_size: 65536
Format specific information:
compat: 0.10
創建磁盤
[root@localhost ~]# qemu-img create -f qcow2 -o preallocation=metadata /vms/centos/centos7.img
[root@localhost ~]# qemu-img create -f qcow2 -o preallocation=metadata,size=5G /vms/centos/centos7.img
Formatting ‘/vms/centos/centos7.img‘, fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 preallocation=‘metadata‘ lazy_refcounts=off
查看大小
[root@localhost centos]# ll -h /vms/centos/centos7.img
-rw-r--r--. 1 root root 5.1G 6月 28 03:00 /vms/centos/centos7.img
[root@localhost centos]# du -h centos7.img
1.3M centos7.img #實際大小
查看虛擬磁盤信息
[root@localhost centos]# qemu-img info centos7.img
image: centos7.img
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 1.3M
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
圖形化啟動
[root@localhost vms]# qemu-kvm -name centos -m 512 -cpu host -smp 1,cores=2 -drive file=/vms/centos/centos7.img,if=virtio,media=disk,cache=writeback,format=qcow2 -drive file=/vms/iso/centos-75.iso,media=cdrom -boot order=dc,once=d -vnc :0
[root@localhost vms]# yum -y install tigervnc
虛擬網絡創建:(每一個虛擬都要創建2個網絡接口,一個在宿主機上一個連接虛擬機)
[root@localhost vms]# brctl addbr br-int
[root@localhost vms]# ip link set br-int up
[root@localhost vms]# ip a
12: br-int: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN qlen 1000
link/ether 3e:3a:9f:29:61:6f brd ff:ff:ff:ff:ff:ff
inet6 fe80::3c3a:9fff:fe29:616f/64 scope link
valid_lft forever preferred_lft forever
需要一個腳本
[root@localhost vms]# 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 1
fi
[root@localhost vms]# chmod a+x /etc/qemu-ifup
設置網絡為橋接 啟動2個實例
[root@localhost images]# qemu-kvm -name c1 -m 256 -smp 2 -drive file=/vms/images/cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:01:00:00 -net tap,script=/etc/qemu-ifup -vnc :0 -daemonize
[root@localhost images]# qemu-kvm -name c2 -m 256 -smp 2 -drive file=/vms/images/cirros2.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:01:00:01 -net tap,script=/etc/qemu-ifup -vnc :1 -daemonize
宿主機上留2個ip(另外兩個在虛擬機中)
[root@localhost images]# brctl show
bridge name bridge id STP enabled interfaces
br-int 8000.1eeb8ad38953 no tap0
tap1
virbr0 8000.5254002b4dcf yes virbr0-nic
virbr1 8000.000000000000 yes
[root@localhost images]# ifconfig
tap0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::6c2d:5fff:fe37:7495 prefixlen 64 scopeid 0x20<link>
ether 6e:2d:5f:37:74:95 txqueuelen 1000 (Ethernet)
RX packets 8 bytes 1132 (1.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 15 bytes 1448 (1.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
tap1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::1ceb:8aff:fed3:8953 prefixlen 64 scopeid 0x20<link>
ether 1e:eb:8a:d3:89:53 txqueuelen 1000 (Ethernet)
RX packets 7 bytes 800 (800.0 B)
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
虛擬機:
宿主機設置網絡:
[root@localhost images]# ifconfig br-int 10.1.1.254/24 up
相當於這三個網絡在同一物理環境中
dhcp
[root@localhost images]# yum install dnsmasq
#創建ip隊
[root@localhost images]# ip link add vethy.1 type veth peer name vethy.2
[root@localhost images]# ifconfig vethy.1 up
一半添加到交換機中
[root@localhost images]# brctl addif br-int vethy.1
[root@localhost images]# brctl show
bridge name bridge id STP enabled interfaces
br-int 8000.1eeb8ad38953 no tap0
tap1
vethy.1
另外一半添加到一個名稱空間中,並且啟動dhcp
[root@localhost images]# ip netns add dhcpsrv
[root@localhost images]# ip link set dev vethy.2 netns dhcpsrv
[root@localhost images]# ip netns exec dhcpsrv ifconfig vethy.2 10.1.1.253/24 up
[root@localhost images]# ip netns exec dhcpsrv ifconfig vethy.2
vethy.2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.1.253 netmask 255.255.255.0 broadcast 10.1.1.255
inet6 fe80::8ee:dcff:fe38:9eaf prefixlen 64 scopeid 0x20<link>
ether 0a:ee:dc:38:9e:af txqueuelen 1000 (Ethernet)
RX packets 8 bytes 648 (648.0 B)
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
[root@localhost images]# ip netns exec dhcpsrv dnsmasq -F 10.1.1.11,10.1.1.100 -O 3,10.1.1.254
重啟虛擬機
KVM虛擬化介紹