KVM簡介,安裝及常見使用,維護詳解


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 +]`

常用操作說明

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 <虛擬機名稱>   # 連接虛擬機

autostart      #自動加載指定的一個虛擬機
connect        #重新連接到hypervisor
console        #連接到客戶會話
create         #從一個SML文件創建一個虛擬機
start          #開始一個非活躍的虛擬機
destroy        #刪除一個虛擬機
define         #從一個XML文件定義一個虛擬機
domid          #把一個虛擬機名或UUID轉換為ID
domuuid        #把一個郁悶或ID轉換為UUID
dominfo        #查看虛擬機信息
domstate       #查看虛擬機狀態
domblkstat     #獲取虛擬機設備快狀態
domifstat      #獲取虛擬機網絡接口狀態
dumpxml        #XML中的虛擬機信息
edit           #編輯某個虛擬機的XML文件
list           #列出虛擬機
migrate        #將虛擬機遷移到另一台主機
quit           #退出非交互式終端
reboot         #重新啟動一個虛擬機
resume         #重新恢復一個虛擬機
save           #把一個虛擬機的狀態保存到一個文件
dump           #把一個虛擬機的內核dump到一個文件中以方便分析
shutdown       #關閉一個虛擬機
setmem         #改變內存的分配
setmaxmem      #改變最大內存限制值
suspend        #掛起一個虛擬機
vcpuinfo       #虛擬機的cpu信息
version        #顯示virsh版本
實用常見命令
3)virt-clone,如果我們要建幾個一樣的虛擬機,這個命令,非常有用!
# virt-clone --connect=qemu:#/system -o centos1 -n centos3 -f /root/centos3.img #克隆centos1
正在克隆 centos1.img | 10.0 GB 00:07
  
Clone 'centos3' created successfully.
libguestfs-tools是虛擬機一個管理包,很有用的工具
[root@localhost ~]# yum -y install libguestfs-tools #安裝工具包
  
4)未登錄的情況下,查看鏡像目錄
[root@localhost ~]# virt-ls centos.img /home #查看centos.img鏡像文件中/home目錄
tank
  
5)未登錄的情況下,將鏡像文件中的文件copy出來
[root@localhost ~]# virsh list --all #查看所有的虛擬機名稱
Id 名稱 狀態
----------------------------------------------------
1 centos1 running
2 centos6.5 running
- arch 關閉
- arch1 關閉
- arch2 關閉
- arch3 關閉
- arch5 關閉
- centos3 關閉
- ubuntu 關閉
- ubuntu1 關閉
[root@localhost ~]# virt-copy-out -d centos1 /etc/passwd /tmp          #將centos1中的文件copy到tmp下面
  
6)查看虛擬機的分區情況
[root@localhost ~]# virt-filesystems -d centos1
/dev/sda1
/dev/VolGroup/lv_root
[root@localhost ~]# virt-list-partitions /root/centos.img
/dev/sda1
/dev/sda2
[root@localhost ~]# virt-df centos.img
Filesystem 1K-blocks Used Available Use%
centos.img:/dev/sda1 495844 34510 435734 7%
centos.img:/dev/VolGroup/lv_root 8780808 2842056 5492700 33%
  
7)mount虛擬機
[root@localhost ~]# guestmount -a /root/centos.img -m /dev/VolGroup/lv_root --rw /mnt/usb
[root@localhost ~]# cd /mnt/usb/
[root@localhost usb]# ls
bin dev home lib64 media mnt opt root selinux sys usr
boot etc lib lost+found misc net proc sbin srv tmp var
  
8)修改kvm中虛擬機的內存大小
[root@nfs ~]# virsh edit vm01 ##注意vi直接編輯不生效
vm01
df8604c1-dcf3-fa98-420f-6eea7b39c395
1048576 ###本來開始設置為1G,現在這個單位是k
1048576
  
修改為1.5G
[root@nfs ~]# expr 1536 \* 1024
1572864</p> <p>[root@nfs ~]# virsh list
Id Name State
----------------------------------
1 win2003 running
3 vm01 running
 
[root@nfs ~]# virsh shutdown vm01         ###修改配置文件后需要重新啟動下虛擬機,先關閉它
Domain vm01 is being shutdown
>[root@nfs ~]# virsh list                 ###確認已經被關閉
Id Name State
----------------------------------
1 win2003 running
 
[root@nfs ~]# virsh start vm01 ###啟動它
Domain vm01 started
 
[root@nfs ~]# virsh list
Id Name State
----------------------------------
1 win2003 running
3 vm01 running
  
// 到機器上查看內存大小:
[root@vm01 liuxiaojie]# free -m
total used free shared buffers cached
Mem: 1505 618 886 0 29 361
-/+ buffers/cache: 227 1277
Swap: 2000 0 2000
  
# 9)刪除一個虛擬機(vm01),可以刪除一個狀態為“shut off”的虛擬機
[root@nfs qemu]# virsh undefine vm01
[root@nfs qemu]# rm -f /home/data/vm01.img
  
# 10)刪除一個域
[root@nfs web01]# virsh list --all
Id Name State
----------------------------------
1 web01 running ##處於工作狀態
- myweb01 shut off
- myweb03 shut off
- mywin2003 shut off
- myxp shut off
- xp shut off
[root@nfs web01]# virsh undefine web01 ##處於工作狀態也能刪除!
Domain web01 has been undefined
[root@nfs web01]# virsh list
Id Name State
----------------------------------
1 web01 running
[root@nfs web01]# virsh destroy web01
Domain web01 destroyed
[root@nfs web01]# virsh list --all ##web01已經沒有了!
Id Name State
----------------------------------
- myweb01 shut off
- myweb03 shut off
- mywin2003 shut off
- myxp shut off
- xp shut off
[root@nfs web01]# virsh define web01
error: Failed to open file 'web01': No such file or directory
    
    
# 11) 查詢虛擬機vnc端口
virsh vncdisplay centos7
宿主機虛機之間copy文件
[root@kvm-host tmp]# virt-copy-out -d vm01-centos6.8 /etc/hosts /tmp   #把虛機hosts拷貝至宿主機/tmp目錄

[root@kvm-host tmp]# virt-copy-in -d vm02-centos6.8 /tmp/test.txt /tmp  #把宿主機test.txt拷貝到虛機/tmp目錄
修改虛擬機名稱
// (低版本不支持)重命名
// 開機狀態不能修改,要在shut off下修改
virsh domrename centos7 web-01
配置文件&備份恢復
// 磁盤文件   例: centos7.raw   -> 在虛擬機的安裝目錄
// 配置文件   例: centos7.xml  -> /etc/libvirt/qemu/centos7.xml

// 1. 當第一次安裝完成后,查看虛擬機的安裝目錄如下 .centos2.raw是磁盤文件

// 2. 虛擬機的默認配置文件, /etc/libvirt/qemu/

// 3. 備份配置文件, 
virsh dumpxml centos7 > centos7.xml (關機時備份)

// 4. 刪除虛擬機配置
virsh undefinne centos7
// 刪除虛擬機,配置文件會被刪除,但是磁盤文件不會刪除

// 5. 導入虛擬機,只能恢復配置文件丟失的情況,恢復備份的配置文件
virsh define centos7.xml

// 6. 磁盤文件丟失,恢復如下
// 模擬: 將磁盤文件改名為7.raw, 提示找不到/opt/centos2.raw
// 使用: virsh edit centos7(這個是虛擬機的名稱)  --> 查找centos2.raw改成centos7.raw
// 用virsh edit 去修改配置文件,有語法檢查, 如果使用centos7.xml沒有語法檢測,修改用edit,自帶語法檢查
kvm修改虛擬機密碼

1. 安裝libguestfs-tools

 yum install libguestfs-tools   

2. 生成新的密碼串

openssl passwd -1 -salt 'root' '123'
$1$hello$ZwmhCpcG.I1XIfVjdarKc1

# openssl是一個加密工具,-1 是指普通加密;
# root為key ,123456 才是密碼,下面就是是生成的密碼串,這樣我們只要將這些進行對應的替換酒可以了

3. linux系統的加密密碼通暢存儲在/etc/shadow文件中

root:$1$bTPRDWwf$LpjUZmGTHw.hYFccl0/lK.:16804:0:99999:7:::                                                                                    
bin:*:15937:0:99999:7:::
daemon:*:15937:0:99999:7:::
adm:*:15937:0:99999:7:::
lp:*:15937:0:99999:7:::
sync:*:15937:0:99999:7:::
shutdown:*:15937:0:99999:7:::

4. 修改root賬戶密碼

virt-edit -d centos7 /etc/shadow
root:$1$bTPRDWwf$LpjUZmGTHw.hYFccl0/lK.:16804:0:99999:7:::
# 更換為
root:$1$hello$ZwmhCpcG.I1XIfVjdarKc1:16541:0:99999:7:::
kvm命令行在啟動界面修改密碼(保險)

1.宿主機關掉虛機,然后啟動

[root@kvm-47 ~]# virsh shutdown test1
[root@kvm-47 ~]# virsh start test1

2.連接虛機

[root@kvm-47 ~]# virsh console test1

按下小寫 e

3.找到下面位置添加命令行

4.按下Ctrl+X,以單用戶模式啟動,輸入相關命令修改用戶密碼

switch_root:/# mount -o remount,rw /sysroot/
switch_root:/# chroot /sysroot/
sh-4.2# passwd root
Changing password for user root.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
sh-4.2# touch /.autorelabel
sh-4.2# exit
exit
switch_root:/# reboot

然后我們就會發現密碼修改生效了

KVM快照操作

如果你在使用基於 KVM 的虛擬機管理程序hypervisor,那么可以使用 virsh 命令獲取虛擬機或域快照。快照在一種情況下變得非常有用,當你已經在虛擬機上安裝或應用了最新的補丁,但是由於某些原因,虛擬機上的程序變得不穩定,開發團隊想要還原所有的更改和補丁。如果你在應用補丁之前設置了虛擬機的快照,那么可以使用快照將虛擬機恢復到之前的狀態。

注意: 我們只能對磁盤格式為Qcow2的虛擬機的進行快照,並且 kvm 的 virsh 命令不支持 raw 磁盤格式,請使用以下命令將原始磁盤格式轉換為 qcow2。

qemu-img convert -f raw -O qcow2 image-name.img image-name.qcow2
內置磁盤快照創建

我假設 KVM 管理程序已經在 CentOS 7 / RHEL 7 機器上配置好了,並且有虛擬機正在運行。我們可以使用下面的 virsh 命令列出虛擬機管理程序中的所有虛擬機,

[root@kvm-47 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 29    test1                          running
 34    test2                          running

假設我們想創建test1虛擬機的快照,運行下面命令

[root@kvm-47 ~]# qemu-img info /tmp/libguestfsfm0RPq/overlay1.qcow2
image: /tmp/libguestfsfm0RPq/overlay1.qcow2
file format: qcow2
virtual size: 4.0G (4294967296 bytes)
disk size: 196K
cluster_size: 65536
backing file: /var/tmp/.guestfs-0/appliance.d/root
backing file format: raw
Format specific information:
    compat: 1.1
    lazy refcounts: false
      
      
[root@kvm-47 ~]# virsh snapshot-create-as test1 test_sn1 test1_sn1-desc
Domain snapshot test_sn1 created      
內置磁盤快照查看
[root@kvm-47 ~]# virsh snapshot-list test1
 Name                 Creation Time             State
------------------------------------------------------------
 test_sn1             2020-11-05 15:40:02 +0800 running
內置磁盤快照回滾
[root@kvm-47 ~]# virsh snapshot-revert --domain test1 test_sn1
內置磁盤快照刪除
[root@kvm-47 ~]# virsh snapshot-delete --domain test1 --snapshotname test_sn1
Domain snapshot test_sn1 deleted
外置磁盤快照創建

首先啟動test1虛擬機

配置網絡

配置虛擬機網絡
[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不是隨便設置的,你可以通過hostdignslookup命令查詢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

配置宿主機網絡

  1. KVM 虛擬機是基於 NAT 的網絡配置;
  2. 只有同一宿主機的虛擬鍵之間可以互相訪問,跨宿主機是不能訪問;
  3. 虛擬機需要和宿主機配置成橋接模式,以便虛擬機可以在局域網內可見;

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

KVM虛擬機Console登錄

就是執行 virsh console 的時候,宿主機可以控制虛擬機

如果是10網段想遠程控制172網段的宿主機,是無法使用VNC的(10網段只能訪問10網段的,不可以訪問172網段)。那這個時候我們有修改宿主機的需求,就可以使用console登錄的方式。

通過連接跳板機,再通過跳板機,遠程控制宿主機。

Centos 7.x版本console登錄
// 查看宿主機,也有相同的IP地址,因為這塊網卡的存在,才能使用ssh遠程連接到虛擬機

下面操作僅限centos7

// centos7的kvm虛擬機下執行下面操作
cp /etc/grub2.cfg /tmp
grubby --update-kernel=ALL --args="console=ttyS0,115200n8"   ----->  使用命令直接插入

// diff比較


// reboot


// 宿主機使用virsh console  [虛擬機名字]

w

// ttys0是終端的名字,和配置時候的參數一致,后面內容為頻率(串口的頻率,交換機的內容)

錯誤解決

console test
Connected to domain test
Escape character is ^]

如果出現上面字符串使用 CTRL+Shift+5 CTRL+Shift+]

  1. ERROR Format cannot be specified for unmanaged storage.
    virt-manager 沒有找到存儲池,創建儲存池即可

  2. KVM VNC客戶端連接閃退
    使用real vnc或者其它vnc客戶端連接kvm閃退,把客戶端設置中的ColourLevel值設置為rgb222或full即可

  3. virsh shutdown 無法關閉虛擬機
    使用該命令關閉虛擬機時,KVM是向虛擬機發送一個ACPI的指令,需要虛擬機安裝acpid服務:

  4. 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 對應的虛擬機進程
創建的虛擬機無法上外網

症狀

/*
		1. 主機和虛擬機之間互相能ping通
		2. 主機能ping通外網
		3. 虛擬機不能Ping通外網
*/

``解決辦法`

