無標題文檔

Clear Linux 下 KVM 硬件直通配置

前言

Clear Linux 是针对 Intel 平台的滚动 Linux 发行版。它有很多优势,我个人目前主要用来针对老机型(四代酷睿平台)的裸机运行平台,并主要用来跑虚拟机。

由于 Clear Linux 是过于强调精简的发行版,因此配置方面需要额外的精力,所在这里针对 KVM 虚拟机的配置做个记录。

BIOS 配置

针对硬件直通这块,首先需要 CPU 的支持,四代平台支持 VT-D 功能的不多,主要集中在 i5、i7 的 CPU。个人购买过四代 i3 的 CPU 发现并不支持硬件直通,所以又退款换货非常的折腾。

了解了支持的 CPU 以后,然后在 BIOS 中对应的开启虚拟化以及 VT-D,这里就不表。

内核配置

和其他的发行版不同,Clear Linux 的引导器是 Intel 自己研发的 clr-boot-manager。内核的参数文件具体的文件路径在 /etc/kernel/cmdline.d/ 这个目录中,然后对应的示例文件 iommu.conf:

intel_iommu=on iommu=pt vfio_iommu_type1.allow_unsafe_interrupts=1 vfio-pci.ids=<id>,<id>

这个 ID 是 PCI ID,对应的可以使用 lspci -nn 获得,例如列出网卡的 PCI ID:

$ lspci -nn | grep -i Ether
00:19.0 Ethernet controller [0200]: Intel Corporation Ethernet Connection I217-V [8086:153b] (rev 04)
02:00.0 Ethernet controller [0200]: Intel Corporation I210 Gigabit Network Connection [8086:1533] (rev 03)

同时,需要注意的是 IOMMU Group 分组是否在一个组中(这个可能需要 PCI 设备的支持),可以使用以下简单的 Shell 脚本查看(来自 Arch 的 Wiki):

#!/bin/bash
shopt -s nullglob
for g in `find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V`; do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done;
done;

然后,使用 clr-boot-manager update 生成启动配置,然后 reboot 重启后查看 cat /proc/cmdline 内核引导参数是否已经生效。

Qemu 配置

查看 Qemu 下 PCI 的设备列表,例如

$  virsh nodedev-list | grep pci
pci_0000_00_00_0
pci_0000_00_02_0
pci_0000_00_03_0
pci_0000_00_14_0
pci_0000_00_16_0
pci_0000_00_19_0
pci_0000_00_1a_0
pci_0000_00_1c_0
pci_0000_00_1c_3
pci_0000_00_1d_0
pci_0000_00_1f_0
pci_0000_00_1f_2
pci_0000_00_1f_3
pci_0000_02_00_0

那么根据对并上面

$ lspci -nn | grep -i Ether
00:19.0 Ethernet controller [0200]: Intel Corporation Ethernet Connection I217-V [8086:153b] (rev 04)
02:00.0 Ethernet controller [0200]: Intel Corporation I210 Gigabit Network Connection [8086:1533] (rev 03)

两块网卡的 ID 分别为 pci_0000_00_19_0 和 pci_0000_02_00_0 ,然后我们 dump 出配置来

$ virsh nodedev-dumpxml pci_0000_00_19_0
<device>
  <name>pci_0000_00_19_0</name>
  <path>/sys/devices/pci0000:00/0000:00:19.0</path>
  <parent>computer</parent>
  <driver>
    <name>vfio-pci</name>
  </driver>
  <capability type='pci'>
    <class>0x020000</class>
    <domain>0</domain>
    <bus>0</bus>
    <slot>25</slot>
    <function>0</function>
    <product id='0x153b'>Ethernet Connection I217-V</product>
    <vendor id='0x8086'>Intel Corporation</vendor>
    <iommuGroup number='4'>
      <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
    </iommuGroup>
  </capability>
</device>

例如以上就可以 dump 出具体 PCI 信息的来,可以比较直观的看到 product id 以及生产商 vendor id 等信息。这里需要的几个参数分别是 domainbusslot、以及 function

我们分别记录下来,然后填写到以下的 xml 片段中,例如上面对应的数值就是

