0. 背景知识
NAS是什么?NAS的全称是Network Attached Storage,网络附加存储,说白了就是一个低性能高容量的私有云服务器
NAS能干什么用?NAS可以作为家庭影院数据中心,NAS+ 局域网文件传输协议 + 智能电视 + 家庭影院软件可以实现非常好的家庭观影体验NAS可以作为私有云服务器,承担例如图床/视频床等功能,也可以建网站
- 怎么做一个
NAS?- 通常情况下,直接买一个成品
NAS是一个省心的选择,外观看通常是一个可以插硬盘的盒子,本质是一个PC - 我更喜欢自己手搓
- 通常情况下,直接买一个成品
1. 手搓 NAS 方案
NAS手搓需要搞定NAS本体和网络两大块NAS本体负责下载数据,保存数据和局域网内数据共享- 网络部分负责让
NAS本体成为一个公网可访问的设备
NAS本体用树莓派5实现是一个不错的选择- 网络部分用光猫桥接 +
DDNS+ 端口转发方案
2. NAS 本体
硬件
NAS本体是一个4GB版本树莓派5- 一个
32GB的SD卡作为系统盘 - 一块
500GB的USB 3.0的移动机械硬盘(后续根据需求扩容)
软件
- 操作系统:
Ubuntu 24.04 Desktop arm64,下载地址- 用
Ubuntu的好处:社区活跃,遇到问题容易解决 - 坏处:预安装软件很多,比较大
- 用
- 其他软件:根据需求安装,例如:
Samba局域网共享软件RDP远程桌面软件Transmission磁力链接下载器
3. 网络
和 NAS 本体比起来,网络才是手搓 NAS 最难的部分,主要包含如下几个部分
公网 IP
- 选择的宽带运营商是电信,电信的入户光纤是动态公网
IPv4地址(这一点还是比较良心的) - 光猫默认开启了路由模式,因此路由器的输入已经变成了局域网,为了简化网络拓扑,需要给电信客服打电话要求将光猫改成桥接模式,即光猫只承担光电转换功能,输出端口
IP和输入端口IP一致 - 光猫开启桥接模式之后,路由器输入端口变成了公网
IP,通过PPPoE拨号上网,同时实测发现,光猫桥接模式下,下载速度更快
DDNS
- 虽然路由器的输入已经变成公网
IP,但是动态的,几乎每天都在发生变化 - 因此需要用到
DDNS服务,让动态IP绑定到静态的域名上,域名之前已购买,只需要在顶级域名之前加上一个A记录的子域名 - 由于家里用的路由器是小米
be6500 pro型号,这个路由器本身并不支持腾讯云(dnspod)的DDNS服务,所以有两条路可以选:- 刷机到
Openwrt路由器固件,这个开源固件功能十分强大,但坏处是路由器无法再绑定到米家APP实现远程控制的一些官方功能 - 另外一种方法是通过某种方法开启路由器的
ssh权限,登录到路由器内部,在内部开启dnspod DDNS
- 刷机到
- 这里选择了第二种方法,
ssh开启教程在 这里 - 开启
ssh后,就可以登录到路由器terminal,然而路由器使用的是小米自己魔改的XiaoQiang Linux操作系统,包管理工具以及软件源什么的完全搞不懂,也很难查到相关资料,所以常用的DDNS服务软件例如ddns-go什么的也无法正常安装和配置 - 在仔细了解了
DDNS服务的基本原理之后,决定用SHELL手写一个DDNS服务DDNS的原理(仅在dnspod服务商上测试过):客户端(路由器)定期检查输入端口IP,当发现和dnspod服务商记录的这个域名绑定的IP不一致时,就给dnspod发一条修改绑定关系的请求,dnspod更改后,新的 “域名——IP” 绑定关系就建立了- 这里涉及到几个关键:
API Token:上面这个修改过程显然不是任何人都可以改的,你只能修改自己名下的域名绑定的IP,所以需要一个密钥来和dnspod服务器交互,这个密钥在https://console.dnspod.cn/account/token/token创建- 查找域名和记录对应的
ID:由于dnspod的DDNS API要求域名和对应的记录是以ID的方式描述的,所以需要查到域名ID和记录ID- 域名
ID:curl -s "https://dnsapi.cn/Domain.List" -d "login_token=<your_token>&format=json"得到输出查询结果- 然后在查询结果中找到名下多个域名中想要查询域名的
ID
- 记录
ID:curl -s "https://dnsapi.cn/Record.List" -d "login_token=<your_token>&format=json&domain_id=<your_domain_id>&sub_domain=<your_sub_domain>"得到查询结果- 在查询到的此域名下多条记录中,找到关注的记录
ID
- 域名
- 查询当前
IP:curl -s http://ipinfo.io/ip - 更新
DNS记录:curl -s -X POST "https://dnsapi.cn/Record.Modify" -d "login_token=${API_TOKEN}" -d "format=json" -d "domain_id=${DOMAIN_ID}" -d "record_id=${RECORD_ID}" -d "sub_domain=${SUB_DOMAIN}" -d "record_line=${RECORD_LINE}" -d "record_type=${RECORD_TYPE}" -d "value=${CURRENT_IP}"
- 然后将此
DDNS_update.sh文件注册到crontab中,每5分钟更新一次
- 确实可以正常更新
DNS,不过忙完之后才发现可以在树莓派上实现,不用自己写SHELL…
端口转发
- 外网只能访问到路由器,如果想要通过
ssh实现外网直连树莓派,那么需要在路由器上配置端口转发 - 由于目前只有
SSH和VNC两个远程访问需求,所以只开了22的TCP端口转发 VNC可以通过ssh+ 端口转发实现,不用开5900端口,开的越少内网设备越安全VNC具体使用方法- 在树莓派上开启
VNC服务,并打开5900监听端口 - 由于路由器只配置了
22端口转发,所以这个5900端口在公网是无法访问的 - 这时候就需要用到
ssh的端口转发功能,在本地电脑上执行如下命令:1
2
3# 在连接 ssh 的时候,开启端口转发,将本地的 `5900` 端口转发到树莓派的 `5900` 端口
# 实际上走的还是服务器的 `22` 端口
ssh -L 5900:localhost:5900 <your_username>@<your_domain> - 建立好
ssh连接后,就可以在本地电脑上通过localhost:5900访问树莓派的VNC服务了(一定要注意,是连接 本地 localhost 不是服务器5900端口)
- 在树莓派上开启
4. 使用体验和后续计划
使用体验
- 用外网可以直连树莓派,可以用
SSH远程给树莓派下发一些下载任务,也可以用VNC处理一些需要GUI的需求 - 设置了移动硬盘开机自动挂载,索尼电视安装
KODI通过Samba协议看4K电影体验很震撼
后续计划
- 开放
http协议端口,在树莓派上用Nginx等引擎让树莓派作为个人博客的图床和视频床 - 扩展硬盘架,树莓派外接
16 pin PCIE转多口SATA扩展板 ,连接机械硬盘架
5. 最终版效果

- 买了一个二手服务器电源
12v供电,买了一个车载12v转5v的电源模块,这两个一起给所有设备供电 - 买了树莓派
m2转SATA * 6的扩展板,用16pin PCIE连到主板上 - 硬盘架现在是两块
16T服务器拆机机械硬盘 + 四块500G单片机械硬盘(凑数用的),后续会根据实际情况逐步把500G硬盘换成16T的服务器氦气盘 - 因为供电电流充足(服务器电源可最高提供
50A稳定电流),在不同时和多个硬盘交互的情况下,16T硬盘读写速度差不多260MB/s,500G硬盘读写速度差不多100MB/s - 如果有小容量高速读写需求的话,主板上有一块
512GB的Flash可以用 - 一堆风扇组成了一个小型的散热系统,电视柜当机箱用
- 非常耐操,已经稳定运行半年多了,几乎没有关过机,随时随地访问私有云 + 家庭影院确实爽