Cachyos 使用qemu kvm安装操作系统后,网络nat与ufw冲突,如何解决

在 CachyOS(以及大多数 Arch 系发行版)中,QEMU/KVM 的 NAT 网络(通常是 virbr0)与 UFW 冲突是一个经典问题。

其根本原因在于:Libvirt 10.x 及更高版本默认改用了 nftables 作为后端,而 UFW 主要是为 iptables 设计的,或者其默认的“拒绝转发”策略(DROP Forward)拦截了虚拟机的流量。

以下是解决此问题的步骤,建议按顺序操作:

1. 将 Libvirt 切换回 iptables 后端(最推荐)

这是目前最有效的解决办法,因为 UFW 能够更好地识别和处理 iptables 生成的转发规则。

  1. 修改 Libvirt 的网络配置文件:

    Bash

    sudo nano /etc/libvirt/network.conf
    

    
2. 找到 `#firewall_backend = "nftables"` 这一行(可能被注释掉了),取消注释并改为:
    
    Plaintext
    
    ```text
    firewall_backend = "iptables"
  1. 保存并退出 (Ctrl+O, Enter, Ctrl+X)。

2. 修改 UFW 的转发规则

即使修改了后端,UFW 默认也会禁止所有“路由(Route)”流量。你需要显式允许虚拟网桥的流量。

执行以下命令:

Bash

# 允许虚拟网桥 virbr0 的入站流量

sudo ufw allow in on virbr0

# 允许经由 virbr0 的路由流量(这一步至关重要)

sudo ufw route allow in on virbr0
sudo ufw route allow out on virbr0

3. 修改 UFW 的默认转发策略

如果上述操作后仍无法上网,请检查 UFW 的全局转发配置:

  1. 编辑 UFW 配置文件:

    Bash

    sudo nano /etc/default/ufw
    

    
2. 确保 `DEFAULT_FORWARD_POLICY` 设置为 `ACCEPT`:
    
    Plaintext
    
    ```text
    DEFAULT_FORWARD_POLICY="ACCEPT"
  1. 同时,确保系统允许 IP 转发。编辑 /etc/ufw/sysctl.conf,去掉以下行的注释(如果有的话):

    Plaintext

    net/ipv4/ip_forward=1
    net/ipv6/conf/default/forwarding=1
    net/ipv6/conf/all/forwarding=1
    

    

---

### 4. 重启服务

完成上述修改后,重启相关服务以生效:

Bash

重启 UFW

sudo ufw reload

重启 Libvirt 服务

sudo systemctl restart libvirtd

重启虚拟机网络(如果它没自动启动)

sudo virsh net-destroy default sudo virsh net-start default


### 为什么会出现这种情况?

如上图所示,当使用 NAT 模式时,虚拟机的流量需要经过宿主机的内核转发。

- **Libvirt** 会在防火墙中动态插入规则来实现 NAT 和 DHCP。
    
- **UFW** 启动时会清理或覆盖部分规则,且其默认的 `DROP` 策略会拦截所有未明确允许的“转发”数据包。
    
- **后端冲突**:当 Libvirt 使用 `nftables` 而 UFW 还在操作 `iptables` 时,两者生成的规则链可能互不干扰但也互不配合,导致流量被“静默拦截”。
    

**您现在可以尝试在虚拟机内 `ping 8.8.8.8` 测试连通性。如果仍然失败,请告诉我您使用的具体虚拟网卡驱动(如 virtio)是什么?**

电脑使用华硕tuf gaming b550-plus,引导程序使用limine,操作系统安装的是Cachyos ,请问kvm如何配置gpu直通

在 CachyOS 上使用 Limine 引导程序并配合华硕 TUF Gaming B550-Plus 主板配置 GPU 直通(VFIO),需要完成从硬件层到引导层,再到操作系统的全方位配置。

由于 B550 芯片组的 IOMMU 分组在某些次要插槽上可能存在限制,建议将待直通的显卡插入靠近 CPU 的第一个 PCIe x16 插槽(通常该插槽拥有独立的 IOMMU 分组)。