<hostdev mode='subsystem' type='pci' managed='yes'>
  <driver name='vfio'/>
  <source>
    <address domain='0' bus='0' slot='25' function='0'/>
  </source>
</hostdev>

可以直接使用十进制数值,因为 virsh edit 在编辑保存的时候会自动计算其原始的十六进制数值。

验证

使用 virsh edit 编辑对应的虚拟机配置,例如 virsh edit <my-machine> 。在编辑器中将上述 的 xml 粘贴入 devices 这个 xml 块中,保存关机然后在启动虚拟机即可生效。

在启动虚拟机以后,例如上述的网卡直通可以使用 ip a 等命令查看虚拟机有无识别到对应的物理网卡。如果一切顺利,那么就可以使用对应的网络配置程序来配置对应网卡的网络信息,这里不在复述。

常见问题

  1. 查看 IOMMU Group 中的设备是否分别在不同的组中,如果多个设备在同个组中,则需要额外的操作(参见 Arch Wiki 的内容);
  2. 如果物理机设备被直通出去,那么就无法使用该设备以及设备树下的子设备。例如,如果直通 USB 控制器给虚拟机,那么这个控制器下的键盘、鼠标都只能在虚拟机下使用;
  3. 直通的内核模块应该优先于其对应的物理设备驱动,否则会造成冲突造成无法直通,因此可以考虑搭配内核 blacklist 使用。

最后,如果服务器是 Intel 平台的,强烈建议尝试下 Clear Linux 你会爱上它的!

参考信息

正确配置 WSL2 的宿主机文件权限

在 Windows 平台通过 Docker Desktop 部署 Syncthing 的时候发现文件全部被重新同步了,究其原因是因为 Windows 下的文件系统权限 meta 信息没有带过来。

Docker Desktop 支持在 WSL2 下运行 Docker,也就是说可以使用以前同样的配置去解决 WSL 的宿主机(也就是 Windows 系统)的文件权限问题。

找个 PowerShell 打开 docker-deskop 的 WSL2 虚拟机终端

wsl -d docker-desktop

然后找到文件 /etc/wsl.conf ,建议保险起见先备份原有的配置。增加或修改对应的配置如下:

[automount]
enabled = true
root = /mnt/host
options = "metadata,umask=22,fmask=111"
mountFsTab = true

[filesystem]
umask = 022

然后重启 Docker Desktop 就可以了。PS,有其他 WSL2 访问宿主机碰到类似文件的权限问题也可以这样子处理。

- eof -

FreeBSD 下更新 PowerEdge H700 阵列卡的固件

经过一段时间的使用以后,NAS 的情况基本的稳定,同时将系统迁移到了 FreeBSD(主要是为了使用 ZFS)。不得不说,FreeBSD 下对于硬件阵列卡的支持是非常棒的,例如 PowerEdge H700 就有原生工具 mfiutil 支持再也可以不用那逆天的 MegaCli 命令行了

Screen Shots

偶然看到 PowerEdge H700 的固件持续更新到了 2015 年,而我查看了下目前的固件版本是 2012 年的。更新的固件主要修复了很多问题,应该说是比较稳定的了,于是考虑升级下(反正闲着也是闲着)。

看了下 mfiutil 的文档是支持 flash 固件的,但是官方提供的 BIN 包是针对 Linux 的。查找了下解决方案,发现有个类似的可以参考。主要步骤是先解压缩官方 BIN 包:

[root@centos ~]# ./SAS-RAID_Firmware_9FVJ2_LN_12.10.7-0001_A13.BIN --extract /tmp/
[root@centos ~]# ll /tmp/payload/FW4651I.rom

然后提取到 .rom 这个文件,例如,我这边的 ROM 文件名是 FW4651A.rom 。然后将这个文件扔到 FreeBSD 下,用 root 身份进行更新:

mfiutil flash FW4651A.rom

更新的过程比较顺利,内核会有相应的硬件更新提示信息,建议在执行完毕以后 reboot 下机器。

Screen Shots

然后,再次查看固件版本,就可以发现已经升级到最新了。最后,提供下这个版本的 ROM 文件(谨慎使用)

- eof -

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章