前提条件:
X86服务器:
a:进入BIOS->Advanced->Peripheral Configuration-> SR-IOV Setup Settings,把PCle SR-IOV打开
b:进入BIOS->Advanced->Socket Configuration->lIo Configuration->Inte(R) Virtualization for Directed I/O (VT-d),把VT-d选项打开
c:执行vi /etc/default/grub,在GRUB_CMDLINE_LINUX末尾加“intel_iommu=on iommu=pt”,修改好后保存退出,执行grub2-mkconfig -o /boot/efi/EFI/系统名称/grub.cfg,重启os,重启后输入cat /proc/cmdline查看是否生效
ARM服务器:
进入BIOS->Advanced-> MISC Config->,Support Smmu、Smmu Work Around、Support SPCR三个选项状态改为Enabled
x86和arm服务器安装好os后,执行vi /etc/ssh/sshd_config,把X11Forwarding 改为yes后,systemctl restart sshd重启sshd服务;可以通过ssh远程并运行Linux上有GUI的程序,从而打开virt-manager及virt-viewer工具
一、 配置网络源(安装虚拟机所需要的包)
1、vi编辑 /etc/yum.repos.d/openEuler.repo查看yum配置,openeuler系统自带官方源,可以直接用,无需修改;如果非openeuler系统,则需要修改网络源配置文件,可用清华源、华为源等
2、安装图形化分两种情况:
1)openeuler可安装图形化可使用virt-manager工具管理虚拟机
执行yum install gnome-shell gdm gnome-session gnome-terminal xorg-x11-* -y命令安装图形化所需要的依赖包;执行systemctl enable gdm.service 、systemctl set-default graphical.target两条命令设置 gdm 开机自启,设置完后需要os重启生效(注:安装完后,输入root账号进不去无所谓,ssh远程能调用virt-manager启动即可)
yum install -y qemu* libvirt virt-*安装虚拟机套件
注:arm 系统需要再安装edk2文件,x86无需安装;yum install edk2-*
2)有些系统无法安装图形化及virt-manager管理工具,可以使用virt-viewer工具
yum install -y qemu* libvirt virt-*安装虚拟机套件
注:arm 系统需要再安装edk2文件,x86无需安装;yum install edk2-*
二、 创建虚拟机
1、制作虚拟硬盘(制作qcow2镜像,建议选择大一点的目录,如/home/)
使用qemu-img工具的create命令,创建镜像文件,命令格式:
qemu-img create -f <imgFormat> -o <fileOption> <fileName> <diskSize>
其中,各参数含义如下:
1)imgFormat :镜像格式,取值为raw, qcow2等。
2)fileOption :文件选项,用于设置镜像文件的特性,如指定后端镜像文件,压缩,加密等特性。
3)fileName :文件名称。
4)diskSize :磁盘大小,用于指定块磁盘设备的大小,支持的单位有K、M、G、T,分别代表KiB、MiB、GiB、TiB。
例如,创建一个磁盘设备大小为20GB、格式为qcow2的镜像文件openEuler-imge.qcow2,命令如下:qemu-img create -f qcow2 openEuler-imge.qcow2 20G
注意:xml文件、qcow2、系统ISO文件最后放在同一目录下
2、创建虚拟机xml文件
根据openeuler官网配置xml,网址如下:左侧导航窗格选择虚拟机配置页,最下方有arm及x86的相关xml文件配置
https://docs.openeuler.org/zh/docs/20.03_LTS/docs/Virtualization/virtualization.html
xml修改点如下:
1)修改磁盘文件存放路径
2)修改安装ISO存放路径
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' iothread="1"/>
<source file='/root/centos/image.qcow2'/>#创建虚拟硬盘的位置
<target dev='vda' bus='virtio'/>
<boot order='1'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/root/CentOS-7-aarch64-Everything-1810.iso'/>#需要安装的系统镜像的位置
<readonly/>
<target dev='sdb' bus='scsi'/>
<boot order='2'/>
</disk>
3、定义虚拟机及安装虚拟机
1)执行命令virsh define openEuler.xml定义虚拟机 #以实际xml文件名称为主
2)执行命令virsh start openEuler开启虚拟机 #以实际xml文件中虚拟机名字为主
3)通过在系统的图形化界面下执行virt-manager(没有此命令说明没有相关的依赖包,使用virt-viewer如果两个命令都没有,则使用virsh console 虚拟机名称,直接连接进入虚拟机,此时虚拟机为文字界面,如果安装没有进度,则可以试试修改镜像文件为suse系统或者另找方法把安装界面修改为文字界面安装,可以试试虚拟机grub配置加入:console=ttyS0,115200n8 console=tty0),然后跳出系统选项,
4)如果登录系统需要VNC密码,需要看xml配置中VNC处设定密码
5)成功进入虚拟机安装
6)安装完成开机
三、配置pci设备直通方法
先关闭虚拟机,然后更改配置文件,如果有virt-manager工具则直接使用工具添加pci直通设备
如图
如果没有virt-manager工具则按如下方法添加pci设备:
使用virsh edit <虚拟名称>,命令修改已经定义的虚拟机文件,在配置文件的最后面修改,注意格式,格式错误会导致修改不成功、无法保存文件等情况,注意后面连个标签为xml自带,意为修改的参照格式
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x01' slot='0x00' function='0x2'/>#后三个值根据使能的网口的BDF号进行修改
</source>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0' multifunction='on'/>#04根据xml前面的bus值更改,比前面的值更大即可
</hostdev>
</devices>
</domain>
注:上面所写格式中,不对齐标签与前一个标签的间隔都为2个空格
修改完毕保存成功后,开启虚拟机virsh start <虚拟机名称>即可
四:平时常用的配置
1、配置虚拟网口VF的MAC地址:ip link set enp7s0f0 vf 0 mac 1a:20:3c:4d:5e:a1
查看对应网口的VF有没有MAC地址:ip link show dev pf口
2、virsh克隆虚拟机:
virsh dumpxml centos7.6 >centos7.6.xml #生成一个centos7.6系统当前的XML文件
cp系统centos7.6的虚拟盘,cp centos7.6.qcow2 cenntos7.6-clone.qcow2
之后修改系统生成的xml文件下的虚拟磁盘和虚拟机命名,直接定义虚拟机virsh defint centos7.6.xml
3、挂载iso镜像:
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/root/20230313_103803.iso'/>
<target dev='vde' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</disk>
virsh domblklist centos7(查看挂载了什么东西)
五:virsh等常用命令
virsh list #显示正在运行的虚拟机
virsh list --all #显示所有的虚拟机 (如果没有显示,可能需要切换到root权限下)
virsh start vm-node1 #启动vm-node1虚拟机
virsh shutdown vm-node1 #关闭vm-node1虚拟机
virsh destroy vm-node1 #虚拟机vm-node1强制断电
virsh suspend vm-node1 #挂起vm-node1虚拟机
virsh resume vm-node1 #恢复挂起的虚拟机
virsh undefine vm-node1 #删除虚拟机,慎用
virsh dominfo vm-node1 #查看虚拟机的配置信息
virsh omiflist vm-node1 #查看网卡配置信息
virsh domblklist vm-node1 #查看该虚拟机的磁盘位置
virsh edit vm-node1 #修改vm-node1的xml配置文件
qemu-img create -f qcow2 test1.qcow2 1g # 创建一个1G磁盘的磁盘文件
virsh attach-disk --domain dns --source /root/vm/test2.qcow2 --target vdc --subdriver qcow2 --config --live # 虚拟机添加磁盘文件
virsh detach-disk dns vdc # 从虚拟机删除磁盘
virsh attach-interface openEuler20.03.3 --type direct --source enp122s2u1u1 --config #桥接网口至虚拟机
virsh console <虚拟机名称> #直接连接虚拟机OS中(没有图形化的情况下可以使用命令连接进OS)
退出console:ctrl+]
virsh define dns.xml # 从xml配置文件定义一个虚拟机
virsh reboot dns # 重启虚拟机
virsh dumpxml dns > dns.xml # 导出dns虚拟机的配置文件
virsh autostart dns # 设置虚拟机dns开机自启
virsh autostart --disable dns # 取消虚拟机dns开机自启
virsh net-destroy lab2 #停止指定的虚拟网络
virsh net-undefine lab2 # 删除指定的虚拟网络
virsh edit 虚拟机 #修改已经定义的虚拟机的配置文件
六:遇到的问题
1、如果虚拟机开启时提示“Error polling connection ‘qemu:///system’:in
ternal error socket 6378 can't be handled {max socket is 4095}”的报错
是因为libvirt版本太低,需要升级到4.7.0版本,下面为操作步骤,需要联网
yum install gcc libnl-devel libxml2-devel yajl-devel device-mapper-devel libpciaccess-devel libnl3-devel netcf-devel numactl-devel
wget https://libvirt.org/sources/libvirt-4.7.0.tar.xz
xz -d libvirt-4.7.0.tar.xz
tar -xvf libvirt-4.7.0.tar
cd libvirt-4.7.0
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --with-numactl
(如果编译时报错,则可能是依赖包版本过低根据提示更新对应依赖包,如
报错You must install the gnutls >= 3.2.0 pkg-config module to compile libvirt.则更新gnutls*)
make
make install
ldconfig #需要更新动态链接库
libvirtd --version #查看libvirt的版本
systemctl restart libvirtd#重启服务(如果提示Warning: libvirtd.service changed on disk. Run 'systemctl daemon-reload' to reload units.,按提示输
入 systemctl daemon-reload)
2、提示虚拟硬盘没有权限cannot access storage file (as uid:107, gid:107) permission denied
修改/etc/libvirt/qemu.conf,user="root"和group="root"前的注释删除掉
3、如果使能网卡的时候提示echo: write error: Cannot allocate memory
修改内核文件/etc/default/grub,加入pci=realloc,保存退出使用命令grub2-mkconfig -o /boot/efi/Efi/系统名字/grub.cfg生效
4、提示报错:error: Failed to define domain from hostname.xmlerror: Cannot find QEMU binary /usr/bin/kvm: No such file or directory
解决方法:安装qemu-kvm,查看kvm在哪:find / -name kvm,之后创建软连接:ln -s /usr/libexec/qemu-kvm /usr/bin/kvm
5、ARM机器虚拟机安装时图形化卡死,把xml文件的type=virtio和type=usb和type=tablet和type=keyboard几行删除进行文字界面安装,原因可能时系统不支持这些配置