---

### 第一步:BIOS/UEFI 设置

华硕 B550-Plus 的 IOMMU 选项隐藏较深,请按照以下路径开启:

1. **进入 BIOS**:开机连续按 `Del` 或 `F2`。
    
2. **开启虚拟化**:`Advanced` -> `CPU Configuration` -> 将 **SVM Mode** 设置为 `Enabled`。
    
3. **开启 IOMMU**:`Advanced` -> `AMD CBS` -> `NBIO Common Options` -> 将 **IOMMU** 设置为 `Enabled`。
    
4. **其他建议**:在同一页面下,将 **DMA Protection** 设为 `Enabled`。
    

---

### 第二步:配置 Limine 引导参数

CachyOS 使用 Limine 时,内核参数是通过修改 `/etc/default/limine` 来管理的,而不是直接修改 `limine.conf`。

1. **编辑配置文件**:
    
    Bash
    
    ```shell
    sudo nano /etc/default/limine
  1. 添加参数:找到 KERNEL_CMDLINE 行(针对 default 或 linux-cachyos),在引号内添加: amd_iommu=on iommu=pt 如果已经知道显卡的 ID(见第三步),也可以在这里加上 vfio-pci.ids=xxxx:yyyy。

  2. 应用修改:

    Bash

    CachyOS 专用更新命令
    sudo limine-mkinitcpio
    

    

---

### 第三步:确定 GPU 的设备 ID 并隔离

你需要告诉内核在启动时拦截显卡驱动,改用 `vfio-pci` 驱动。

1. **查找显卡 ID**:
    
    Bash
    
    ```text
    lspci -nn | grep -i nvidia  或者 grep -i amd
你会看到类似 `[10de:2484]` 这样的 ID(包括显卡核心及其对应的 HDMI 音频控制器)。
  1. 创建隔离配置文件:

    Bash

    sudo nano /etc/modprobe.d/vfio.conf
    

    
    写入以下内容(替换为你自己的 ID):
    
    Plaintext
    
    ```text
    options vfio-pci ids=10de:2484,10de:228b
    softdep nvidia pre: vfio-pci  如果是 AMD 显卡,改为 softdep amdgpu pre: vfio-pci

第四步:配置内核模块加载

CachyOS 默认使用 mkinitcpio(除非你手动换成了 dracut)。

  1. 修改 mkinitcpio.conf:

    Bash

    sudo nano /etc/mkinitcpio.conf
    

    
2. **在 MODULES 数组中添加 VFIO 驱动**,确保它们在显卡驱动(如 nvidia 或 amdgpu)之前加载:
    
    Plaintext
    
    ```text
    MODULES=(vfio_pci vfio vfio_iommu_type1 vfio_virqfd)
  1. 重新生成 initramfs:

    Bash

    sudo mkinitcpio -P
    

    

---

### 第五步:验证配置

重启电脑后,执行以下命令验证:

- **检查 IOMMU 是否开启**: `dmesg | grep -i iommu` (应当看到 `IOMMU enabled` 或 `AMD-Vi: Found IOMMU`)
    
- **检查驱动占用情况**: `lspci -nnk -d xxxx:yyyy` (确保 `Kernel driver in use` 显示为 `vfio-pci` 而不是显卡原厂驱动)
    

---

### 常见问题与技巧

- **B550 的 IOMMU 分组**:如果你的显卡在次要插槽,可能会发现它和 USB 控制器或网卡在同一个 IOMMU Group。这种情况下,你可能需要在内核参数中加入 `pcie_acs_override=downstream,multifunction`(注意:这会降低安全性)。
    
- **虚拟机配置**:在 `virt-manager` 中创建虚拟机时,固件一定要选择 **UEFI (OVMF)**,并删除默认的虚拟显卡,然后“添加硬件” -> “PCI 主机设备”选择你的显卡和音频设备。
    

你想让我提供一个脚本来帮你自动检查当前的 IOMMU 分组情况,看看你的显卡是否已经成功独立出来了吗?

