目录
介绍
简要介绍
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