KVM
KVM(Kernel-based Virtual Machine)是眾多虛擬化技術之一,它是Linux內核中的一個模塊,該模塊依賴於CPU,如果CPU支持虛擬化,那么該模塊才可以被加載。KVM技術是硬件層面的虛擬化,它會為我們虛擬各種硬件設備,這樣我們可以在已有操作系統上運行別的操作系統。
檢查CPU是否支持虛擬化
sudo apt install cpu-checker -y
sudo kvm-ok
先安裝cpu-checker工具,然后使用其帶的kvm-ok命令檢查kvm模塊是否加載
- 顯示‘/dev/kvm does not exist’則表示kvm模塊未被加載,執行sudo modprobe kvm_intel命令進行加載
- 當然加載kvm模塊需要開啟CPU虛擬化技術,在BIOS中設置Intel Virtualization Technology為Enable
注:lsmod | grep kvm也可以查看kvm模塊是否加載
安裝軟件包
安裝服務端軟件包
sudo apt install ubuntu-virt-server
軟件包ubuntu-virt-server依賴的兩個主要的軟件包是qemu-kvm和libvirt-bin。
- qemu將內核中的虛擬功能暴露給用戶,提供了用戶空間的虛擬機環境
- libvirt是一個工具庫,通過它可以方便的管理各種虛擬機軟件。Libvirt幾乎支持所有常見的虛擬技術,包括KVM,Xen,LXC,VMware,VirtualBox等
安裝客戶端軟件包
sudo apt-get install virtinst
該軟件包提供4個命令來管理虛擬機
- virt-conver --------把一種格式的虛擬機轉為另一種格式
- virt-clone --------克隆虛擬機
- virt-image -------創建虛擬機鏡像
- virt-install -------創建新的虛擬機
創建虛擬機
配置虛擬網卡
默認情況下,KVM新創建的虛擬機使用NAT網絡(虛擬機可以訪問外面,外面看不到它)。這種NAT機制不通過網卡,只通過內核內部的IP轉發來進行數據傳輸,所以外面的機器訪問不到虛擬機。為了能讓外面的機器訪問虛擬機,需要創建虛擬網橋,把虛擬機的虛擬網卡與外部物理網卡通過網橋橋接起來。
1. 啟動IP轉發
編輯/etc/sysctl.conf文件
# 去掉該行前面的#號,開啟轉發功能
net.ipv4.ip_forward = 1
執行sudo sysctl -p命令使配置生效
2. 創建橋接設備
在宿主機上安裝bridge-utils軟件包:
sudo apt-get install bridge-utils
編輯/etc/network/interfaces,然后添加虛擬網橋網橋br0,將物理網卡enp4s0f2添加到網橋。
注:將物理網卡enp4s0f2添加到br0后,物理網卡的IP地址將失去作用,所以下面的配置文件中沒有為enp4s0f2指定IP
[...]
auto enp4s0f2
iface enp4s0f2 inet manual
auto br0
iface br0 inet dhcp
address 10.10.10.2 網橋IP地址
netmask 255.255.255.0 掩碼
gateway 10.10.10.1
bridge_ports enp4s0f2 #將物理網卡添加到虛擬網橋中
bridge_stp off
bridge_maxwait 0
bridge_fd 0
[...]
重啟網絡
#sudo /etc/init.d/networking restart
或
#sudo service networking restart
重啟網絡之后,執行brctl show查看網橋是否添加成功,下面顯示我的機器已成功創建網橋,並將enp4s0f2網卡添加到網橋中
3. 創建虛擬機
首先准備好鏡像文件,我這里准備了ubuntu-server-adm64.iso鏡像文件,然后通過前面提到的命令來創建虛擬機
sudo virt-install \
--name=myvps1 \
--ram=512 \
--network bridge:br0 \
--disk path=/var/lib/libvirt/images/myvps1.img,bus=virtio,size=10 \
--graphics vnc,listen=0.0.0.0
--noautoconsole \
--hvm \
--cdrom ./ubuntu-server-adm64.iso
下面解釋一下各個參數的作用:
- --name=myvps1 虛擬機名稱為myvps1
- --ram=512 虛擬機內存大小為512MB
- --network bridge:br0 指定網絡為網橋設備,后面具體解釋
- --disk 指定虛擬盤的位置,虛擬盤可以是一個文件,分區或者一個邏輯卷。例子指定為myvps1.img文件,空間為10G,總線使用virtio總線
- --graphics 指定圖形界面,例子中指定vnc遠程桌面控制,即我們可以使用vnc客戶端對虛擬機進行遠程桌面控制
- --noautoconsole 不要自動連接到虛擬機控制台,主要因為我們安裝的服務器版虛擬機,它上面沒有圖形界面
- --hvm 創建功能完整的虛擬機
- --cdrom 指定安裝鏡像位置
當然關於參數的詳解使用man virt-install來查看
如果虛擬機創建成功則會顯示以下內容
4. 連接虛擬機
我們使用VNC軟件來連接虛擬機,VNC軟件是一款開源的Linux遠程桌面控制軟件,和Windows下的Teamviewer或者是QQ自帶的遠程桌面控制一樣。VNC分服務端和客戶端,安裝客戶端的電腦可以遠程控制安裝服務端的電腦,剛才我們在創建虛擬機的時候,指定支持vnc遠程控制,所以我們下載一個vnc客戶端就可以了。下載地址
下面是vnc軟件的連接界面,VNS Server填寫網橋的IP即可,Name可以隨意命名。
連接成功后就會開始裝系統的步驟,這里就不介紹了。
5. 遺留問題
創建虛擬機的時候會自動創建兩塊虛擬網卡出來,虛擬機內部有一塊(ens3),虛擬機外部也有一塊(vnet0),這個下圖有顯示。在創建虛擬機的我們指定為網橋,意思是將來把外部那塊網卡(vnet0)添加到網橋中。而物理機的網卡(enp4s0f2)已被添加的網橋中,這樣外部就可以和虛擬機進行通信了(虛擬機內部那塊網卡IP必須和網橋在一個IP段)。
外部虛擬網卡
網橋br0中添加了兩塊網卡(端口)
管理虛擬機
啟動虛擬機
使用下面的命令來啟動剛創建的虛擬機
# virsh start myvps1
讓虛擬機隨物理機一起啟動
# virsh autostart myvps1
列出正在運行的虛擬機,所有虛擬機,關閉的虛擬機
# virsh list
# virsh list --all
# virsh list --inactive
重啟,關機
重啟
# virsh reboot myvps1
關機
# virsh shutdown myvps1
保存,恢復狀態
有時我們需要把某個虛擬機暫時關閉,而又想啟動時恢復當時的狀態,這是需要用到save命令
# virsh save myvps1 myvps1-20171202.state
執行上面的命令后,虛擬機的內存會被保存到一個文件中,然后虛擬機自動關閉
# virsh restore myvps1-20171202.state
恢復虛擬機
掛起,恢復
掛起
# virsh suspend myvps1
恢復
# virsh resume myvps1
空間擴容
在虛擬機運行一段時間后可能會需要添加更多的磁盤空間。這里可以使用attach-disk命令對磁盤擴容。
1. 生成文件
我們使用dd命令來產生一個文件
# sudo dd if=/dev/zero of=/var/lib/libvirt/images/myvps1-disk2.image bs=1M count=4096
該命令會為我們生成一個4GB大小的文件
2. 把文件添加到虛擬機
使用attach-disk命令,把剛剛創建的文件添加到myvps1虛擬機,作為其磁盤使用:
# virsh attach-disk myvps1 \
/var/lib/libvirt/images/myvps1-disk2.img vdb \
--live \
--cache none
這樣一個名為vdb的虛擬磁盤就被添加到虛擬機中了
3. 分區
將硬盤添加到虛擬機后,需要在虛擬機中對新的硬盤進行格式化才能使用。下面的操作都是在虛擬機myvps1中進行的
查看硬盤是否添加成功
# sudo fdisk -l
上圖可以看到已經有磁盤/dev/vdb,但是未分區和格式化,關於Linux下如何對分區進行格式化請自行百度
增加CPU核數
查看主機cpu核數
# virsh nodeinf0
我的機器顯示兩個核,也就是每個虛擬機最多能有兩個CPU核
查看當前虛擬機(myvps1)虛擬機核數,顯示只有一個核,vcpu 0表示第0個核,而不是核數為0
# virsh vcpuinfo myvps1
關閉虛擬機
# virsh shutdown myvps1
修改最大核數為2核,並設置到配置文件(/etc/libvirt/qemu下)
# virsh setvcpus myvps1 2 --maximum --config
設置核數為2到配置文件(/etc/libvirt/qemu下)
# virsh setvcpu2 myvps1 2 --config
重啟虛擬機
# virsh start myvps1
上圖顯示出兩個cpu核表示我們設置成功
增加內存
增加內存核增加CPU核數一樣,先設置最大內存,在設置當前內存
查看當前虛擬機信息,可以看到當前的內存設置
# virsh dominfo myvps1
設置最大內存為2G
# virsh setmaxmem myvps1 2097152 --config
設置當前內存為1G
# virsh setmem myvps1 1048576 --config
重啟虛擬機
# virsh shutdown myvps1
# virsh start myvps1
克隆虛擬機
有時我們需要幾台環境相同的虛擬機,這時,我們不需要從頭創建,只需要克隆即可
先關閉虛擬機
# virsh shutdown myvps1
克隆虛擬機
# sudo virsh-clone \
--original myvps1 \
--name myvps3 \
--file /var/lib/libvirt/images/myvps3.img
啟動克隆的虛擬機
# virsh start myvps3
虛擬機鏡像管理
虛擬機鏡像做好后,我們可能需要修改虛擬機的IP地址,虛擬機內部的文件等。當然可以先啟動虛擬機,然后通過VNC或者SSH進去修改。不過,方便的方法時使用virt-edit命令來直接編輯虛擬機鏡像文件即可。virt-edit是libguestfs-tools包提供的命令。
# sudo apt install libguestfs-tools
這個軟件包專門管理虛擬機的虛擬磁盤文件,提供的工具有:
- virt-cat 顯示虛擬機中文件的內容(相當於cat命令)
- virt-edit 編輯虛擬機中的文件(相當於vi命令)
- virt-inspector 顯示虛擬機的操作系統等詳細信息
- virt-tar 在虛擬機和主機之間傳遞文件
當然還有很多命令,這里就不一一列出了
刪除虛擬機
# virsh undefine myvps1
# virsh pool-refresh default
在執行virsh undefine myvps1時,虛擬機的虛擬磁盤文件/var/lib/libvirt/images/myvps1.img文件不會被刪除,需要手動刪除。刪除完畢后需要執行virsh pool-refresh default命令清楚虛擬機的緩存記錄