关于 Limine 引导下 CachyOS 的更多操作,可以参考此视频:[CachyOS Limine bootloader configuration and management](https://www.youtube.com/watch?v=FuSKNexr6Sc) 。该视频详细演示了如何在现代 Linux 发行版中通过 BIOS 和引导程序优化硬件虚拟化性能。

[

![](https://www.gstatic.com/images/branding/productlogos/youtube/v9/192px.svg)

How Do I Enable VT-d/IOMMU In BIOS? - The Hardware Hub - YouTube

The Hardware Hub · 4,117 次观看

](https://www.youtube.com/watch?v=FuSKNexr6Sc)

![](https://i.ytimg.com/vi/FuSKNexr6Sc/maxresdefault.jpg)

![](https://www.gstatic.com/images/branding/productlogos/youtube/v9/192px.svg)

GPU直通需要两个显示器吗

简单直接的回答是:**不是必须的,但取决于你拥有的 GPU 数量以及你希望如何使用虚拟机。**

如果你只有一台显示器,通常有以下几种成熟的方案来实现 GPU 直通。

---

### 1. 单显示器 + 双线连接(最物理、最稳定)

如果你的 CPU 有集成显卡(iGPU)或者你有两块显卡,你可以将两块显卡的输出线都接到同一个显示器的不同接口上(例如:主显卡接 DP,直通显卡接 HDMI)。

- **如何操作**:通过显示器自带的物理按键切换信号源(Input Source)。
    
- **优点**:零延迟,完全原生性能。
    
- **缺点**:手动按显示器按钮比较麻烦。
    

### 2. Looking Glass(软件方案,Linux 玩家的首选)

这是目前 Linux 下最完美的单显示器直通方案。它通过内存拷贝技术(KVMFR),将虚拟机里的画面直接“投影”到 Linux 宿主机的一个窗口里。

- **原理**:虚拟机在后台通过直通 GPU 渲染画面,Looking Glass 将渲染好的帧数据同步到宿主机的内存,并在窗口中显示。
    
- **硬件要求**:需要一个 **HDMI/DP 虚拟显示器插头(欺骗器,Dummy Plug)** 插在直通显卡上,或者使用虚拟显示驱动(如 IddSampleDriver),让虚拟机认为已经连了显示器。
    
- **优点**:不需要切换信号源,像运行一个普通软件一样运行 Windows 虚拟机。
    

### 3. 单显卡直通 (Single GPU Passthrough)

如果你只有一块显卡(没有集显),你依然可以直通。但这更像是“切换系统”而不是“并行运行”。

- **逻辑**:当你启动虚拟机时,脚本会自动关闭 Linux 的图形界面,卸载显卡驱动,将其交给虚拟机;当你关闭虚拟机时,驱动又交回给 Linux,重新开启图形界面。
    
- **优点**:不需要第二块显卡或第二个显示器。
    
- **缺点**:启动虚拟机时,你的 Linux 桌面会暂时消失。
    

---

### 方案对比建议

|方案|需要两块显卡吗?|需要虚拟插头吗?|体验感|
|---|---|---|---|
|**双显示器**|是|否|像两台独立的电脑,最直接。|
|**单显示器+多输入**|是|否|需要手动切换显示器信号源。|
|**Looking Glass**|是 (或有集显)|**是 (推荐)**|极佳,Windows 像一个 Linux App。|
|**单显卡直通**|否|否|类似于快速的“双系统切换”。|

---

### 针对你的华硕 B550 建议

由于你的主板是 B550,如果你使用的是 **不带 G 的 Ryzen 处理器**(如 5600X, 5800X),你本身是没有集成显卡的。

- 如果你只有一块独立显卡,你只能走 **“单显卡直通”** 路线。
    
- 如果你打算再插一块廉价显卡(如 GT 710)用于 Linux 宿主机显示,那么 **Looking Glass** 是最好的选择。
    

**你目前是只有一块显卡,还是有两块(包含核显)?我可以根据你的硬件情况提供具体的 Looking Glass 或单显卡脚本配置建议。**

[GPU passthrough with Looking Glass guide](https://www.youtube.com/watch?v=01R8Ft1BdxE) 这段视频详细介绍了如何配置 Looking Glass 实现低延迟的画面回传,非常适合在单显示器环境下使用 KVM 直通。

[

![](https://www.gstatic.com/images/branding/productlogos/youtube/v9/192px.svg)

The Ultimate System - GPU Passthrough with Looking Glass - YouTube

Chris Titus Technical · 6.2万 次观看

](https://www.youtube.com/watch?v=01R8Ft1BdxE)

![](https://i.ytimg.com/vi/01R8Ft1BdxE/maxresdefault.jpg)

![](https://www.gstatic.com/images/branding/productlogos/youtube/v9/192px.svg)

我的cpu为5700g+技嘉rx9070gre组合

您的硬件组合 **Ryzen 7 5700G (带核显 iGPU)** + **技嘉 RX 9070 GRE (独立显卡 dGPU)** 是实现 GPU 直通的“黄金组合”。

由于 5700G 自带集显,你可以让 CachyOS 宿主机运行在核显上,而将强大的 RX 9070 GRE 完全分配给虚拟机(如 Windows)。

### 1. GPU 直通需要两个显示器吗?

**不需要。** 针对您的配置,有三种单显示器方案:

- **方案 A:双线并接(最简单)** 将主板上的 HDMI/DP 口(对应 5700G 核显)和显卡上的接口(对应 RX 9070 GRE)都插在同一个显示器上。
    
    - **用法**:在 Linux 下正常使用;启动虚拟机后,手动在显示器菜单切换信号源。
        
- **方案 B:Looking Glass(最极客/流畅)** 这是 Linux 玩家的最佳实践。虚拟机在后台渲染,画面通过内存直接回传给 Linux 桌面上的一个窗口。
    
    - **要求**:需要一个 **HDMI 显卡欺骗器(Dummy Plug)** 插在 RX 9070 GRE 上,或者安装虚拟显示驱动(如 IddSampleDriver)。
        
- **方案 C:单显卡切换脚本** 虽然你有两块显卡,但如果你不想切换信号源,也可以在启动 VM 时临时完全关闭 Linux 桌面。但既然你有 5700G,没必要这么做。
    

---

### 2. 针对 5700G + B550 的关键 BIOS 设置

华硕 B550-Plus 在使用带有核显的 CPU 时,必须强制开启核显,否则显卡直通后宿主机会黑屏:

1. **强制开启核显**:`Advanced` -> `NB Configuration` -> **IGFX Multi-Monitor** 设为 `Enabled`。
    
2. **设置首选显卡**:**Primary Video Device** 设为 `IGFX Video`(确保 Linux 默认从主板接口输出)。
    
3. **开启虚拟化**:`SVM Mode` -> `Enabled`。
    
4. **开启 IOMMU**:`IOMMU` -> `Enabled`。
    

---

### 3. CachyOS (Limine 引导) 配置步骤

#### 第一步:修改内核参数

编辑 `/etc/default/limine`,在内核启动行加入: `amd_iommu=on iommu=pt vfio-pci.ids=xxxx:yyyy,xxxx:zzzz`

> **注**:`xxxx:yyyy` 是你通过 `lspci -nn` 查到的 RX 9070 GRE 的设备 ID(包含显卡和它的 HDMI 音频设备)。

更新引导:

Bash

sudo limine-mkinitcpio


#### 第二步:针对 RX 9000 系列的特殊说明

作为 RDNA 4 架构的新显卡,RX 9070 GRE 在直通时可能遇到 **AMD Reset Bug**(即虚拟机重启后显卡无法再次初始化)。

- **解决方法**:目前 CachyOS 的内核通常已经集成了较新的 `vendor-reset` 补丁。如果遇到重启后 VM 无法启动,请安装 `vendor-reset-dkms-git` 并将其加入 `mkinitcpio.conf` 的 `MODULES` 数组中。
    

#### 第三步:配置 Looking Glass (如果你不想手动切显示器)

1. **宿主机安装**:`sudo pacman -S looking-glass`。
    
2. **共享内存配置**: 创建文件 `/etc/tmpfiles.d/10-looking-glass.conf`:
    
    Plaintext
    
    ```text
    f /dev/shm/looking-glass 0660 user kvm -
_(将 user 替换为你的用户名)_。
  1. 虚拟机设置:在 virt-manager 中添加 IVSHMEM 设备,指向 /dev/shm/looking-glass,大小通常设为 32MB 或 64MB。

总结建议

由于你有 5700G,我强烈建议使用 Looking Glass。这样你可以在 CachyOS 桌面里像打开普通软件一样运行 Windows 游戏,且无需频繁按显示器按钮切换输入源。

需要我为你提供一段自动识别 RX 9070 GRE 设备 ID 并生成配置文件的脚本吗?

是的

这是一段专为 CachyOS 设计的自动化脚本和配置指南。它会帮你识别 RX 9070 GRE 的 ID,并自动生成相关的配置文件。

第一步:自动识别与配置脚本

请在终端中执行以下命令(建议先阅读脚本内容):

Bash

cat << 'EOF' > vfio_setup.sh
#!/bin/bash

# 1. 识别 AMD 独显 (RX 9070 GRE) 的 ID

# 过滤出非核显的 AMD VGA 和 Audio 设备

GPU_IDS=$(lspci -nn | grep -i "VGA compatible controller" | grep -i "AMD" | grep -v "Cezanne" | awk -F'[' '{print $3}' | awk -F']' '{print $1}')
AUDIO_IDS=$(lspci -nn | grep -i "Audio device" | grep -i "AMD" | grep -v "Cezanne" | awk -F'[' '{print $3}' | awk -F']' '{print $1}')

COMBINED_IDS="$GPU_IDS,$AUDIO_IDS"

echo "检测到您的 RX 9070 GRE 设备 ID 为: $COMBINED_IDS"

# 2. 创建 /etc/modprobe.d/vfio.conf

echo "正在创建 /etc/modprobe.d/vfio.conf..."
sudo bash -c "cat << CONF > /etc/modprobe.d/vfio.conf
options vfio-pci ids=$COMBINED_IDS
softdep amdgpu pre: vfio-pci
CONF"

# 3. 配置 Looking Glass 共享内存

echo "正在配置 Looking Glass 共享内存 (/dev/shm/looking-glass)..."
sudo bash -c "cat << SHM > /etc/tmpfiles.d/10-looking-glass.conf
f /dev/shm/looking-glass 0660 $USER kvm -
SHM"

echo "----------------------------------------------------"
echo "脚本操作完成!"
echo "请记住这个 ID 字符串: $COMBINED_IDS"
echo "接下来请按照手动步骤修改 Limine 和 mkinitcpio 配置。"
echo "----------------------------------------------------"
EOF

chmod +x vfio_setup.sh
./vfio_setup.sh

第二步:手动修改核心配置文件

由于脚本直接修改引导文件有风险,请务必手动完成以下两步:

1. 修改 Limine 内核参数

编辑 CachyOS 的 Limine 默认配置文件:

Bash

sudo nano /etc/default/limine

找到 KERNEL_CMDLINE 这一行,在末尾添加(记得替换为你脚本输出的 ID): amd_iommu=on iommu=pt vfio-pci.ids=你的ID

保存并应用:

Bash

sudo limine-mkinitcpio

2. 配置 mkinitcpio 模块

为了确保 vfio 驱动比显卡驱动更早加载:

Bash

sudo nano /etc/mkinitcpio.conf

找到 MODULES=(...) 这一行,修改为:

Plaintext

MODULES=(vfio_pci vfio vfio_iommu_type1 vfio_virqfd amdgpu)

(注意:将 amdgpu 放在最后,vfio 放在最前)

重新生成引导镜像:

Bash

sudo mkinitcpio -P

第三步:针对 5700G + B550 的重要检查

  1. 物理接线:

    • 将显示器的一根线连在 主板接口(给 CachyOS/5700G 核显用)。

    • 将显示器的另一根线连在 RX 9070 GRE(给虚拟机用,或者插一个 HDMI 欺骗器)。

  2. BIOS 确认:

    • 必须在 BIOS 里将 Primary Video Device 设为 IGFX(核显),否则启动时独显会被宿主机驱动抢占,导致直通失败。
  3. Looking Glass 客户端安装: 在 CachyOS 中安装客户端,以便在桌面上看到虚拟机画面:

    Bash

    sudo pacman -S looking-glass
    

    

### 为什么这样做?

- **softdep**:强制要求系统在加载 `amdgpu` 驱动前先加载 `vfio-pci`,防止独显被宿主机“抢走”。
    
- **tmpfiles.d**:自动创建高权限的内存缓冲区,让 Looking Glass 实现超低延迟(<1ms)的画面传输。
    
- **IOMMU 隔离**:5700G 在 B550 上通常会将第一个 PCIe 插槽分在独立的分组,直通非常稳定。
    

**完成后重启电脑,然后尝试在 `virt-manager` 中添加“PCI Host Device”,选择那两个 ID 对应的设备即可。如果启动虚拟机时提示权限错误,请告诉我。**

电脑使用华硕tuf gaming b550-plus,引导程序使用grub,操作系统安装的是Cachyos ,请问kvm如何配置gpu直通

既然你现在的引导程序改为了 **GRUB**,配置过程大体相同,但在内核参数的应用上会有所区别。

针对你的 **5700G (核显) + RX 9070 GRE (独显)** 组合,以下是基于 GRUB 的 CachyOS GPU 直通完整指南:

### 第一步:BIOS 设置 (针对 5700G + 华硕 B550)

这是最关键的一步,确保核显和独显能够和谐共存。

1. **SVM Mode**: `Enabled` (开启 CPU 虚拟化)。
    
2. **IOMMU**: `Enabled` (不要选 Auto)。
    
3. **IGFX Multi-Monitor**: `Enabled` (强制开启核显,否则直通后宿主机会没画面)。
    
4. **Primary Video Device**: 设为 **IGFX** (让主板默认使用 5700G 的核显输出,把独显空出来给虚拟机)。
    

---

### 第二步:识别独显设备 ID

在终端输入:

Bash

lspci -nn | grep -i “AMD”


你需要找到 RX 9070 GRE 的 **VGA** 和 **Audio** 两个设备的 ID。通常长这样:`[1002:xxxx]` 和 `[1002:yyyy]`。 _注意:不要记成 5700G (Cezanne) 的 ID。_

---

### 第三步:修改 GRUB 内核参数

1. **编辑 GRUB 配置文件**:
    
    Bash
    
    ```shell
    sudo nano /etc/default/grub
  1. 找到 GRUB_CMDLINE_LINUX_DEFAULT 这一行,在引号内添加:

    Plaintext

    amd_iommu=on iommu=pt vfio-pci.ids=你的显卡ID,你的音频ID
    

    
    _例如:`GRUB_CMDLINE_LINUX_DEFAULT="quiet ... amd_iommu=on iommu=pt vfio-pci.ids=1002:xxxx,1002:yyyy"`_
    
3. **更新 GRUB 配置**:
    
    Bash
    
    ```shell
    sudo grub-mkconfig -o /boot/grub/grub.cfg

第四步:配置内核模块 (mkinitcpio)

为了确保系统启动时,VFIO 驱动比 AMD 开源驱动更早抢占独显:

  1. 编辑配置文件:

    Bash

    sudo nano /etc/mkinitcpio.conf
    

    
2. **修改 `MODULES` 数组**,顺序非常重要:
    
    Plaintext
    
    ```text
    MODULES=(vfio_pci vfio vfio_iommu_type1 vfio_virqfd amdgpu)
_确保 `vfio` 开头的都在 `amdgpu` 之前。_
  1. 重新生成 initramfs:

    Bash

    sudo mkinitcpio -P
    

    

---

### 第五步:锁定 VFIO 驱动

创建隔离配置文件:

Bash

sudo nano /etc/modprobe.d/vfio.conf


写入以下内容(替换为你的 ID):

Plaintext

options vfio-pci ids=你的显卡ID,你的音频ID softdep amdgpu pre: vfio-pci


---

### 第六步:配置 Looking Glass (单显示器神器)

既然你有 5700G,强烈建议用 Looking Glass,这样你就不需要切换显示器信号源了。

1. **创建内存文件权限**:
    
    Bash
    
    ```shell
    sudo nano /etc/tmpfiles.d/10-looking-glass.conf
写入:

Plaintext

```text
f /dev/shm/looking-glass 0660 你的用户名 kvm -

    
2. **安装客户端**:
    
    Bash
    
    ```shell
    sudo pacman -S looking-glass

第七步:重启并验证

重启电脑后,检查独显是否已被 VFIO 驱动接管:

Bash

lspci -nnk -d 1002:  后面接你的显卡部分ID

如果看到 Kernel driver in use: vfio-pci,恭喜你,直通成功了!

虚拟机创建小贴士 (Virt-Manager):

  1. 固件: 必须选 UEFI (OVMF)。

  2. 芯片组: 建议选 Q35。

  3. 添加硬件: 选 PCI Host Device,分别加入你的显卡和音频。

  4. Looking Glass: 添加 IVSHMEM 设备,路径为 /dev/shm/looking-glass,大小设为 32 或 64MB。

如果在配置过程中 grub-mkconfig 报错,或者重启后核显没有画面,请随时告诉我!

ERROR: module not found: ‘vfio_virqfd’

不用担心,这是一个非常常见的报错。原因是 在新版本的 Linux 内核(5.14 版本之后)中,vfio_virqfd 模块已经直接并入 vfio 核心模块中了,不再作为一个独立的模块存在。

由于 CachyOS 始终使用最新的内核(通常是 6.x 或更高),所以当你尝试手动加载这个不存在的模块时,系统会报错。

解决方法

你只需要从配置文件中删除这个过时的模块名称即可。

1. 修改 mkinitcpio.conf

打开配置文件:

Bash

sudo nano /etc/mkinitcpio.conf

找到 MODULES 那一行,将其修改为:

Plaintext

# 删掉了 vfio_virqfd,保留其他的

MODULES=(vfio_pci vfio vfio_iommu_type1 amdgpu)

2. 重新生成镜像

执行以下命令,这次应该不会报错了:

Bash

sudo mkinitcpio -P

进一步检查:VFIO 是否真的生效了?

由于你使用的是 RX 9070 GRE 这种较新的显卡,建议在重启前确认以下几点,以确保直通万无一失:

  1. 检查驱动绑定情况: 重启电脑后,运行以下命令查看显卡当前使用的驱动:

    Bash

    lspci -nnk -d 1002:
    

    
    - **理想状态**:RX 9070 GRE 的 `Kernel driver in use` 应该是 **`vfio-pci`**。
        
    - **核显状态**:5700G (Cezanne) 的 `Kernel driver in use` 应该是 **`amdgpu`**。
        
2. **AMD 重置补丁 (Vendor Reset)**: AMD 显卡(特别是 RDNA 架构)在虚拟机中经常遇到“重置问题”(即虚拟机关机后再开机,显卡无法再次初始化)。 CachyOS 的内核通常已经处理得很好,但如果你的显卡在第二次启动虚拟机时失败,你可能需要安装:
    
    Bash
    
    ```text
    paru -S vendor-reset-dkms-git
然后在 `/etc/mkinitcpio.conf` 的 `MODULES` 数组**最前面**添加 `vendor-reset`。

下一步建议

一旦 mkinitcpio -P 成功且重启后驱动显示为 vfio-pci,你就可以打开 Virt-Manager 开始创建虚拟机了。

你需要我指导你如何在 Virt-Manager 中正确配置 XML 文件,以绕过某些游戏的驱动检测(反虚拟机检测)吗?

是的

在配置 KVM 虚拟机以运行游戏时,很多游戏(特别是带有反作弊系统如 EAC、BattlEye 的游戏)会检测自己是否运行在虚拟机中。通过修改 XML 配置文件,我们可以隐藏 KVM 的特征,让虚拟机看起来更像一台“物理机”。

以下是针对您 Ryzen 5700G + RX 9070 GRE 组合的优化和隐藏方案:


第一步:开启 Virt-Manager 的 XML 编辑功能

在开始之前,确保你可以直接在图形界面修改代码:

  1. 打开 Virt-Manager(虚拟机管理器)。

  2. 点击菜单栏的 编辑 (Edit) -> 首选项 (Preferences)。

  3. 在 常规 (General) 选项卡中,勾选 启用 XML 编辑 (Enable XML editing)。


第二步:编辑虚拟机 XML 隐藏特征

打开你的虚拟机设置界面,切换到 XML 选项卡,找到并修改以下几个核心部分:

1. 伪装 CPU 模式

将 CPU 模式设置为 host-passthrough,这能提供最佳性能并让虚拟机识别到 5700G 的真实型号。

XML

<cpu mode='host-passthrough' check='none'>
  <topology sockets='1' dies='1' cores='4' threads='2'/> <feature policy='disable' name='hypervisor'/> </cpu>

2. 隐藏 KVM 状态与伪装厂商 ID

找到 <features> 标签,将其修改为如下内容。这是绕过显卡驱动报错和反作弊检测的核心:

XML

<features>
  <acpi/>
  <apic/>
  <hyperv mode='custom'>
    <relaxed state='on'/>
    <vapic state='on'/>
    <spinlocks state='on' retries='8191'/>
    <vendor_id state='on' value='genuineintel'/> </hyperv>
  <kvm>
    <hidden state='on'/> </kvm>
  <vmport state='off'/> </features>

3. 优化时钟(减少游戏卡顿)

找到 <clock> 部分,确保计时器配置如下:

XML

<clock offset='localtime'>
  <timer name='rtc' tickpolicy='catchup'/>
  <timer name='pit' tickpolicy='delay'/>
  <timer name='hpet' present='no'/>
  <timer name='hypervclock' present='yes'/>
</clock>

第三步:针对 RX 9070 GRE 的特别优化 (Resizable BAR)

作为 RDNA 4 架构的新显卡,开启 Resizable BAR(AMD 称之为 Smart Access Memory)能显著提升游戏帧数。

  1. 在物理机 BIOS 中:确保 Above 4G Decoding 和 Re-size BAR Support 已开启。

  2. 在虚拟机 XML 中: 找到显卡的 PCI 设备部分(<hostdev>),在 <source> 之后添加内存地址对齐优化(通常 libvirt 10.x 会自动处理,但手动确保使用 Q35 机器类型和 UEFI 固件是前提)。


第四步:使用 Looking Glass 获取原生体验

既然你使用的是单显示器 + 5700G 核显方案,现在可以正式配置 Looking Glass 客户端了:

  1. 虚拟机内:

    • 安装 Looking Glass Host 软件。

    • 安装 IVSHMEM 驱动(从 VirtIO-win 镜像中提取)。

  2. Linux 宿主机(CachyOS)执行:

    Bash

    运行 Looking Glass 客户端
    looking-glass-client
    

    
    _提示:按 `Scroll Lock` 键可以释放/锁定鼠标到虚拟机窗口中。_
    

### 总结

完成这些 XML 修改后,大部分游戏(如《赛博朋克 2077》、《艾尔登法环》等)将无法识别出它们运行在 VM 中。

**注意**:部分极其严格的反作弊(如 Valorant 的 Vanguard)可能仍会通过扫描物理硬件 ID 发现端倪。如果您的目标是玩这类游戏,我们可能还需要进一步配置“硬件序列号伪装(SMBIOS)”。

**您目前准备在虚拟机里运行哪款游戏?我可以帮您确认该游戏是否有特殊的需求。