标签归档:PVE

PVE安装OpenWrt以及Clash-Meta笔记

做个笔记,方便下次再用。

  1. PVE创建OpenWrt虚拟机,操作系统不选择任何安装介质,bios选efi引导,注意不要创建硬盘,其它自定义。
  2. https://firmware-selector.openwrt.org/选择合适的镜像并下载”COMBINED-EFI (EXT4)”的那个,把解压出来的openwrt img镜像文件用pve的ISO上传功能上传到pve里。
  3. 执行以下命令把镜像导入为虚拟机的硬盘
    qm importdisk 虚拟机ID /var/lib/vz/template/iso/openwrt-25.12.5-x86-64-generic-ext4-combined-efi.img(改成你的镜像文件名) local-zfs(存放虚拟硬盘的位置,改成你的存储库名称)
  4. 在pve的openwrt虚拟机硬件配置里把刚刚导入的盘分配到设备上,比如SATA0,然后调整它到你想要的大小。
  5. 在pve的openwrt虚拟机选项页面调整引导顺序,把刚刚分配的硬盘勾上。
  6. 接下来就可以启动虚拟机了,此时openwrt应该已经可以顺利启动。
  7. 从pve打开openwrt的shell界面开始设置。
      1. 执行vi /etc/config/network修改网络配置的以下部分:
        config interface 'lan'
                option ifname 'br-lan'
                option proto 'static'
                option ipaddr '192.168.1.1'   # 按需设置
                option netmask '255.255.255.0'# 按需设置
                option gateway '你的网关IP'    # 如有需要
                list dns '8.8.8.8'            # 如有需要

        改完以后保存退出(按”:wq回车”)。

      2. 执行/etc/init.d/network restart重启网络服务,此时应该可以ping通这个openwrt了。
      3. (可选)执行passwd设置一个root密码,然后用ssh客户端登录进行后续步骤,可以方便粘贴东西(此时的pve vnc界面是没法复制粘贴文字的)。
      4. (可选)替换apk软件源为清华源:
        sed -i 's_https\?://downloads.openwrt.org_https://mirrors.tuna.tsinghua.edu.cn/openwrt_' /etc/apk/repositories.d/distfeeds.list
        apk update
      5. (可选)有需要的话可以扩展一下openwrt的主存储空间,参照另一篇笔记
      6. (可选)安装luci界面中文语言包 apk add luci-i18n-base-zh-cn
      7. (可选)如果需要使用winscp连接,需要安装 apk add openssh-sftp-server
      8. (建议)如果这个openwrt是作为旁路网关使用的话,可以直接删除dnsmasq软件包,它的部分功能和开启tun模式的clash是冲突的,但如果你需要在这个openwrt上开启DHCP功能,则不能删除它,需要对dnsmasq进行具体的设置来消除冲突。
      9. 安装必要的包:apk add curl
      10. 你需要在局域网内准备一个socks5代理,可以开启各种梯子客户端自带的socks5代理并向局域网开放,注意windows系统要在防火墙放行代理端口。
      11. 安装clash-meta客户端(目前常用的是nikki包)
        curl -x socks5h://socks5代理地址:端口 -sSL https://github.com/nikkinikki-org/OpenWrt-nikki/raw/refs/heads/main/feed.sh | ash

        然后在luci的包管理界面安装执行nikki luci-app-nikki luci-i18n-nikki-zh-cn这三个包,注意不要使用apk直接安装,因为luci模块有后处理步骤,直接使用apk安装的话不会在web界面显示出来。

至此在pve上安装openwrt并安装clash的步骤就完成了。

[PVE]在Proxmox Virtual Environment中给虚拟机直通PCIE SATA控制器

我在PVE中跑了个TrueNAS系统,不过之前一直是通过软SCSI控制器把硬盘一块块映射到虚拟机里面去的,虽然这样能用,但这样一个问题是有性能开销,truenas也不能直接对硬盘进行最直接的控制,另一个问题是换盘的时候都要重新执行映射指令,很麻烦。

于是我想着还是得实现真正的直通才行,要实现对虚拟机来说能让硬盘即插即用最干脆的方法还是直接把整个SATA控制器映射进去,我刚好有个插在主板m.2插槽上的PCIE转SATA扩展卡,扩出来5个SATA口。

注意主板上的SATA控制器是不可以映射到虚拟机里的,一个原因是其iommu分组一定会绑定主板芯片组里其它兼职的部分无法分开,另一个原因是如果你的PVE系统盘在主板上的SATA接口上或者在通过芯片组的m.2接口上(通常是远离CPU的那个m.2接口),会导致pve启动不了。

这篇文章的主要部分就是以上我踩的坑,分享出来给同样遇到问题的人参考一下,下面是跟着AI的指导操作的步骤。

编辑PVE的配置文件,设置在PVE主机中屏蔽需要直通硬件的驱动:

  1. 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX_DEFAULT 中添加 intel_iommu=on(Intel)或 amd_iommu=on(AMD)以及 iommu=pt
  2. 如果你发现扩展卡和别的设备被捆绑在一个组里,可以添加 pcie_acs_override=downstream,multifunction
  3. 我这个AMD平台的示例:
    GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt pcie_acs_override=downstream,multifunction
  4. 编辑 /etc/modules,确保里面包含:
    vfio
    vfio_iommu_type1
    vfio_pci
    vfio_virqfd
  5. 执行proxmox-boot-tool refresh,然后重启PVE。
  6. 重启后执行以下命令检查 IOMMU 分组
    for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*}; printf '%s\t%s\n' "$n" "$(lspci -nns ${d##*/})"; done | sort -n

    如果此时你要直通的设备还是和其他设备共用一个组号,那么要考虑更换直通CPU的插槽,换插槽也没用就是没有办法了。

  7. 在刚才命令执行后你还会获得一个PCI地址,就在你设备所在行开头的那一串,类似:26:00.0,然后就要执行lspci -n -s 26:00.0查看你的设备ID(这里面的PCI地址替换成你自己设备的那个),我的设备id返回的是这个样式的:197b:0585
  8. 接下来要用vfio驱动接管你的设备,防止设备被ahci驱动接管。
    1. /etc/modprobe.d/vfio.conf中添加以下内容:options vfio-pci ids=你的设备ID
    2. /etc/modprobe.d/pve-blacklist.conf中添加:softdep ahci pre: vfio-pci
    3. 执行update-initramfs -u -k all
    4. 重启 PVE,重启后执行lspci -k -s 你的设备PCI地址,检查是否有Kernel driver in use: vfio-pci,有的话就是驱动成功被接管了。
  9. 然后就可以在虚拟机设置里添加PCIE设备了,编辑PCIE设备时选择“原始设备”,在里面选择你的SATA控制器,“所有功能”的选项不用勾,然后勾上”Rom-Bar”和”PCI-Express”保存即可。

完成以上步骤直通SATA控制器就设置好了,然后可以打开虚拟机。