目錄
介紹
簡要介紹
KVM實際是Linux內核提供的虛擬化架構,可將內核直接充當hypervisor來使用。
KVM包含一個內核模塊kvm.ko用來實現核心虛擬化功能,以及一個和處理器強相關的模塊如kvm-amd.ko。KVM本身不實現任何模擬,僅僅是暴露了一個/dev/kvm接口,這個接口可被宿主機用來主要負責vCPU的創建,虛擬內存的地址空間分配,vCPU寄存器的讀寫以及vCPU的運行。有了KVM以后,guest os的CPU指令不用再經過QEMU來轉譯便可直接運行,大大提高了運行速度。但KVM的kvm.ko本身只提供了CPU和內存的虛擬化,所以它必須結合QEMU才能構成一個完整的虛擬化技術。
KVM實現了CPU和內存的虛擬化,但KVM并不能模擬其他設備,還必須有個運行在用戶空間的工具才行。KVM的開發者選擇了比較成熟的開源虛擬化軟件QEMU來作為這個工具,QEMU模擬IO設備(網卡,磁盤等),對其進行了修改,最后形成了Qemu-KVM。
在Qemu-KVM中,KVM運行在內核空間,QEMU運行在用戶空間,實際模擬創建、管理各種虛擬硬件,QEMU將KVM整合了進來,通過/ioctl 調用 /dev/kvm,從而將CPU指令的部分交給內核模塊來做,KVM實現了CPU和內存的虛擬化,但KVM不能虛擬其他硬件設備,因此QEMU還有模擬IO設備(磁盤,網卡,顯卡等)的作用,KVM加上QEMU后就是完整意義上的服務器虛擬化。
建議的版本
表1 建議的版本 | |
軟件 | 建議版本 |
QEMU | qemu-2.12.0及以上版本 |
libvirt | libvirt-4.5.0及以上版本 |
環境要求
硬件要求
表1 硬件要求 | ||
類別 | 項目 | 要求 |
硬件 | 服務器 | TaiShan 200服務器(型號2280) |
CPU | 鯤鵬920處理器 | |
RAID卡 | Avago 3508 | |
BIOS | Advanced→MISC Config→Support Smmu | Enabled |
Advanced→PCIe Config→SRIOV | Enabled |
注意:
Avago 3408iMR RAID卡不支持虛擬化功能。
操作系統要求
表2 操作系統要求 | |
項目 | 要求 |
CentOS | CentOS 7.6 |
操作系統推薦安裝Infrastructure Server或者Server with GUI,如圖1所示。
圖1 安裝Server with GUI
獲取軟件包
表3 獲取軟件包 | |
軟件包名稱 | 獲取方法 |
qemu-4.0.0.tar.xz | 在線 執行wget https://download.qemu.org/qemu-4.0.0.tar.xz命令下載源碼包。 離線 在可以訪問外網的機器上訪問https://download.qemu.org/qemu-4.0.0.tar.xz下載源碼包。 將下載好的源碼包拷貝至目標機器。 |
libvirt-5.6.0.tar.xz | 以libvirt-5.6.0為例。 在線 執行wget https://libvirt.org/sources/libvirt-5.6.0-1.fc30.src.rpm命令,下載源碼rpm包。 離線 在可以訪問外網的機器上訪問https://libvirt.org/sources/libvirt-5.6.0-1.fc30.src.rpm下載源碼rpm包。 將下載好的源碼包拷貝至目標機器。 |
安裝虛擬化相關組件
(可選)配置本地源
說明:
如果組網環境處于外網受限情況下,服務器yum命令無法通過外界獲取依賴包時,可參考本節內容進行本地源配置。
1. 將操作系統鏡像文件CentOS-7-aarch64-Everything-1810.iso拷貝到每臺服務器的root目錄下。
2. 鏡像文件掛載。
a. 將/root目錄下的CentOS操作系統對應iso文件掛載到/mnt目錄下。
mount /root/CentOS-7-aarch64-Everything-1810.iso /mnt -o loop
說明:
該操作單次生效,重啟后失效。
b. (可選)配置開機啟動自動掛載鏡像。
1. 打開fstab文件。
vi /etc/fstab
2. 編輯fstab文件,在文件末尾添加如下信息:
/root/CentOS-7-aarch64-Everything-1810.iso /media iso9660 loop 0 0
3. 保存并退出fstab文件。
3. 添加本地源文件。
a. 將系統鏡像上傳至root目錄,并把CentOS操作系統對應iso文件掛載到/mnt下。
mount /root/CentOS-7-aarch64-Everything-1810.iso /mnt
b. 進入/etc/yum.repos.d目錄。
cd /etc/yum.repos.d
說明:
此時,建議將此目錄下的*.repo文件移到任意其他備份目錄下。
c. 創建local.repo文件。
1. 打開local.repo文件。
vi local.repo
2. 編輯local.repo文件,在local.repo文件中添加如下內容:
3. [local]
4. name=local repo
5. baseurl=file:///mnt
6. enabled=1
gpgcheck=0
7. 保存并退出local.repo文件。
4. 生效本地源。
yum clean all
yum makecache
yum list
安裝虛擬化相關組件
說明:
本章節的操作需要外網可用或已配置本地源。
1. 安裝虛擬化相關組件。
yum -y install qemu* libvirt* AAVMF virt-install
創建qemu-kvm軟鏈接
1. 創建qemu-kvm軟鏈接。
ln -sv /usr/libexec/qemu-kvm /usr/bin/
升級QEMU
安裝依賴包
說明:
本章節的操作需要外網可用或已配置本地源。
1. 安裝依賴包。
yum -y install glib2-devel zlib-devel pixman-devel
編譯安裝
1. 解壓并進入QEMU目錄。
tar -xvf qemu-4.0.0.tar.xz
cd qemu-4.0.0
2. 配置安裝。(執行./configure命令會報錯,先執行以下命令)
yum install gcc
yum install zlib*
yum install -y glib* libvirt*
yum install install autoconf automake libtool
a. 執行./configure命令,執行結果如下圖所示:
b. 執行 make命令(建議screen模式下跑,避免意外中斷),執行結果如下圖所示:
c. 執行make install命令(先執行yum -y install flex bison vim wget),執行結果如下圖所示:
3. 添加lib庫。
a. 執行vim /etc/ld.so.conf命令,添加lib庫。
命令如下所示,添加lib庫路徑后保存退出。
[root@localhost ~]# vim /etc/ld.so.conf
...
include /usr/local/lib //加入lib庫路徑
b. 執行ldconfig命令,使lib庫更改生效。
[root@localhost ~]# ldconfig //使Lib庫更改生效
4. 檢驗QEMU版本。
qemu-img --version
升級libvirt
須知:
如果對圖形化界面沒有訴求,能夠使用命令行進行虛擬化相關操作,建議使用系統自帶的libvirt-4.5.0。
由于libvirt-4.5.0代碼存在bug,所以在使用virt-manager時會觸發一些報錯,例如:internal error: Socket 6378 can't be handled(max socket is 4095),如果一定要用virt-manager操作,請按照如下章節安裝libvirt4.7.0或更高版本。
安裝edk2
• 在線安裝
執行如下命令在線安裝edk2,如圖1所示。
wget https://www.kraxel.org/repos/firmware.repo -O /etc/yum.repos.d/firmware.repo
yum -y install edk2.git-aarch64
圖1 在線安裝edk2
• 離線安裝
在有外網的環境下訪問https://www.kraxel.org/repos/jenkins/edk2/,獲取rpm包并拷貝至目標服務器系統相應位置。執行如下命令離線安裝edk2,如圖2所示。
rpm -ivh edk2.git-aarch64*.rpm
圖2 離線安裝edk2
安裝依賴包
說明:
本章節的操作需要外網可用或已配置本地源。
1. 安裝依賴包。
yum -y install libxml2-devel readline-devel ncurses-devel libtasn1-devel gnutls-devel libattr-devel libblkid-devel augeas systemd-devel libpciaccess-devel yajl-devel sanlock-devel libpcap-devel libnl3-devel libselinux-devel dnsmasq radvd cyrus-sasl-devel libacl-devel parted-devel device-mapper-devel xfsprogs-devel librados2-devel librbd1-devel glusterfs-api-devel glusterfs-devel numactl-devel libcap-ng-devel fuse-devel netcf-devel libcurl-devel audit-libs-devel systemtap-sdt-devel nfs-utils dbus-devel scrub numad
編譯安裝
源碼包的下載請參見獲取軟件包,本章以libvirt-5.6.0為例。
1. 安裝src.rpm源碼包。
rpm -i libvirt-5.6.0-1.fc30.src.rpm
2. 生成rpm包。
cd /root/rpmbuild/SPECS/
yum -y install rpm* git
yum -y install bash* iscsi*
groupadd veillard
useradd -g veillard veillard
yum groupinstall "Virtualization Hypervisor" "Virutalization Client","Virutalization Platform","Virtualization Tools"
rpmbuild -ba libvirt.spec
3. 修改配置文件。
a. 打開qemu.conf文件。
vim /etc/libvirt/qemu.conf
b. 找到修改位置,如下圖所示:
c. 添加如下配置。
nvram = ["/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw:/usr/share/edk2.git/aarch64/vars-template-pflash.raw"]
d. 按:wq,保存退出。
4. 執行service libvirtd restart命令,重啟libvirtd服務。
5. 關閉SELinux。
執行setenforce 0命令,臨時關閉selinux。
(建議永久關閉SElinux)
永久關閉:
[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing 改為 SELINUX=disabled
驗證環境
1. 執行service libvirtd restart命令,重啟libvirt服務。
2. 執行virsh version命令,查看版本信息。
若升級libvirt,那么如下圖所示。
配置網絡
本次配置的kvm虛擬機希望采用DHCP方式獲取IP地址,為此先通過vi命令在/etc/sysconfig/network-scripts下創建橋接網卡的配置文件ifcfg-br1:
vi /etc/sysconfig/network-scripts/ifcfg-br1
然后在ifcfg-br1文件中錄入如下內容并保存后退出
這是橋的配置
DEVICE="br1"
NAME="br1"
ONBOOT="yes"
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"
TYPE=Bridge
之后,對br1綁定的物理網卡需要修改配置,本次綁定的是enp125s0f0網卡:
vi /etc/sysconfig/network-scripts/ifcfg-enp125s0f0
這是網卡的配置
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
BRIDGE="br1"
NAME="enp125s0f0"
UUID="d6235b44-8169-4ed2-879a-06eea18352d7"
DEVICE="enp125s0f0"
ONBOOT="yes"
以上配置完成后,為了保證配置生效,應當通過以下命令重啟網絡服務:
systemctl restart network
通過以下命令查看橋接狀態
brctl show
創建第一個虛擬機
1. 啟動libvertd服務并設置開機自啟。
systemctl start libvirtd
systemctl enable libvirtd
2. 創建存儲池。
a. 創建存儲池目錄,配置目錄權限。
mkdir -p /home/kvm/images
chown root:root /home/kvm/images
chmod 755 /home/kvm/images
b. 定義一個存儲池并綁定目錄,建立基于文件夾的存儲池、激活、設置開機啟動。
virsh pool-define-as StoragePool --type dir --target /home/kvm/images
virsh pool-build StoragePool
virsh pool-start StoragePool
virsh pool-autostart StoragePool
c. 查看存儲池信息。
virsh pool-info StoragePool
virsh pool-list
3. 創建虛擬機磁盤空間。
a. 創建卷 。
創建名稱為1.img,所在存儲池為StoragePool,容量為50G,初始分配1G,文件格式類型為qcow2, 硬盤文件的格式必須為qcow2格式。
virsh vol-create-as --pool StoragePool --name 1.img --capacity 50G --allocation 1G --format qcow2
b. 查看卷信息。
virsh vol-info /home/kvm/images/1.img
4. 創建虛擬機。
a. 創建虛擬機vm1,虛擬機分配4個CPU、8G內存,使用1.img作為磁盤空間,將iso文件拷貝/tmp路徑下,安裝CentOS7.6系統。
virt-install --name=vm1 --vcpus=4 --ram=8192 --disk path=/home/kvm/images/1.img,format=qcow2,size=50,bus=virtio --cdrom /tmp/CentOS-7-aarch64-Everything-1810.iso --network bridge=br1,model=virtio --force --autostart
b. 安裝虛擬機的操作系統。
執行了virt-install安裝上述命令后,系統開始安裝,并之后進入如下界面時設置語言、時區、網絡、管理員密碼等:
================================================================================
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]:
[anaconda] 1:main* 2:shell 3:log 4:storage-lo> Switch tab: Alt+Tab | Help: F1
1、進入菜單2)Time settings后設置時區的步驟:
Time settings
Timezone: not set
NTP servers:not configured
1) Set timezone 2) Configure NTP servers Please make your choice from above ['q' to quit | 'c' to continue |
輸入1后回車,進入如下菜單:
Available regions
1) Europe
2) Asia
3) America
4) Africa
5) Antarctica
6) Pacific
7) Australia
8) Atlantic
9) Indian
10) Arctic
11) US
12) Etc
輸入2后回車(選擇了Asia),進入如下菜單:
6) Aqtobe
7) Ashgabat
8) Atyrau
9) Baghdad
10) Bahrain
11) Baku
34) Jerusalem
35) Kabul
36) Kamchatka
37) Karachi
38) Kathmandu
39) Khandyga
62) Sakhalin
63) Samarkand
64) Seoul
65) Shanghai
66) Singapore
67) Srednekolymsk
輸入65(選擇了Shanghai),完成時區設置
2、進入菜單3) Installation source選擇安裝源
Choose an installation source type.
1) CD/DVD
2) local ISO file
3) Network
輸入2后回車(選擇了local ISO file),完成安裝源的選擇
3、進入菜單4) Software selection選擇需要安裝的軟件集
1) [ ] Minimal Install
2) [x] Compute Node
3) [ ] Infrastructure Server
4) [ ] File and Print Server
5) [ ] Basic Web Server Workstation
6) [ ] Virtualization Host
7) [ ] Server with GUI
8) [ ] GNOME Desktop
9) [ ] KDE Plasma Workspaces
10) [ ] Development and Creative
例如選擇2后回車(選擇了Compute Node),完成軟件集的選擇
4、進入菜單5) Installation destination選擇目標磁盤
Installation Destination
[x] 1) : 64 GiB (vda)
輸入c后回車,進入磁盤分區選擇:
Autopartitioning Options
[ ] 1) Replace Existing Linux system(s)
[x] 2) Use All Space
[ ] 3) Use Free Space
輸入c后回車(選擇了默認的User All Space),之后進入分區schema選擇:
Partition Scheme Options
[ ] 1) Standard Partition
[ ] 2) Btrfs
[x] 3) LVM
[ ] 4) LVM Thin Provisioning
輸入c后回車(選擇了默認的LVM),完成磁盤的選擇
5、進入菜單7) Network Configuration配置網絡連接
Host name: localhost.localdomain
Current host name: localhost
1) Set host name 2) Configure device eth0
輸入1回車(選擇了Set host name),然后輸入根據提示新的host name,例如centos.vm0
Enter new value for 'Host name' and press enter
centos.vm0
輸入2回車(選擇了Configure device eth0)
Device configuration
1) IPv4 address or "dhcp" for DHCP dhcp
2) IPv4 netmask 3) IPv4 gateway
4) IPv6 address[/prefix] or "auto" for automatic, "dhcp" for DHCP, "ignore" to turn off auto
5) IPv6 default gateway
6) Nameservers (comma separated)
7) [ ] Connect automatically after reboot
8) [ ] Apply configuration in installer
輸入1回車(選擇了IPv4 address or "dhcp" for DHCP),然后根據提示輸入IPv4地址或dhcp,本次用的是dhcp:
Enter new value for 'IPv4 address or "dhcp" for DHCP' and press enter
dhcp
輸入7回車(選擇了Connect automatically after reboot)
輸入8回車(選擇了Apply configuration in installer)
輸入c回車完成網絡配置,繼續輸入c回車直到回到主菜單
6、進入菜單8) Root password設置管理員密碼
按照提示兩次輸入同樣的密碼即可,如果密碼過于簡單,系統會提示是否確認,輸入yes回車即可
================================================================================
Please select new root password. You will have to type it twice.
Password:Password (confirm):
================================================================================
================================================================================
Question
The password you have provided is weak: The password fails the dictionary check- it is too simplistic/systematic.Would you like to use it anyway?
Please respond 'yes' or 'no': yes
7、進入菜單9) User creation創建一個用戶,該步驟為可選,如需要,按照提示菜單輸入用戶名、密碼即可,不再贅述:
以上步驟完成后,輸入b并回車,開始安裝(如遇到不能開始,返回菜單進入未設置的菜單輸入c回車,再返回機箱輸入b回車進行嘗試);
Please make your choice from above ['q' to quit | 'b' to begin installation |
'r' to refresh]: b
================================================================================
================================================================================
ProgressSetting up the installation environment.Creating disklabel on /dev/vda.Creating xfs on /dev/vda1.Creating lvmpv on /dev/vda2
. . .
四、驗證虛擬機的安裝
系統安裝完成后,進入登錄界面。
虛擬機安裝完后虛擬機將被自動啟動,啟動后進入虛擬機CentOS7,通過命令ifconfig檢查網絡是否OK:
[root@centos ~]# ifconfig
eth0: flags=4163
inet 192.168.0.8 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::d72c:1539:12b3:c85c prefixlen 64 scopeid 0x20
ether 52:54:00:e7:96:71 txqueuelen 1000 (Ethernet)
RX packets 57 bytes 6069 (5.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 48 bytes 4500 (4.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到,虛擬機已經通過dhcp獲得了IP地址(示例中為192.168.0.8);
如果是安裝UOS虛擬機,創建虛擬機的命令則為:
1、 先從百度下載安裝VNC軟件,再執行創建卷、創建虛擬機命令
virsh vol-create-as --pool StoragePool --name 1.img --capacity 300G --allocation 1G --format qcow2
virt-install --name=vm1 --vcpus=8 --ram=32768 --disk path=/sda/kvm/images/1.img,format=qcow2,size=50,bus=virtio --cdrom /tmp/uos-20-SP1-server-arm64.iso --network bridge=br1,model=virtio --force --autostart --graphics vnc,listen=0.0.0.0 –noautoconsole
通過查看進程獲取到VNC端口
ps -ef |grep vm1 |grep qemu
netstat -ntlup|grep 進程號
PS:正常第一臺虛擬機,VNC端口是5900,然后依次遞增
打開VNC輸入IP:端口,即可進行圖形化安裝uos系統了(此處較為簡單,不再截圖)
配置虛擬機
本章節介紹通過執行virsh edit vmx命令編輯虛擬機配置文件的操作方法,其中vmx是虛擬機名稱。
綁定CPU
虛擬機的CPU綁定,是指將VM的vcpu綁定到同一個NUMA節點的物理CPU上。
以將虛擬機的4個vcpu分別綁定到0/1/2/3物理核為例,介紹虛擬機CPU綁定的配置方法。
1. 執行virsh edit vmx命令,編輯配置文件。
2. 在配置文件中添加如下CPU配置信息:
3.
4.
5.
6.
7.
8.
經過上述的配置后,虛擬機的vcpu線程就會固定運行在指定的主機的物理CPU上。
9. 保存并退出配置文件。
10. 執行virsh vcpuinfo vmx 命令查看CPU定選效果。
綁定內存
將內存綁定到與CPU在同一NUMA節點上。
1. 執行virsh edit vmx命令編輯配置文件。
2. 在配置文件中,添加如下內存配置信息:
3.
4.
5. 保存并退出配置文件。
啟動虛擬機
• 啟動vm1。
virsh start vm1
• 編輯vm1的配置文件
virsh edit vm1
• 關閉vm1。
virsh shutdown vm1
常用命令
命令行 | 功能描述 |
virsh list --all | 查看所有虛擬機。 |
virsh undefined vm2 | 刪除虛擬機。 |
virsh vol-delete --pool StoragePool --vol 2.img | 刪除img。 |
virsh pool-destroy vmfspool virsh pool-undefine vmfspool virsh pool-delete vmfspool |
刪除存儲池。 |
常見問題
1、安裝qemu可能會報錯:
ERROR: "cc" either does not exist or does not work說明沒有gcc編譯器,故安裝gcc編譯yum install gcc繼續運行./configure,可能還會出錯
Error: zlib check failed
Make sure to have the zlib libs and headers installed.
則需安裝zlib相關的軟件yum install zlib*再次運行./configure,可能還有錯誤
glib-2.12 required to compile QEMU則須安裝glib相關的模塊yum install -y glib* libvirt*
./configure
make
./configure成功,繼續運行make后失敗,出現錯誤
/bin/sh: autoreconf: command not found make: *** [/home/qemu-2.1.3/pixman/configure] Error 127說明make方面出現問題,通過安裝這三個
yum install install autoconf automake libtool
2、虛擬機無法獲取到IP地址
參考以下我的配置文件:
這是橋的配置
DEVICE="br1"
NAME="br1"
ONBOOT="yes"
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"
TYPE=Bridge
這是網卡的配置
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
BRIDGE="br1"
NAME="enp125s0f0"
UUID="d6235b44-8169-4ed2-879a-06eea18352d7"
DEVICE="enp125s0f0"
ONBOOT="yes"
3、創建虛擬機失敗
檢查ISO鏡像文件是否有放在/tmp目錄下,沒有請移到/tmp路徑再創建
4、建議虛擬機配置成靜態IP,避免服務器重啟,導致虛擬機IP地址改變
-------------------------------uos配置靜態IP--------------------
vi /etc/network/interfaces
auto enp1s0
iface enp1s0 inet static
address 192.168.1.48
netmask 255.255.255.0
gateway 192.168.1.1
改完reboot重啟虛擬機
-------------------------------Centos配置靜態IP--------------------
dhcp改成static 增加如下
IPADDR=192.168.1.32
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=114.114.114.114
最后重啟網絡systemctl restart network