1.設置IP轉發

vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p

# 一般這時候就能上外網了

2. 打開防火牆

systemctl start firewalld

// 防火牆關了,路由表就沒有了,不能進行IP轉發。
// 可以在防火牆開關前后分別查看路由表,看看結果如何:
iptables -t nat -vL  // 查看路由表

防火牆與路由表的關系

Linux 自帶的防火牆是什么呢?網上很多都是把linux防火牆解釋為iptables,這樣的解釋不能說是不對,但是不全,具體的說,Linux自帶的防火牆應該是一套系統自帶的iptables 策略,通過系統自帶的防火牆,我們可以在圖形界面下,配置iptables策略,默認的已經有了很多策略,而這些策略可能會在我們配置系統服務的時候產生干擾,所以通常情況下不建議關閉系統自帶的防火牆。上面我也說了,系統自帶的防火牆只是一些iptables策略,我們只是不想用系統子自帶的這些策略。我們可以通過手動的方式添加,我們需要的策略,這樣是比較好了,因為對於這些我們手動添加的策略,我們了解他。
在啟用和關閉系統自帶的防火牆時有些要注意的,假如你的系統中已經手動配置過iptables,那在你啟用系統自帶防火牆式一定要備份一下,這些策略,否則會丟失現有策略,后果很嚴重。
大家都知道,使用iptables -F 可以清除所有的策略,所以,如果你是在啟用系統自帶防火牆的狀態下,使用的這條命令,策略是會被清掉,你也可以加,運行也沒問題。這個時侯假如你突然想關閉系統自帶的防火牆,那要提醒一下,你先保存一下策略,否則你會后悔的。

