点击展开更新日志

2024

11-16

  1. 创建了这篇文
  2. 补充了 PVE

11-19

  1. 更新 OP 镜像自编译部分
  2. opkg 软件源

11-19

  1. 更新 iKuai 部署
  2. 更新封面
  3. 补充截图

11-27

  1. 更新 Adguard Home 配置
  2. 新增 LXC Ubuntu 安装
  3. 新增 lucky 部署

11-28

  1. 新增“影视库”章节

2025

02-07

  1. 更新 PVE 系统更新命令

02-14

  1. 更新PVE备份和恢复
  2. 废弃 Ubuntu 安装章节
  3. 更新 Win10 安装章节

02-14

  1. 新增 LEDE 自编译 OpenWrt
  2. 新增 passwall 配置

0412

更新底层更换为 Windows Server 部分,主要是驱动安装。

nexttime

会有些什么呢 ˋ( ° ▽、° )

源起

折腾这种事,一旦开始了就很难再停下来。随着接触的设备越多,手上的设备越多,总会逐渐了解到更多相关、更多认知之外的新事物,然后便是产生兴趣,再加上有点闲钱,有点时间,不自觉,就已经开始踏入到另一个圈子——软路由。

去年是买了一个小米的 AX3000T,用着倒也没有什么问题,虽然一直想着刷成 OpenWRT 之类,但是忌惮成砖之后救不回来,属于是有心无胆。今年双十一之前在 B 站恰好刷到了软路由,难免心痒,看了眼自己的荷包,咬咬牙,这个月就收敛一下,买了!

关于本文的组织结构及排版,均为实际部署过程中修正过的建议安装顺序(实际牵扯太多已经不可调整,如果重新部署建议按照这个顺序)。至少目前已基本实现我的需求,如果你也和我差不多,可以参考一下,毕竟想要达到什么程度,还得自己上手慢慢打磨。

硬件

康奈信 7505

  • CPU:Intel 奔腾 7505
    • 2C4T 最大睿频 3.5GHz
    • 最大支持 64G D4 内存
    • 核显 Intel 11 代 UHD 最大 1.25GHz
  • 网卡:I226V x6
  • 接口:USB3.0x2 USB2.0x2 COMx1 TYPE-Cx1
  • 存储:M22280x1 SATA2.5x1
  • 显示:HDMI2.0 DP

整体架构

软硬件设备

  • ONT: 光猫
  • PVE: 软路由
    • iKuai: 主路由,流量控制(蹭的室友的网,有时候上传太大会有影响),DHCP。
    • ImmortalWrt: 旁路由,承担广告过滤等扩展功能
    • DSM: 黑群(只是因为没用过)
  • AX3000T: 小米路由,主要做无线 AP,探索世界。ImmortalWrt

底层选择——PVE

刚买来的时候开机是已经装好了 ikuai,不过我最开始的打算,就不单单只想装个 ikuai[^1],所以到手就开始准备重装系统。可以选择直接单装软路由系统,也可以选择先装一个虚拟平台,在这个基础上再部署其它应用,这里选择后者。

纠结了几十分钟吧,翻了下网上的帖子,最终还是选择了 PVE ,无他,开源。

声明:

截止 2024-11-16,官网最新版本为 8.2,以下所有操作均在此版本上进行,其它版本可参考。不保证所有操作和命令一切顺利,不保证在其它版本上的兼容性。

PVE 安装

  1. 先到 PVE 官网下载 iso 镜像,直接下载最新版本即可;
  2. 将镜像刻录到启动 U 盘,如果不想频繁格式化 U 盘(每次刻录都得格式化一次),建议使用 Ventory
  3. 将 U 盘插入主机,重启进入 BIOS(点按 del),如果不是就找找其它教程/谷歌;
  4. 选择 PVE 镜像启动,两次默认直接回车,进入 GUI 安装界面
    • 管理 IP:任意 192.168.x.x 局域网 IP 皆可,不建议用 192.168.x.1 的地址,这个是计划留给 OpenWrt 的。
    • 网关:192.168.x.1
    • 主机名、邮箱、密码自定义
    • 磁盘:注意不要选择到启动盘
  5. 安装完成后会自动重启,此时拔下 U 盘,否则重启就还是会进入 Ventory。重启加载完成后会看到登录提示,上面有一个类似 https://192.168.x.x:8006 的管理地址;
  6. 找一根网线,连接主机和电脑(此时主机上应该只有这一个网卡接到电脑,暂时先不要接入网线),修改电脑 IPv4 为手动模式,设置 IP 为【192.168.x.x】,和刚才设置的 PVE 管理地址同一网段,子网掩码【255.255.255.0】,网关【192.168.x.1】,DNS【8.8.8.8】,浏览器打开设置的 PVE 管理地址的8006端口 https://192.168.x.x:8006,即可进入 PVE 管理页面;
  7. 先选择语言为中文,然后输入用户名【root】,密码【安装时设置的】,登录。至此,PVE 安装完成。

PVE 优化

