
给折腾了一个多月的自组NAS做个完整记录。动机主要有三点:
- 用作仓库的SSD快满了,而且还有一堆相机的raw要存
- 需要对部分重要数据做备份,万一电脑硬盘炸了得不偿失
- 不想在电脑上开vmware/wsl2跑Linux
但就算有各种教程和资料,装的时候也走了相当多的弯路,记下来就当复习一下学到的东西。

1 - 硬件与网络拓扑图
2 - 刷入PVE,AX210无线网卡调试
3 - 安装虚拟机,软路由设置虚拟机联网
4 - NAT映射与windows远程桌面测试
5 - 硬盘直通,物理机访问群晖共享文件夹

乔思伯N2机箱,畅网微控N305主板,4块sata(希捷16T)组raid5
两条m2nvme固态(256G+1T),一条DDR5 48G内存
只用AX210无线网卡,全程无需网线,但代价是≈20MB/s的低传输速率
虚拟机分出软路由、群晖和win11,但为了避免All-in-Boom软路由仅供虚拟机使用
itx主板外加SFX全模组电源,走线并不麻烦,换了主板和机箱的原配风扇,装好内存硬盘网卡,接上电源,一次点亮。
专栏封面上的重炮?那玩意是AX210连出来的天线。

真要说的话,加了四块硬盘的机箱有点重
然后是家里网络的拓扑图;
目标是局域网内的所有设备都能访问到虚拟机上的群晖系统,且能远程控制win11。

主路由和软路由都设置了IP固定,后面的IP设置会以这张图为基础。

虚拟机底层系统有三个选择:
-Windows + HyperV
-VMware ESXi
-Proxmox Virtual Environment(PVE)
调查了一阵子后,发现ESXi似乎不支持AX210/AX211网卡(无法识别驱动),而在N305处理器上跑windows底层无论是速度还是功耗都不太乐观,且在全天24小时开机的情况下系统并不稳定...那还是去折腾PVE吧。
找个32G的u盘,用ventoy做成引导盘,然后拷了官网的Proxmox 8.2镜像启动安装到ssd。

