这项目到现在都没有正式名字,我在主机上建目录时随手敲的就是“无标题”。结果这套东西不仅活得好好的,还成了家里使用频率最高的基础设施。说白了,这就是一台用旧电脑改装的轻量级局域网文件共享系统,也就是大家常说的自建NAS。
这套系统解决的是我们普通人最真实的一个痛点:手机照片、工作文档、剪辑素材、下载的电影散落得到处都是,今天用微信传一次,明天又拿U盘拷一遍,时间一长根本找不到文件在哪。我把一台闲置主机装上系统,用Samba协议做了几个共享目录,现在家里的笔记本、台式机、手机、平板连上同一个WiFi就能直接读写,就跟访问本地硬盘一样。
如果你手里有一台闲置电脑,或者正打算花几百块组一台低功耗文件服务器,这篇博文里的思路和步骤可以直接照着做。我会把选型逻辑、配置参数、踩过的坑全部写清楚,不搞花架子,保证每一步都能落地。
1. 项目整体设计与思路拆解
1.1 为什么自建轻量NAS,而不直接买成品或挂网盘
先说说最核心的问题:明明有百度网盘、各类同步盘这种现成方案,为什么还要自己在家里搭一套?我当时的判断很简单,三个原因。
第一,数据安全。照片和工作文件放到别人服务器上,虽然方便,心里总有些不踏实。有些内容是私人的,有些是没定稿的,不想被网盘扫描或误判,放自己家的硬盘上最安稳。
第二,速度和容量。网盘下载速度受会员等级限制,批量导入素材时经常等得抓狂。自建的方案在局域网内跑满千兆带宽,实测读写能到100MB/s左右,比网盘体验强太多。而且硬盘容量基本想加就加,不用按月续费扩容空间。
第三,旧硬件回收利用。不少人家里的旧电脑除了吃灰就是占地方,卖二手又不值几个钱。装一个轻量Linux系统,让它干文件存储这一个小任务,性能绰绰有余。
当然,成品NAS的优势也很明显,比如系统成熟、即插即用、有配套APP。但它的缺点是价格偏高,而且对于只想解决“文件共享”这一个需求的人来说,功能过剩。自建的路径更像乐高,一开始只搭一个共享存储,后面想加什么再往上叠,灵活度完全在自己手里。
1.2 我的软硬件清单与选型逻辑
硬件方面我直接用了朋友淘汰的一台老主机,配置如下:
| 部件 | 参数 | 备注 |
|---|---|---|
| 主板 | B85芯片组 | 老平台,胜在稳定 |
| CPU | Intel i3-4130 | 双核四线程,待机功耗低 |
| 内存 | 8GB DDR3 | 对文件共享来说绰绰有余 |
| 系统盘 | 120GB SATA固态 | 装系统和Docker镜像 |
| 存储盘 | 4TB机械硬盘 | 存放主要共享数据 |
| 网卡 | 板载千兆网卡 | 关键是路由器和网线也要千兆 |
这套配置现在看很过时,但跑Samba完全是杀鸡用牛刀。如果你手里没有任何硬件,我建议重点关注三类设备:二手迷你主机、软路由(部分型号可以做NAS)、树莓派等ARM开发板。其中二手迷你主机性价比最高,三百元左右就能拿下,功耗低、体积小,做成共享服务器非常合适。
系统层面我选了Debian 12,理由是稳定、保守、文档多。Samba相关软件包维护很及时,而且以后装Docker之类的开发环境也方便。我也试过用Windows开共享,但内存占用高、后台自动更新会半夜重启,长期运行的稳定性不如Linux,最后果断放弃。
1.3 文件共享的整体架构
整个系统可以抽象成一条简单的数据链路:客户端设备 → 局域网 → 主机上的Samba服务 → 存储硬盘。Samba做的事情,就是让Linux的文件系统通过Windows网络邻居协议(SMB/CIFS)对外提供服务,这样各个操作系统都能把它当成一台普通的文件服务器来访问。
传输示意图不是我凭空设计的,而是基于Samba成熟稳定的特性。整个架构最大的好处是解耦,客户端用什么系统不重要,Windows、macOS、Android、iOS都有各自的支持和适配,服务器端不需要针对每种终端做特殊处理。后续若有新的智能设备要接入,比如电视盒子需要读取共享视频,同样在同一个局域网里加一个Samba客户端配置就能用。
这个架构也有一个潜在问题需要考虑,即网络质量直接决定体验。千兆路由器和合格网线是底线,如果家里用的还是百兆路由,传大文件会明显感觉吃力。这部分的排查方法放在第4章细说。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心细节解析与实操要点
2.1 硬盘分区与文件系统选型
很多人做NAS最容易忽略的就是硬盘文件系统。系统盘和存储盘的分工不同,我做了严格的区分:120GB固态只装系统,4TB机械盘专门存放共享数据。
站在实用角度,我选了ext4。有人会提Btrfs或XFS,但Btrfs的压缩和快照功能虽好,对普通用户来说徒增复杂度,遇到版本升级还可能碰到兼容性问题。而XFS的性能优势在个人NAS场景里感知不强。ext4结实耐用,任何一个Linux运维都不会陌生,出了问题网上答案一抓一大把。
分区的思路也很重要,建议不要在机械盘上分太多区,共享目录用独立的完整分区,物理上跟系统盘分离。这样系统崩溃了,数据盘还能拔下来插到其他机器上直接读,降低了数据损失的连带风险。
挂载参数里有两个值得提的:defaults 和 nofail。nofail 的意思是硬盘在启动时没插好也不耽误系统起来,否则系统会卡在挂载点报错。这对机械盘这种偶尔接触不良的设备来说非常实用。
2.2 Samba核心配置参数详解
Samba配置是整套系统的灵魂,配置文件路径是 /etc/samba/smb.conf。初次安装时系统会生成一个默认配置,我建议先备份再改成自己的内容。
我的配置里几个关键参数如下:
ini复制[global]
workgroup = WORKGROUP
server role = standalone server
security = user
map to guest = Bad User
server min protocol = SMB2
log file = /var/log/samba/log.%m
max log size = 1000
[files]
comment = 公共文件区
path = /srv/nas/files
browseable = yes
writable = yes
valid users = @nasgroup
create mask = 0664
directory mask = 0775
逐个解释我为什么这么配:
security = user 表示所有连接必须通过账号密码验证,这是安全底线,不建议改成share或匿名。map to guest = Bad User 可以把登录失败的请求自动映射为游客,这个选项主要是为了保底,但为了安全,我还是在共享目录里限制了 valid users,即使游客进来了也进不了目录。
server min protocol = SMB2 设置了最低协议版本。SMB1虽然兼容老设备,但存在严重的安全漏洞和性能瓶颈,所以我直接禁掉了SMB1,把最低版本卡在SMB2。现在Windows 10/11、macOS新版本、Android主流文件管理器都支持SMB2及以上,兼容性完全没问题。
create mask = 0664 和 directory mask = 0775 定义了新文件和新目录的默认权限。0664 解释一下:6是读加写,4是只读,组合起来就是群成员可读写、其他用户只读,这既保证了同组用户协作,又避免了文件被随意改动。
2.3 共享目录结构与账号权限设计
设计目录结构时要考虑以后怎么用。一开始我只想共享一个文件夹,后来发现把不同用途的数据混在一起非常难管理和备份,所以重新规划成下面这样:
| 目录名 | 用途 | 写入权限 |
|---|---|---|
| files | 日常工作文档、家庭照片 | nasgroup组可写 |
| media | 电影、音乐、视频素材 | 限固定用户 |
| backup | 各设备备份的压缩包 | 限固定用户 |
每个共享的权限在Samba配置里用 valid users 控制,同时在Linux文件系统层面再做一层权限控制。这种做法称为“双层权限”,Samba层的账号密码挡掉门外汉,Linux层的属主权限挡掉误操作。
账号方面我建了一个 nasgroup 组,把日常需要互传文件的家庭成员都放进这个组。然后给每个人单独分配一个Samba用户,不要所有人共用同一个账号,因为一旦共用账号就分不清谁删了文件、谁改了内容。虽然小场景下共用一个账号省事,但排查问题时会非常痛苦,不值得。
3. 实操过程与核心环节实现
3.1 系统安装后的基础初始化和防火墙
系统安装这里不啰嗦,选择最小化安装Debian即可,过程中只装标准系统工具和SSH服务器。装完第一件事,我用 apt update && apt upgrade 把系统打了最新补丁,然后创建了一个普通用户用于日常操作,禁止使用root直接登录SSH。
防火墙方面,Debian默认没有开启防火墙规则,可以使用 ufw 做简单管理:
bash复制apt install ufw -y
ufw allow OpenSSH
ufw allow Samba
ufw enable
这里 ufw allow Samba 会同时放行UDP 137/138和TCP 139/445端口,这些都是Samba协议需要使用的端口,少一个都可能导致共享能看见但连不上。
基础初始化完成后,我把存储盘格式化并挂载到 /srv/nas 目录下。为了开机自动挂载,在 /etc/fstab 里加了一行:
code复制UUID=你的硬盘UUID /srv/nas ext4 defaults,nofail 0 2
需要注意,UUID不要用 /dev/sda 这种设备名,因为重启后设备名可能发生变化,而UUID是永久唯一的,这种细节能省去以后很多麻烦。
3.2 Samba安装配置完整步骤
安装Samba非常简单,Debian一条命令搞定:
bash复制apt install samba -y
装完后我备份了原始配置,然后写入自定义配置。配置内容就是前面展示的那份,写入后还需要创建Linux用户并设置Samba密码:
bash复制useradd -m -s /usr/sbin/nologin tom
smbpasswd -a tom
我把用户的shell设置成 /usr/sbin/nologin,意思是这个人只能通过Samba访问文件,不能登录系统执行命令。这是很关键的安全习惯,否则一个文件共享账号还可能变成系统后门。
然后创建共享目录并设置权限:
bash复制mkdir -p /srv/nas/files
chown root:nasgroup /srv/nas/files
chmod 2770 /srv/nas/files
chmod 2770 中的 2 是setgid位,它保证所有在这个目录下新建的文件都会自动继承 nasgroup 组身份,避免多个用户操作后文件所属组五花八门。这个细节解决了很多协作场景的权限错乱问题。
重启Samba服务并验证配置:
bash复制systemctl restart smbd nmbd
testparm
testparm 会检查配置文件的语法和参数合法性,有任何错误都会直接列出来,这是个长眼睛的操作,改完配置一定要先跑一遍。
3.3 多设备连接实操记录
Windows端连接最顺手。打开文件资源管理器,地址栏输入 \\192.168.x.x,回车后会弹认证窗口,输入刚才的Samba用户名和密码就能看到共享目录。右键选择“映射网络驱动器”,把共享目录挂载成一个盘符,以后打开“此电脑”就能直接看到,跟本地D盘没区别。
macOS端连接方式也简单,在访达里按 Cmd + K,输入 smb://192.168.x.x,然后选择“注册用户”登录。macOS的SMB客户端对SMB2/3的兼容性很好,实测连接后读写速度都稳定。
Android端我用的是“CX文件管理器”或“文件管理器+”,新建一个“远程连接”,填上IP、账号、密码就能访问。iOS用“文件”App自带的“连接服务器”功能,同样输入 smb:// 地址就能加入。
连接过程中最容易出错的是IP地址。建议在路由器后台给这台NAS主机设置一个静态IP租约,把MAC地址和IP绑定起来,否则有一天主机IP变了,所有客户端都要重新配置。我的NAS固定成了 192.168.1.10,每次排查环境时心里都有数。
3.4 开机自启与长期运行的基础设置
Samba服务在安装后默认就已经设置为开机启动了。系统开机后会自动读取上面的fstab挂载数据盘,然后启动Samba服务,整个过程不需要人工干预。我会定期检查系统日志:
bash复制journalctl -u smbd --since today
另外,Linux主机长时间运行需要留意硬盘温度。我装了一个 smartmontools,每周用定时任务跑一次硬盘健康自查:
bash复制smartctl -a /dev/sda
同时我习惯在BIOS里开启“断电恢复后自动开机”选项,这样偶尔短时停电,来电后主机能自动恢复运行,不需要再手动去按电源键。
4. 常见问题与排查技巧实录
4.1 共享连不上,六种典型原因排查
用了小半年,我遇到过几次连接失败,总结下来九成离不开下面几个原因。
第一种是网络不通。先在NAS主机上 ip addr 看一下当前IP是否被重置,再从客户端 ping 一下NAS的IP。如果ping不通,查网线、查路由器后台、查主机网络配置。
第二种是防火墙问题。Samba相关端口的TCP/UDP必须全部放行,比如缺少UDP 137/138时,客户端能发现网络邻居里的设备名,但双击会直接报错。
第三种是Samba服务没起来。执行 systemctl status smbd 看服务状态,如果显示 active (running) 但客户端依然连不上,还可以检查 nmbd 服务,这两个组件缺一不可。
第四种是账号密码错误或Samba账号未创建。很多人只创建了Linux用户,忘了执行 smbpasswd -a,导致密码验证永远失败。
第五种是SMB版本不匹配。老设备走SMB1会被我们禁掉,如果在老设备上反复报协议错误,可以考虑在配置里把 server min protocol 临时调低测试,但测完记得改回来。
第六种是操作系统信任域问题,Windows某些版本默认启用“来宾访问”策略,会干扰账号验证。解决办法是需要知道这类改注册表的操作,但我会先排除其他五项再考虑它。
4.2 传输速度上不去,三个方向排查
如果共享能连上但速度只有十几MB/s甚至几MB/s,那传输瓶颈多半不出在Samba配置上。第一个要查的是网线,很多顺手拿的网线仅支持百兆,跑不满千兆。我有一个土办法,在NAS上用 ethtool eth0 查看协商速率,输出显示 1000Mb/s 才算合格。
第二个要查的是路由器的交换机芯片。低端路由器在有线转无线负载大时,端口间转发性能会缩水,测试方法是用两台有线设备直接对拷,如果速度上去了,说明瓶颈在路由器。
第三个要查的是硬盘IO和系统负载。机械硬盘在大量读写的场景下确实达不到满速,这个正常。确认方法是用 iotop 看实时IO,再用 htop 看CPU和内存负载。如果机械硬盘本身单盘极限就在150MB/s附近,而Samba实测能到110MB/s,这个水平已经算正常,不要纠结于纸面参数。
4.3 权限出错和中文文件名乱码处理
权限报错最常见的症状是:能连上共享、能打开目录,但创建文件或重命名时提示“没有权限”。这往往是因为Samba用户对应的Linux用户在目录上没有写权限。检查共享目录的属主和setgid位,确保用的是正确用户组合,或者执行 setfacl 给指定用户单独加权限。
中文乱码问题多发生在连接老设备或在Windows下压缩的文件解压到NAS后。现在Samba 4默认的UTF-8处理已经比较完善,如果还遇到乱码,可以在 [global] 里补上 unix charset = UTF-8 和 dos charset = CP936。CP936是中文Windows使用的编码,这两个参数搭配好,大多数乱码都能解决。
4.4 长期运行的一些稳定性和舒适度心得
这台主机放在家里角落全天运行,我额外买了两个小配件很值得分享。一个是几块钱的USB风扇,夏天给硬盘仓吹风,温度稳定在40度左右;另一个是带开关的智能插座,用来监控功耗,整机待机实测大约25瓦,一年电费不过百元,完全在可接受范围内。
还有一条很实用:定期把共享目录的目录结构和文件名导出成清单。我每天凌晨跑一个脚本,把当天新增的文件列表发到邮箱,万一哪天某台设备因病毒或误操作把文件删了,我至少能知道是哪天、动了哪些文件,恢复起来心里有数。
5. 从文件共享到自动备份:一个实用扩展
5.1 用rsync给共享数据做定时备份
做NAS之后我最担心的是硬盘突然挂掉。所以我在NAS上又插了一块闲置的3.5英寸机械盘作为备份盘,用rsync做增量同步,把关键共享目录备份到另一个分区。
备份命令我写成一行:
bash复制rsync -av --delete /srv/nas/files/ /mnt/backup/files/
这条命令的参数逐个说明:-a 是归档模式,保留权限、属主、时间戳;-v 显示进度;--delete 同步时删除源端已不存在但备份端还有的文件,保证备份是源目录的完整镜像。
然后把这个命令放进crontab,每天凌晨两点执行:
bash复制0 2 * * * /usr/local/bin/nas_backup.sh >> /var/log/nas_backup.log 2>&1
备份盘和源数据盘最好不是同一块物理硬盘,否则硬盘坏了备份也跟着废了。如果条件允许,还可以按周把备份盘拔下来放到抽屉里,形成“离线备份”的兜底方案,应对更极端的情况。
5.2 后续还能玩什么:Docker、同步盘、影音库
Samba只是这个项目的第一块积木。现在这套硬件和目录结构稳定运行了很长时间,我评估后决定继续在Docker里叠功能。已经有几个方向值得尝试:
一是部署一个同步盘服务,支持多设备双向同步,手机上拍的照片会自动上传到NAS,不再依赖任何第三方网盘。
二是搭一个影音媒体服务,用来管理下载的电影和电视剧,自动刮削海报、简介,电视和手机端随时点播。
三是给共享目录套一层Web文件管理器,在外面用浏览器打开网址就能访问文件,这是局域网Samba之外的一个补充入口。
但一定要记住,功能叠加的前提是先把共享和备份这一层打牢。基础不扎实,叠再多功能都是空中楼阁,一旦数据出了问题,后悔都来不及。
最后再分享一点我个人的体会。做完这个项目,我最深的感受是“无标题”这三个字挺贴切的,因为它从一个小实验长成了家里必不可少的数字基石。做技术项目往往不需要高大上的起点,一个闲置的旧电脑、一块多余的硬盘、一台普通路由器,就能解决很多人天天都在忍受的问题。如果你身边正好有这些零件,不妨按这篇博文的步骤试一次,搭完之后你会觉得,原来数据统一管理是一件这么顺心的事。
