Loading... | 组件 | 产品 | 价格,渠道 | 备注 | | ---------------- | --------------------------------------------------------------- | ------------------ | ------ | | cpu | AMD;R9 7950x 盒装(板 u 套装) | 4619,pdd | [jd](https://item.jd.com/100039537667.html) | | 主板 | 技嘉;电竞雕 WIFI B650M AORUS PRO AX | 0 | [jd](https://item.jd.com/100042368439.html) | | | | | | | 显卡 | 盈通;樱瞳花嫁 4070 super oc 12g | 4469,tb | | | 内存 | 金百达;银爵,32GB x 2 套装,DDR5 6400 C32,海力士 A-die 颗粒 | 1284,pdd | [jd](https://item.jd.com/100046655844.html) | | 固态存储 | 致态;Tiplus 7100,1t,长江原厂颗粒 | 492,pdd | [jd](https://item.jd.com/10079976018181.html) | | | 梵想;铝片高速固态 QLC,PCIe 4.0 7200MB/s,2t | 806,pdd | | | 电源 | 海韵;focus gx650w,全日系金牌全模,14 cm | 596,jd | [jd](https://item.jd.com/100007186422.html) | | | | | | | 散热(cpu) | COOLLEO 酷里奥;倚天 P60T V3,黑色性能版,双塔 6 热管 | 261,pdd | [jd](https://item.jd.com/10099761123199.html) | | 散热,机箱风扇 | 伊科贝拉;玄冥普 1800 转,FBD(无光)黑色正叶 | 17 x 3 = 51,pdd | [pdd](https://mobile.yangkeduo.com/goods1.html?goods_id=593177321830&page_from=23) | | | | | | | 机箱 | 未知玩家;X200 手提小机箱 MATX ,jojo 定制图 | 268,pdd | [jd](https://item.jd.com/100070489290.html) | | | | 12846 | | | | | | | | ~~机械存储~~ | ~~西部数据;WUH721414ALE6L4 14T 7200 SATA3 企业级氦气硬盘~~ | ~~1298,tb~~ | [tb](https://item.taobao.com/item.htm?abbucket=17&id=624523855339&ns=1) | | | | ~~12846 + 1298 = 14135~~ | | | | | | | | 其他耗材 | 扎带 宽 2.5mm 长 15cm 100 条 | 5.9,pdd | | | | miku chibi 角色贴纸 65 张不重复 | 4.9,pdd | | | | 像素 miku 机箱贴纸 53 张不重复 | 6,pdd | | | | 螺丝刀套装,合金 | 5.8,pdd | |  ## network 网络拓扑信息如下,需要到 192.168.9.1 路由器里配置相关静态 ip 地址 | ip | dev | | ------ | ----------------- | | 9.1 | main router | | | | | 9.2 | matx | | 9.3 | pve | | 9.4 | pve / wrt / wan | | 9.5 | pve / wrt / lan | | 9.6 | pve / linux-nas | | | | | 9.7 | | | 9.8 | phone | | 9.9 | ipad | | 9.10 | ppkvm |  ## pve ### 环境介绍 主路由器小米 ax6000(wifi6)是 192.168.9.1(从光猫桥接进来拨号,有公网 ipv4、ipv6)、主板板载 2.5g 网口(enp1s0)、8 块 hdd 机械硬盘、bcm 5720 2 千兆口 pcie 网卡(enp2s0、enp3s0)、sata 3.0 pcie 拓展卡、整机运存是 32G,规划如下: 1. 装一个 pve 作为主系统,通过 enp2s0 管理 pve(192.168.9.3) 2. 使用 pve 自带的 ZFS 系统管理硬盘,其中 7 块 4t 组 RAIDZ1,1 块 6t 单独组,使用 alist 进行磁盘的共享 3. 虚拟机装一个 immortalwrt 做旁路由(2c2g) 1. 将 enp3s0 直通给旁路由(192.168.9.4,作 WAN 口,设置网关为 192.168.9.1); 2. pve 再添加一个 VirtIO 给旁路由(192.168.9.5,做 LAN 口,子网的网关为 192.168.9.5); 3. 按照以上设计,局域网内(192.168.9.0/24)设备在上网时有两种选择: 1. 设置 gateway 为 192.168.9.1,则直接走主路由连接互联网 2. 设置 gateway 为 192.168.9.5,则其路由为:*局域网设备 -> pve -> VirtIO -> wrt lan -> vSwitch -> pcie -> wrt wan -> enp3s0 -> 主路由* 在主路由和 wrt 上,都把局域网内常用设备的 ip 和 mac 进行绑定,即切换网关的时候都使用同一个 ip  4. 当设备加入局域网时,只需要将网关切换成 192.168.9.5,即可实现旁路由上网;若不需要旁路由,则会默认使用主路由 192.168.9.1 网关 4. ~~虚拟机装一个 ubuntu-server 24.04,作为游戏服务器、docker 服务器(alist、ddns-go、qbittorrent 等)~~ ,直接使用普通用户 + docker 权限的方式来使用 pve,这样不需要新建一个 vm,减少一层虚拟化开销 ### pve 基本设置 1. 修改 pcie 设备的时候,可能会导致网卡的装载顺序发生变化,可能会出现因为 ip 不对的问题无法访问 pve 的 web 界面,需要手动修改网络信息(需要连接到 pve 系统的 shell,例如通过图形界面): 1. `ip a` 查看网卡信息,这里是一个网口 `enp5s0` 和一个 wlan 网口 `wlp4s0` 2. 然后修改网卡信息:`nano /etc/network/interfaces` ```ini auto lo iface lo inet loopback iface enp5s0 inet manual iface wlp4s0 inet manual auto vmbr0 iface vmbr0 inet static address 192.168.9.3/24 gateway 192.168.9.1 bridge-ports enp5s0 bridge-stp off bridge-fd 0 source /etc/network/interfaces.d/* ``` 3. 重启网络:`systemctl restart networking.service` 2. 在 pve 安装常用的工具 1. 先配置 <span data-type="text" style="font-size: 13.6px; font-variant-ligatures: none; white-space-collapse: preserve; background-color: rgba(27, 31, 35, 0.05);"> </span>,使用 ustc 的 debian 源,参考如下 ```ini deb http://mirrors.ustc.edu.cn/debian bookworm main contrib non-free non-free-firmware deb http://mirrors.ustc.edu.cn/debian bookworm-updates main contrib non-free non-free-firmware ``` 1. 同时可以将 `/etc/apt/sources.list.d/pve-enterprise.list` 中的内容注释掉(如果没有订阅企业版 pve 的话) 2. 然后配置 ustc 的 pve 源:`echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list` 3. ustc 的 ceph 源:`source /etc/os-release`,`echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-$(ceph -v | grep ceph | awk '{print $(NF-1)}') $VERSION_CODENAME no-subscription" > /etc/apt/sources.list.d/ceph.list` 4. 替换 pve 的 gpg 验证:`cp /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg.backup`,`wget http://mirrors.ustc.edu.cn/proxmox/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg` 2. 更新 `apt update` 3. 安装工具 `apt install sudo zsh vim git iperf3 net-tools openvpn` 3. 配置 pve 的访问控制权限,这里是设计成分角色的方案:root 用户可以进行所有操作,而平常使用一个普通用户,只进行简单的虚拟机开关机、虚拟机创建销毁、状态查看等 1. 定位到 *数据中心 - 权限 - 群组,* 在这里创建一个名为 common_pve_user 的群组 2. 定位到 *数据中心 - 权限 - 角色*,在这里创建一个角色名为 common_pve_user,特权可以多选,建议如下(参考 [PVE 权限管理](https://www.cnblogs.com/varden/p/15246180.html),只列出了必须的,未列出的自行检索) | 特权名称 | 作用 | 建议 | | ------------------- | -------------------------- | ------ | | Datastore.* | 磁盘管理相关 | 全选 | | | | | | Sys.AccessNetwork | 可以用于配置虚拟机的网络 | 选 | | Sys.Audit | 审计 | 选 | | Sys.PowerMgmt | pve 开关机 | 选 | | | | | | VM.* | 虚拟机相关 | 全选 | 3. 创建完成后,到 *数据中心 - 权限 - 用户*,添加一个新用户:领域选择 Proxmox VE authentication,群组选择上面创建的 4. 定位到 *数据中心 - 权限*,选择 *添加 - 群组权限*,路径为 `/`,群组为 `common_pve_user`,角色选择刚才创建的 `common_pve_user`,创建 5. 此时退出再登录 pve,账密为刚才创建的,领域选择 `Proxmox VE authentication server`,登陆即可 4. 其他设置 1. PVE 上传的 iso 镜像位置为:`/var/lib/vz/template/iso/` 2. pve 的存储中,有个 `local` 和 `local-lvm` 1. `local`,就是 PVE 的根目录,同时还可以用于存储 iso 镜像 2. `local-lvm`,专门特化用于存储虚拟镜像,也就是 pve 的节点存放的地方,由于在初始化时一般没有挂载其他盘,则 pve 默认将当前的盘分开成两种系统,当新建虚拟机时,一般放入到这个逻辑卷中 ## ZFS 文件系统 ZFS 使用 设备 id、事务 id 等机制确保它不依赖于磁盘的物理插槽顺序,ZFS 池可以在磁盘顺序完全不同的情况下成功导入机械硬盘(前提是硬盘没有损坏)。除了前文直接挂载机械硬盘,然后让虚拟机管理软 raid 的情况外,还可以在 pve 上直接配置 ZFS 系统来管理这些机械硬盘 类似 raid 阵列,zfs 也有以下的阵列解决方案 | 类型 | 磁盘利用率 | 原理 | 缺点 | | --------- | ---------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------- | | Stripe | 100% | 类似 RAID 0,数据被分散存储在所有磁盘上,提供最大存储空间和性能 | 无冗余,一块盘故障会导致所有数据丢失 | | Mirror | 50% (双向镜像) | 类似 RAID 1,数据被完全复制到每个镜像盘,可支持多路镜像(2 路、3 路等) | 磁盘利用率低,n 块盘只能使用 1 块的容量 | | RAIDZ1 | n-1 块盘的容量 | 类似 RAID 5,单奇偶校验,可承受 1 块盘故障。数据以可变大小的条带分布,避免 RAID 5 写入放大 | 重建时间长且有额外负载,影响系统性能;风险窗口长 | | RAIDZ2 | n-2 块盘的容量 | 类似 RAID 6,双奇偶校验,可承受 2 块盘同时故障。避免了 RAID 6 的写入放大 | 写性能比 RAIDZ1 略差,重建过程长 | | RAIDZ3 | n-3 块盘的容量 | ZFS 特有,三重奇偶校验,可承受 3 块盘同时故障 | 写性能进一步降低,适合大型存储阵列 | | RAID-Z+ | n-P 块盘的容量(可配) | ZFS 2.0 新增,允许用户配置更高的奇偶校验盘数 | 写性能随奇偶校验盘数量的增加而降低 | | DRAID | 可配置 | 分布式备用盘,在传统 RAID-Z 基础上增加了分布式热备功能,重建速度更快 | 较为复杂,需更高版本 ZFS 支持 | | RAID 10 | 50% | 在 ZFS 中通过结合 Mirror 和 Stripe 实现,先镜像后条带化 | 磁盘利用率低,但比单纯 Mirror 阵列提供更好性能 | 这里有 pool 和 filesystem 的概念,使用 `zpool` 创建的是池,参考于根目录,而使用 `zfs create pool/dir` 的方式是在 pool 下创建子文件系统,一般来说用这种方式来创建 `pool/video`、`pool/music` 这样分离的方式会更好管理 选择 ZFS 的 RAIDZ1,总共是 `4t * (7 - 1) + 6t = 30t`(会有缩水),其中 6t 单独拿出来不做 raid,步骤如下: 1. ZFS 在创建池时会在每个磁盘上记录唯一的元数据信息,为了确保 raid 阵列在今后迁移时能够保证磁盘顺序不变,且与所插入的物理插槽无关,通过 by-id 的方式来组件 zfs 阵列: 1. 首先为 7 块 4t 盘组建 RAIDZ1 存储池: ```bash # 确定要使用的磁盘 $ ls -al /dev/disk/by-id/ lrwxrwxrwx 1 root root 9 Mar 1 00:18 /dev/disk/by-id/ata-ST4000NM0035-1V4107_ZC18HJPF -> ../../sdc lrwxrwxrwx 1 root root 10 Mar 1 00:18 /dev/disk/by-id/ata-ST4000NM0035-1V4107_ZC18HJPF-part1 -> ../../sdc1 lrwxrwxrwx 1 root root 9 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY27TNF -> ../../sdf lrwxrwxrwx 1 root root 10 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY27TNF-part1 -> ../../sdf1 lrwxrwxrwx 1 root root 9 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JM4H -> ../../sdb lrwxrwxrwx 1 root root 10 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JM4H-part1 -> ../../sdb1 lrwxrwxrwx 1 root root 9 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JMC0 -> ../../sdh lrwxrwxrwx 1 root root 10 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JMC0-part1 -> ../../sdh1 lrwxrwxrwx 1 root root 9 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JMJJ -> ../../sdg lrwxrwxrwx 1 root root 10 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JMJJ-part1 -> ../../sdg1 lrwxrwxrwx 1 root root 9 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JN49 -> ../../sdd lrwxrwxrwx 1 root root 10 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JN49-part1 -> ../../sdd1 lrwxrwxrwx 1 root root 9 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JN7W -> ../../sda lrwxrwxrwx 1 root root 10 Mar 1 00:18 /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JN7W-part1 -> ../../sda1 lrwxrwxrwx 1 root root 9 Mar 1 00:18 /dev/disk/by-id/ata-WDC_WD60EJRX-89MP9Y1_WD-WX11D19511DC -> ../../sde lrwxrwxrwx 1 root root 10 Mar 1 00:18 /dev/disk/by-id/ata-WDC_WD60EJRX-89MP9Y1_WD-WX11D19511DC-part1 -> ../../sde1 ``` 这里的不带 `-part1` 的值就是磁盘的 guid(全局唯一标识符),然后根据具体情况创建 RAIDZ1 存储池 ```bash # zpool create -f <pool_name> <raid_type> guid1 guid2 ... $ zpool create -f raid4t raidz1 \ /dev/disk/by-id/ata-ST4000NM0035-1V4107_ZC18HJPF \ /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY27TNF \ /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JM4H \ /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JMC0 \ /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JMJJ \ /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JN49 \ /dev/disk/by-id/ata-ST4000VX007-2DT166_ZGY2JN7W ``` 2. 然后创建单独的 6t 盘存储池:`zpool create -f single6t /dev/disk/by-id/ata-WDC_WD60EJRX-89MP9Y1_WD-WX11D19511DC` 2. 然后创建并配置 ZFS 文件系统: 1. 在 RAIDZ1 存储池 data4t 和独立存储池 single6t 上创建文件系统:`zfs create raid4t/nas`、`zfs create single6t/data` 2. 设置 ZFS 数据压缩,可以提高机械硬盘的 IO 瓶颈,同时减少写入量,提高硬盘寿命:`zfs set compression=lz4 raid4t/nas`、`zfs set compression=lz4 single6t/data` 3. 禁用 atime,提高性能:`zfs set atime=off raid4t/nas`、`zfs set atime=off single6t/data` 3. 配置 ZFS 系统内存参数,ARC 是 ZFS 的内存缓存机制,用作缓存数据的缓冲区,由于 pve 还需要分配 14 - 16g 的内存给其他应用,因此这边将 ARC 缓冲区的大小设置为 12G(`pow(2, 10) * 12 * 1024 * 1024 = 12884901888`):`echo "options zfs zfs_arc_max=12884901888" > /etc/modprobe.d/zfs.conf` 4. 配置完成后查看相关回显: ```bash $ zpool status pool:raid4t state: ONLINE config: NAME STATE READ WRITE CKSUM data4t ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 ata-ST4000NM0035-1V4107_ZC18HJPF ONLINE 0 0 0 ata-ST4000VX007-2DT166_ZGY27TNF ONLINE 0 0 0 ata-ST4000VX007-2DT166_ZGY2JM4H ONLINE 0 0 0 ata-ST4000VX007-2DT166_ZGY2JMC0 ONLINE 0 0 0 ata-ST4000VX007-2DT166_ZGY2JMJJ ONLINE 0 0 0 ata-ST4000VX007-2DT166_ZGY2JN49 ONLINE 0 0 0 ata-ST4000VX007-2DT166_ZGY2JN7W ONLINE 0 0 0 errors: No known data errors pool: single6t state: ONLINE config: NAME STATE READ WRITE CKSUM single6t ONLINE 0 0 0 ata-WDC_WD60EJRX-89MP9Y1_WD-WX11D19511DC ONLINE 0 0 0 errors: No known data errors $ zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT raid4t 25.5T 1.43M 25.5T - - 0% 0% 1.00x ONLINE - single6t 5.45T 708K 5.45T - - 0% 0% 1.00x ONLINE - $ df -h Filesystem Size Used Avail Use% Mounted on udev 16G 0 16G 0% /dev tmpfs 3.1G 2.4M 3.1G 1% /run /dev/mapper/pve-root 94G 8.1G 82G 10% / tmpfs 16G 46M 16G 1% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock efivarfs 128K 36K 88K 29% /sys/firmware/efi/efivars /dev/nvme0n1p2 1022M 12M 1011M 2% /boot/efi /dev/fuse 128M 20K 128M 1% /etc/pve tmpfs 3.1G 0 3.1G 0% /run/user/0 raid4t 22T 256K 22T 1% /raid4t single6t 5.4T 128K 5.4T 1% /single6t raid4t/nas 22T 256K 22T 1% /raid4t/nas single6t/data 5.4T 128K 5.4T 1% /single6t/data ``` 由此 ZFS 文件系统就已经创建完毕 1. 想删除某个 zfs 系统:`zfs destory raid4t/nas` 2. 想删除某个 pool:`zfs destory raid4t` 3. 重命名 zfs 系统:`zfs rename raid4t/nas raid4t/new` 5. 此时有两种方式来使用 ZFS 管理的磁盘: 1. 直接挂载到 pve:`zfs set mountpoint=/mnt/nas raid4t/nas` 和 `zfs set mountpoint=/mnt/data single6t/data`,如果要解除挂载:`zfs unmount -f raid4t/nas` 2. (可选)由于是直接在 pve 中当作文件系统来使用,因此不再需要到 pve 的管理界面中再添加。如果需要用作它途,例如映射给虚拟机使用,那么需要到 *pve - 数据中心 - 存储 - 添加 - ZFS* 添加 ZFS 池,id 可以随意指定,ZFS 池选择 `raid4t/nas`,内容根据情况来选,例如 `Disk image` 是传统的 qcow2 虚拟机磁盘文件、`Container` 是 linux container 格式的文件系统(常用于 docker)等 ## 旁路由解决方案 旁路由有两种解决方案: 1. 使用 iStoreOS 处理 nas + 旁路由,这种是典型的在旁路由上添加 nas 功能的方案,一般会将硬盘通过直通或映射的方式给 iStoreOS 去管理 2. 使用 immortalwrt 单独管理旁路由 ### iStoreOS 安装 [iStoreOS](https://www.istoreos.com/),用于管理软路由以及 nas 存储,[安装参考](https://post.smzdm.com/p/a7nd00ql/),给的是 2c2g10G 的配置,如果想要路由和 nas 分离,参看 immortalwrt 部分 1. 下载 [镜像文件](https://fw0.koolcenter.com/iStoreOS/x86_64/istoreos-22.03.7-2024080210-x86-64-squashfs-combined.img.gz),由于 qemu 无法识别 img 格式的文件,直接选择下载 `squashfs.iso.gz` 格式的就好,然后将文件解压缩后主动将其挂载到硬盘 2. pve web 里 1. 创建虚拟机,名称 `iStoreOS`,VM ID 为 100,高级里的开机自启动勾上 2. 操作系统处选择不使用任何介质 3. 磁盘删除掉 4. cpu 1 插槽 2 核心,cpu type 选 host,这是独占两个逻辑核心 5. 内存 2048MiB 6. 网络桥接到 vmbr0,模型选 VirtIO 3. 然后将下载好的 gz 文件上传到 pve 的 `/tmp` 1. 解压:`gunzip istore-squashfs.iso.gz` 2. 挂载镜像:`qm importdisk 100 /tmp/istoreos-squashfs.img local-lvm`,挂载完成会显示 *Successfully imported disk as 'unused0:local-lvm:vm-100-disk-1'* 3. 然后回到 `web/数据中心/pve/100` 1. 硬件,将未使用的硬盘绑定到 scsi0,这里可以顺便增加 scsi0 的容量,我加了 58g 2. 硬件,添加硬盘,SCSI,存储就选择之前挂载的机械硬盘,磁盘大小是 GiB 需要换算(使用微软计算器),5.5TiB 填入 5680GB 即可,3.6TiB 的就填 3725GB,格式选择 raw(为了在 pve、或其他设备可以直接共享访问该硬盘数据);多块机械硬盘就添加多次 3. 选项,引导顺序将 scsi0 移到第一位 4. 开机(如果报错 *TASK ERROR: KVM virtualisation configured, but not available. Either disable in VM configuration or enable in BIOS.* ,则需要在主机的 bios 里开启虚拟化) 4. 见到 *iStoreOS is ready* 成功开机,按回车开始配置 iStoreOS,输入 `quickstart` 开始进行配置 1. 第一项 `Show Interfaces` 可以发现网络 ip 被 dhcp 自动配置到 `192.168.9.x` 了 2. 选择 `Change LAN IP`,修改如下:`192.168.9.4`、`255.255.255.0` 3. 修改完成后,在网段内输入 `http://192.168.9.4` 进入 iStoreOS 的配置界面,预设账密是 `root/password` 4. 然后到路由器里配置静态 ip 绑定 `iStoreOS` 的 mac 到 192.168.9.4 5. 使用 ssh 连接到终端,默认登录账密也是 `root / password`,然后参照 [init-a-new-vps-host](https://www.majo.im/index.php/wkyuu/342.html) 配置 iStoreOS 1. 新建用户 wkyuu:`groupadd -g 1000 wkyuu`、`useradd -s /bin/ash -g wkyuu -G adm,users,docker -u 1000 -d /home/wkyuu -m wkyuu`、`passwd wkyuu` 2. 为 root 和 wkyuu 配置 ssh 免密登录,这里由于 iStoreOS 使用的是 dropbear ssh,在本地创建一个文件,输入 `authorized_keys` 里的内容,然后在 `web/系统/管理权/SSH密钥` 里将其上传,该文件会被放置到 `/etc/dropbear/authorized_keys` 3. 将 wkyuu 添加到 docker 组:`usermod add -aG docker wkyuu` 6. (可选)为 iStoreOS 系统目录扩容,如果是后续调整加盘,但是系统里没有自动将其挂载,则需要手动分区 1. 输入 `lsblk` 查看未利用情况 ```bash root@nas:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 60.4G 0 disk ├─sda1 8:1 0 128M 0 part /boot │ /boot ├─sda2 8:2 0 256M 0 part /rom └─sda3 8:3 0 2G 0 part /overlay/upper/opt/docker /overlay ``` 2. 使用 `fdisk /dev/sda` 操作磁盘信息 1. 删除分区:一进去就输入 `d`,然后选择分区 `3` 2. 创建分区:然后输入 `n`,选择分区类型为主分区 `p`,分区号 `3`,起始和结束扇区都默认即可 3. 完成修改:输入 `w` 即可 3. 然后重启 `reboot` 即可看到更改 7. 网络附加存储(nas) 1. 在 `web/系统/磁盘管理` 中可以看到已经成功挂载的机械硬盘及其容量 2. 进入 `web/网络存储/磁盘阵列`,创建磁盘阵列 1. 各种 raid 的区别: | 类型 | 磁盘利用率 | 原理 | 缺点 | | --------- | ------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------- | | raid 0 | 100% | 数据被分割并同时写入多块硬盘,使得读写速度提升 | 一块盘坏,全部坏 | | raid 1 | 50% | 平均分成两组,当数据被存到其中一组时,也会被完全复制到另一组硬盘上,一块硬盘损坏,数据可以从镜像盘中恢复 | 吃空间 | | raid 5 | 减去 1 块盘 | 数据分布在所有硬盘上,使用奇偶校验信息来在 1 块硬盘损坏的情况下恢复数据 | 写入速度较慢,特别是小文件 | | raid 6 | 减去 2 块盘 | 数据分布在所有硬盘上,使用奇偶校验信息来在 2 块硬盘损坏的情况下恢复数据 | 写入性能更差,配置起来复杂 | | raid 10 | 50% | 结合 raid 0 和 raid 1,先将数据镜像到两组硬盘,然后对镜像盘进行条带化 | 吃空间 | 2. 确定 raid 后,选择硬盘来创建,我这里选择了 raid 5,但是由于既有 5.5t 又有 3.6t,会导致全部按照 3.6t 的大小来组建 raid 5,会浪费 6t 左右的空间,因此还可以分开组 raid:7 块 3.6t 的盘组 raid 5,3 块 5.5t 的盘组 raid 5;两者方案对比:`5.5 * 2 + 3.6 * 6 = 32.6`、`3.6 * 9 = 32.4`,方便起见,可以选择 10 块全组 raid 5,由于最后是将 raid 阵列抽象成单个硬盘,因此组多个 raid 可以将数据分成多种类型来存储,例如 `3.6 * 6` 全部存种子下载的文件,`5.5 * 2` 存相片、录像文件 3. 按照 `5.5 * 2 + 3.6 * 6 = 32.6` 的方式组建 raid 5,得到两个路径:`/mnt/md0`、`/mnt/md1`,之后存储数据只要选择这两个路径就可以了,剩下的交给 raid 5 系统来实现 3. 进入 `web/网络存储/统一文件共享` 1. 常规设置启用 2. 在 `用户` 选项卡添加用户账密 3. 在 `统一文件共享` 选项卡,路径 `/mnt/data_mdx`,名称 `storage`,用户勾选上刚才创建的用户 4. 保存并应用 4. 在 windows 上,资源管理器添加网络位置:`\\nas\storage`(这里的 `nas` 是主机名),选择一个名称即可 5. 在 linux 上,需要手动 mount,debian 系参考如下 1. `sudo apt update && sudo apt install cifs-utils` 2. `mkdir -p /mnt/samba sudo mount -t cifs //192.168.9.4/storage /mnt/samba -o username=user`,然后输入密码 3. 挂载完成后即可进入并访问 8. 配网,科学上网 1. 到 [openclash](https://github.com/vernesong/OpenClash.git) 获取 ipk 文件:[luci-app-openclash-x.ipk](https://github.com/vernesong/OpenClash/releases/download/v0.46.014-beta/luci-app-openclash_0.46.014-beta_all.ipk) 2. 安装前置:`opkg update`,`opkg install coreutils-nohup bash iptables dnsmasq-full curl ca-certificates ipset ip-full iptables-mod-tproxy iptables-mod-extra libcap libcap-bin ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base` 3. 在 `web/iStore/手动安装` 选择下载好的 ipk 文件安装即可在 `web/服务/OpenClash` 里看到,第一次点进去可能会要求下载内核,选择一个可连接的 cdn 下载即可 4. 除了要安装内核、上传配置文件外,还需要到 *web - 服务 - OpenClash - 覆写设置 - 常规设置* 最下方删除掉默认生成的一个账户,否则在使用代理时会报 407 错误,设置完成后点击应用设置 ### ImmortalWrt 十分接近原版 OpenWrt,适合稳定、精简,旁路由只干好自己本职工作的场景,[镜像下载链接](https://mirrors.sdu.edu.cn/immortalwrt/releases/24.10.0/targets/x86/64/);在当前场景的设计中,bcm5720 是一块免驱的 2 千兆口 PCIe 网卡,使用 f0 和 f1 来代表这两个网口,其中 f0 已经被用作 pve 的 vmbr0,打算将 f1 直通给 wrt,作为其 wan 口,让主路由给 f1 提供 wan(也就是 f1 连接主路由的 lan 口),pve 中其他虚拟机将 wrt 的 f1 设置为网关时,可以通过 *vmbr0(f0) -> vSwitch(PCIe) -> wrt 的 wan(f1)* 的方式吃满这张 bcm5720(即其他虚拟机成为了 wrt 的子网) 给的是 2c2g2g 的配置,大体上是参考上文 iStoreOS 的创建方式,下载文件系统然后导入到空磁盘安装,具体内容可以参考着执行,下面使用 qcow2 + efi 的方式来导入(这边的 vmid 是 100,后文碰到 vmid 的地方会直接写 100): 1. 在创建虚拟机时,内存 2048、处理器 1 插槽 2 核心选择 host、bios 选择 ovmf、机型选择 q35 和 viommu intel(支持 amd)、网络(如果有多网卡,也要继续选择 VirtIO、vmbr0,这是为旁路由的设计)、硬盘去掉,其他默认即可 2. 选择 ext4 文件格式,方便有需求的情况下扩容:immortalwrt-x86-64-generic-ext4-combined-efi.qcow2.gz 3. 下载后的 qcow2.gz 无法在 pve 上通过工具直接解压,可以本地解压提取出其中的 qcow2 文件后再上传到 pve 里:`rsync -avtz --progress ./immortalwrt-x86-64-generic-ext4-combined-efi.qcow2 root@host:/tmp/immortalwrt-efi.qcow2` 4. 导入:`qm importdisk 100 /tmp/immortalwrt-24.10.0-x86-64-generic-ext4-combined-efi.qcow2 local-lvm --format=qcow2`,导入完成后到 web 就可以看到 wrt 的硬件页面出现了未使用磁盘 0,点击编辑这个磁盘,然后再点添加即可 5. 在左侧 选项 里找到 引导顺序 选择 scsi0,拖动到顶端 6. 开机,初次进入可以为 root 账号配置一个密码:`passwd` 然后开始直通网卡 1. **注意:直通网卡前,需要通过 vfio 配置网卡隔离,如果未配置网卡隔离直接直通,会导致网卡被完全直通给虚拟机(常见于多网口的 PCIE 网卡),如果此时又正好是通过该 PCIE 网卡访问的 pve 后台,这将导致 pve 的后台无法通过之前的网口进入**,需要手动进入 pve 的 shell:`qm set vmid --delete hostpci0` 来删除网卡直通(可以通过 `qm config 100` 来查看其 pci 设备的 key) 2. 先修改 grub 1. intel 的 cpu:`vim /etc/default/grub`,在 `GRUB_CMDLINE_LINUX_DEFAULT="quiet"` 修改成 `GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"` 2. amd 的是:`GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"` 3. 然后 `update-grub` 4. `reboot` 3. 然后修改 `vim /etc/modules` 添加以下行,该文件默认为空 ```ini vfio vfio_iommu_type1 vfio_pci vfio_virqfd ``` 使用 `update-initramfs -k all -u` 更新内核,然后使用 `find /sys/kernel/iommu_groups/ -type l` 查看如果出现了很多直通组,就算开启直通成功一半了,输出示例如下 ```bash $ find /sys/kernel/iommu_groups/ -type l /sys/kernel/iommu_groups/7/devices/0000:00:18.3 /sys/kernel/iommu_groups/7/devices/0000:00:18.1 /sys/kernel/iommu_groups/7/devices/0000:00:18.6 /sys/kernel/iommu_groups/7/devices/0000:00:18.4 /sys/kernel/iommu_groups/7/devices/0000:00:18.2 /sys/kernel/iommu_groups/7/devices/0000:00:18.0 /sys/kernel/iommu_groups/7/devices/0000:00:18.7 ... $ dmesg | grep -e DMAR -e IOMMU [ 0.000000] Warning: PCIe ACS overrides enabled; This may allow non-IOMMU protected peer-to-peer DMA [ 0.390595] pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported [ 0.401186] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank). ``` 4. 现在解决另一半的直通: 1. 输入 `for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*}; printf 'IOMMU Group %s ' "$n"; lspci -nns "${d##*/}"; done | grep Eth`,这个命令会列出系统中与网卡相关的 IOMMU 分组,示例如下 ```bash # for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*}; printf 'IOMMU Group %s ' "$n"; lspci -nns "${d##*/}"; done | grep Eth IOMMU Group 8 04:00.0 Ethernet controller [0200]: Broadcom Inc. and subsidiaries NetXtreme BCM5720 Gigabit Ethernet PCIe [14e4:165f] IOMMU Group 8 04:00.1 Ethernet controller [0200]: Broadcom Inc. and subsidiaries NetXtreme BCM5720 Gigabit Ethernet PCIe [14e4:165f] IOMMU Group 8 07:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller [10ec:8125] (rev 05) ``` 如果发现你的网口并没有被分到同一个 IOMMU Group,就可以直接跳过下面的步骤了 2. 会发现上述三个网卡全都被分到了同一个 IOMMU 组,IOMMU 组是硬件设备的分组,同一组内的设备在 DMA 和中断处理上是相互关联的,必须一起直通给虚拟机,也就是无法隔离开来 3. 想要实现 bcm5720 的两个网口 f0 和 f1,其中 f0 作为 pve 的管理口(也是其中其他虚拟机的 vmbr0 桥接口),f1 直通给 wrt,就必须拆分 IOMMU 分组,通过使用 [pcie_acs_override](https://lkml.org/lkml/2013/5/30/513) 功能强制将所有设备全部分开成不同的 IOMMU 分组,需要修改 `vim /etc/default/grub` 内容如下: ```ini GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt pcie_acs_override=downstream,multifunction" ``` 修改完成后 `update-grub`、`reboot`,之后再次重新查看: ```bash # for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*}; printf 'IOMMU Group %s ' "$n"; lspci -nns "${d##*/}"; done | grep Eth IOMMU Group 17 04:00.0 Ethernet controller [0200]: Broadcom Inc. and subsidiaries NetXtreme BCM5720 Gigabit Ethernet PCIe [14e4:165f] IOMMU Group 18 04:00.1 Ethernet controller [0200]: Broadcom Inc. and subsidiaries NetXtreme BCM5720 Gigabit Ethernet PCIe [14e4:165f] IOMMU Group 20 07:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller [10ec:8125] (rev 05) ``` 此时的 IOMMU 就被强制分开了 5. 通过 `lspci | grep net` 找到自己的网卡设备,这边是打算将 `04:00.1` 直通给 wrt ```bash # lspci | grep net 04:00.0 Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM5720 Gigabit Ethernet PCIe 04:00.1 Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM5720 Gigabit Ethernet PCIe 07:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05) ``` 6. 到 web 界面中,wrt 的硬件里添加 pci 设备,这里应该可以看到 bcm5720 被分开不同的 IOMMU 组,**记得不要勾选所有功能**,否则会将 pcie 完全直通给 wrt,相当于前面白干 7. 如果成功了将在 web 里对应的虚拟机看到 pci 设备,进入系统后输入 `ip a` 也应该可以看到已经有了直通进来的网卡的 mac 8. 此时的 ip 是 192.168.1.1,不一定能访问得到,这里需要配置 `/etc/config/network` 实现设计的旁路由内容 1. 由于既有 vmbr0 又有 f1(pcie 网卡) 直通,pve 会优先引导 vmbr0 然后才到 pcie,因此 vmbr0 对应 eth0、f1 对应 eth1 2. 配置 `/etc/config/network` 如下 ```bash root@ImmortalWrt:~# cat /etc/config/network config interface 'loopback' option device 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config globals 'globals' option ula_prefix 'fdaf:f5d4:e2c::/48' option packet_steering '1' config interface 'lan' option device 'eth0' option proto 'static' option ipaddr '192.168.9.5' option netmask '255.255.255.0' config interface 'wan' option device 'eth1' option proto 'static' option ipaddr '192.168.9.4' option netmask '255.255.255.0' option gateway '192.168.9.1' root@ImmortalWrt:~# service network restart root@ImmortalWrt:~# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000 link/ether bc:24:11:82:eb:cb brd ff:ff:ff:ff:ff:ff inet 192.168.9.5/24 brd 192.168.9.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:0a:f7:86:6d:99 brd ff:ff:ff:ff:ff:ff inet 192.168.9.4/24 brd 192.168.9.255 scope global eth1 valid_lft forever preferred_lft forever ``` 3. 可以在 `vim /tmp/resolv.conf` 中添加 dns 服务器:`nameserver 223.5.5.5`,然后持久化:`ln -sf /tmp/resolv.conf /etc/resolv.conf` 4. 配置完成后执行 `service network restart` 来应用网络 9. 配置软件包 1. 不建议换 ustc 的源,他们更新慢 2. 配置代理:`vim /etc/opkg.conf`,添加 `option http_proxy xxx`、`option https_proxy xxx` 3. 更新:`opkg update` 4. 安装主题:`wget https://github.com/jerrykuku/luci-theme-argon/releases/download/v2.3.1/luci-theme-argon_2.3.1_all.ipk`、`wget https://github.com/jerrykuku/luci-app-argon-config/releases/download/v0.9/luci-app-argon-config_0.9_all.ipk`,`opkg install luci*.ipk` 5. 装点常用软件:`opkg install curl iperf3 rsync ddns-go` 6. 一些项目推荐: 1. ~~[nikkinikki-org/OpenWrt-nikki](https://github.com/nikkinikki-org/OpenWrt-nikki.git)~~ **请勿使用这个代理,不好用不说,作者态度傲慢** 2. [vernesong/OpenClash](https://github.com/vernesong/OpenClash.git) 3. luci-app-filebrowser,用于查看 wrt 内部文件,配置完成后在系统选项卡中查看 10. 通过 ip 访问 wrt 的网页,默认账密为 `root / password`,如果在上面使用过 `passwd` 来设置密码,那么密码就是所设置的 ## vm 除了 nas、软路由,还需要选择一个可以访问图形界面的系统,这里以基于 debian 的 kali 为例 1. 参考安装 iStoreOS 时的方式,只不过这次选择的是 iso 安装 2. 磁盘选择 `local-lvm`,磁盘大小给到了 239GiB(就是所谓 256GB) 3. cpu 给到 2 插槽 3 核心共 6 个核心,类别选择 host 4. 内存给了 16384MiB(就是所谓 16GB) 5. 网络桥接到 vmbr0 即可 6. 开始安装系统 1. 在 disk 分区那块,选择手动分区,主硬盘是 `primary 252.6GB ext4 /`,然后剩下一个 `logical 4GB swap swap` 2. 在安装 grub 来 boot 系统那块,选择 primary disk,然后位置 `/dev/sda` 3. 安装完成后,回到选项里在引导顺序中将 scsi0 移到顶上再重新启动系统即可进入 kali 7. 安装完成后初始化方式就可以参考:[init-my-unix](https://www.majo.im/index.php/wkyuu/356.html) ## other ### u 盘不识别 1. 参照 [win10/win11 系统安装教程(新装、重装)](https://zhuanlan.zhihu.com/p/93127323) 安装 windows 系统,使用图吧工具箱测试性能 2. 清空 u 盘启动盘状态,恢复成普通 u 盘 1. `diskpart`,使用 `?` 查看帮助 2. `list disk` 查看硬体磁盘信息,找到 u 盘设备,这里是 `磁盘 2` 3. 因此 `select disk 2` 4. 清空:`clean` 5. 创建主分区:`create partition primary` 6. 选择该分区:`select partition 1` 7. 格式化该分区:`format fs=ntfs quick`,fs 还可选 fat32,一般是为空间较小的 u 盘准备的 8. 分配一个驱动器号:`assign`(这一步一般会在格式化后自动完成并识别出来,如果没有就手动分配) ### ssd 不识别 新买了一块 2t 的 ssd,插上 pve 开机时可能不识别,需要按照以下操作: 1. `lsblk` 查看新增的固态名称,这里是 nvme0n1 2. 对其格式化:`fdisk /dev/nvme0n1`, 1. 输入 `n` 开始创建分区,这里 `p` 和 `e`,如果只想用来存数据,则选择 p 即可,然后一路回车默认即可 2. 再次输入 `p` 可以查看分区表,确认分区已经创建 3. 输入 `w` 写入分区表,然后会自动退出 3. `partprobe` 刷新系统的分区表信息,此时再 `lsblk` 就能看到 nvme0n1 有 disk 信息了 4. 想要系统能够使用该固态,需要将该固态修改成 ext4 文件系统:`sudo mkfs.ext4 /dev/nvme0n1p1` 5. 修改完成后即可挂载:`sudo mount /dev/nvme0n1p1 /mnt/nvme0n1` 6. 性能测试:`sudo apt-get update && sudo apt-get install fio`,然后简单测试:`sudo fio --name=randwrite --ioengine=libaio --direct=1 --rw=randwrite --bs=4k --numjobs=1 --size=1G --time_based --runtime=30 --group_reporting --allow_mounted_write=1 --filename=/dev/nvme0n1` ### 挂载机械硬盘 挂载系统中的机械硬盘(更推荐通过 ZFS 系统来配置自己的磁盘资源,参看前文),查看所有的机械盘信息: ```bash $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 3.6T 0 disk └─sda1 8:1 0 128M 0 part sdb 8:16 0 5.5T 0 disk └─sdb1 8:17 0 128M 0 part sdc 8:32 0 3.6T 0 disk └─sdc1 8:33 0 128M 0 part sdd 8:48 0 5.5T 0 disk └─sdd1 8:49 0 128M 0 part sde 8:64 0 3.6T 0 disk └─sde1 8:65 0 128M 0 part sdf 8:80 0 3.6T 0 disk └─sdf1 8:81 0 128M 0 part sdg 8:96 0 3.6T 0 disk └─sdg1 8:97 0 128M 0 part sdh 8:112 0 3.6T 0 disk └─sdh1 8:113 0 128M 0 part sdi 8:128 0 5.5T 0 disk └─sdi1 8:129 0 128M 0 part sdj 8:144 0 3.6T 0 disk └─sdj1 8:145 0 128M 0 part nvme0n1 259:0 0 931.5G 0 disk ├─nvme0n1p1 259:1 0 1007K 0 part ├─nvme0n1p2 259:2 0 1G 0 part /boot/efi └─nvme0n1p3 259:3 0 930.5G 0 part ├─pve-swap 252:0 0 8G 0 lvm [SWAP] ├─pve-root 252:1 0 96G 0 lvm / ├─pve-data_tmeta 252:2 0 8.1G 0 lvm │ └─pve-data-tpool 252:4 0 794.3G 0 lvm │ ├─pve-data 252:5 0 794.3G 1 lvm │ └─pve-vm--100--disk--0 252:6 0 60.4G 0 lvm └─pve-data_tdata 252:3 0 794.3G 0 lvm └─pve-data-tpool 252:4 0 794.3G 0 lvm ├─pve-data 252:5 0 794.3G 1 lvm └─pve-vm--100--disk--0 252:6 0 60.4G 0 lvm $ df -h Filesystem Size Used Avail Use% Mounted on udev 16G 0 16G 0% /dev tmpfs 3.1G 1.4M 3.1G 1% /run /dev/mapper/pve-root 94G 18G 72G 20% / tmpfs 16G 46M 16G 1% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock efivarfs 128K 36K 88K 29% /sys/firmware/efi/efivars /dev/nvme0n1p2 1022M 12M 1011M 2% /boot/efi /dev/fuse 128M 16K 128M 1% /etc/pve tmpfs 3.1G 0 3.1G 0% /run/user/0 ``` 可以看到有 10 块机械硬盘没有被挂载,且只用了很小一部分的 ssd 作为 pve 的系统盘 1. 先格式化机械硬盘:`fdisk /dev/sda`,然后 `d` 删除分区,`n` 新建分区,默认分区号 `1`,默认起始和结束扇区,`w` 完成修改 2. 为空的机械硬盘创建文件系统 `mkfs -t ext4 /dev/sda1` 3. 创建目录并挂载:`mkdir -p /mnt/disk1`,`mount /dev/sda1 /mnt/disk1` 4. 配置自动挂载,需要编辑 `/etc/fstab` 文件,在末尾加入信息 `/dev/sda1 /mnt/disk1 ext4 defaults 0 0`,示例如下: ```ini # <file system> <mount point> <type> <options> <dump> <pass> /dev/pve/root / ext4 errors=remount-ro 0 1 UUID=41F2-21AB /boot/efi vfat defaults 0 1 /dev/pve/swap none swap sw 0 0 proc /proc proc defaults 0 0 /dev/sda1 /mnt/disk1 ext4 defaults 0 0 ``` 修改完成后,输入 `systemctl daemon-reload` 重载配置,此时再 `df -h` 就可以看到已经挂载上了 5. 有 10 块盘,就循环配置并挂载、写入文件即可 1. `mkdir -p /mnt/disk01-5.5t /mnt/disk02-5.5t /mnt/disk03-5.5t /mnt/disk04-3.6t /mnt/disk05-3.6t /mnt/disk06-3.6t /mnt/disk07-3.6t /mnt/disk08-3.6t /mnt/disk09-3.6t /mnt/disk10-3.6t` 2. `touch /tmp/mount.sh && chmod +x /tmp/mount.sh`: ```bash #/usr/bin/env bash mount /dev/sdb1 /mnt/disk01-5.5t mount /dev/sdd1 /mnt/disk02-5.5t mount /dev/sdi1 /mnt/disk03-5.5t mount /dev/sda1 /mnt/disk04-3.6t mount /dev/sdc1 /mnt/disk05-3.6t mount /dev/sde1 /mnt/disk06-3.6t mount /dev/sdf1 /mnt/disk07-3.6t mount /dev/sdg1 /mnt/disk08-3.6t mount /dev/sdh1 /mnt/disk09-3.6t mount /dev/sdj1 /mnt/disk10-3.6t ``` 3. `vim /etc/fstab` ```ini # <file system> <mount point> <type> <options> <dump> <pass> /dev/pve/root / ext4 errors=remount-ro 0 1 UUID=41F2-21AB /boot/efi vfat defaults 0 1 /dev/pve/swap none swap sw 0 0 proc /proc proc defaults 0 0 /dev/sdb1 /mnt/disk01-5.5t ext4 defaults 0 0 /dev/sdd1 /mnt/disk02-5.5t ext4 defaults 0 0 /dev/sdi1 /mnt/disk03-5.5t ext4 defaults 0 0 /dev/sda1 /mnt/disk04-3.6t ext4 defaults 0 0 /dev/sdc1 /mnt/disk05-3.6t ext4 defaults 0 0 /dev/sde1 /mnt/disk06-3.6t ext4 defaults 0 0 /dev/sdf1 /mnt/disk07-3.6t ext4 defaults 0 0 /dev/sdg1 /mnt/disk08-3.6t ext4 defaults 0 0 /dev/sdh1 /mnt/disk09-3.6t ext4 defaults 0 0 /dev/sdj1 /mnt/disk10-3.6t ext4 defaults 0 0 ``` `systemctl daemon-reload` 4. 配置完可以 `reboot` 看看结果 到 *web - 数据中心 - 存储 - 添加* 选择添加目录,参考:ID 随便输可以与前文一致(`disk01-5.5t`),目录就选择对应的 `/mnt/disk`(`/mnt/disk01-5.5t`),内容选磁盘映像;此时应该可以在左侧看到已挂载的硬盘 ### initramfs 问题 PVE 开机总是进入 initramfs 无法正常进入系统,[参考](https://www.bilibili.com/read/cv21618228/):`sed 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="rootdelay=10 quiet"/g' /etc/default/grub` ### 路由风暴问题(重要) 按照以上思路配置完设备后,当 pve 同时拥有两张网卡时,可能会因为相同路由导致局域网内的广播风暴,具体表现为局域网内其他设备会时不时断网, ```bash # ip route default via 192.168.9.1 dev vmbr0 proto kernel onlink 192.168.9.0/24 dev vmbr0 proto kernel scope link src 192.168.9.3 192.168.9.0/24 dev enp7s0 proto kernel scope link src 192.168.9.6 ``` 查看路由表,可以发现起初设计的由 enp7s0 提供 2.5g 带宽能力给 nas,vmbr0(使用 enp4s0f0 网口)提供 pve 及其虚拟机访问能力,在路由上出现了问题:**同一网段(192.168.9.0/24)有两条重复路由,一条通过 vmbr0,一条通过 enp7s0,系统不知道该通过哪个网卡发送数据包,这会导致路由混乱和 ARP 冲突** 为什么 ARP 表混乱和广播风暴会影响局域网其他设备?这实际上是一种无意的自我 DoS 攻击 1. PVE 主机使用两个不同的物理网卡(不同 MAC 地址)宣告了同一个子网的路由。当其他设备(如 192.168.9.2)需要与 PVE 通信时: * 它会发送 ARP 广播询问"谁是 192.168.9.3/192.168.9.6" * PVE 会从两个不同网卡回应,提供不同的 MAC 地址 * 其他设备的 ARP 表会频繁更新,导致通信不稳定 * 路由器的 ARP 表也会反复变化,造成路由不稳定 2. 广播风暴,当两个网卡都连接到同一个物理网络时: * 一个网卡接收的广播包会被另一个网卡重新发送 * 形成广播循环,迅速耗尽网络带宽和设备处理能力 * 网络设备因处理大量无效包而变得不可用 以下是 5 种解决思路 #### 链路聚合 **最推荐** 将 enp7s0 也添加到 vmbr0 桥接中,这种方式是将 enp4s0f0 和 enp7s0 都桥接给 vmbr0 但是这样就没法实现 enp7s0 单占一个 ip,好处是可以通过链路聚合的方式实现两个网卡的负载均衡,且会优先使用 enp7s0 网卡 链路聚合是一种将多个物理网络接口组合成一个逻辑接口的技术,在 Linux 系统中,通过内核的 bonding 驱动实现,主要用于: * 增加带宽容量:理论上可将多个网卡带宽合并 * 提供冗余:一个网卡失效时,另一个可继续工作 * 负载均衡:在多个网卡间分配流量,balance-alb 模式会自动优先使用 2.5G 网卡,在大文件传输时,系统会尽可能使用最快的链路,当多个客户端同时访问 NAS 时,流量可以分散到两个网卡,系统会动态平衡网络负载,提高整体吞吐量 如果明确不需要为 nas 单独分配 ip,那么选择链路聚合的方案可以简化网络结构 实现方式也简单,先安装 `apt install ifenslave`,然后启用模块:`modprobe bonding`,`echo "bonding" >> /etc/modules` 编辑 `vim /etc/network/interfaces`(注意注释内容不能写在配置后面,不然无法识别甚至报错): ```ini auto bond0 iface bond0 inet manual # 2.5G网卡放前面优先使用 bond-slaves enp7s0 enp4s0f0 # 自适应负载均衡模式 bond-mode balance-alb # 链路监控间隔 bond-miimon 100 # 基于IP+端口分配流量 bond-xmit-hash-policy layer3+4 # 明确指定2.5G为主要链路 bond-primary enp7s0 auto vmbr0 iface vmbr0 inet static address 192.168.9.3/24 gateway 192.168.9.1 bridge-ports bond0 bridge-stp off bridge-fd 0 ``` 重启系统即可 #### 策略路由 **次要推荐,原因是我用这种方式还是存在风暴的问题,也可能是我没完全配明白** 首先配置网口控制文件:`vim /etc/network/interfaces`: ```ini auto lo iface lo inet loopback iface enp4s0f0 inet manual iface wlp6s0 inet manual auto vmbr0 iface vmbr0 inet static address 192.168.9.3/24 gateway 192.168.9.1 bridge-ports enp4s0f0 bridge-stp off bridge-fd 0 auto enp7s0 iface enp7s0 inet static address 192.168.9.6/24 # 删除主路由表中的重复路由 post-up ip route del 192.168.9.0/24 dev enp7s0 proto kernel scope link src 192.168.9.6 # 策略路由配置, 添加双向策略路由规则 post-up ip route add 192.168.9.0/24 dev enp7s0 src 192.168.9.6 table 200 post-up ip route add default via 192.168.9.1 dev enp7s0 table 200 post-up ip rule add from 192.168.9.6 lookup 200 priority 100 post-up ip rule add to 192.168.9.6 lookup 200 priority 100 # 确保从 192.168.9.6 发出的流量只使用 enp7s0 # 发往 192.168.9.6 的流量只使用 enp7s0 # 其他流量使用主路由表, 即通过 vmbr0/192.168.9.3 # ARP和网络优化 post-up echo 1 > /proc/sys/net/ipv4/conf/enp7s0/arp_filter # 确保每个网卡只响应发给自己 IP 的 ARP 请求 post-up echo 2 > /proc/sys/net/ipv4/conf/enp7s0/rp_filter # 只响应目标 IP 匹配的 ARP 请求 post-up echo 1 > /proc/sys/net/ipv4/conf/enp7s0/arp_announce # 使用更严格的 ARP 通告策略 post-up echo 2 > /proc/sys/net/ipv4/conf/enp7s0/arp_ignore # 网络性能优化, tso: TCP 分段卸载, gso: 通用分段卸载, gro: 通用接收卸载 post-up ethtool -K enp7s0 tso on gso on gro on # 清理接口关闭时的配置 pre-down ip rule del from 192.168.9.6 lookup 200 priority 100 pre-down ip rule del to 192.168.9.6 lookup 200 priority 100 source /etc/network/interfaces.d/* ``` 然后修改系统 ipv4 吞吐性能 `vim /etc/sysctl.d/99-network-tuning.conf`: ```ini # 基本网络优化 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_sack = 1 # 缓冲区优化 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 # TCP优化 net.ipv4.tcp_mtu_probing = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_slow_start_after_idle = 0 # 网络接口优化 net.core.netdev_max_backlog = 5000 ``` 修改完成后应用网络配置 `sysctl -p /etc/sysctl.d/99-network-tuning.conf`,重启网络 `systemctl restart networking` 通过以上配置,实现了: * 完全隔离了两个网卡的流量路由 * 避免了 ARP 响应冲突 * 保持了 2.5G 网卡的独立带宽优势 * 优化了网络性能 #### 虚拟机直通 就是通过 pve 创建虚拟机,然后 enp7s0 直通给虚拟机就行,这么做就是把虚拟机抽象出来成为局域网的成员,两个不同的 Linux 内核管理两个不同的路由,自然不会风暴了 #### 配置不同子网 将 enp7s0 配置成不同的子网 ```ini iface enp7s0 inet static address 192.168.10.1/24 ``` 按照这么配置,带来以下问题: 1. 需要在主路由中配置相应的静态路由 2. 所有其他 192.168.9.0/24 的设备都需要添加一条到 192.168.10.0/24 的路由:`ip route add 192.168.10.0/24 via 192.168.9.1 dev IFNAME` ## refer 1. https://post.smzdm.com/p/a7nd00ql/ 2. https://zahui.fan/posts/cfedbd03/ 3. https://mdnice.com/writing/1e33dbfdbbab4fbeba0d4a4632d0208a 4. https://www.cnblogs.com/varden/p/15246180.html 5. https://www.orcy.net.cn/185.html 6. https://foxi.buduanwang.vip/virtualization/pve/561.html/ 7. https://pve.proxmox.com/wiki/PCI_Passthrough [pve.drawio](assets/pve-20250305005915-75pxsp8.drawio) © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