装好后,用户名root+安装时设置的密码登录Linux shell。
安装wpa_supplicant,没有联网,于是挂载u盘的安装包:
cd /root/
mkdir wpa
fdisk -l #查找连接中的设备
mount -i /dev/sda1 /mnt #sda1是U盘的设备id,硬盘也是同理
cp /mnt/wpa/* ~/wpa/ #挂载U盘
cd wpa
dpkg -i *.deb #安装
#取消挂载,装完wpa后U盘就可以拔了
umount -i /dev/sda1 看一下连接状态:

无线网卡(id是wls12)此时还没有任何连接:
4.wls12:<BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether dc:97:ba:b6:72:04 brd ff:ff:ff:ff:ff:ff
altname wlp6s0 接着创建连接wifi的配置,在此之前建议先看一下相关资料以熟悉每个属性的作用:
https://wiki.archlinuxcn.org/wiki/Wpa_supplicant
> wpa passphrase <WiFi名称> <WiFi密码> >> /etc/wpa.conf 修改生成的配置文件,没有priority和scan_ssid,需要手动添加:
network={
ssid="WiFi名称"
scan ssid=1 #允许搜索ssid
#psk="WiFi密码"
priority=1 #优先连接
psk=XXXXXX #这部分是wpa_passphrase自动生成的加密后密码
}
#另外可以多设置几个网备用,通过改priority来设置优先级
network={
ssid="第二WiFi名称"
scan ssid=1
#psk="第二WiFi密码"
priority=2
psk=XXXXXX
} 然后设置用来建立网络的/etc/network/interfaces。
注意:这部分的目标只是让pve本身能通过WiFi联网,设置完后虚拟机是无法用无线网卡联网的,需要再用NAT给虚拟机加网卡,后面还会对这个文件进行进一步扩展。
auto lo
iface lo inet loopback
auto vmbr0
iface vmbr0 inet static
address 192.168.100.2/24 #安装PVE时填的地址
bridge-ports wls12 #我的AX210网卡id
bridge-stp off
bridge-fd 0
auto wls12 #配置无线网卡
iface wls12 inet dhcp
wpa-conf 'etc/wpa.conf' #刚才的wifi登录配置
再写一下配置变量/etc/wpa_supplicant/wpa_supplicant.conf:
ctrl_interface=/var/run/wpa/supplicant #运行位置
update_config=1 #允许在运行中由进程自动修改配置
ap_scan=1 #在启动时先扫描一遍wifi 重启系统,准备用wpa_cli扫描wifi——
> wpa_cli -i wls12
wpa_cli v2.10
Copyright (c) 2004-2022, Jouni Malinen <j@w1.fi> and contributors
...
Selected interface 'wls12'
Interactive mode
Could not connect to wpa_supplicant: (wls12) - re-trying 坏了,连不上,trace一遍看看:
> strace wpa_cli -i wls12
#前略
bind(3, {sa_family=AF_UNIX, sun_path="/tmp/wpa_ctrl_485-2"}, 110) = 0
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/wpa_supplicant/wls12"}, 110) = -1 ENOENT (No such file or directory)
close(3)
#后略 发现wpa_supplicant根本没有运行,那重新加载配置启动试试:
> wpa_supplicant -B -D wext -i wls12 -c /etc/wpa_supplicant/wpa_supplicant.conf
Successfully initialized wpa_supplicant
wls12: Failed to initialize driver interface 原来是驱动炸了,那再看看启动信息:
> dmesg|grep iwl
#略
iwlwifi 0000:aa:00.0: WRT: Invalid buffer destination
#略
iwlwifi 0000:aa:00.0: loaded firmware version 83.e8f84e98.0 ty-a0-gf-a0-83.ucode op_mode iwlmvm
iwlwifi 0000:aa:00.0: Detected Intel(R) Wi-Fi 6 AX210 160MHz, REV=0x420 似乎是读驱动时报了”Invalid buffer destination“,然后顺着这个错误信息,在archlinux论坛里翻到两个帖子:
https://bbs.archlinux.org/viewtopic.php?id=288765
https://bbs.archlinux.org/viewtopic.php?id=286305
提到了“AX210/211无线网卡在OS的某次6.X内核更新后无法使用”,报错和上面相同。看了下PVE 8.2的内核,发现用的是Kernel 6.5.11的Debian 12.5。
说不定是因为内核不兼容导致的呢?于是移走刚才加载的驱动:
mv /usr/lib/firmware/iwlwifi-ty-a0-gf-a0-83.ucode.xz ~/ 重启机子,再加载一遍配置:
> wpa_supplicant -B -D wext -i wls12 -c /etc/wpa_supplicant/wpa_supplicant.conf
Successfully initialized wpa_supplicant 这次就没报错了,然后用wps_cli连接:
> wpa_cli -i wls12
wpa_cli v2.10
Copyright (c) 2004-2022, Jouni Malinen <j@w1.fi> and contributors
...
Selected interface 'wls12'
Interactive mode
>_ #可交互状态 通了,保险起见,再trace一下现在的启动记录:

从log里可以看到,在没了iwlwifi-ty-a0-gf-a0-83之后,按照顺序加载的驱动是iwlwifi-ty-a0-gf-a0-72,也并没有报其他可疑信息。
回头看下连接状态:
> wpa_cli -i wls12
> status
bssid=68:dd:b7:19:f8:82
freg=5200
ssid=<家里的WiFi名>
id=8
mode=station
wifi_generation=6
pairwise_cipher=CCMp
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
p2p_device_address=dc:97:ba:b6:72:05
address=dc:97:ba:b6:72:84
uuid=7881cc0b-9b24-5d08-a1c6-8bfc32ccb9b5
ieee80211ac=1 连上WiFi了,此时ip a的结果中还是没有IP:
4.wls12:<BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether dc:97:ba:b6:72:04 brd ff:ff:ff:ff:ff:ff altname wlp6s0 但既然有了连接,那就是路由器还没分配IP,DHCP拿一个即可。
> dhclient wls12
#再看一下连接状态
> wpa_cli -i wls12
> status
bssid=68:dd:b7:19:f8:82
freq=5200
ssid=<家里的WiFi名>
id=0
mode=station
wifi_generation=6
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
ip_address=192.168.0.101
p2p_device_address=dc:97:ba:b6:72:05
address=dc:97:ba:b6:72:84
uuid=7881cc0b-9b24-5d08-a1c6-8bfc32ccb9b5
ieee80211ac=1 现在无线网卡有了IP位,桥接也出来了,ping一下百度试试:

通了,pve可以联网。
立刻apt-get update和apt-get install一套下去把需要装的装完,终于可以用vim而不是vi了。
为了每次开机后不用手动dhc_client来给网卡分配IP,在rc-local service的开机自启脚本/etc/rc.local里加一段:
#!/bin/sh
dhclient wls12 同局域网下的电脑开浏览器,连上IP登录pve。
(如果浏览器有代理的话记得给192.168.*.*设一下直连)

然后就能快乐的在网页上操作命令行了,接着准备载入虚拟机。


可以说是最折磨的部分。
如果机子插了网线的话,虚拟机就能用vmbr桥接联网——但现在用的是无线网卡。
虚拟机并用不了无线网卡的AP,所以没法通过和有线一样来桥接联网。在网上找资料时,几乎都是清一色的”Avoid using WLAN if possible“,也是自己写下这篇记录的主要原因。
具体解决思路是:先通过软路由(iKuai)和win虚拟机来设置NAT,让虚拟机使用无线网卡上网,并设置路由表将虚拟机ip映射到局域网ip上。
主要参考了pve的官网教程以及如下两篇专栏:
https://pve.proxmox.com/wiki/Network_Configuration#sysadmin_network_masquerading

先在/etc/network/interfaces里设置好NAT:
auto lo
iface lo inet loopback
#机箱上没用到的两个有线网口
iface ens10 inet manual
iface ens7 inet manual
auto vmbr0
iface vmbr0 inet static
address 192.168.100.2/24
bridge-ports wls12
bridge-stp off
bridge-fd 0
auto wls12
iface wls12 inet dhcp
wpa-conf /etc/wpa.conf
up route add -net 0.0.0.0/0 gw 192.168.100.1 metric 0 wls12
down route del -net 0.0.0.0/0 gw 192.168.100.1 metric 0 wls12
#另起一个桥接
auto vmbr1
iface vmbr1 inet static
address 10.1.2.2/24
bridge-ports none
bridge-stp off
bridge-fd 0
#在vmbr1启动/关闭时设置NAT相关
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.1.2.0/24' -o wls12 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.1.2.0/24' -o wls12 -j MASQUERADE
重启一下,此时的路由表状态:

然后把要装的镜像准备一下:

win, ikuai, rr(arpl)
ikuai:


win:

自己的电脑舍不得升级,刚好借机试试win11
在win里设置一下IP,和ikuai处在同一局域网下:
ikuai的LAN端口(默认):192.168.9.1/24,也就是192.168.9.1/255.255.255.0
win设置:
ipv4: 192.168.9.200
掩码: 255.255.255.0
网关:192.168.100.101
DNS:192.168.1.1
(先确保win浏览器能打开ikuai的GUI,IP后面还会改)

改一下ikuai的dhcp设置:

再把lan口的地址改成10.1.2.1/24:

把win的IP也改成同一网段:

这时就能上网了,连ikuai的端口则变为10.1.2.1:80:

然后就可以把win的IP设置成自动,每次连接都由ikuai作为DHCP服务器来分配IP:


由ikuai分配的IP是10.1.2.100
只要记得以后在开其他虚拟机前先开ikuai就行,或者干脆给ikuai设个开机自启。

既然虚拟机能联网了,那接下来安装黑群晖,参考教程:
https://blog.csdn.net/u013360850/article/details/131491889
使用的arpl为:
https://github.com/RROrg/rr
相对于原版已经停更的arpl,rr依然在更新,并且支持更多群晖OS和型号。
把rr的镜像作为磁盘导入给虚拟机:
qm importdisk 100 /var/lib/vz/template/iso/rr.img local-lvm 将其修改成SATA,然后从local-lvm(也就是装PVE的那个256G的ssd)再分出50G作为群晖的初始硬盘:

只是为了避免群晖安装后没读到硬盘,装完后可以把这部分删掉
配置:

改下引导顺序,由镜像来启动:

剩下就是正常的安装过程,选了920+和DSM7.2,编译时用sn和mac码洗了白:

为了避免损耗,装完后暂时先不给群晖直通硬盘。

接着要让局域网中的其他设备(包括PC/手机等其他物理机)来访问虚拟机”10.1.2.X“的IP,所以得给PVE的连接加个NAT。
以win的远程桌面做测试,给路由表加上端口映射(临时设置,重启后会清空):
#192.168.0.103 → 10.1.2.100:3389
iptables -t nat -A PREROUTING -i wls12 -p tcp --dport 3389 -j DNAT --to 10.1.2.100:3389 在win虚拟机里允许远程控制:

然后在电脑上ping一下端口,成功:
telnet 192.168.0.103 3389 也就是说,针对局域网IP特定端口的请求已经成功转发到了虚拟机。
接着在自己电脑上启动远程桌面:

正常连接。

然后照着端口把映射加进/etc/network/interfaces,让其随着wifi一起启动:
auto vmbr0
iface vmbr0 inet static
address 192.168.100.2/24
bridge-ports wls12
bridge-stp off
bridge-fd 0
auto wls12
iface wls12 inet dhcp
wpa-conf /etc/wpa.conf
up route add -net 0.0.0.0/0 gw 192.168.100.1 metric 0 wls12
down route del -net 0.0.0.0/0 gw 192.168.100.1 metric 0 wls12
auto vmbr1
iface vmbr1 inet static
address 10.1.2.2/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.1.2.0/24' -o wls12 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.1.2.0/24' -o wls12 -j MASQUERADE
#win11
post-up iptables -t nat -A PREROUTING -i wls12 -p tcp --dport 3389 -j DNAT --to 10.1.2.100:3389
post-down iptables -t nat -D PREROUTING -i wls12 -p tcp --dport 3389 -j DNAT --to 10.1.2.100:3389
#群晖
post-up iptables -t nat -A PREROUTING -i wls12 -p tcp --dport 5000 -j DNAT --to 10.1.2.101:5000
post-down iptables -t nat -D PREROUTING -i wls12 -p tcp --dport 5000 -j DNAT --to 10.1.2.101:5000
重启一下网络,此时的路由表状态:

3389是windows远程桌面的默认端口

接着就能给群晖直通硬盘并做设置了。

#看一下硬盘ID,不用挂载也不用格式化
> ls -l /dev/disk/by-id
total 0
lrwxrwxrwx 1 root root 9 May 30 21:56 ata-ST16000NM000J-2TW103_ZR618W64 -> ../../sdc
lrwxrwxrwx 1 root root 9 May 30 21:56 ata-ST16000NM000J-2TW103_ZRS0TM30 -> ../../sda
lrwxrwxrwx 1 root root 9 May 30 21:56 ata-ST16000NM000J-2TW103_ZRS0TX24 -> ../../sdb
lrwxrwxrwx 1 root root 9 May 30 21:56 ata-ST16000NM000J-2TW103_ZRS0TXLA -> ../../sdd
#100是群晖虚拟机id
#之前已经有sata0(镜像)和sata1(安装盘)了,所以从sata2开始
qm set 100 --sata2 /dev/disk/by-id/ata-ST16000NM000J-2TW103_ZR618W64
qm set 100 --sata3 /dev/disk/by-id/ata-ST16000NM000J-2TW103_ZRS0TM30
qm set 100 --sata4 /dev/disk/by-id/ata-ST16000NM000J-2TW103_ZRS0TX24
qm set 100 --sata5 /dev/disk/by-id/ata-ST16000NM000J-2TW103_ZRS0TXLA

然后把硬盘加到虚拟机上:

在自己的电脑上登录群晖的端口:192.168.0.103:5000,用直通的硬盘起存储池:

虚拟机的IP地址10.1.2.5:5000通过NAT映射到PVE的5000端口


接下来把群晖的共享文件夹也给通出去...然而这时又会出现一个问题:
由于用的是无线网卡,虚拟机的群晖的共享文件夹只能通过SMB传给PVE里的其他虚拟机,而局域网里的其他主机是没法连上这个地址的。

于是参考了如下两篇文章:
https://post.smzdm.com/p/a0x46wz8/
https://acceptdefaults.com/2023/06/18/mount-synology-nfs-share-in-proxmox/
思路非常有趣,将群晖的共享文件夹通过NFS挂载为PVE的存储后,通过PVE的SMB来共享给局域网的其他主机。
打开群晖的NFS功能:

编辑共享文件夹的NFS规则,IP地址填联网时桥接的vmbr1:


回到PVE,数据中心→存储→添加→NFS,服务器填群晖的IP:

于是NAS的空间就被挂载上了PVE。

接着在PVE里安装SMB服务:
apt-get install samba -y
#然后编辑/etc/samba/smb.conf文件
[global]
workgroup = WORKGROUP
security = user
usershare owner only = false
public = yes
browseable = yes
[NAS Share]
comment = NAS
path = /mnt/pve/NAS
public = yes
writeable = yes
browsable = yes
create mask = 0777
directory mask = 0777
display charset = UTFS
valid users = smbuser
创建SMB用户并分配挂载目录的权限:
adduser smbuser
smbpasswd -a smbuser
smbpasswd -a root
chown -R smbuser /mnt/pve/NAS
#看情况,完全读写的话就是777
chmod 777 /mnt/pve/NAS 再确认一下当前的SMB用户:
> pdbedit -L
smbuser:1000:natsumi
root:0:root 重启smbd服务,在自己电脑上添加群晖IP下的文件夹作为网络位置,并以刚才创建的smbuser和密码登录(用户名就是“smbuser”):


随便同步一个文件看看:

\ My guiding star... /
同样的方式还能共享其他PVE挂载的硬盘,以供局域网下物理机和虚拟机之间传文件用。

把套件装一下,确认洗白后的AME能正常下载编码器:


至此配置完毕,解放。
终于可以把那堆数据包/BD/OST和做过的视频素材丢进去了。

看下待机状态的使用数据:
ikuai,分配2核1G,基本没占用;
win11,分配4核8G,内存一般占3G;
群晖,分配4核16G,内存一般占5G,传文件时偶尔会跑到14G;

硬盘和CPU基本都是30-40度左右:


smartctl -a /dev/<硬盘挂载位> | grep "Temperature"
如果说还有什么想做的话:
公网IP+域名DDNS搞远程访问
↑ 换了电信宽带,申请公网IP并绑了腾讯云的域名,主机正式化作服务器。win11可以远程操控,手机上也能用DS Audio/DS Video调NAS上的东西。
找机会给docker上塞点东西 ,或者在win上跑联机服务器↑ 随着公网IP到手,先和朋友爽打了大半月的大师死亡难度灾厄,一路到bossrush。


半当中也crash过,风暴编织者/神吞/星流巨械/终灾各一次,bossrush三次,大概是因为射弹和实体过多导致CPU过热吧。

机箱加个UPS电源,然后把断电信号连给群晖,实现断电关机保护↑ 买了BK650M2,把对应的USB端口连给虚拟机就行。



以上。
想要的也都实现了,基本满足。