KVM簡介
KVM(名稱來自英語:Kernel-basedVirtual Machine的縮寫,即基於核心的虛擬機器),是一種用於Linux核心中的虛擬化基礎設施,可以將Linux核心轉化為一個hypervisor。KVM在2007年2月被匯入Linux 2.6.20核心中,以可載入核心模組的方式被移植到FreeBSD及illumos上。
KVM在具備Intel VT或AMD-V功能的x86平臺上執行。它也被移植到S/390,PowerPC與IA-64平臺上。在Linux核心3.9版中,加入ARM架構的支援。
/*
1).KVM是開源軟體,全稱是kernel-based virtual machine(基於核心的虛擬機器)。
2).是x86架構且硬體支援虛擬化技術(如 intel VT 或 AMD-V)的Linux全虛擬化解決方案。
3).它包含一個為處理器提供底層虛擬化 可載入的核心模組kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
4).KVM還需要一個經過修改的QEMU軟體(qemu-kvm),作為虛擬機器上層控制和介面。
5).KVM能在不改變linux或windows映象的情況下同時執行多個虛擬機器,(它的意思是多個虛擬機器使用同一映象)併為每一個虛擬機器配置個性化硬體環境(網路卡、磁碟、圖形介面卡……)。
6).在主流的Linux核心,如2.6.20以上的核心均已包含了KVM核心。
*/
特點
1).要求cpu 必須支援虛擬化。
2).效能:作為伺服器很好,可是圖形能力十分的差。即使放電影,影像也是像刷油漆一樣,一層一層的。
3).cpu使用率控制很好。
4).控制上比較簡潔,功能比較豐富:比如使用“無敵功能”所有更改指向記憶體,你的映象永遠保持乾淨。“母映象”功能讓你擁有n個獨立快照點。還有很多引數。另外,kvm作為核心級的虛擬機器,剛開始發展關注的公司比較多——但是還沒有達到商業應用的水平。
KVM記憶體管理
KVM繼承了Linux系統管理記憶體的諸多特性,比如,分配給虛擬使用的記憶體可以被交換至交換空間、能夠使用大記憶體頁以實現更好的效能,以及對NUMA的支援能夠讓虛擬機器高效訪問更大的記憶體空間等。
KVM基於Intel的EPT(ExtendedPage Table)或AMD的RVI(Rapid Virtualization Indexing)技術可以支援更新的記憶體虛擬功能,這可以降低CPU的佔用率,並提供較好的吞吐量。
此外,KVM還藉助於KSM(Kernel Same-pageMerging)這個核心特性實現了記憶體頁面共享。KSM通過掃描每個虛擬機器的記憶體查詢各虛擬機器間相同的記憶體頁,並將這些記憶體頁合併為一個被各相關虛擬機器共享的單獨頁面。在某虛擬機器試圖修改此頁面中的資料時,KSM會重新為其提供一個新的頁面副本。實踐中,執行於同一臺物理主機上的具有相同GuestOS的虛擬機器之間出現相同記憶體頁面的概率是很高的,比如共享庫、核心或其它記憶體物件等都有可能表現為相同的記憶體頁,因此,KSM技術可以降低記憶體佔用進而提高整體效能。
部署KVM
檢測是否支援KVM
KVM 是基於 x86 虛擬化擴充套件(Intel VT 或者 AMD-V) 技術的虛擬機器軟體,所以檢視 CPU 是否支援 VT 技術,就可以判斷是否支援KVM。有返回結果,如果結果中有vmx(Intel)或svm(AMD)字樣,就說明CPU的支援的。
[root@kvm-47 ~]# cat /proc/cpuinfo | egrep 'vmx|svm' |wc -l
4
安裝KVM基礎環境
kvm相關安裝包及其作用:
/*
qemukvm 主要的KVM程式包
pythonvirtinst 建立虛擬機器所需要的命令列工具和程式庫
virtmanager GUI虛擬機器管理工具
virttop 虛擬機器統計命令
virtviewer GUI連線程式,連線到已配置好的虛擬機器
libvirt C語言工具包,提供libvirt服務
libvirtclient 為虛擬客戶機提供的C語言工具包
virtinstall 基於libvirt服務的虛擬機器建立命令
bridgeutils 建立和管理橋接裝置的工具
*/
安裝 kvm
yum -y install qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install
# 重啟宿主機,以便載入 kvm 模組
reboot
# 檢視KVM模組是否被正確載入
[root@kvm-47 ~]# lsmod | grep kvm
kvm_intel 170181 4
kvm 554609 1 kvm_intel
irqbypass 13503 3 kvm
啟動kvm服務
啟動設定其開機自動啟動
systemctl start libvirtd && systemctl enable libvirtd
檢視狀態操作結果,如
Active: active (running),說明執行情況良好
[root@kvm-47 ~]# systemctl status libvirtd
● libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-11-04 10:41:23 CST; 2h 50min ago
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 947 (libvirtd)
Tasks: 20 (limit: 32768)
CGroup: /system.slice/libvirtd.service
├─ 947 /usr/sbin/libvirtd
├─1082 /usr/sbin/dnsmasq --conf-file=/var/lib/libv...
└─1083 /usr/sbin/dnsmasq --conf-file=/var/lib/libv...
Nov 04 12:36:40 kvm-47 libvirtd[947]: 2020-11-04 04:36:40.956...
Nov 04 12:40:29 kvm-47 libvirtd[947]: 2020-11-04 04:40:29.654...
Nov 04 12:48:44 kvm-47 dnsmasq-dhcp[1082]: DHCPREQUEST(virbr0...
Nov 04 12:48:44 kvm-47 dnsmasq-dhcp[1082]: DHCPACK(virbr0) 19...
Nov 04 12:52:46 kvm-47 dnsmasq-dhcp[1082]: DHCPREQUEST(virbr0...
Nov 04 12:52:46 kvm-47 dnsmasq-dhcp[1082]: DHCPACK(virbr0) 19...
Nov 04 12:59:56 kvm-47 dnsmasq-dhcp[1082]: DHCPREQUEST(virbr0...
Nov 04 12:59:56 kvm-47 dnsmasq-dhcp[1082]: DHCPACK(virbr0) 19...
Nov 04 13:24:39 kvm-47 dnsmasq-dhcp[1082]: DHCPREQUEST(virbr0...
Nov 04 13:24:39 kvm-47 dnsmasq-dhcp[1082]: DHCPACK(virbr0) 19...
Hint: Some lines were ellipsized, use -l to show in full.
[root@kvm-47 ~]# systemctl is-enabled libvirtd
enabled
安裝虛擬機器
安裝前要設定環境語言為英文
LANG="en_US.UTF-8"
,如果是中文的話某些版本可能會報錯。CentOS 7
在這裡修改/etc/locale.conf
。kvm建立虛擬機器,特別注意
.iso
映象檔案一定放到/home
,/tmp
或者根目錄重新建立目錄,不然會因為許可權報錯,無法建立虛擬機器。
下載映象
wget http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-2003.iso
mv CentOS-7-x86_64-Minimal-2003.iso /tmp/
安裝虛擬機器
mkdir /var/kvm/images/ -p
virt-install \
--name test1 \
--ram 2096 \
--disk path=/var/kvm/images/test.img,size=8 \
--vcpus 1 \
--os-type linux \
--os-variant rhel7 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location /tmp/CentOS-7-x86_64-Minimal-2003.iso \
--extra-args 'console=ttyS0,115200n8 serial'
virt-install \
--name test2 \
--ram 2096 \
--disk path=/var/kvm/images/test2.img,size=8 \
--vcpus 1 \
--os-type linux \
--os-variant rhel7 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location /tmp/CentOS-7-x86_64-Minimal-2003.iso \
--extra-args 'console=ttyS0,115200n8 serial'
引數介紹
命令列配置系統
上面建立虛擬機器命令最終需要你配置系統基礎設定,帶
[!]
基本都是要配置的,按照順序往下配置,按對用的數字以此進行設定。
命令列操作介面
Installation
1) [x] Language settings 2) [!] Time settings
(English (United States)) (Timezone is not set.)
3) [!] Installation source 4) [!] Software selection
(Processing...) (Processing...)
5) [!] Installation Destination 6) [x] Kdump
(No disks selected) (Kdump is enabled)
7) [ ] Network configuration 8) [!] Root password
(Not connected) (Password is not set.)
9) [!] User creation
(No user will be created)
Please make your choice from above ['q' to quit | 'b' to begin installation |
'r' to refresh]:
1.Time settings設定時區
Installation Destination 安裝磁碟
按b進入安裝, 等待幾分鐘安裝完成即可
連線虛擬機器
通過 virsh console <虛擬機器名稱>
命令來連線虛擬機器
# 檢視虛擬機器
virsh list # 檢視在執行的虛擬機器
virsh list --all # 檢視所有虛擬機器
Id Name State
----------------------------------------------------
7 centos72 running
連線虛擬機器
virsh console centos72
退出虛擬機器
`exit 退出系統到登入介面`
`快捷鍵: ctrl+]`
`ctrl +5` `從虛擬機器登入頁面,退出到宿主機命令列頁面`
`control +]`
配置網路
配置虛擬機器網路
[root@kvm-47 ~]# virsh console test2
Connected to domain test2
Escape character is ^]
CentOS Linux 7 (Core)
Kernel 3.10.0-1127.el7.x86_64 on an x86_64
localhost login: root
Password:
Last login: Wed Nov 4 14:20:45 on ttyS0
[root@localhost ~]# dhclient eth0
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:40:16:b0 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.59/24 brd 192.168.122.255 scope global dynamic eth0
valid_lft 3522sec preferred_lft 3522sec
[root@localhost ~]# yum install -y net-tools
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=55bac306-da97-49f8-9838-450002d702dc
DEVICE=eth0
// 此處修改為yes
ONBOOT=yes
[root@localhost ~]# systemctl restart network
DNS配置,也可以放到
ifcfg-eth0
中,DNS不是隨便設定的,你可以通過host、dig、nslookup命令查詢DNS,如果這些工具不存在可以通過yum install bind-utils -y
來安裝一下。
# 如果沒有在網路配置新增DNS可以這種方式新增DNS
echo "nameserver 192.168.188.1" > /etc/resolv.conf
虛擬機器其它管理
virsh start centos72 # 虛擬機器開啟(啟動):
virsh reboot centos72 # 虛擬機器重新啟動
virsh shutdown centos72 # 虛擬機器關機
virsh destroy centos72 # 強制關機(強制斷電)
virsh suspend centos72 # 暫停(掛起)KVM 虛擬機器
virsh resume centos72 # 恢復被掛起的 KVM 虛擬機器
virsh undefine centos72 # 該方法只刪除配置檔案,磁碟檔案未刪除
virsh autostart centos72 # 隨物理機啟動而啟動(開機啟動)
virsh autostart --disable centos72 # 取消標記為自動開始(取消開機啟動)
配置物理機網路
目前我只有一個固定IP,通過配置eno2
,網橋當做路由器,虛擬機器共享物理機進出網路。物理機網路配置,網路進出走eno2
編輯vi /etc/sysconfig/network-scripts/ifcfg-eno2
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno2
UUID=f66c303e-994a-43cf-bd91-bb897dc2088d
DEVICE=eno2
ONBOOT=yes
IPADDR=<這裡固定IP配置的地方> # 設定IP地址
PREFIX=24 # 設定子網掩碼
GATEWAY=<這裡設定閘道器> # 設定閘道器
DNS1=<這裡設定DNS> # DNS
ifcfg-br0
橋接網路卡配置在同一個目錄中。
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.120.1
PREFIX=24
ifcfg-eno1
物理網路卡指定橋接網路卡BRIDGE="br0"
TYPE=Ethernet
BOOTPROTO=none
NAME=eno1
DEVICE=eno1
ONBOOT=yes
BRIDGE="br0"
配置路由轉發vi /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
# 修改為
# Controls IP packet forwarding
net.ipv4.ip_forward = 1 # 允許內建路由
# 再執行 `sysctl -p` 使其生效
埠轉發
現在我們還以上述VM為例,目前該KVM的公網IP為
211.11.61.7
,VM的IP為192.168.188.115
,現在我要求通過訪問KVM的2222埠訪問VM的22埠。編輯
vi /etc/rc.d/rc.local
新增下面命令,達到開機重啟配置網路轉發規則。
# 啟動網路轉發規則
iptables -t nat -A : -s 192.168.188.0/24 -j SNAT --to-source 211.11.61.7
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 211.11.61.7
iptables -t nat -A PREROUTING -d 211.11.61.7 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22
iptables -t nat -A PREROUTING -d 211.11.61.7 -p tcp --dport 2221 -j DNAT --to-dest 192.168.188.115:21
# 實際效果可以通過外網連線虛擬機器
ssh -p 2222 root@211.11.61.7
通過iptables命令來設定轉發規則,源SNAT規則,源網路地址轉換,SNAT就是重寫包的源IP地址。
# 資料包進行 源NAT(SNAT),系統先路由——>再過濾(FORWARD)——>最後才進行POSTROUTING SNAT地址翻譯
# -t<表>:指定要操縱的表;
# -A:向規則鏈中新增條目;
# -s:指定要匹配的資料包源ip地址;
# -j<目標>:指定要跳轉的目標;
# -j SNAT:源網路地址轉換,SNAT就是重寫包的源IP地址
# --to-source ipaddr[-ipaddr][:port-port]
# 它可以指定單個新的源IP地址,IP地址的包含範圍,以及可選的埠範圍(僅當規則還指定-p tcp或-p udp時才有效)。
# 如果沒有指定埠範圍,則低於512的源埠將對映到512以下的其他埠:512和1023之間的埠將對映到低於1024的埠,
# 其他埠將被對映到1024或更高。 在可能的情況下,不會發生港口更改。
# 在核心高達2.6.10,您可以新增幾個 - 源選項。
# 對於這些核心,如果通過地址範圍或多個源選項指定多個源地址,則會在這些地址之間進行簡單的迴圈(迴圈中迴圈)。
# 後來的核心(> = 2.6.11-rc1)不再具有NAT到多個範圍的能力。
iptables -t nat -A POSTROUTING -s 192.168.120.0/24 -j SNAT --to-source <固定IP>
# cat /etc/sysconfig/iptables
公網訪問虛擬機器
通過公網ip 192.168.188.222
埠2280
,轉發到虛擬機器192.168.111.133:80
上面
iptables -t nat -A PREROUTING -d 192.168.188.222 -p tcp --dport 2280 -j DNAT --to-dest 192.168.111.133:80
重啟並儲存 iptables
配置。
# 儲存
service iptables save
# 重啟
service iptables restart
配置宿主機網路
- KVM 虛擬機器是基於 NAT 的網路配置;
- 只有同一宿主機的虛擬鍵之間可以互相訪問,跨宿主機是不能訪問;
- 虛擬機器需要和宿主機配置成橋接模式,以便虛擬機器可以在區域網內可見;
Bridge模式配置
Bridge方式即虛擬網橋的網路連線方式,是客戶機和子網裡面的機器能夠互相通訊。可以使虛擬機器成為網路中具有獨立IP的主機。橋接網路(也叫 物理裝置共享)被用作把一個物理裝置複製到一臺虛擬機器。網橋多用作高階設定,特別是主機多個網路介面的情況。
┌─────────────────────────┐ ┌─────────────────┐
│ HOST │ │Virtual Machine 1│
│ ┌──────┐ ┌───────┐ │ │ ┌──────┐ │
│ │ br0 │──┬───│ vnet0 │─│─ ─ ─ │ │ br0 │ │
│ └──────┘ │ └───────┘ │ │ └──────┘ │
│ │ │ │ └─────────────────┘
│ │ │ ┌───────┐ │ ┌─────────────────┐
│ ┌──────┐ └───│ vnet1 │─│─ │Virtual Machine 2│
│ │ eno0 │ └───────┘ │ │ │ ┌──────┐ │
│ └──────┘ │ ─ ─ │ │ br0 │ │
│ ┌──────┐ │ │ └──────┘ │
│ │ eno1 │ │ └─────────────────┘
│ └──────┘ │
└─────────────────────────┘
通過ip命令檢視宿主機配置檔案的名字
ip addr
6: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 38:63:bb:44:cf:6c brd ff:ff:ff:ff:ff:ff
inet 192.168.188.132/24 brd 192.168.188.255 scope global dynamic eno1
valid_lft 2822sec preferred_lft 2822sec
inet6 fe80::3a63:bbff:fe44:cf6c/64 scope link
valid_lft forever preferred_lft forever
可以看到上面
eno1
是有獲取到ip地址的,相對應的檔案在/etc/sysconfig/network-scripts/
目錄中,ifcfg-eno1
宿主機的物理網路卡配置檔案
# cat ifcfg-eno1
TYPE=Ethernet
BOOTPROTO=static
NAME=eno1
DEVICE=eno1
UUID=242b3d4d-37a5-4f46-b072-55554c185ecf
ONBOOT=yes
BRIDGE="br0" # 指定橋接網路卡的名稱
ifcfg-br0
橋接網路卡配置在同一個目錄中。
# cat ifcfg-br0
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=br0
UUID=242b3d4d-37a5-4f46-b072-55554c185ecf
DEVICE=br0
ONBOOT=yes
TYPE=bridge # 將制定為橋接型別
IPADDR=192.168.188.133 # 設定IP地址
PREFIX=24 # 設定子網掩碼
GATEWAY=192.168.188.1 # 設定閘道器
配置好之後,通過systemctl 命令重啟網路卡。
ifup eno1 # 啟用網路卡
ifup br0 # 啟用橋接網路卡
# 兩種重啟網路的方法
systemctl restart network.service
service network restart
# 校驗橋接介面
brctl show
bridge name bridge id STP enabled interfaces
br0 8000.3863bb44cf6c no eno1
vnet0
virbr0 8000.525400193f0f yes virbr0-nic
NAT模式
NAT(Network Address Translation網路地址翻譯),NAT方式是kvm安裝後的預設方式。它支援主機與虛擬機器的互訪,同時也支援虛擬機器訪問網際網路,但不支援外界訪問虛擬機器。
virsh net-edit default # 如果要建立或者修改NAT網路,要先編輯default.xml:
virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active no no
default是宿主機安裝虛擬機器支援模組的時候自動安裝的。
ip a l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
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: ens1f0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 2c:44:fd:8c:43:44 brd ff:ff:ff:ff:ff:ff
3: ens1f1: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 2c:44:fd:8c:43:45 brd ff:ff:ff:ff:ff:ff
4: ens1f2: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 2c:44:fd:8c:43:46 brd ff:ff:ff:ff:ff:ff
5: ens1f3: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 2c:44:fd:8c:43:47 brd ff:ff:ff:ff:ff:ff
6: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP qlen 1000
link/ether 38:63:bb:44:cf:6c brd ff:ff:ff:ff:ff:ff
7: eno2: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 38:63:bb:44:cf:6d brd ff:ff:ff:ff:ff:ff
8: eno3: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 38:63:bb:44:cf:6e brd ff:ff:ff:ff:ff:ff
9: eno4: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 38:63:bb:44:cf:6f brd ff:ff:ff:ff:ff:ff
10: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 52:54:00:19:3f:0f 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
11: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500
link/ether 52:54:00:19:3f:0f brd ff:ff:ff:ff:ff:ff
12: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 38:63:bb:44:cf:6c brd ff:ff:ff:ff:ff:ff
inet 192.168.188.132/24 brd 192.168.188.255 scope global dynamic br0
valid_lft 3397sec preferred_lft 3397sec
inet 192.168.188.133/24 brd 192.168.188.255 scope global secondary br0
valid_lft forever preferred_lft forever
inet6 fe80::3a63:bbff:fe44:cf6c/64 scope link
valid_lft forever preferred_lft forever
19: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 500
link/ether fe:54:00:72:12:a8 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe72:12a8/64 scope link
valid_lft forever preferred_lft forever
其中virbr0是由宿主機虛擬機器支援模組安裝時產生的虛擬網路介面,也是一個switch和bridge,負責把內容分發到各虛擬機器。幾個虛擬機器管理模組產生的介面關係如下圖:
┌───────────────────────┐
│ HOST │
│ ┌──────┐ │ ┌─────────────────┐
│ │ br0 │─┬──────┐ │ │Virtual Machine 1│
│ └──────┘ │ │ │ │ ┌──────┐ │
│ │ │ ┌───────┐ │ ─ │ │ br0 │ │
│ │ │ │ vnet0 │─│┘ │ └──────┘ │
│ ┌──────┐ │ └───────┘ │ └─────────────────┘
│ │virbr0│ │ ┌───────┐ │ ┌─────────────────┐
│ │ -nic │ └──│ vnet1 │─│┐ │Virtual Machine 2│
│ └──────┘ └───────┘ │ │ │
│ ┌──────┐ │└ ─│ ┌──────┐ │
│ │ eno0 │ │ │ │ br0 │ │
│ └──────┘ │ │ └──────┘ │
│ ┌──────┐ │ └─────────────────┘
│ │ eno1 │ │
│ └──────┘ │
└───────────────────────┘
從圖上可以看出,虛擬介面和物理介面之間沒有連線關係,所以虛擬機器只能在通過虛擬的網路訪問外部世界,無法從網路上定位和訪問虛擬主機。virbr0是一個橋接器,接收所有到網路192.168.122.*的內容。從下面命令可以驗證:
brctl show
# 輸出結果
# ---------------------
# bridge name bridge id STP enabled interfaces
# br0 8000.3863bb44cf6c no eno1
# vnet0
# virbr0 8000.525400193f0f yes virbr0-nic
ip route
# default via 192.168.188.1 dev br0
# 169.254.0.0/16 dev br0 scope link metric 1012
# 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
# 192.168.188.0/24 dev br0 proto kernel scope link src 192.168.188.132
同時,虛擬機器支援模組會修改iptables規則,通過命令可以檢視:
iptables -t nat -L -nv
iptables -t filter -L -nv
如果沒有default的話,或者需要擴充套件自己的虛擬網路,可以使用命令重新安裝NAT。
virsh net-define /usr/share/libvirt/networks/default.xml
此命令定義一個虛擬網路,default.xml的內容:
<network>
<name>default</name>
<bridge name="virbr0" />
<forward/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254" />
</dhcp>
</ip>
</network>
也可以修改xml,建立自己的虛擬網路。
重新載入和啟用配置:
virsh net-define /etc/libvirt/qemu/networks/default.xml
標記為自動啟動:
virsh net-autostart default
# Network default marked as autostarted
virsh net-start default
啟動網路
virsh net-start default
# Network default started
網路啟動後可以用命令brctl show 檢視和驗證。
修改vi /etc/sysctl.conf
中引數,允許ip轉發,CentOS7是在vi /usr/lib/sysctl.d/00-system.conf
這裡面修改
net.ipv4.ip_forward=1
通過 sysctl -p
檢視修改結果
自定義NAT網路
建立名為management
的NAT網路,vi /usr/share/libvirt/networks/management.xml
<network>
<name>management</name>
<bridge name="virbr1"/>
<forward/>
<ip address="192.168.123.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.123.2" end="192.168.123.254"/>
</dhcp>
</ip>
</network>
啟用新建的NAT網路
virsh net-define /usr/share/libvirt/networks/management.xml
virsh net-start management
virsh net-autostart management
驗證
brctl show
# bridge name bridge id STP enabled interfaces
# br0 8000.3863bb44cf6c no eno1
# vnet0
# virbr0 8000.525400193f0f yes virbr0-nic
# virbr1 8000.52540027f0ba yes virbr1-nic
virsh net-list --all
# Name State Autostart Persistent
# ----------------------------------------------------------
# default active no no
# management active yes yes
修改虛擬機器配置資訊
直接通過vim命令修改
vim /etc/libvirt/qemu/centos72.xml
通過virsh命令修改
virsh edit centos72
克隆虛擬機器
# 暫停原始虛擬機器
virsh shutdown centos72
virt-clone -o centos72 -n centos.112 -f /home/vms/centos.112.qcow2 -m 00:00:00:00:00:01
virt-clone -o centos88 -n centos.112 --file /home/vms/centos.112.qcow2 --nonsparse
virt-clone
引數介紹
--version
檢視版本。-h,--help
檢視幫助資訊。--connect=URI
連線到虛擬機器管理程式 libvirt 的URI。-o 原始虛擬機器名稱
原始虛擬機器名稱,必須為關閉或者暫停狀態。-n 新虛擬機器名稱
--name 新虛擬機器名稱。--auto-clone
從原來的虛擬機器配置自動生成克隆名稱和儲存路徑。-u NEW_UUID, --uuid=NEW_UUID
克隆虛擬機器的新的UUID,預設值是一個隨機生成的UUID。-m NEW_MAC, --mac=NEW_MAC
設定一個新的mac地址,預設為隨機生成 MAC。-f NEW_DISKFILE, --file=NEW_DISKFILE
為新客戶機使用新的磁碟映象檔案地址。--force-copy=TARGET
強制複製裝置。--nonsparse
不使用稀疏檔案複製磁碟映像。
通過映象建立虛擬機器
建立虛擬機器映象檔案
# 複製第一次安裝的乾淨系統映象,作為基礎映象檔案,
# 後面建立虛擬機器使用這個基礎映象
cp /home/vms/centos.88.qcow2 /home/vms/centos7.base.qcow2
# 使用基礎映象檔案,建立新的虛擬機器映象
cp /home/vms/centos7.base.qcow2 /home/vms/centos7.113.qcow2
建立虛擬機器配置檔案
# 複製第一次安裝的乾淨系統映象,作為基礎配置檔案。
virsh dumpxml centos.88 > /home/vms/centos7.base.xml
# 使用基礎虛擬機器映象配置檔案,建立新的虛擬機器配置檔案
cp /home/vms/centos7.base.xml /home/vms/centos7.113.xml
# 編輯新虛擬機器配置檔案
vi /home/vms/centos7.113.xml
主要是修改虛擬機器檔名,UUID,映象地址和網路卡地址,其中 UUID 在 Linux 下可以使用 uuidgen
命令生成
<domain type='kvm'>
<name>centos7.113</name>
<uuid>1e86167a-33a9-4ce8-929e-58013fbf9122</uuid>
<devices>
<disk type='file' device='disk'>
<source file='/home/vms/centos7.113.img'/>
</disk>
<interface type='bridge'>
<mac address='00:00:00:00:00:04'/>
</interface>
</devices>
</domain>
virsh define /home/vms/centos7.113.xml
# Domain centos.113 defined from /home/vms/centos7.113.xml
動態更改cpu數量和記憶體大小
動態調整,如果超過給虛擬機器分配的最大記憶體,需要重啟虛擬機器。
virsh list --all
# Id 名稱 狀態
# ----------------------------------------------------
# 2 working112 running
# 更改CPU
virsh setvcpus working112 --maximum 4 --config
# 更改記憶體
virsh setmaxmem working112 1048576 --config
# 檢視資訊
virsh dominfo working112
掛載磁碟
建立磁碟
mkdir /home/vms
檢視映象資訊
virt-filesystems --long --parts --blkdevs -h -a working112.qcow2
# Name Type Size Parent
# /dev/sda1 partition 200M /dev/sda
# /dev/sda2 partition 9.8G /dev/sda
# /dev/sda device 10G -
qemu-img info working112.qcow2
# image: working112.qcow2
# file format: qcow2
# virtual size: 140G (150323855360 bytes)
# disk size: 33G
# cluster_size: 65536
# Format specific information:
# compat: 1.1
# lazy refcounts: true
給虛擬機器映象新增
200G
大小,注意需要停止working112
虛擬機器
qemu-img resize working112.qcow2 +200G
# Image resized.
首先,我們製作如下所示的磁碟的備份副本。
cp working112.qcow2 working112-orig.qcow2
然後我們執行下面的命令來增加
/dev/sda
virt-resize --expand /dev/sda1 working112-orig.qcow2 working112.qcow2
檢視映象資訊
qemu-img info working112.qcow2
# image: working112.qcow2
# file format: qcow2
# virtual size: 140G (150323855360 bytes)
# disk size: 33G
# cluster_size: 65536
# Format specific information:
# compat: 1.1
# lazy refcounts: true
進入虛擬機器
virsh console working112 檢視資訊
vgdisplay # 顯示卷組大小
lvdisplay # 顯示邏輯卷大小
卷組大小已增加,下面需要分配容量給邏輯卷
lvextend -L +60G /dev/centos/root
還有最後一步,分配好了需要做系統調整
# ext 系統格式使用:
resize2fs /dev/centos/root
# xfs 系統格式使用下面命令
xfs_growfs /dev/centos/root
常用命令說明
virt-install
常用引數說明
–name指定虛擬機器名稱
–memory分配記憶體大小。
–vcpus分配CPU核心數,最大與實體機CPU核心數相同
–disk指定虛擬機器映象,size指定分配大小單位為G。
–network網路型別,此處用的是預設,一般用的應該是bridge橋接。
–accelerate加速
–cdrom指定安裝映象iso
–vnc啟用VNC遠端管理,一般安裝系統都要啟用。
–vncport指定VNC監控埠,預設埠為5900,埠不能重複。
–vnclisten指定VNC繫結IP,預設繫結127.0.0.1,這裡改為0.0.0.0。
–os-type=linux,windows
–os-variant=rhel6
--name 指定虛擬機器名稱
--ram 虛擬機器記憶體大小,以 MB 為單位
--vcpus 分配CPU核心數,最大與實體機CPU核心數相同
–-vnc 啟用VNC遠端管理,一般安裝系統都要啟用。
–-vncport 指定VNC監控埠,預設埠為5900,埠不能重複。
–-vnclisten 指定VNC繫結IP,預設繫結127.0.0.1,這裡改為0.0.0.0。
--network 虛擬機器網路配置
# 其中子選項,bridge=br0 指定橋接網路卡的名稱。
–os-type=linux,windows
–os-variant=rhel7.2
--disk 指定虛擬機器的磁碟儲存位置
# size,初始磁碟大小,以 GB 為單位。
--location 指定安裝介質路徑,如光碟映象的檔案路徑。
--graphics 圖形化顯示配置
# 全新安裝虛擬機器過程中可能會有很多互動操作,比如設定語言,初始化 root 密碼等等。
# graphics 選項的作用就是配置圖形化的互動方式,可以使用 vnc(一種遠端桌面軟體)進行連結。
# 我們這列使用命令列的方式安裝,所以這裡要設定為 none,但要通過 --extra-args 選項指定終端資訊,
# 這樣才能將安裝過程中的互動資訊輸出到當前控制檯。
--extra-args 根據不同的安裝方式設定不同的額外選項
virsh
virsh list --all # 檢視所有執行和沒有執行的虛擬機器
virsh list # 檢視在執行的虛擬機器
virsh dumpxml vm-name # 檢視kvm虛擬機器配置檔案
virsh start vm-name # 啟動kvm虛擬機器
virsh shutdown vm-name # 正常關機
virsh destroy vm-name # 非正常關機,強制關閉虛擬機器(相當於物理機直接拔掉電源)
virsh undefine vm-name # 刪除vm的配置檔案
ls /etc/libvirt/qemu
# 檢視刪除結果,Centos-6.6的配置檔案被刪除,但磁碟檔案不會被刪除
virsh define file-name.xml # 根據配置檔案定義虛擬機器
virsh suspend vm-name # 掛起,終止
virsh resumed vm-name # 恢復被掛起的虛擬機器
virsh autostart vm-name # 開機自啟動vm
virsh console <虛擬機器名稱> # 連線虛擬機器
錯誤解決
console test
Connected to domain test
Escape character is ^]
如果出現上面字串使用 CTRL+Shift+5 CTRL+Shift+]
-
ERROR Format cannot be specified for unmanaged storage.
virt-manager 沒有找到儲存池,建立儲存池即可 -
KVM VNC客戶端連線閃退
使用real vnc或者其它vnc客戶端連線kvm閃退,把客戶端設定中的ColourLevel值設定為rgb222或full即可 -
virsh shutdown
無法關閉虛擬機器
使用該命令關閉虛擬機器時,KVM是向虛擬機器傳送一個ACPI的指令,需要虛擬機器安裝acpid服務: -
operation failed: Active console session exists for this domain
# 方案1
$ ps aux | grep console
$ kill -9 <程式號>
# 方案2
$ /etc/init.d/libvirt-bin restart
# 方案3
$ ps aux | grep kvm
$ kill 對應的虛擬機器程式