其实这个时候就可以直接使用了,但是显然刚才登录时的弹窗貌似让人有点不爽;软件更新源也是国外源,速度有影响;概览界面看到的信息也比较少等等(但实际上好像也并不是不可忍受的诶(❁´◡`❁)

添加网卡

选择【pve】节点-【网络】-【创建】-【Linux Bridgr】,勾选【自动启动】,在桥接端口填入上面 ``enp2s0类似网卡名称,需要用的话都要加上,然后会有vmbr0` 这类多个设备可供虚拟机/CT 使用。

添加网卡

注意实际网卡名称!我这里网卡名称是 enpxs0 ,如果你的不是这个,根据实际情况修改。暂时用不到的网卡(比如 enp7s0)可以先不用添加。

合并 lvm

参考 alay.cc

PVE 在默认安装完成时会把存储划分成 locallocal-lvm 两块,本意是将 lvm 镜像和虚拟机分开存放,但实际使用中往往一个不够用,一个用不完。所以一般是将 local-lvm 的空间全部分配给 local ,自己做管理。

如果在此之前已经创建了虚拟机,需要先移动到 local :编辑 【local】,勾选所有内容,在虚拟机配置栏,选择磁盘,移动到其它磁盘上备份。

先执行命令删除卷

1
2
3
4
5
lvremove /dev/pve/data
lvextend -rl +100%FREE /dev/pve/root

# 查看扩容后的情况
df -h

然后在 PVE 【数据中心】-【存储】上选择 local-lvm 删除。

删除订阅弹窗

非商业版会在每次登录时弹出提醒,执行删除:

1
sed -Ezi.bak "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js && systemctl restart pveproxy.service

Shift + F5 清理浏览器缓存重新登录。

配置软件源

默认是企业订阅版,如果不做修改,在使用 pveceph init 进行 ceph 初始化安装的时候会将整个环境破坏。主要还是因为下载速度的原因。

建议用专门的 SSH 工具(XShell、MobaXterm 等)连接,也可以使用 PVE 页面上的控制台。

  1. 删除企业源

    1
    2
    3
    rm -rf /etc/apt/sources.list.d/pve-enterprise.list
    # 不放心的可以mv备份
    mv /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak
  2. 更新 Proxmox 软件源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 任选其一即可
    # 南大NJU源
    echo "deb https://mirrors.nju.edu.cn/proxmox/debian bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list
    apt update && apt dist-upgrade #更新软件,可不执行

    # 中科大源
    wget https://mirrors.ustc.edu.cn/proxmox/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
    echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list
    apt update && apt dist-upgrade #更新软件,可不执行

    # 清华源
    echo "deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list


  3. 更新 Debian 系统源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 阿里源
    sed -i.bak "s#ftp.debian.org/debian#mirrors.aliyun.com/debian#g" /etc/apt/sources.list #阿里Debian源
    sed -i "s#security.debian.org#mirrors.aliyun.com/debian-security#g" /etc/apt/sources.list #阿里Debian源
    apt update && apt-get install -y apt-transport-https ca-certificates --fix-missing

    # 华为源
    sed -i.bak "s#http://ftp.debian.org#https://repo.huaweicloud.com#g" /etc/apt/sources.list #华为Debian源
    sed -i "s#http://security.debian.org#https://repo.huaweicloud.com/debian-security#g" /etc/apt/sources.list #华为Debian源
    apt update && apt-get install -y apt-transport-https ca-certificates --fix-missing

    # 中科大源
    sed -i 's|^deb http://ftp.debian.org|deb https://mirrors.ustc.edu.cn|g' /etc/apt/sources.list
    sed -i 's|^deb http://security.debian.org|deb https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list

    # 一键替换脚本
    bash <(curl -sSL https://linuxmirrors.cn/main.sh)
  4. 更新 LXC 仓库源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 南大NJU源
    sed -i.bak "s#http://download.proxmox.com/images#https://mirrors.nju.edu.cn/proxmox/images#g" /usr/share/perl5/PVE/APLInfo.pm
    wget -O /var/lib/pve-manager/apl-info/mirrors.nju.edu.cn https://mirrors.nju.edu.cn/proxmox/images/aplinfo-pve-7.dat
    systemctl restart pvedaemon

    # 中科大源
    sed -i.bak "s#http://download.proxmox.com/images#https://mirrors.ustc.edu.cn/proxmox/images#g" /usr/share/perl5/PVE/APLInfo.pm
    wget -O /var/lib/pve-manager/apl-info/mirrors.ustc.edu.cn https://mirrors.ustc.edu.cn/proxmox/images/aplinfo-pve-7.dat
    systemctl restart pvedaemon
  5. 更新 CEPH 源

    1
    2
    3
    4
    echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-quincy bookworm no-subscription" > /etc/apt/sources.list.d/ceph.list     #中科大源

    cp /usr/share/perl5/PVE/CLI/pveceph.pm /usr/share/perl5/PVE/CLI/pveceph.pm.back
    sed -i.bak "s#http://download.proxmox.com/debian#https://mirrors.ustc.edu.cn/proxmox/debian#g" /usr/share/perl5/PVE/CLI/pveceph.pm #中科大源
  6. 更新软件包升级系统

    1
    2
    3
    4
    5
    6
    # 更新源列表
    apt update
    # 升级软件包
    apt upgrade
    # 升级系统
    apt dist-upgrade

补充 PVE 显示信息

默认情况就没有截图了,可以看你自己刚装好的情况,补充之后的情况是这样:

PVE 补充显示信息

主要是增加了温度显示。

提供两个可选:

我这里采用了第一个,Github 里面很详细了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 更新 Proxmox VE 软件包
export LC_ALL=en_US.UTF-8
apt update && apt upgrade -y

# 安装 git 和 wget
apt install git wget

# 拉取脚本
mkdir github
cd github
git clone https://github.com/KoolCore/Proxmox_VE_Status.git # 如果报错就多执行几次,GitHub是这样的

# 进入脚本命令目录
cd Proxmox_VE_Status

# 执行脚本
bash ./Proxmox_VE_Status_zh.sh

# 执行硬件直通脚本
bash ./passthrough.sh

如果要还原,则执行以下四条命令:

1
2
3
4
sed -i '/PVE::pvecfg::version_text();/,/my $dinfo = df/!b;//!d;s/my $dinfo = df/\n\t&/' /usr/share/perl5/PVE/API2/Nodes.pm
sed -i '/pveversion/,/^\s\+],/!b;//!d;s/^\s\+],/\t value: '"'"''"'"',\n\t},\n&/' /usr/share/pve-manager/js/pvemanagerlib.js
sed -i '/widget.pveNodeStatus/,/},/ { s/height: [0-9]\+/height: 300/; /textAlign/d}' /usr/share/pve-manager/js/pvemanagerlib.js
systemctl restart pveproxy

iommu 直通

因为不熟悉这块,不确定是否会产生新问题,暂时没弄。

上面增加 PVE 显示信息的脚本就附带开启了硬件直通。

PVE 更新

因为本质上还是 Ubuntu,因此直接在命令行更新即可,包括小版本更新,至于大版本没试过~

1
2
apt update
apt list --upgradeable

PVE 备份与恢复

备份

起因是 手贱 更新系统之后重新执行了一遍上面的硬件直通脚本,然后就挂了。。进入救援模式也没有看出个所以然,然后重装了PVE,容器自然是没有了,后面重装之后痛定思痛,我要备份!

备份的核心就是将外部共享目录挂载到 PVE 上,将备份目录修改到这个共享目录。我的情况是PVE装在软路由上,备份是打算放到 Windows 上,因此以此为例说明。

  1. 在 Windows 备份盘上创建备份(共享)目录,比如 D:\PVE\backup

  2. 设置目录共享和权限;

    • 管理员:无需设置权限。(只是自己用的话,没必要单独创建一个用户用来挂载)
    • 新创建一个用户:或许需要设置管理员权限才能正常挂载读写,因为我创建了一个普通用户挂载正常,无权限访问(可能和root有关)。
    • Everyone:需要启用 Guest 用户。
  3. PVE 挂载共享目录:
    选择【数据中心】-【存储】-添加【SMB/CIFS】

    • ID:自定义在 PVE 中显示的名称,比如 pve_bak
    • 服务器:共享目录的Windows机器,IP/域名,比如 192.168.19.10
    • 用户名/密码:我直接用的个人管理员账户
    • 内容:选择【VZDump备份文件】就够了,仅作备份
    • Share:如果上面地址和帐密正确可以看到共享目录列表,没有就说明用户名/密码/目录权限/用户权限有问题。选择保存位置
    • 启用:勾选
  4. 配置备份
    在【数据中心】-【备份】,新增一个备份作业。

    • 节点:虚拟机/容器位置(一般一个节点没选的)
    • 存储:选择上面添加的外部存储,如 pve_bak
    • 计划:每周日1:00(你问可以修改吗,不知道哦~)
    • 选择模式:所有(按需吧)
    • 压缩:ZSTD(都告诉你了,又快又好)
    • 模式:停止
      • 停止(stop):要停机,能够最好保持数据一致性。
      • 挂起(suspend):挂起+snapshot,官方建议直接 snapshot
      • 快照(snapshot):停机时间最短,代价是备份数据可能不一致
    • 启用:勾选

    配置完成后,可以【现在运行】一次,到 Windows 看看备份是否正常。

恢复

前面操作和备份一致,需要先将备份目录挂载到 PVE 上,然后就可以在数据中心下面的节点(PVE)上看到挂载目录(pve_bak),选择【备份】,可以看到之前的备份,选择需要的版本【还原】即可。

已测试过删除已有虚拟机后还原开机,结果杠杠的!

底层选择——Windows Server

安装

下载地址:MSDN-itellyou

驱动安装

网卡驱动

参考链接:Windows Server 2022安装Intel I225-V/I226-V驱动 - 夸克之书

  1. 下载网卡驱动
    从官网 下载驱动 ,根据设备网卡选择对应的型号,进入【下载】页面下载驱动,比如 I226V驱动下载

  2. 获取网卡硬件ID

    在【设备管理器】-右键【以太网控制器】-【属性】-【详细信息】,属性选择【硬件ID】,复制:

    1
    2
    # I226V
    PCI\VEN_8086&DEV_125C&SUBSYS_00008086&REV_04
  3. 修改驱动
    将下载的驱动解压,打开 PRO2500\Winx64\WS2022\e2f.inf (2.5G网卡-Windows Server 2022)编辑:
    搜索网卡硬件ID(只需要前面一部分):PCI\VEN_8086&DEV_125C,找到所在行,复制整行到 [Intel.NTamd64.10.0...17763] 节下面:
    image-20250410212948642

    保存后将驱动目录复制到 Windows Server 2022的服务器上。

  4. 禁用驱动签名和开启测试模式
    修改了inf之后,过不了签名验证,需要禁用签名验证才能安装,管理员CMD执行:

1
2
bcdedit -set loadoptions DISABLE_INTEGRITY_CHECKS # 禁用驱动程序签名强制验证
bcdedit -set TESTSIGNING ON # 启用测试签名
  • BCD(Boot Configuration Data):修改Windows启动配置数据
  • 开启测试签名后桌面右下角会显示“测试模式”

修改后重启机器。

  1. 安装驱动
    重启后,打开【设备管理器】,右键未知的以太网控制器,选择【更新驱动程序和软件】-【浏览我的电脑以查找驱动程序】,定位到驱动目录,弹出无法验证驱动警告时选择【始终安装此驱动程序软件】,此时驱动就可以安装上了。
    依次安装其它网卡驱动。

  2. 关闭测试模式
    驱动安装完成后管理员CMD执行:

    1
    2
    bcdedit -set loadoptions ENABLE_INTEGRITY_CHECKS
    bcdedit -set TESTSIGNING OFF

    重启系统。

显卡驱动

打开【设备管理器】-【显示适配器】,此时会看到显示为“Microsoft基本显示适配器”(这是因为没有驱动识别不到显卡,系统默认驱动),没有核显。

7505 CPU 带11代核显,经过实测,有两种方式可以安装上驱动。

  1. Windows 更新
    安装网卡驱动连上网之后,可以从Windows更新 Intel Display驱动。某一次通过这种方式装上了,后面几次都失败了,需要手动装。

  2. 驱动安装程序
    可选下载 英特尔® 驱动程序和支持助理 进行驱动更新;
    建议直接在这里下载驱动安装程序手动安装: 英特尔® Arc™ 和锐炬® Xe 显卡 - Windows*
    需要注意的是注意是否支持 CPU 结构,涵盖了11代U之后及独显,如果是11代之前,返回到上一级选择对应条目

    不清楚CPU代号是什么的,直接搜索进 Intel 官方查看即可。

    安装完成之后就可以在设备管理器看到核显了:
    核显安装成功

芯片组驱动

如果在【其它设备】下看到SMBus控制器(System Management Bus,系统管理总线,负责主板组件数据通信)、PCI控制器上有感叹号,这是因为缺少芯片组驱动。

  1. 关于上面两个驱动,下载 芯片组 INF 实用程序 驱动,安装即可;
  2. 关于【PCI简单通讯控制器】,下载Intel® Management Engine Drivers for Windows® 10 and Windows® 11 驱动执行 Installers/Main_DCH/SetupME.exe 安装。

安装完成之后,应该就只有一个【未知设备】还没有驱动,这个就确实找不到了,基本也不影响使用,就不处理了。

基本配置

远程桌面

更改远程桌面端口号

Ikuai

🙄 自言自语:

“其实最开始只打算装 OP 的,但是因为后面有了流控的需求(ps:室友拉了宽带,友情给我们用,但说了不要搞 BT 啥的占用上传。我有备份到百度云的需要,所以要限制上传速度),考虑了两种方案:① OP 上 QOS+流量监控——能监控,但不能根据 IP/MAC 做限制,大家一起难受(其实就只有我啦~);② iKuai 在流控方面做的不错,再装一个 iKuai。尝试了方式 1 之后选择了 iKuai 的方案”

准备

  1. iKuai 官网下载页下载 ISO 镜像,选择机器架构(如 64 位);
  2. 打开 PVE Web 管理页面,上传镜像文件:位置在【local】-【ISO 镜像】,上传即可
  3. 至少添加了一个 vmbr0 桥接网卡

部署

采用虚拟机的方式安装。

  1. 创建虚拟机:

    1. 【常规】-输入名称【iKuai】
    2. 【操作系统】-选择 iKuai 镜像
    3. 【磁盘】-建议 2G 以上
    4. 【CPU】-类别选择【host】(最后一个)
    5. 【内存】-至少 2G 才能安装
    6. 【网络】-选择【vmbr0】桥接设备
  2. 添加直通网卡

    1. 因为在 PVE 优化 部分已经做了直通,所以这里可以直接添加直通网卡

      添加直通网卡-1

      添加直通网卡-2

      注意一点,PCI 网卡前面的编号(?)数字是和物理网卡对应的,不要把管理网卡也加进去了,管理网卡(vmbr0)我们创建虚拟机的时候已经做了桥接。

      需要用到的网卡都可以加进来,既然选择用 iKuai 做主路由,所以直通给 iKuai,不需要给 OP。

  3. 启动镜像进行安装

    1. 选择刚才创建的 iKuai 虚拟机-【选项】-【引导顺序】,将 ISO 镜像【ide2】勾选,并拖动的最上面,勾选【net0】
    2. 进入【控制台】,启动,之后根据提示选择安装即可(好像是输入 0 回车,输入 y 安装就完成了)
  4. 配置 lan 地址

    1. 安装完成重启之后就会进入 iKuai 控制台,这里需要先设置管理地址
    2. 根据提示,输入【2】设置 LAN/WAN 地址,然后输入想要的管理地址,比如 192.168.19.2 (任何 192.168.x.x 都行,用 19 是因为单纯喜欢这个数字,主机号永 2 是因为 1 已经给了 OP,不想再改了。一般说都是和光猫错开 192.168.2.1 这种。)
    3. 回车确认之后就可以回到电脑上,用网线连接在一起,手动修改电脑 IPv4 地址和上面同一网段(如 192.168.19.100 ),掩码 255.255.255.0 ,网关就是上面 iKuai 的地址,比如我的就是 192.168.19.2
    4. 浏览器打开刚才设置的地址,进入 iKuai 后台,用户名和密码都是 admin (下载页面下滑一丢丢就看到了),登录改密即可。
  5. WAN 配置

    1. 左侧菜单【系统概况】,点击中间【wan1】进入广域网配置界面:

      wan 配置

      网卡选择你准备接光猫的口(比如 eth1,eth0 是管理口),【接入方式】如果不打算路由拨号就选择【DHCP】,顺利的话就可以获取到 ip 了,保存即可。

    2. 回到【系统概览】,选择【lan1】:如果加了多个网卡,这里应该还有 lan2,lan3…,我们用不上,除非你需要给每个网卡都指定不同网段,我理解应该是方便 iKuai 下面还有一层交换机/路由之类,划分网段。

      lan 配置

      这里网卡选择 【eth0】,也就是管理口。下面展开【高级设置】,将其它网口都勾选上。

  6. DHCP 配置

    DHCP 配置

    选择【lan1】接口,设置网关为 iKuai 地址。这里并没有设置为 OP 的地址互指,如果 OP 配置了代理, iKuai 下的设备也就从代理出去了。如果你能配置路由表绕过自然也是没有问题的。

  7. 至此, iKuai 下面的设备应该就可以正常上网了,包括 PVE。

  8. (可选)固定 IP

    在【网络设置】-【DHCP 终端列表】中可以看到直接/间接连接到 iKuai 的设备,选择【加入静态分配】,设置好 IP。

OpenWRT

🎗️ 20241127

已经从单 OP 主路由切换为 iKuai 主路由 + OP 旁路由 的组合,如果你的实际情况以此存在冲突,请多看看教程和他人的帖子,不要盲目局限单一教程。

软路由是我的第一个需求,包括 PVE 的网络,后面也会统一由 OP 进行管理。

后日谈:OP 曾经确实是第一个需求,但结合实际情况,实际的管理是交给了 iKuai 来做。该章节的所有内容是以 OP 作为主路由的前提组织,所以如果以确定使用 iKuai(主路由) + OP(旁路由) 的方式,请在安装完成后跳转至 ImmortalWrt 旁路由配置

准备

在正式进行安装之前,需要先做点准备:

img2kvm

工具软件,将 OP 的 imgimg.gz 后缀镜像转换为 PVE 磁盘镜像

下载地址:

基本上搜一下就有下载方式,基本命令格式: img2kvm <img_name> <vm_id> <vmdisk_name> [storage]

  • img_name 是 IMG 文件名称。一般为“xxx.img”或“xxx.img.gz”的格式。img2kvm 可以直接识别并转换“img.gz”压缩格式的固件文件,对于“xxx.img.gz”来说,只需要输入“xxx.img”作为名称即可,不必再另外加“.gz”。
  • vm_id 是创建好的虚拟机的 ID。一般为一组非零开头的数字,如 100。
  • vmdisk_name 是虚拟机要使用的磁盘名称。建议采用 vm-<vm_id>-disk-<disk_id>的命名方式,如 vm-100-disk-1。
  • storage 是指导入使用的存储池的 ID,默认为“local-lvm”,这是安装 PVE 时自动创建的。此项为可选项,若不指定则使用默认值。【记住,要考】

SSH 客户端

MobaXterm 或 WindTermXShell等,或者 Windows 终端也不错。

不推荐 xshll 是因为试用到期后需要联网验证,在没有互联网的情况下完全无法使用。

OpenWrt 镜像

具体单开一节。

OpebWrt 镜像-成品

懒人版

  • 可以去 OpenWrt 官网根据型号下载
  • 或者在 haierccc-恩山 里面看看【推荐用开源版本】。
  • 再者就是找其它作者编译的版本,比如我懒,直接用的 bleach1991-恩山 编译版本

OpenWrt 镜像-自编译

ImmortalWrt

如果不想和别人用一样的镜像,大可以试试自己编译一版。听上去是什么了不得的大工程,实际上各个大佬已经把编译工作做的相当完善,真正需要动手的地方并不多,有手就行。我昨天还在下别人的包,今天下午就已经编译了三版出来,你说难吗,很简单嘛。

前提:

  • 一台内核数不小于 2 的电脑:试过单核的编译失败了
  • 可用磁盘空间不少于 50G:编译过程中会产生很多文件和缓存
  • 爬墙工具
  • 时间:编译时间一般 1-2h,不过如果舍得下料,也挺快的。我用 VM 4C4G8T Ubuntu24 应该不到一小时。
  • 眼睛和手:脑子可以先摘掉,暂时用不到

参考资料:

首先感谢以上大佬的帖子!辛苦…(* ̄0 ̄)ノ…(* ̄0 ̄)ノ

其实大体步骤就差不多,只是有些细节个别帖子会说的比较详细,所以再加个人上实践结果,做了一个整合。

目前比较流行的源码有官方源码、lede、lienol、immortalwrt 几位大佬几套,选用哪套开始都可以,我这里就以 immortalwrt 为例进行说明,其它仅作参考,如有出入请以实际情况为准。

  1. 所有操作都是以普通用户执行,不要用 root,不要用 root,不要用 root!

  2. 首先是到 GitHub 仓库,查看项目说明,其实也写明了核心步骤,只是有点简略而已。

  3. 准备编译环境:建议使用 Debian 11 或 Ubuntu 22 系统,选择新一点的,太旧可能会存在组件版本太低的情况(我用的 Ubuntu 24.04.1 LTS)

    1. 通过 VMWare 虚拟机安装 Ubuntu:

      • 网络模式选择【桥接】,方便出国下载
      • 类型选择 Ubuntu 64 位
      • 核数不少于 2,线程可以多一点,硬盘不少于 50G
    2. 安装编译依赖

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      sudo apt update -y
      sudo apt full-upgrade -y
      sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
      bzip2 ccache clang cmake cpio curl device-tree-compiler ecj fastjar flex gawk gettext gcc-multilib \
      g++-multilib git gnutls-dev gperf haveged help2man intltool lib32gcc-s1 libc6-dev-i386 libelf-dev \
      libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses-dev libpython3-dev \
      libreadline-dev libssl-dev libtool libyaml-dev libz-dev lld llvm lrzsz mkisofs msmtp nano \
      ninja-build p7zip p7zip-full patch pkgconf python3 python3-pip python3-ply python3-docutils \
      python3-pyelftools qemu-utils re2c rsync scons squashfs-tools subversion swig texinfo uglifyjs \
      upx-ucl unzip vim wget xmlto xxd zlib1g-dev zstd

      # 或者直接执行下面的脚本
      sudo bash -c 'bash <(curl -s https://build-scripts.immortalwrt.org/init_build_environment.sh)'
  4. 下载源代码

    1. 宿主机上打开小猫咪,允许【局域网代理】,然后在 Ubuntu 中配置到宿主机的代理,http 和 https 都要配置

    2. 克隆源码

      1
      2
      3
      4
      5
      6
      # 指定要使用的分支,比如 master,v23.05.4
      git clone -b <branch> --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt

      # 如果克隆之后想要更换/指定其它版本分支
      git tag # 查看稳定版,回车拉到最下面,q 结束
      git checkout v23.05.4 # 切换分支
  5. 进入项目目录:

    1
    cd immortalwrt
  6. (可选)补充插件源

    1
    2
    3
    sed -i '1i src-git kenzo https://github.com/kenzok8/openwrt-packages' feeds.conf.default
    sed -i '2i src-git small https://github.com/kenzok8/small' feeds.conf.default
    git pull
  7. (可选)修改默认管理地址

    其实OP 配置第一条就是修改管理地址,可以安装完成后再修改。只是我不想每次安装都修改所以改了。

    1
    2
    3
    # 进入项目目录
    cd immortalwrt
    vim package/base-files/files/bin/config_generate

    搜索 192.168, 更新 IP 保存即可。

  8. 更新插件源码:更新定义在 feeds.conf 和 feeds.conf.default 中插件的最新源码

    1
    ./scripts/feeds update -a
  9. 拷贝源码:

    1
    ./scripts/feeds install -a
  10. 定制 OpenWrt:打开 OP 可视化配置面板

    1
    make menuconfig

    在此面板使用方向键移动,回车确认,空格选中【<> 未选中, <M> 编译为 ipk 包但不集成到固件, <*> 编译进固件,双击空格选中这个】,ESC 返回上一级【按两次】

    • Target System -> x86 — 目录架构
    • Subtarget -> x86_64 — 具体架构型号
    • Target Profile -> Generic x86_64
    • Target Images -> tar.gz,qcow2,ext4,squashfs — 镜像格式,可以跳到VM 安装CT 安装 看一下要求的镜像
    • Utilities (可选,如果需要可以后续再打包)
      • -> Filesystem -> attr 、btrfs-progs(Build with zstd support)、chattr、dosfstools、e2fsprogs、f2fs-tools、f2fsck、lsattr、mkf2fs、xfs-fsck、xfs-mkfs
      • -> Shells -> bash
    • WIFI 设置:参考以上参考资料-实用技能。因为我的设备没有无线模块,故未设置。
    • LuCI:插件和主题配置
      • Modules -> Translations -> Chinese simplified — 默认已勾选
      • Applications
      • Themes -> Argon

    固件说明:

    • docker:luci-app-dockerman,x86 平台还需要手动勾选依赖 【Utilities】-【dockerd】

    如果需要重新配置,只需要删除配置即可:

    1
    2
    rm -rf ./tmp && rm -rf .config
    make menuconfig
  11. 下载 dl 库,编译固件

    1
    2
    3
    4
    5
    6
    # 下载 dl 库,V=s 显示任务详细情况(可以省略),-j 指定线程数,nproc获取系统线程数-1,防卡死
    make -j$(nproc) download V=s

    # 编译
    # 这里直接指定线程数为4
    make -j4 V=s

    编译时间取决线程数,以我上面 VM 的配置,应该不到 1h,具体没注意。

    如果编译失败,可以执行:

    1
    2
    make clean # 删除编译目录/bin和/build_dir目录中的文件
    make dirclean # 除了删除编译目录之外还删除编译工具目录,删除/bin和/build_dir目录的中的文件(make clean)以及/staging_dir、/toolchain、/tmp和/logs中的文件,一般在更换CPU架构的情况下才操作。
  12. 下载编译压缩包
    编译完成后的输出路径:~/immortalwrt/bin/targets/ 下面,里面会有多个格式的镜像文件,复制到宿主机。x86_64 的就可以直接使用了。

    补充:开启 SSH
    如果 VM 不能直接复制出来(可能需要 VMtools),可以用 SSH,这里不赘述。

  13. 【二次编译】
    后续更新源码、添加插件之后都需要重新编译:

    1
    2
    3
    4
    git pull
    ./scripts/feeds update -a
    ./scripts/feeds install -a
    make menuconfig

    可以将这几步放在一个脚本里-check-update,sh,每次执行 bash check-update.sh 会方便一点。

  14. 【ipk 编译】
    如果选择插件时,选中 <M> 作为 ipk 包编译,会生成 ipk 包,使用 find 命令查找,一般在 bin/packages/x86_64 下面。

    然后上传到路由器执行安装:

    1
    opkg install luci-app-alist.ipk

    也可以在 Web 界面上传安装。

LEDE

最新一次更新已更换为此自编译版本。用过 ImmortalWrt 自编译版本和官方编译版本,自编译版本用着还不错,只不过重装系统没有备份,然后用的官方编译版本。但是这个版本安装 Clash 和 Passwall 配置总有点问题,无奈只能再编译一版(本来嫌弃编译太慢所以用的现成的😅)。之所以不使用其他三方编译版本,一是觉得很多功能用不上,二是哇哇哇哇。

  1. 环境准备
    1. VMware 安装 Ubuntu 24.02,4C8G50G;
    2. 局域网代理,注意虚拟机的代理地址要设置为 VMnet 网段的网关地址;
    3. 设置虚拟机不要休眠,我本地如果用SSH一段时间后,虚拟机桌面会黑屏打不开。
  2. 安装编译依赖
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sudo apt update -y
    sudo apt full-upgrade -y
    sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
    bzip2 ccache clang cmake cpio curl device-tree-compiler flex gawk gcc-multilib g++-multilib gettext \
    genisoimage git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libfuse-dev libglib2.0-dev \
    libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libpython3-dev \
    libreadline-dev libssl-dev libtool llvm lrzsz msmtp ninja-build p7zip p7zip-full patch pkgconf \
    python3 python3-pyelftools python3-setuptools qemu-utils rsync scons squashfs-tools subversion \
    swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
  3. 下载源代码,更新 feeds 并配置
    1
    2
    3
    4
    5
    git clone https://github.com/coolsnowwolf/lede
    cd lede
    ./scripts/feeds update -a
    ./scripts/feeds install -a
    make menuconfig
  4. 下载 dl 库,编译固件
    1
    2
    make download -j8
    make V=s -j1
    编译完成后的输出位置:bin/targets 。如果中途手动/网络原因终端了,删除 build 目录重新执行编译。
  5. 二次编译
    1
    2
    3
    4
    5
    6
    7
    cd lede
    git pull
    ./scripts/feeds update -a
    ./scripts/feeds install -a
    make defconfig
    make download -j8
    make V=s -j$(nproc)
  6. 重新配置
    1
    2
    3
    rm -rf .config
    make menuconfig
    make V=s -j$(nproc)

OpenWrt 镜像–云编译

参考资料:

使用 GitHub Action 提供的服务实现自动编译,不需要处理依赖(真的吗,我不信),不过时间会比较久。建议本地自己跑一遍,基本定型没有大的变更后可以托管到 GitHub Action 云编译。

上面视频教程已经喂到嘴里了,我就没必要再写一遍了。

关于 config 文件的内容,其实就是本地执行 make menuconfig 命令,在可视化界面做的配置后保存的 .config 文件,把这里的内容拷贝过来就可以了。

这里引用一下视频的评论:“不把 config 配置文件分享怎么用,都本地编译了还来看这个”。前半句不做评价,确实都本地跑了没必要看这个,一直留着编译环境完全用不上云编译

OpenWrt 安装

可以选择【虚拟机】或【CT】安装:

  • 虚拟机(VM):在硬件层面虚拟出一套完整的 CPU、内存、文件系统等资源,相互完全隔离,支持任何操作系统。但是占用资源更多。
  • CT:共享物理机内核和驱动,进程隔离,文件系统独立。优势是占用物理资源较少,利用率高。

这里仅提供两种安装方式,具体取舍看个人。你问我?CT 咯(○ ` 3′○)

VM 方式安装

正式安装前应该已经准备好的文件:

  • OpenWrt 镜像,后缀为 img.gzqcow2
  • img2kvm
  • SSH 客户端
  1. 登录到 PVE 后台,右上角选择【创建虚拟机】:

    • 常规:【VM ID】可以指定,比如 100(后面我就以此进行说明);【名称】比如 OpenWrt
    • 操作系统:选择【不使用任何介质】
    • 系统:默认
    • 磁盘:左侧删除【scsi0】[^2],磁盘大小 1G
    • 内存:512/1024M 都可以
    • 网络:【桥接】选择【vmbr0】,其它默认即可
  2. 打开 MobaXterm,SSH 登录到 PVE 后台(不会吧不会吧,这个还需要教程吧),密码就是 Web 登录的密码

  3. 创建启动镜像磁盘:
    可以看到 MobaXterm 左侧就是远程 PVE 上的目录,将 OpenWrt 镜像和 img2kvm 工具拖到这里上传,下面可以看到进度(很快的啦~)。检查一下:

    1
    2
    3
    4
    5
    6
    root@evergardenviolet:~# ls -l
    total 123612
    drwxr-xr-x 3 root root 4096 Nov 17 00:12 github
    -rwxr-xr-x 1 root root 18608 Nov 15 23:59 img2kvm
    -rw-r--r-- 1 root root 18481152 Nov 17 01:39 immortalwrt-23.05.4-x86-64-generic-squashfs-combined-efi.img.gz # 就是这个
    -rw-r--r-- 1 root root 108068864 Nov 18 14:04 immortalwrt-x86-64-generic-squashfs-combined-efi.qcow2

    执行命令创建启动镜像磁盘(以下二选一,结果都一样):

    • 镜像格式为 img.gz

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12

      以我自己为例,执行的命令为:

      ```bash
      chmod +x img2kvm
      # 上传上去的镜像为: mmortalwrt-23.05.4-x86-64-generic-squashfs-combined-efi.img 可以直接用img2kvm导入,但不要加 .gz 后缀
      ./img2kvm mmortalwrt-23.05.4-x86-64-generic-squashfs-combined-efi.img 100 vm-100-disk-0 local

      # 注意点:
      # 1. 100 是刚才创建的虚拟机ID,以你实际创建为准
      # 2. vm-100-disk-0 是给上面的虚拟机创建的第 1 块镜像磁盘(从0开始),如果没有删除 `scsio` ,那就是 vm-100-disk-1
      # 3. 最后的 local 是因为删除了 local-lvm 卷,需要指定安装位置;如果没有删除可以省略。
    • 镜像格式为 qcow2

      1
      2
      3
      4
      5
      6
      7
      # 上传上去的镜像为:immortalwrt-x86-64-generic-squashfs-combined-efi.qcow2
      qm importdisk 100 immortalwrt-23.05.4-x86-64-generic-squashfs-combined-efi.qcow2 local --format=qcom2

      # 注意点:
      # 1. 100 是虚拟机ID
      # 2. local 也是指定保存位置,默认 local-lvm,因为我已经删了,所以指定为local
      # 3. --format=qcom2 指定格式,不要写成了 qcow,别问为什么要提醒你,人家才没有写错呢(*/ω\*)

    如果一切顺利执行完成后会显示原谅色的 【Successfully】,那就可以进行下一步了,否则就根据报错处理问题!

  4. 此时回到 PVE web 后台,选择【100】-【硬件】,可以看到最下方有一块未使用的磁盘,双击挂载;然后在【选项】-【启动顺序】,将刚才挂载的磁盘拖到最前面,并勾选,然后进入【控制台】,点击中间大大的【原神启动】

  5. 很快啊,加载完成之后敲一下回车就可以看到 ImmortalWrt 的 logo,至此已安装完成。

  6. 接下来的配置请跳转到 补充中 继续进行。

CT 方式安装

参考资料:

LXC 容器安装 openwrt 做主路由-edmondgavin

正式安装前应该已经准备好的文件:

  • OpenWrt 镜像,格式为 xxx-rootfs.tar.gz
  • SSH 客户端
  1. 打开 MobaXterm,SSH 登录到 PVE 后台,将 tar.gz 后缀的镜像上传上去

  2. 通过命令创建容器:

    1
    pct create 102 local:vztmpl/immortalwrt-x86-64-generic-rootfs.tar.gz --rootfs local:2 --ostype unmanaged --hostname openwrt --arch amd64 --cores 1 --memory 1024 --swap 0 -net0 bridge=vmbr0,name=eth0

    命令解析:

    • local(102 后面这个):镜像位置,可以将 local:vztmpl/immortalwrt-xx-rootfs.tar.gz 换成 /var/lib/vz/template/cache/immortalwrt-xx-rootfs.tar.gz
    • local:2:local 是保存位置,可以用 local-lvm(如果没删的话), 2 是磁盘大小为 2G
    • 其它的字面意思,内存、swap 大小等
    • net0:OP 的网卡

    创建完成后,先不要启动,还有一些配置要添加。

  3. 进入 PVE 后台,刚才创建的容器–【选项】-【功能】,开启【嵌套】和【FUSE】,【NFS】和【SMB】建议开启。选择【网络】-【添加】,名称 eth0,桥接 vmbr0,IPV4 设置和 PVE 相同网段,比如 192.168.7.1/24,网关不需要设置。

  4. SSH 登录 PVE,编辑容器的配置文件

    1
    2
    3
    4
    # 先让我们装一个 vim
    apt-get install vim

    vim /etc/pve/lxc/<容器ID>.conf # vim /etc/pve/lxc/100.conf

    参照以下我的配置进行补充即可:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    # 创建容器后的配置
    arch: amd64
    cores: 1
    features: fuse=1,mount=nfs;cifs,nesting=1
    hostname: ImmortalWrt
    memory: 512
    net0: name=eth0,bridge=vmbr0,hwaddr=BC:24:11:6A:4A:06,ip=192.168.19.1/24,type=veth
    onboot: 1
    ostype: unmanaged
    rootfs: local:100/vm-100-disk-0.raw,size=1G
    swap: 0

    # PVE 自带的 OpenWrt 实例配置
    lxc.include: /usr/share/lxc/config/openwrt.common.conf

    # 网卡直通
    lxc.net.1.type: phys
    lxc.net.1.link: enp3s0
    lxc.net.1.name: eth1
    lxc.net.1.flags: up
    lxc.net.2.type: phys
    lxc.net.2.link: enp4s0
    lxc.net.2.name: eth2
    lxc.net.2.flags: up
    lxc.net.3.type: phys
    lxc.net.3.link: enp5s0
    lxc.net.3.name: eth3
    lxc.net.3.flags: up
    lxc.net.4.type: phys
    lxc.net.4.link: enp6s0
    lxc.net.4.name: eth4
    lxc.net.4.flags: up

    lxc.apparmor.profile: unconfined
    lxc.apparmor.allow_nesting: 1
    lxc.cgroup.devices.allow: a
    lxc.cgroup2.devices.allow: a
    lxc.cap.drop:
    lxc.mount.entry: /dev/ppp dev/ppp none bind,create=file
    lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
    lxc.mount.entry: tmp tmp tmpfs rw,nodev,relatime,mode=1777 0 0
    lxc.mount.auto: cgroup:rw
    lxc.mount.auto: proc:rw
    lxc.mount.auto: sys:rw
    lxc.autodev: 1

    提醒,因为我们将 enp2s0 桥接到 OP 作为管理口,所以就不做直通。

    以上配置,无须配置 hook 钩子,不需要注释 dnsmasq 配置文件 jail 内容(其它帖子中如果不注释可能会无法获取 DHCP IPv4)。[^3]

  5. 此时就可以开始 OpenWrt 的设置了。

OpenWrt 配置(主路由)

📢: 如果计划将 OP 作为旁路由,请跳转至下一节继续。

完成 OP 的安装之后,首先需要修改配置以进入管理后台。

  1. 打开虚拟机/CT 的控制台,回车进入命令行,编辑配置文件:

    1
    vim /etc/config/network

    找到 lan 所在块,修改 ipaddr 的值为你想要的局域网网段,比如我就修改为 192.168.7.1 , 因为 192.168.1.1 一般是光猫的管理地址,最好换一个。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    config interface 'lan'
    option device 'br-lan'
    option proto 'static'
    option ipaddr '192.168.7.1'
    option netmask '255.255.255.0'
    option ip6assign '60'
    list dns '192.168.7.1'
    list dns '119.29.29.29'
    list dns '8.8.8.8'
  2. 用网线连接软路由和电脑,手动修改电脑 IP 为同网段不为 192.168.7.1,比如 192.168.7.2,然后就可以从浏览器访问后台了: http://192.168.7.1 。密码一般是 password ,如果不是,就以下载位置作者说明为准。

  3. 添加网卡:

    1. 如果是虚拟机部署:需要在 PVE 后台-虚拟机-【网络】,逐个添加需要使用的 vmbrx 网卡设备
    2. 如果是 CT 容器部署:需要在配置中配置好直通即可
  4. 修改局域网配置(lan)
    进入【网络】-【接口】,看到名称为 接口 的标签,选择 lan 编辑

    • DNS:添加一个国内和国外的 DNS,可以 看这里各选一个
    • 其它保持默认

    选择上方 接口 的标签,配置 br-lan 设备,将需要用到的网桥端口都勾选中,

    保存并应用!

  5. 修改广域网配置(wan)
    一般插了网线可以自动识别,如果没有就编辑 wan 配置,选择协议 【DHCP 客户端】,设备为接入光猫的网口

  6. IPv6 配置
    和上面 wan 类似,编辑 wan6 的配置,修改协议为 【DHCP 客户端】,网口和 wan 一样。一般会自动生成,如果没有就自己创建一份。

  7. 此时应该就可以正常上网了,配置了的网口也就可以接入其它设备使用了。无线?我没有无线啊!(后面会说)

放一个三方 opkg 软件源:OpenWrt.op

OpenWrt 配置调整(旁路由)

参考链接:

-修复 iKuai 使用 LEDE 当旁路由导致的终端 MAC 地址重复的问题-柠了个檬 k

此部分基本配置和上面一样,只是【LAN】部分的配置有所区别:

  1. 修改局域网设置(lan)
    1. 【常规设置】-修改 IPv4 网关地址为 iKuai 地址
    2. 【DHCP】服务器:【忽略此接口】,去掉【动态 DHCP】,禁用 IPv6 的【RA 服务】、【DHCPv6 服务】、【NDP 代理】
  2. 网卡:虚拟机方式创建则只添加 vmbr0 即可;CT 方式创建则注释掉配置中的直通部分。此时管理页面 wan 和 wan6 应该会提示“网络设备不存在”的错误,可以直接删除 wan 口。
  3. 在【系统】-【软件包】,先【更新列表】,再搜索 snmpd 安装,就叫这个,不是 luci-app-snmpdmini-snmpd
    装这个包是因为使用 OP 做旁路由会导致 iKuai mac 地址重复。此时回到 iKuai,【高级应用】→【跨三层应用】→【添加】,在【SNMP 服务器 IP】后输入 OpenWrt 路由管理 IP,其他保证默认不变,点击【保存】,此时终端设备的 mac 就可以正常获取了。如果还有问题,可能是固件的问题,建议更换固件。

passwall 配置

目的是实现上网需求,此包已在上面自编译部分进行添加。

  1. 节点订阅
  2. 规则管理-分流规则
    1. 删除默认所有规则,按照顺序添加以下规则
    2. 【Reject】规则:添加域名 geosite:category-ads-all - 去广告
    3. 【Direct】规则:
      1
      2
      3
      4
      5
      6
      7
      8
      # 添加域名
      xn--ngstr-lra8j.com
      geosite:private
      geosite:cn

      # 添加IP
      geoip:private
      geoip:cn
    4. 【Proxy】规则:添加域名 geosite:geolocation-!cn
  3. 高级设置
    1. 【UDP不转发端口】:所有
    2. 【TCP转发端口】:仅网页,仅允许80,443 端口代理
    3. 【TCP代理方式】:TPROXY,也可以默认 REDIRECT,勾选 IPv6 透明代理后会自动变为 TPROXY。
    4. 【IPv6透明代理】:节点支持IPv6就勾选,反之不勾选。
  4. 节点列表-Xray分流
    1. 【Reject】:黑洞(丢弃)
    2. 【Direct】:直连(绕过)
    3. 【Proxy】:默认(代理)
    4. 【默认】:选择一个可用节点
    5. 【域名解析策略】:Asla(跳过 IP 匹配,只匹配域名)
  5. 基本设置
    1. 【DNS】:【远程DNS协议】选择 DOH,勾选 FakeDNS。
  6. (可选)检查 DNS 泄露

AdGuard Home 配置

参考链接:

首先需要说明,去广告主要还是用的浏览器插件,对于 ADGH 主要是做 DNS 加速及防劫持,去广告也没有太多期待,毕竟就这样。

  1. 安装 AdGuard Home

    1. 如果固件里面已经编译了,那么就可以直接使用了;如果没有捏,可以从【系统】-【软件包】进行安装(搜不到就先更新一下啦)
  2. ImmortalWrt 端设置

    1. 先更新核心版本;
    2. 【6060 重定向】建议选择【使用 53 端口替换 Dnsmasq】,相当于接替现有 DNS,也可以选择作为上游服务器,我在 ImmortalWrt 上选择重定向 53 端口不生效;
    3. 其它保持默认即可,勾选【启用】,保存并应用。
  3. AdGuard Home 配置

    1. 打开 http://<ImmortalWrt IP>:3000 管理页面,默认账密 admin/admin ,如果不是就 bing 一下多找找;

    2. 【设置】-【常规设置】:日志保存时间根据 OP 大小根据自己需要选择,保存。

    3. 【设置】-【DNS 设置】:

      1. 上游 DNS 服务器:使用加密 DNS 可以防劫持,比如:

        1
        2
        3
        4
        # 阿里云
        https://dns.alidns.com/dns-query
        # 360
        https://doh.360.cn/dns-query

        更多的可以直接点击上面的【已知 DNS 提供商列表](https://link.adtidy.org/forward.html?action=dns_kb_providers&from=ui&app=home) 选择

      2. 勾选【并向请求】

      3. Bootstrap DNS 服务器是用来解析上面 DNS 地址的 DNS,可以下一个 DNS 优选测一下最快的,比如:

        1
        2
        119.29.29.29
        223.5.5.5
      4. 保存应用

      5. DNS 服务配置,勾选【启用 EDNS 客户端子网】、【启用 DNSSEC】-校验 DNS 签名、【禁用 IPv6 地址解析】-不影响使用的前提下加快解析。保存。

  4. 【可选】【过滤器】-【DNS 重写】
    在此可以维护自己本地的一套 DNS 记录,配合 lucky 或者 npm 很舒服。

Ubuntu(Deprecated)

关于 PVE 安装 Windows、Linux、黑苹果的教程很多,如果只想装上去玩玩可以去 B 站找找教程。因为我的设备只有 128G,所以只能省着点用 😢。加上有 docker 需求,所以目前就只部署了 Ubuntu,当然选择其它 Linux 发行版也是没有问题的。

2025年2月15日更新,在经历过PVE崩过一次之后,觉着再套一层 Ubuntu 没啥必要性,毕竟都是用 Docker,因此此次不再安装 Linux,直接在宿主机安装 Docker。

安装

参考链接:

本次使用 LXC 方式部署。

  1. 下载模板:
    登录到 PVE 后台-【local】-【CT 模板】-【模板】,选择需要的模板下载,比如 ubuntu-24.04。

    如果下载进度卡在 “Saving to …”,是因为连不上服务器,需要先替换镜像源。

  2. 创建容器
    右上角选择【创建 CT】

    • 常规:输入 root 用户密码,注意取消勾选【无特权的容器】(默认已勾选!) — 不然最后是核显直通有问题+无法 SMB 挂载!😹
    • 模板:选择刚才下载的 ubuntu-2.04
    • 磁盘:根据需要给就行,也可以单独加一块磁盘。后续 docker 应用可能都会放上来,所以给了 50G。
    • CPU 和内存:按需分配即可,比如 1C1G
    • 网络配置:默认网卡【eth0】,桥接【vmbr0】,设置 IPv4 192.168.19.50/24 (最终容器的 IP),网关 192.168.19.1,IPv6 选择 DHCP 即可。
  3. 启动容器
    创建完成后,先来到【选项】-【控制台模式】,修改为 shell,否则启动后黑屏。【验证过确实会,已老实 🤐】

    启动容器,开启远程登录:

    1
    2
    3
    4
    5
    6
    #允许远程登录
    sed -i '/PermitRootLogin/ a PermitRootLogin yes' /etc/ssh/sshd_config

    #重启ssh服务
    systemctl restart sshd

  4. 初始化设置

    1. 时区:

      1
      dpkg-reconfigure tzdata
    2. 语言

      1
      dpkg-reconfigure locales

      选择 zh_CN.UTF-8

    3. 软件源更换

      1
      2
      3
      4
      apt update
      apt install curl
      bash <(curl -sSL https://linuxmirrors.cn/main.sh)

  5. 【可选】核显配置
    如果容器不需要使用核显,可以跳过这部分。因为我计划部署 Jellyfin 做硬解,所以需要配置一下。

    PVE 宿主机上执行:

    1
    2
    3
    4
    5
    # 查询核显信息
    ls -l /dev/dri
    # 安装核显驱动
    apt install intel-media-va-driver

    这里的 226,0 和 226,128 是主次设备号,编辑配置文件/etc/pve/lxc/容器 id.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #新增下列内容
    lxc.apparmor.profile: unconfined
    lxc.cgroup.devices.allow: a
    lxc.cap.drop:
    lxc.cgroup2.devices.allow: c 226:0 rwm
    lxc.cgroup2.devices.allow: c 226:128 rwm
    # lxc.cgroup2.devices.allow: c 29:0 rwm
    lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
    lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file

    # 下面这条根据需要添加,下面解释
    # lxc.apparmor.profile: unconfined

    lxc.apparmor.profile: unconfined:该配置指定了 AppArmor(应用程序安全性配置框架)的配置文件名称,这里设置为 “unconfined”,用于允许容器内的进程具有更高的系统权限

    lxc.cgroup.devices.allow: a: 允许容器内的进程访问所有的 cgroup 设备。

    lxc.cap.drop: 此配置项为空,容器内的进程将继承主机系统的默认能力设置。

    lxc.cgroup2.devices.allow: c 226:0 rwmlxc.cgroup2.devices.allow: c 226:128 rwm: 允许容器内的进程对设备号为 226:0 和 226:128 的字符设备节点拥有读、写和映射(rwm)的权限。用于允许容器内的进程访问特定的设备,如图形加速设备。

    lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=filelxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file:将主机系统上的两个设备节点 /dev/dri/card0 和 /dev/dri/renderD128 挂载到容器内的相同位置,用于允许容器内的应用程序访问图形硬件加速功能,以便执行图形相关的任务

    lxc.apparmor.profile: unconfined 用于关闭 LXC 容器的 apparmor 保护,开启状态无法安装 Docker。可能会报错:

    1
    Error response from daemon: Could not check if docker-default AppArmor profile was loaded: open /sys/kernel/security/apparmor/profiles: permission denied

    处理 1: 添加上面 apparmor 的配置,重启容器。

    1
    2
    pct stop <容器ID>
    pct start <容器ID>

    处理 2: 在容器界面-【选项】-【功能】-开启【嵌套】(nesting=1),重启容器

    两种方式择其一即可,如果都做了,还是会报错:explicitly configured lxc.apparmor.profile overrides the following settings: features:nesting,因为 features:nesting 已经隐式处理了与 AppArmor 相关的安全限制。

    🎗️: 还没装上测试,介意的话就先别搞,果咩。

  6. 安装 Docker
    此处就参考 Docker 官方安装操作即可:

    ⚠ 强调一点:请根据自己的发行版选择对应的安装教程,不要直接复制下面的命令,不然版本对不上会报错。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 配置 Docker GPG key
    sudo apt-get update
    sudo apt-get install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc

    # 添加 apt 仓库
    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
    $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update

    # 安装 Docker 软件包
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

    # 设置开机自启
    systemctk enable docker
  7. 安装 docker-compose

    1
    2
    3
    4
    5
    6
    7
    8
    # 下载
    curl -SL https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

    # 赋予权限
    chmod +x /usr/local/bin/docker-compose

    # 测试
    docker-compose

Portainer

可视化管理 docker。

  1. 创建数据目录
    1
    mkdir /data/Containers/portainer
  2. 创建容器
    1
    docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /data/Containers/portainer:/data portainer/portainer-ce:2.24.1

lucky 大吉

Lucky - 家用软硬路由公网利器

介绍(来自官网):

  • 简单易用:自带 WebUI 可视化后台 — 确实操作很简单,比 npm 好用
  • 支持多种系统:
  • 功能强大:总之就是很强

安装

采用 Docker 镜像的方式安装。

1
docker run -d --name lucky --restart=always --net=host -v /data/luckyconf:/goodluck gdy666/lucky

配置太简单了,就不解释了。只是注意如果要支持 IPv6,需要使用 host 网络模式。

简单配置

反向代理

我目前只用到了反代,所以暂时只说一下这个。

其实也没啥说的,下一步下一步就行,不懂的保持默认,太简单了。。。监听端口也可以用 443

HTTP 跳转 HTTPS

前提是上面已经创建好了一条 https 的规则,然后重新创建一条【Web 服务规则】,监听 80 端口,选择【定制模式】,服务类型【重定向】,前端地址填泛域名【*.mydomain.com】,后端地址填【https://{host}】 即可。

如果访问错误,记得看日志,没有日志就检查域名、端口、防火墙啥的,基本就这几个点,挨个排查一遍。

🎗︎:我之前在 NAS 上装了 luckt,但是没有日志,应该是防火墙的问题,后面有了 PVE 就拎出来了,原因也懒得查了。

影视库

在上面 Ubuntu docker 的基础上安装 Jellyfin/Emby。

Jellyfin(Deprecated)

推荐使用 nyanmisaka 大佬封装版本,更适合中国宝宝体制。

  1. 创建一个特权容器

  2. 配置核显直通

    1
    2
    3
    4
    5
    6
    7
    lxc.apparmor.profile: unconfined
    lxc.cgroup.devices.allow: a
    lxc.cap.drop:
    lxc.cgroup2.devices.allow: c 226:0 rwm
    lxc.cgroup2.devices.allow: c 226:128 rwm
    lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
    lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
  3. 通过 portainer 安装 Jellyfin

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    services:
    jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    user: 0:0
    network_mode: "host"
    volumes:
    - /data/Containers/jellyfin/config:/config
    - /data/Containers/jellyfin/cache:/cache
    - type: bind
    source: /media
    target: /media
    extra_hosts:
    - "host.docker.internal:host-gateway"

Emby

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: "2.3"
services:
emby:
image: emby/embyserver
container_name: embyserver
# runtime: nvidia # Expose NVIDIA GPUs
network_mode: host # Enable DLNA and Wake-on-Lan
environment:
- UID=1000 # The UID to run emby as (default: 2)
- GID=100 # The GID to run emby as (default 2)
- GIDLIST=100 # A comma-separated list of additional GIDs to run emby as (default: 2)
volumes:
- /path/to/programdata:/config # Configuration directory
- /path/to/tvshows:/mnt/share1 # Media directory
- /path/to/movies:/mnt/share2 # Media directory
ports:
- 8096:8096 # HTTP port
- 8920:8920 # HTTPS port
devices:
- /dev/dri:/dev/dri # VAAPI/NVDEC/NVENC render nodes
- /dev/vchiq:/dev/vchiq # MMAL/OMX on Raspberry Pi
restart: on-failure

除官方版,也可以使用 amilys 大佬的版本(低调低调~)

增强插件

Emby Crx

官方地址:emby-crx

媒体库大图封面轮播。

安装方式:

  • 浏览器插件:需用户端自行下载解压安装
  • 服务端:替换文件,具体说明

一键安装

1
docker exec EmbyServer /bin/sh -c 'cd /system/dashboard-ui && wget -O - https://tinyurl.com/2p97xcpd | sh'

手动安装

手动安装方式参考:沧水的博客

  1. 找到 Emby webui 安装目录:
    使用官方 Ubuntu 安装的在:/opt/emby-server/system/dashboard-ui
    docker 安装的位置在: /system/dashboard-ui/

    找不到就用 find 搜一下 dashboard-ui 目录。

  2. 上传文件:下载上面作者官方源码,提取以下文件:

    1
    2
    3
    4
    5
    common-utils.js
    jquery-3.6.0.min.js
    md5.min.js
    style.css
    main.js

    上传到上面 dashboard-ui 目录。

  3. 插入 js
    编辑 webui 目录下 index.html 文件,在 <head></head> 之间插入:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <link
    rel="stylesheet"
    id="theme-css"
    href="style.css"
    type="text/css"
    media="all"
    />
    <script src="common-utils.js"></script>
    <script src="jquery-3.6.0.min.js"></script>
    <script src="md5.min.js"></script>
    <script src="main.js"></script>
  4. 刷新网页即可生效。

emby-danmaku

官方地址:dd-danmaku

弹幕。

安装方式:

和上面类似,修改 webui 目录下 index.html ,在前添加如下标签

1
2
3
4
<script
src="https://cdn.jsdelivr.net/gh/RyoLee/emby-danmaku@gh-pages/ede.user.js"
defer
></script>
embyExternalUrl

官方地址:embyExteralUrl

调用外部播放器。

建议用浏览器脚本比较方便。

LXC GPU 访问

不清楚就不需要在意这一节,如果按照以上操作后,LXC 容器还是访问不了核显,/dev/dri 下用户组都是 nobody,docker 透穿存在问题,可以尝试这部分配置。因为最开始我做了,后面发现不添加这部分,jellyfin 也可以识别到 GPU 硬解,所以就没加了。

补:大概原因可能是因为用了特权容器,如果不想要使用特权容器,可能就需要看这部分配置咯。

参考资料:LXC GPU Access

具体操作及原因资料中有具体说明,为保证行文简洁,除未提及部分,本文仅写操作,不解释原因。

  1. 确定宿主机设备编号

    1
    2
    3
    # ls -l /dev/dri
    crw-rw---- 1 root video 226, 0 Nov 26 21:17 card0
    crw-rw---- 1 root render 226, 128 Nov 26 21:17 renderD128

    注意这里的主设备号 226,次设备号分别为 0128。(看了这么多教程,应该都是一样的(❁´◡`❁))

  2. 允许 LXC 访问该设备
    就是上面核显部分啦:

    1
    2
    3
    4
    # /etc/pve/lxc/*.conf
    + lxc.cgroup.devices.allow: c 226:* rwm
    + lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file,mode=0666
    + lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
  3. 允许非特权容器访问

    1
    2
    3
    #  /etc/subgid
    + root:44:1
    + root:108:1

    使用 idmapusermod 将容器内用户和组(uid 和 gid)映射到宿主机 video 和 render 组,从而具有调用设备权限。因为我们这里只处理组映射,所以 uid 可以直接用一组全部映射即可。

    1. 检查宿主机 video 和 render 的 gid

      1
      2
      3
      # cat /etc/group | grep -P "video|render"
      video:x:44:
      render:x:104:

      记住这里的两个值,分别为 44 104,你的未必也是这两个值。

    2. 检查 LXC 容器 video 和 render 的 gid

      1
      2
      3
      # cat /etc/group | grep -P "video|render"
      video:x:44:
      render:x:993:

      记住这里的两个值,分别为 44 993,你的未必也是这两个值。

    3. 修改容器配置
      修改容器配置文件: /etc/pve/lxc/<ID>.conf,加入以下内容:

      1
      2
      3
      4
      5
      6
      7
      lxc.idmap: u 0 100000 65536
      lxc.idmap: g 0 100000 44
      lxc.idmap: g 44 44 1
      lxc.idmap: g 45 100045 945
      lxc.idmap: g 990 100990 3
      lxc.idmap: g 993 104 1
      lxc.idmap: g 994 100994 64542

      ps: lxc.mount.entry 这几行也要嗷,只是这里没写。

      解释一下什么意思:

      • lxc.idmap 表示映射容器到宿主机的 uid 和 gid
      • uid 和 gid 的范围是 [0, 65536)
      • 以第一行为例,四个值含义分别为:类型 容器起始 id 宿主机起始 id 步长。u 表示映射 uid,将容器中 [0,65536) 映射到宿主机的 [100000,165536)。为什么要从 100000 开始?不存在啊,你要再加几个 0 也行。因为只需要映射 video 和 render 组,其它的不管不知道会不会有问题(别问了,我也不知道啊!)
      • uid 就一行搞定,gid 麻烦一点,要根据容器这两个组的 gid 将 整个 gid 分段,比如我这里就需要分成:[0,44),[44,45),[45,993),[993,994),[994,65536),减一下步长。看不懂就多看几遍就懂了。
  4. 添加用户组
    在 LXC 容器内,将 root 用户添加到用户组:

    1
    usermod -aG video,render root

    再看一下显卡设备,此时用户组就变成 video 和 render 了。

Windows10

  1. 下载镜像和驱动:
    • Win10镜像:官方原版/LTSC/精简版均可,如果机器性能一般可以用精简版或者LTSC
    • VirtIO:虚拟机 Windows 访问网卡等设备需要

上传到 local 镜像库。
2. 创建虚拟机

  • 常规:
    • 名称:自定义,如 Win10
  • 操作系统:
    • ISO镜像:选择 Win10 镜像
    • 类别:Microsoft Windows
    • 为 VirIO 驱动器添加额外驱动器:勾选挂载
  • 系统:
    • 机型:q35
    • BIOS:UEFI/默认都可,取消勾选 【添加TPM】
  • 磁盘:
    • 磁盘:类型SATA,大小50G够了(主要我总共才100G的盘)
    • 格式:qcow2,性能略逊于 raw
  • CPU:
    • 核心:2C (够用就行)
  • 内存:
    • 8192MB(至少8G起,少了会爆内存)
  • 网络:
    • 默认即可
  1. 安装系统
    在虚拟机-【选项】-【引导顺序】,修改镜像盘到第一启动项。然后启动安装即可,和正常安装步骤一样。

  2. 安装驱动
    如果 Virto 选项和上面一样提前挂载,就不需要在【硬件】再挂载了。

    进入系统可以看到Virto镜像,双击挂载。

    进入【设备管理器】,可以看到有两个设备不能识别,右键-【更新驱动】-【本地浏览】-选择Virto挂载盘(D盘),然后自动搜索安装,两个都安装上之后,网卡、PCI设备就可以正常使用了。

  3. 开启远程访问
    固定IP,开启远程。

[^1]: ikuai 也是一个软路由解决方案,和 OpenWrt(OP)属于同一范畴,和 OP 的主要区别是一个开源一个闭源,其它没用过,不做评价。
[^2]: 直接创建启动镜像会有空余空间,如果不够可以扩容,这里可以不必留。
[^3]: