前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >失败笔记,希望对你有用:Ubuntu 18.04 安装 KVM 并配置硬件直通

失败笔记,希望对你有用:Ubuntu 18.04 安装 KVM 并配置硬件直通

作者头像
iVampireSP.com
发布2023-10-21 10:30:17
1K0
发布2023-10-21 10:30:17
举报
文章被收录于专栏:iVampireSPの物语

由于近期比较折腾,另外也找不到好的虚拟化方案,于是就把目光留在了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

代码语言:javascript
复制
sudo vim /etc/default/grub

找到GRUB_CMDLINE_LINUX_DEFAULT=""这一行,并往里面添加值,如IntelAMD看下方代码框中

代码语言:javascript
复制
添加: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硬件加速

代码语言:javascript
复制
sudo apt install cpu-checker
sudo kvm-ok

如果反馈中有“KVM acceleration can be used”说明支持。

执行以下命令安装KVM并启动服务

代码语言:javascript
复制
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关掉。

代码语言:javascript
复制
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]

请按照自己的实际环境修改。

使用下面命令查看网桥状态

代码语言:javascript
复制
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如下:

代码语言:javascript
复制
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

然后将设备的驱动加入黑名单:

代码语言:javascript
复制
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然后加入以下内容

代码语言:javascript
复制
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

将你的显卡ID加入vfio.conf中

执行下面命令

代码语言:javascript
复制
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,用下列命令添加。

代码语言:javascript
复制
echo "options vfio-pci ids=10de:104a,10de:0e08" > /etc/modprobe.d/vfio.conf

重新生成initrd

代码语言:javascript
复制
update-initramfs -u

重启服务器:reboot

来源: https://zhuanlan.zhihu.com/p/60389508

https://pve.proxmox.com/wiki/Pci_passthrough#Intel_CPU

新建虚拟机

创建虚拟机磁盘,容量随意,格式要为raw,如我的如下,请按照自己的实际情况修改:

代码语言:javascript
复制
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 数据盘

安装虚拟机,请按照自己的实际情况修改。

代码语言:javascript
复制
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,可以用以下命令进行编辑。

代码语言:javascript
复制
virsh edit WinServer2019 //改成你的虚拟机名字

在<devices>和</devices>之间添加如下代码

代码语言:javascript
复制
  <devices>
    <hostdev mode='subsystem' type='usb'>
      <source>
        <vendor id='0x1a40'/>
        <product id='0x0101'/>
      </source>
    </hostdev>
  </devices>

添加完成后需要重新定义虚拟机

代码语言:javascript
复制
virsh define /etc/libvirt/qemu/WinServer2019.xml //改成你的虚拟机名字.xml

还有其他方法,如热添加,请参考如下: https://blog.acesheep.com/index.php/archives/720https://help.ubuntu.com/community/KVM/Managing#Adding_USB_Device_Pass-through

直通显卡

代码语言:javascript
复制
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/

代码语言:javascript
复制
    <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 的第一串数字,后门以此类推 完成后需要重新定义虚拟机

代码语言:javascript
复制
virsh define /etc/libvirt/qemu/WinServer2019.xml //改成你的虚拟机名字.xml

https://blog.acesheep.com/index.php/archives/720/

添加数据盘

可见上面我还创建了一个数据盘,我们只要按照xml照葫芦画瓢就行

代码语言:javascript
复制
    <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>

将上面按照实际情况修改,下载完后重新定义。

End

既然写到这了,为何说是失败笔记呢? 因为时间不够了,也有些其他问题,但是到这步不出意外是可以成功的了。希望对你有用。 感谢本文中提到的所有链接的作者。 引用最多的是 https://blog.acesheep.com/index.php/archives/720/ ,并已取得授权

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-3-04 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 配置iommu以支持PCI硬件直通
  • 安装KVM等软件包
  • 直通准备
    • 配置Vfio
    • 新建虚拟机
    • 直通USB设备和直通显卡
      • 直通USB
        • 直通显卡
        • 添加数据盘
        • End
        相关产品与服务
        专用宿主机
        专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档