1. 为什么树莓派 NAS 至今仍然值得折腾
树莓派做 NAS 这件事,我从树莓派 3B+ 时代就开始折腾了。那时候 USB 2.0 的带宽跑 Samba 共享,拷贝大文件的速度稳定在 12MB/s 左右,说实话体验很一般。但到了树莓派 4B 和现在的树莓派 5,情况完全不一样了——USB 3.0 接口、千兆网口、最高 8GB 甚至 16GB 内存,这些硬件规格放在一台功耗只有几瓦的小板子上,做家用 NAS 已经完全够用。
这次要聊的这个开源项目,核心思路是用树莓派搭配一块 OLED 小屏幕,跑 OpenMediaVault 作为 NAS 系统,同时用 OLED 实时显示系统状态。外观上走的是简洁实用路线,没有花哨的 3D 打印外壳,就是一块亚克力板加铜柱把树莓派、硬盘和 OLED 固定在一起,放在桌面上不占地方,看起来也干净。
你可能会问:市面上成品 NAS 那么多,群晖、威联通、飞牛 NAS 都有成熟方案,为什么还要自己折腾树莓派?我的答案很直接——功耗、静音、可定制性。一台群晖 DS220+ 空载功耗大概 15W 到 20W,而树莓派 4B 加一块 2.5 寸硬盘,整机功耗可以控制在 8W 以内。一年 365 天开机,电费差距虽然不大,但风扇噪音的差别是实打实的。树莓派方案可以做到完全无风扇,放在卧室里也听不到声音。
这个项目适合什么人?如果你手头已经有一块树莓派(不管是 4B 还是 5),想把它利用起来做一个轻量级的家庭文件服务器、备份节点或者小型媒体库,同时希望有一个直观的状态显示屏,那这套方案非常合适。如果你完全没接触过 Linux 和命令行,可能需要先补一些基础知识,但整体门槛并不高,跟着步骤走能跑通。
OLED 屏幕在这个项目里扮演的角色,不是装饰,而是状态监控终端。你可以让它显示 CPU 温度、内存占用、硬盘容量、网络 IP 地址、当前时间这些信息。树莓派 NAS 通常放在角落或者弱电箱里,没有显示器,每次想看状态都要 SSH 登录,有了 OLED 之后抬头就能看到关键数据,省事很多。
2. 硬件选型与整体方案设计
2.1 树莓派型号怎么选:4B 还是 5
树莓派 4B 和树莓派 5 都能跑 OpenMediaVault,但两者在实际使用中有几个关键差异需要提前想清楚。
树莓派 4B 的优势是成熟稳定、配件便宜、功耗更低。它的 USB 3.0 接口有两个,千兆网口是独立芯片,不占用 USB 带宽。实测下来,USB 3.0 接一块 SATA 硬盘(通过 USB 转 SATA 线),Samba 读写速度可以跑到 100MB/s 左右,基本跑满千兆网络。功耗方面,4B 加一块 2.5 寸机械硬盘,整机空载大约 5W,满载读写大约 10W。
树莓派 5 的优势是性能更强、PCIe 接口可扩展。树莓派 5 新增了一个 PCIe 2.0 x1 接口,通过 M.2 HAT 可以接 NVMe 固态硬盘,速度比 USB 3.0 快不少。但这里有个坑:树莓派 5 的 PCIe 接口默认没有启用,需要在/boot/firmware/config.txt里手动打开,而且早期固件版本对某些 NVMe 硬盘兼容性不好,需要更新固件。另外树莓派 5 的功耗明显更高,满载可以到 12W 以上,电源要求也更高,官方推荐 5V 5A 的电源。
我的建议是:如果你追求稳定省心,选树莓派 4B;如果你想要更好的存储性能,并且愿意折腾 PCIe 和固件,选树莓派 5。对于大多数家用 NAS 场景,4B 的性能已经足够,没必要多花钱上 5。
2.2 存储方案:USB 硬盘还是 NVMe
存储是这个项目里最影响体验的部分。树莓派本身没有 SATA 接口,所以只能用 USB 或者 PCIe 来接硬盘。
USB 方案是最常见的。用一根 USB 3.0 转 SATA 线,接一块 2.5 寸机械硬盘或者 SSD。2.5 寸硬盘不需要额外供电,直接从 USB 取电就行,树莓派的 USB 接口输出电流足够。但要注意,不要用 USB 3.0 的移动硬盘盒接 3.5 寸硬盘,3.5 寸硬盘需要 12V 供电,USB 口供不了,必须用带独立电源的硬盘盒或者硬盘底座。
NVMe 方案只适用于树莓派 5。通过 M.2 HAT 接一块 NVMe SSD,读写速度可以到 400MB/s 以上,但受限于 PCIe 2.0 x1 的带宽,实际速度大概在 450MB/s 左右。这个速度对于家用 NAS 来说绰绰有余,而且 NVMe 没有机械结构,完全静音,抗震性也好。
如果你要用 OpenMediaVault 做 RAID,需要注意:USB 接口做 RAID 不稳定。USB 连接偶尔会掉盘,RAID 阵列一旦掉盘就需要重建,风险很大。所以我的建议是,USB 方案就单盘用,重要数据定期备份到另一块硬盘或者云端。NVMe 方案可以考虑做 RAID 1,但树莓派 5 只有一个 PCIe 接口,要做 RAID 1 需要两个 NVMe 硬盘,得用支持双盘的 M.2 HAT,成本会高不少。
2.3 OLED 屏幕的选型与接线
OLED 屏幕我推荐用0.96 寸 SSD1306 驱动的 I2C 屏幕,分辨率 128x64,价格便宜,十几块钱就能买到。这个屏幕在树莓派社区里资料最多,驱动成熟,Python 库支持也很好。
接线方面,SSD1306 的 I2C 接口只需要四根线:VCC 接 3.3V,GND 接地,SCL 接树莓派的 GPIO 3(物理引脚 5),SDA 接 GPIO 2(物理引脚 3)。树莓派 4B 和 5 的 I2C 引脚位置是一样的,不用担心兼容性问题。
注意:OLED 屏幕的 VCC 一定要接 3.3V,不要接 5V。虽然有些模块标称支持 3.3V 到 5V,但长期接 5V 可能会缩短屏幕寿命,而且 I2C 电平不匹配可能导致通信不稳定。
如果你买的是 SPI 接口的 OLED 屏幕,接线会复杂一些,需要接 7 根线,而且驱动代码也不一样。对于这个项目,我强烈建议用 I2C 接口的屏幕,省事。
2.4 整体结构设计思路
这个项目的结构设计遵循一个原则:最小化、无风扇、易维护。
底部是一块亚克力板,用铜柱把树莓派固定在上面。硬盘用双面胶或者扎带固定在亚克力板的另一侧。OLED 屏幕用铜柱固定在树莓派上方,角度稍微倾斜,方便查看。所有线缆用扎带整理好,从侧面走线。
电源方面,树莓派 4B 用官方 5V 3A 电源,树莓派 5 用官方 5V 5A 电源。如果你要接 3.5 寸硬盘,还需要一个独立的 12V 电源给硬盘供电。整个系统没有风扇,靠自然散热。树莓派 4B 在 NAS 负载下 CPU 温度大概 60 到 70 度,加一个小散热片就够了。树莓派 5 温度会高一些,建议加一个散热片或者小风扇,但如果你对噪音敏感,可以限制 CPU 频率来降低温度。
3. 系统安装与 OpenMediaVault 配置
3.1 系统镜像的选择与烧录
OpenMediaVault 官方提供了针对树莓派的镜像,基于 Debian 系统。你可以从 OpenMediaVault 官网下载最新的树莓派镜像,然后用 Raspberry Pi Imager 或者 balenaEtcher 烧录到 SD 卡上。
这里有个细节:SD 卡只用来装系统,不要用来存数据。SD 卡的读写寿命有限,频繁读写容易坏。系统装好之后,所有数据都存到 USB 硬盘或者 NVMe 上。我建议用一张 16GB 或者 32GB 的 A1 或 A2 级别的 SD 卡,速度不用太快,但质量要可靠,杂牌卡容易出问题。
烧录完成后,把 SD 卡插到树莓派上,接上网线,通电。第一次启动需要几分钟,系统会自动扩展分区。启动完成后,在浏览器里输入树莓派的 IP 地址,就能看到 OpenMediaVault 的登录界面。默认用户名是admin,密码是openmediavault。
注意:第一次登录后立刻修改默认密码,并且把系统语言改成中文(如果你需要的话)。OpenMediaVault 的 Web 界面支持中文,在“系统”->“常规设置”里可以切换。
3.2 挂载硬盘与创建共享文件夹
登录 OpenMediaVault 后,第一步是挂载硬盘。在“存储器”->“磁盘”里,你应该能看到接在 USB 或者 NVMe 上的硬盘。选中硬盘,点击“擦除”,然后到“文件系统”里创建新的文件系统。对于 Linux 环境,推荐用 ext4 格式,稳定性和兼容性最好。如果你需要在 Windows 和 Linux 之间共享硬盘,可以用 exFAT,但 exFAT 不支持 Linux 的权限管理,OpenMediaVault 的一些功能会受限。
创建文件系统后,点击“挂载”。挂载完成后,到“共享文件夹”里创建一个新的共享文件夹,选择刚才挂载的文件系统,设置好名称和权限。
接下来配置 SMB/CIFS 服务,这是 Windows 和 macOS 都能用的文件共享协议。在“服务”->“SMB/CIFS”里启用服务,然后到“共享”里添加一个新的共享,选择刚才创建的共享文件夹。设置好访问权限,默认是允许所有用户读写,你也可以创建用户和用户组来精细控制权限。
3.3 用户与权限管理
OpenMediaVault 的用户管理是基于 Linux 系统的用户和用户组。在“用户”->“用户”里可以创建新用户,设置用户名和密码。创建用户后,需要把用户加入到相应的用户组里,比如users组,这样才能访问共享文件夹。
权限管理这块,我踩过不少坑。OpenMediaVault 的权限分为共享文件夹权限和SMB 共享权限两层。共享文件夹权限控制的是文件系统层面的访问,SMB 共享权限控制的是网络访问。两层权限必须都配置正确,否则会出现“能看到共享文件夹但打不开”或者“能打开但无法写入”的问题。
我的经验是:先配置共享文件夹权限,再配置 SMB 共享权限。共享文件夹权限里,给需要访问的用户或用户组设置读写权限。SMB 共享权限里,同样给这些用户或用户组设置读写权限。如果还是不行,检查一下共享文件夹的所属用户和所属组,确保当前用户有权限访问。
3.4 树莓派系统优化与调整
OpenMediaVault 装好之后,还需要对树莓派系统做一些优化,才能让 NAS 跑得更稳。
第一件事是关闭不必要的服务。树莓派默认开启了一些服务,比如蓝牙、音频、WiFi(如果你用网线的话),这些服务会占用 CPU 和内存资源。在 OpenMediaVault 的“系统”->“服务”里可以关闭不需要的服务。或者直接 SSH 登录,用systemctl命令关闭。
第二件事是调整 swappiness。Linux 默认的 swappiness 值是 60,意味着系统会积极使用交换分区。对于 NAS 来说,频繁的交换会拖慢速度,而且 SD 卡的读写寿命有限。建议把 swappiness 调到 10 或者更低。编辑/etc/sysctl.conf,添加vm.swappiness=10,然后执行sysctl -p生效。
第三件事是设置静态 IP。NAS 的 IP 地址最好固定,否则每次重启后 IP 变了,其他设备就找不到共享文件夹了。可以在路由器里设置 DHCP 静态分配,或者直接在 OpenMediaVault 的网络设置里配置静态 IP。
第四件事是开启硬盘休眠。如果硬盘长时间不用,可以让它休眠,省电也延长寿命。在 OpenMediaVault 的“存储器”->“硬盘”里可以设置休眠时间。但要注意,频繁启停对硬盘寿命也有影响,所以休眠时间不要设太短,建议 30 分钟以上。
4. OLED 状态显示的实现
4.1 I2C 接口的启用与测试
树莓派的 I2C 接口默认是关闭的,需要手动启用。在 OpenMediaVault 的 Web 界面里,到“系统”->“树莓派”->“接口”,勾选 I2C 并保存。或者 SSH 登录后,执行raspi-config,在“Interface Options”里启用 I2C。
启用后,安装 I2C 工具:sudo apt install i2c-tools。然后执行i2cdetect -y 1,如果屏幕接线正确,你应该能看到一个地址,通常是0x3c或者0x3d。这个地址就是 OLED 屏幕的 I2C 地址,后面写代码的时候要用到。
注意:如果
i2cdetect显示的是UU而不是地址,说明 I2C 地址被驱动占用了,需要先卸载驱动。如果什么都没显示,检查接线是否正确,特别是 SDA 和 SCL 有没有接反。
4.2 Python 驱动库的安装与配置
OLED 屏幕的驱动库我用的是luma.oled,这个库支持多种 OLED 屏幕,文档也比较全。安装方法:
pip install luma.oled如果你用的是树莓派 5,可能需要先安装libopenjp2-7和libtiff5这些依赖:
sudo apt install libopenjp2-7 libtiff5安装完成后,写一个简单的测试脚本,确认屏幕能正常显示:
from luma.core.interface.serial import i2c from luma.oled.device import ssd1306 from luma.core.render import canvas serial = i2c(port=1, address=0x3C) device = ssd1306(serial) with canvas(device) as draw: draw.text((0, 0), "Hello NAS", fill="white")运行这个脚本,如果屏幕上显示“Hello NAS”,说明驱动配置正确。
4.3 系统状态数据的采集
OLED 要显示系统状态,首先得把数据采集出来。树莓派上采集系统信息,最方便的是用psutil库:
pip install psutilpsutil可以获取 CPU 使用率、内存占用、磁盘容量、网络流量等信息。比如:
import psutil cpu_percent = psutil.cpu_percent(interval=1) memory = psutil.virtual_memory() disk = psutil.disk_usage('/mnt/data')CPU 温度需要从系统文件里读:
def get_cpu_temp(): with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f: temp = float(f.read()) / 1000 return temp网络 IP 地址可以用socket库获取:
import socket def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] except: ip = '127.0.0.1' finally: s.close() return ip4.4 OLED 显示界面的设计与实现
显示界面我设计成四行,每行显示一个关键信息:
- 第一行:CPU 温度和 CPU 使用率
- 第二行:内存使用率和内存总量
- 第三行:硬盘使用率和硬盘总量
- 第四行:IP 地址和运行时间
代码实现上,用一个主循环,每隔几秒刷新一次屏幕。为了避免屏幕闪烁,可以用luma.oled的canvas上下文管理器,每次刷新时先清空再绘制。
import time from luma.core.interface.serial import i2c from luma.oled.device import ssd1306 from luma.core.render import canvas from PIL import ImageFont serial = i2c(port=1, address=0x3C) device = ssd1306(serial) font = ImageFont.load_default() def display_status(): cpu_temp = get_cpu_temp() cpu_percent = psutil.cpu_percent(interval=0.5) memory = psutil.virtual_memory() disk = psutil.disk_usage('/mnt/data') ip = get_ip() with canvas(device) as draw: draw.text((0, 0), f"CPU: {cpu_temp:.1f}C {cpu_percent}%", font=font, fill="white") draw.text((0, 16), f"MEM: {memory.percent}% {memory.total//1024//1024}M", font=font, fill="white") draw.text((0, 32), f"DSK: {disk.percent}% {disk.total//1024//1024//1024}G", font=font, fill="white") draw.text((0, 48), f"IP: {ip}", font=font, fill="white") while True: display_status() time.sleep(5)这个脚本跑起来之后,OLED 屏幕上就会实时显示系统状态。你可以把它设置成开机自启动,这样每次树莓派启动后,OLED 自动开始工作。
4.5 设置开机自启动
让 OLED 显示脚本开机自启动,最简单的方法是创建一个 systemd 服务。新建一个文件/etc/systemd/system/oled-status.service:
[Unit] Description=OLED Status Display After=network.target [Service] ExecStart=/usr/bin/python3 /home/pi/oled_status.py Restart=always User=pi [Install] WantedBy=multi-user.target然后执行:
sudo systemctl daemon-reload sudo systemctl enable oled-status.service sudo systemctl start oled-status.service这样每次树莓派启动后,OLED 显示脚本会自动运行。如果脚本崩溃了,systemd 会自动重启它。
5. 常见问题与排查技巧实录
5.1 OLED 屏幕不亮或显示异常
这是最常见的问题,我遇到过好几次。排查思路按顺序来:
第一步,检查接线。I2C 的四根线有没有接反?VCC 是不是接了 3.3V?SDA 和 SCL 有没有接错?树莓派的 GPIO 引脚图网上到处都是,对照着检查一遍。
第二步,检查 I2C 是否启用。执行ls /dev/i2c*,如果只看到/dev/i2c-1,说明 I2C 已经启用。如果什么都没看到,说明 I2C 没启用,需要重新配置。
第三步,检查 I2C 地址。执行i2cdetect -y 1,看看能不能扫描到地址。如果显示0x3c,说明屏幕通信正常。如果显示--,说明屏幕没有响应,可能是接线问题或者屏幕坏了。
第四步,检查驱动库版本。luma.oled的版本不同,API 可能有差异。如果你用的是旧版本,可能需要调整代码。建议用最新版本。
我踩过的一个坑:有些 OLED 屏幕的 I2C 地址是
0x3d而不是0x3c,代码里写死了0x3c就显示不出来。遇到这种情况,把地址改成0x3d试试。
5.2 硬盘挂载失败或掉盘
USB 硬盘掉盘是树莓派 NAS 的常见问题。原因通常有三个:供电不足、USB 线质量差、硬盘休眠设置不当。
供电不足是最常见的。2.5 寸硬盘虽然标称只需要 5V 0.5A,但启动瞬间电流可能超过 1A。如果树莓派的电源功率不够,或者 USB 线太细,就会导致硬盘掉盘。解决办法是换一个功率更大的电源,或者用带独立供电的 USB Hub。
USB 线质量差也会导致掉盘。有些便宜的 USB 3.0 线屏蔽不好,高速传输时误码率高,硬盘就会掉。换一根质量好的线试试。
硬盘休眠设置不当也会导致掉盘。如果休眠时间设得太短,硬盘频繁启停,反而容易出问题。建议把休眠时间设到 30 分钟以上,或者干脆关闭休眠。
5.3 SMB 共享无法访问
SMB 共享无法访问,排查起来比较繁琐。我整理了一个速查表:
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 能看到共享文件夹但打不开 | 共享文件夹权限不足 | 检查共享文件夹的所属用户和权限 |
| 能打开但无法写入 | SMB 共享权限只读 | 在 SMB 共享设置里改为读写 |
| 提示用户名或密码错误 | 用户未加入用户组 | 把用户加入users组 |
| 网络邻居里看不到 NAS | SMB 服务未启用 | 在服务里启用 SMB/CIFS |
| 访问速度很慢 | 网络协商问题 | 检查网线是否千兆,SMB 协议版本设为 SMB3 |
还有一个隐藏问题:Windows 10/11 默认禁用了 SMB1 协议,而有些老设备只支持 SMB1。如果你用老设备访问 NAS,可能需要在 Windows 里启用 SMB1 支持。但 SMB1 有安全风险,不建议长期使用。
5.4 系统温度过高
树莓派 4B 在 NAS 负载下温度到 70 度左右是正常的,但如果超过 80 度,就会触发降频,性能下降。树莓派 5 温度更高,满载可以到 85 度。
解决办法:加散热片。树莓派 4B 加一个铝制散热片,温度可以降 10 度左右。树莓派 5 建议加一个带风扇的散热器,但如果你对噪音敏感,可以限制 CPU 频率。在/boot/firmware/config.txt里添加:
arm_freq=1500这样可以把 CPU 频率限制在 1.5GHz,温度会明显下降,但性能也会有所损失。对于 NAS 来说,1.5GHz 的性能已经足够。
5.5 我的独家避坑经验
折腾树莓派 NAS 这几年,我总结了几条经验,都是踩坑踩出来的:
第一,SD 卡一定要用好的。我一开始用杂牌 SD 卡,跑了三个月就坏了,系统直接起不来。后来换成三星 EVO 或者闪迪 Extreme,稳定跑了一年多没问题。
第二,电源一定要用官方的。树莓派对电源很挑剔,电压不稳会导致各种奇怪的问题,比如 USB 掉盘、WiFi 断连、系统重启。官方电源虽然贵一点,但省心。
第三,重要数据一定要备份。树莓派 NAS 再稳定,也是 DIY 方案,可靠性比不上成品 NAS。重要数据至少备份两份,一份在 NAS 上,一份在另一块硬盘或者云端。
第四,不要频繁插拔 USB 硬盘。树莓派的 USB 接口没有防静电设计,频繁插拔容易损坏接口或者硬盘。如果要换硬盘,先关机再操作。
第五,OLED 屏幕的亮度不要设太高。OLED 屏幕长期高亮度显示会加速老化,出现烧屏现象。建议把亮度设到 50% 左右,或者设置成定时息屏。
6. 性能实测与优化建议
6.1 文件传输速度实测
我用树莓派 4B 加一块 2.5 寸 5400 转机械硬盘做了实测。Samba 共享下,从 Windows 电脑拷贝一个 5GB 的电影文件到 NAS,速度稳定在 95MB/s 到 105MB/s 之间,基本跑满了千兆网络。从 NAS 拷贝到电脑,速度也差不多。
如果用 NVMe 固态硬盘(树莓派 5),速度可以到 400MB/s 以上,但受限于千兆网口,实际网络传输速度还是 110MB/s 左右。所以如果你只是做文件共享,USB 3.0 接机械硬盘已经足够,没必要上 NVMe。
6.2 功耗与噪音实测
树莓派 4B 加 2.5 寸机械硬盘,空载功耗 5.2W,满载读写功耗 9.8W。树莓派 5 加 NVMe 固态硬盘,空载功耗 7.5W,满载功耗 13.2W。这个功耗水平,一年 365 天开机的电费大概在 30 到 60 元之间,非常省电。
噪音方面,2.5 寸机械硬盘有轻微的转动声,但放在桌面上基本听不到。NVMe 固态硬盘完全静音。树莓派本身没有风扇,也没有噪音。整体来说,这套方案比成品 NAS 安静很多。
6.3 进一步优化的方向
如果你想让这套 NAS 跑得更快更稳,可以考虑几个优化方向:
第一,用 Docker 跑额外服务。OpenMediaVault 支持 Docker,你可以在 NAS 上跑一些轻量级服务,比如 AdGuard Home 做网络广告过滤、Jellyfin 做媒体服务器、Nextcloud 做私有云盘。树莓派 4B 的 4GB 内存跑这些服务有点吃力,建议用 8GB 版本。
第二,配置自动备份。OpenMediaVault 有内置的 Rsync 功能,可以设置定时任务,把重要数据备份到另一块硬盘或者远程服务器。我一般设置每天凌晨 3 点自动备份,备份完成后发邮件通知。
第三,监控系统健康状态。除了 OLED 显示,你还可以用 OpenMediaVault 的监控功能,设置 CPU 温度、硬盘 SMART 状态的告警。如果硬盘出现坏道或者温度过高,系统会发邮件提醒你。
第四,考虑升级到 2.5G 网络。树莓派 5 支持通过 USB 3.0 转 2.5G 网卡,网络速度可以提升到 250MB/s 左右。但需要你的路由器和交换机也支持 2.5G,成本会高不少。对于大多数家用场景,千兆网络已经够用。
我个人在实际操作中的体会是,树莓派 NAS 这套方案最大的价值不在于性能有多强,而在于它让你完全掌控自己的数据。成品 NAS 虽然方便,但数据存在别人的系统里,总有一种不踏实的感觉。树莓派 NAS 虽然折腾,但每一块硬盘、每一个服务、每一行代码都是你自己配置的,出了问题也知道怎么修。这种掌控感,是成品 NAS 给不了的。
最后再分享一个小技巧:如果你觉得 OLED 屏幕显示的信息太多,可以做一个轮播效果,每隔几秒切换一屏,比如第一屏显示 CPU 和内存,第二屏显示硬盘和网络,第三屏显示时间和天气。这样屏幕利用率更高,看起来也更舒服。代码实现上,用一个列表存储不同的显示函数,主循环里轮流调用就行。