由于近期比较折腾,另外也找不到好的虚拟化方案,于是就把目光留在了Ubuntu+KVM上。
之前尝试过的ESXi和Proxmox VE,发现ESXi不能直通宿主机的USB键鼠,但能完美直通N卡,Proxmox VE可以直通任何宿主机的USB设备,但是直通显卡后问题就来了,把直通了显卡的虚拟机电源关闭,然后再打开,系统当场奔溃。分析了大半天日志都没找到原因,也尝试过升级,切换方式等,都是相同结果,Google了一圈也没找到解决方法,我的R710前面板还报PCI-E错误,佛了。
但Proxmox VE是用KVM虚拟化的,所以还是上Ubuntu吧(???
下面步骤是我从网络上各大站点整理而来,如有疏忽或疑问,请评论区留言。
本教程中的Ubuntu版本为Ubuntu Server 18.04 LTS
配置iommu以支持PCI硬件直通
AMD和Intel的方法都一样,只是添加的内容不同,如果你不想进行硬件直通,可以忽略这一步。
编辑grub
sudo vim /etc/default/grub
找到GRUB_CMDLINE_LINUX_DEFAULT=""这一行,并往里面添加值,如Intel,AMD看下方代码框中:
添加:intel_iommu=on
最终的结果为:GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on"
AMD则将"intel_iommu=on"改为"amd_iommu=on"
如这行里面有其他值,网后面添加即可。
配置完成后,运行sudo update-grub更新一下,然后reboot服务器。
重启后输入命令 "dmesg | grep -i iommu "查看是否有反馈,如果有类似以下输出,说明成功。
来源: http://aspirer.wang/?p=1266
安装KVM等软件包
验证是否支持虚拟化和KVM
验证虚拟化"egrep -c ‘(vmx|svm)’ /proc/cpuinfo",如反馈出CPU核心数说明支持
验证KVM硬件加速
sudo apt install cpu-checker
sudo kvm-ok
如果反馈中有“KVM acceleration can be used”说明支持。
执行以下命令安装KVM并启动服务
sudo apt update
sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virtinst
sudo service libvirtd start
sudo update-rc.d libvirtd enable
编辑 /etc/netplan/50-cloud-init.yaml 配置网桥,比如我的eno4配置了静态IP,那就把dhcp4和6关掉。
network:
version: 2
ethernets:
eno4:
dhcp4: no
dhcp6: no
bridges:
br0:
interfaces: [eno4]
dhcp4: no
addresses: [192.168.2.189/24]
gateway4: 192.168.2.1
nameservers:
addresses: [192.168.2.1]
请按照自己的实际环境修改。
使用下面命令查看网桥状态
sudo networkctl status -a
ifconfig
可以使用上下按键或者其他功能键翻页。
来源: https://www.linuxtechi.com/install-configure-kvm-ubuntu-18-04-server/
https://www.sysgeek.cn/install-configure-kvm-ubuntu-18-04/
直通准备
如果你已启用了IOMMU并配置好了KVM,那可以到这一步了。
配置Vfio
使用“ lspci -nnk ”查找你要直通的设备ID,注意是-nnk并非原文中的–nnk,–nnk不被识别。
比如我要直通的设备ID如下:
06:00.0 VGA compatible controller [0300]: NVIDIA Corporation GF119 [GeForce GT 610] [10de:104a] (rev a1)
Kernel driver in use: nouveau
Kernel modules: nvidiafb, nouveau
06:00.1 Audio device [0403]: NVIDIA Corporation GF119 HDMI Audio Controller [10de:0e08] (rev a1)
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
然后将设备的驱动加入黑名单:
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
启用modules:编辑/etc/modules然后加入以下内容
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
将你的显卡ID加入vfio.conf中
执行下面命令
lspci -nn | grep -i nvidia
反馈:
06:00.0 VGA compatible controller [0300]: NVIDIA Corporation GF119 [GeForce GT 610] [10de:104a] (rev a1)
06:00.1 Audio device [0403]: NVIDIA Corporation GF119 HDMI Audio Controller [10de:0e08] (rev a1)
可见我的设备ID是10de:104a和10de:0e08,用下列命令添加。
echo "options vfio-pci ids=10de:104a,10de:0e08" > /etc/modprobe.d/vfio.conf
重新生成initrd
update-initramfs -u
重启服务器:reboot
来源: https://zhuanlan.zhihu.com/p/60389508
https://pve.proxmox.com/wiki/Pci_passthrough#Intel_CPU
新建虚拟机
创建虚拟机磁盘,容量随意,格式要为raw,如我的如下,请按照自己的实际情况修改:
qemu-img create -f raw /home/ssd/ssd-2019.raw 40G // SSD 系统盘
qemu-img create -f raw /home/kvm-disks/2019-data.raw 80G // HDD 数据盘
安装虚拟机,请按照自己的实际情况修改。
virt-install
--name WinServer2019
--memory 12288
--cpu host
--vcpus 8
--disk path=/home/ssd/ssd-2019.raw
--network bridge=br0,model='e1000'
--cdrom=/home/kvm-disks/ISO/cn_windows_server_2019_updated_march_2019_x64_dvd_c1ffb46c.iso
--boot cdrom
--virt-type kvm
--vnc
--vncport=5902
--vnclisten=0.0.0.0
--os-type=windows
--features kvm_hidden=on
--machine q35
上述指令:name指定名称,memory指定内存(单位MB),vcpus指定虚拟核心数,disk指定磁盘位置,network指定网络,后面指定我们创建的网桥及虚拟网卡,cdrom指定镜像位置,boot指定启动方式,vnc部分指定了端口等。
来源: https://blog.acesheep.com/index.php/archives/720/
特别需要注意的参数--machine q35
--features kvm_hidden=on
https://blog.acesheep.com/index.php/archives/720/
如果机器有防火墙的话,还需要开放在上面指定的vnc端口。 在运行命令后,会弹出X窗口,你可以安装xmanager,如果没有的话,那虚拟机任然会被创建。(理论是这样
直通USB设备和直通显卡
直通USB
限制:USB协议<= 2.0 使用lsusb查看usb的id 我要直通的USB设备的ID是1a40:0101,可以用以下命令进行编辑。virsh edit WinServer2019 //改成你的虚拟机名字
在<devices>和</devices>之间添加如下代码
<devices>
<hostdev mode='subsystem' type='usb'>
<source>
<vendor id='0x1a40'/>
<product id='0x0101'/>
</source>
</hostdev>
</devices>
添加完成后需要重新定义虚拟机
virsh define /etc/libvirt/qemu/WinServer2019.xml //改成你的虚拟机名字.xml
还有其他方法,如热添加,请参考如下:
https://blog.acesheep.com/index.php/archives/720
https://help.ubuntu.com/community/KVM/Managing#Adding_USB_Device_Pass-through
直通显卡
lspci -nn | grep -i nvidia
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU102 [GeForce RTX 2080 Ti Rev. A] [10de:1e07] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10f7] (rev a1)
01:00.2 USB controller [0c03]: NVIDIA Corporation Device [10de:1ad6] (rev a1)
01:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device [10de:1ad7] (rev a1)
这里列出的PCI 设备序号01:00.0
01:00.1
01:00.2
01:00.3
01:00.0
这里需要对应配置文件的<source>
节点里面<address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
<hostdev>
里面是直通一个PCI 设备, 例如我这里有4个需要穿透到里面,就要有4个<hostdev>
https://blog.acesheep.com/index.php/archives/720/
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</hostdev>
解释一下:bus对于的是 01:00.3 的第一串数字,后门以此类推 完成后需要重新定义虚拟机
virsh define /etc/libvirt/qemu/WinServer2019.xml //改成你的虚拟机名字.xml
https://blog.acesheep.com/index.php/archives/720/
添加数据盘
可见上面我还创建了一个数据盘,我们只要按照xml照葫芦画瓢就行 <disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/home/kvm-disks/2019-data.raw'/>
<target dev='sdc' bus='sata'/>
<address type='drive' controller='0' bus='0' target='0' unit='3'/>
</disk>
将上面按照实际情况修改,下载完后重新定义。
从零开始直通显卡, 直通设置好使用起来挺方便的.
的确,后来我用ESXi了,再后来…就什么也不用了…
我有问题咨询您,方便加工微信吗?或者给个邮箱,请教您一点做直通的问题,谢谢,我的邮箱30428272@qq.com
嗯嗯,在我能力范围之内的问题我会尽量帮忙的!
我的邮箱:ivampiresp@163.com
????
哦豁
好快!