kvm啟動虛機報錯
/*
		因為kvm宿主機上的虛機里面的文件權限被修改了,重啟系統導致無法讀取,缺少權限,一直卡在登錄界面.
		但是他的那個/etc/shadow,/etc/passwd的用戶哪一樣拿到其他系統也是可以啟動的,權限問題概率很大
		但如何確定是什么文件,看夏敏
		
		報錯信息:
		-- root: no shell: Permission denied
*/

1.首先確定這個權限拒絕說明很多文件權限都變了, 前面的shell,我們可以去看下虛擬機/bin,/sbin, /usr/sbin等目錄下文件是不是權限變了

2.確定/bin/bash權限

這個文件權限是下面這樣, 但是正常這個文件是755的,或者不確定這個文件權限是多少,可以和正常啟動的系統文件權限做對比

[root@kvm-47 ~]# virt-ls -l -d test1 /bin/bash
-rw-r-xr-x. 1 root root 960392 Aug  3  2016 /bin/bash

3.當確定這個權限被改了, 說不定其他文件也有很多改了,所以可以看一下/bin/*權限

[root@kvm-47 ~]# virt-ls -l -d test1 /bin/*

4.確定/usr/bin/bash權限

[root@kvm-47 ~]# virt-ls -l -d test1 /usr/bin/bash
-rwxr-xr-x. 1 root root 960392 Aug  3  2016 /usr/bin/bash

5. 可以初步確定我們遇到的登陸報錯是因為/bin/bash權限有問題

copy-in虛機需要關機

# 我們可以copy宿主機上正常權限的文件copy到虛機上
[root@kvm-47 ~]# virt-copy-in -d test1 /bin/bash /bin/

6. 重啟虛機

[root@kvm-47 ~]# virsh reboot test1
[root@kvm-47 ~]# virsh console test1
Connected to domain test1
Escape character is ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-1127.el7.x86_64 on an x86_64

jumpserver login: root
密碼:
Last login: Fri Nov  6 14:59:25 on ttyS0
[root@jumpserver ~]#

# 至此,我們系統雖然登錄進來了,沒有權限拒絕,但為了防止/bin/bash包不兼容系統,我們更新下

[root@jumpserver ~]# yum update bash

# 重啟
[root@jumpserver ~]# reboot


# 再次連接,能進去,說明這個問題解決成功
[root@kvm-47 ~]# virsh console test
error: failed to get domain 'test'
error: Domain not found: no domain with matching name 'test'

[root@kvm-47 ~]# virsh console test1
Connected to domain test1
Escape character is ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-1127.el7.x86_64 on an x86_64
[root@jumpserver ~]# 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM