基于OpenWrt搭建SAMBA服务实现本地网络存储服务的方法

发布时间:2026/11/6 2:01:12
基于OpenWrt搭建SAMBA服务实现本地网络存储服务的方法

其实,我有一个正儿八经的NAS,但似乎基于X86平台实现的NAS在实际部署后干得最多的事情是在局域网内当U盘,加上现在的工作地点离家倒也不远不近,但跑一趟也要跑个三五十公里。既然如此,那又何必专门额外准备一台NAS?于是我想起了以前折腾过的OpenWrt……基于Linux开发的OpenWrt的路由器具有足够的可扩展性,可靠性不说久经考验但也软件生态环境丰富多样,而且家用路由器的硬件设计时就考虑了节能设计,为了实现无线上网路由器又是现实刚需,那就整合到一起,虽然性能说不上有多强,但是至少节能降耗,于是我又开始俺寻思……。

以及吐个槽,OpenWrt的文档是真的不友好,散落得到处都是,写个回忆录,也算是一次逆熵之旅吧。

环境搭建

环境搭建包括两部分,硬件环境和软件环境,以下将分开阐述。

本文使用的路由器为中兴E8820S,处理器为MediaTek MT7621,具有256MB RAM和128MB Flash,五个RJ45 GBE网口和一个USB2.0接口,以及一个5521 12V外负内正电源接口(实测9V也能用,估计里头还是有buck电路转3.3和5V),使用breed作为bootloader。U盘为市售USB3.0 U盘,使用前格式化为exFAT格式(分配单元大小128KB)。使用的OpenWrt固件版本为23.05.4 (因为是在自家百(la)宝(ji)箱(dui)里挖出来的,感觉能用就继续用,按说现在应该有新版本,只是懒得更新了)(型号HiWiFi HC5962),在luci控制台界面“系统->管理权->SSH访问”中启用SSH访问,接口配置为lan,端口配置为22,启用密码验证和允许root用户凭密码访问。个人认为OpenWrt版本并不重要,只是顺便记录。

在部署 NAS 服务之前,应通过命令提示符以 SSH 方式执行指令,完成相关软件包的安装:

#通过SSH方式以root用户登录 #工具可以是cmd、powershell、bash或者别的什么东西 #IP不要抄我的,看你自己的 ssh root@192.168.114.1 #每次ssh登陆OpenWrt安装新软件时,都必须更新软件列表,建议切换到国内源 opkg update #usb驱动 opkg install kmod-usb-core #SCSI总线驱动 opkg install kmod-scsi-core #scsi驱动 opkg install kmod-scsi-generic #USB OHCI controllers opkg install kmod-usb-uhci #USB UHCI controllers opkg install kmod-usb-ohci #USB EHCI controllers opkg install kmod-usb-ehci #USB XHCI controllers opkg install kmod-usb-xhci-hcd #usb2.0驱动 opkg install kmod-usb2 #usb3.0驱动,用于USB3.0设备 opkg install kmod-usb3 #usb存储设备驱动 opkg install kmod-usb-storage #exFAT文件格式支持 opkg install kmod-fs-exfat #块设备挂载管理工具 opkg install block-mount #samba服务 opkg install samba4-server #samba服务图形化界面 #可选的图形化界面汉化包 luci-i18n-samba4-zh-cn opkg install luci-app-samba4

设置USB存储器自动挂载

考虑到路由器运行过程中可能出现的频繁掉电与服务重启,本章内容围绕 USB 存储设备的自动挂载展开说明,以保证外部存储在系统恢复时能够被稳定识别。

在配置自动挂载前,应先检查路由器是否成功识别所连接的 USB 存储器。

ls -h /dev/sd*

检查是否成功识别存储器,执行上述命令后,若系统返回设备节点信息,则表明存储器已被识别。例如,系统反馈如下:

brw------- 1 root root 8, 0 Jan 1 1970 /dev/sda brw------- 1 root root 8, 1 Jan 1 1970 /dev/sda1

根据反馈可知,USB存储器已成功识别,并生成设备节点/dev/sda1。将存储器挂载到文件系统,以挂载到/etc/smb1为例(当然,较真的话,这东西适不适合挂载在/etc下我觉得有点争议,不过我觉得开心就好):

mkdir /etc/smb1 mount -t exfat /dev/sda1 /etc/smb1

默认状态下,mount命令缺省参数是async,可用于启用异步写入提升性能,但是如果不想处理可能的缓存问题,建议改为sync,虽然会变慢。但是,通过此法挂载的存储器不会开机自动挂载,需要通过block-mount工具实现开机自动挂载文件系统,然后使用默认自带的vi工具编辑/etc/config/fstab文件已实现开机自动挂载。

#生成标准配置文件 block detect > /etc/config/fstab #执行完成后,修改fstab配置文件 #编辑fstab配置文件,OpenWrt默认文本编辑器为vi #用不用vi不重要,开心最重要 vi /etc/config/fstab config global option anon_swap '0' option anon_mount '0' option auto_swap '1' option auto_mount '1' option delay_root '5' option check_fs '0' config mount option target '/etc/smb1' option device '/dev/sda1' #磁盘分区类型 option fstype 'exfat' #将自动挂载后的参数设置为sync,若要使用异步写入则为async option options 'rw,sync' option enabled '1' #启动时自动挂载 option enabled_fsck '0'

完成fstab文件编辑后,启动自动挂载:

/etc/init.d/fstab enable

完成上述步骤之后,重启路由器(拔电源、reboot命令按说都随便),运行df命令,应可见USB存储器被挂载到目标目录:

#grep用于查找文件里符合条件的字符串,此处用于仅显示/etc/smb1,当然想一眼万行也无所谓 df | grep "/etc/smb1" #应出现的结果类似物 /dev/sda1 122874752 1458048 121416704 1% /etc/smb1

部署samba服务

因为samba服务默认禁用root用户,而在OpenWrt中默认用户即为root,存在矛盾。详见以下命令运行结果:

#grep用于查找文件里符合条件的字符串,此处用于仅显示invalid user #想看原文直接cat /etc/samba/smb.conf或者vi /etc/samba/smb.conf cat /etc/samba/smb.conf | grep "invalid user" #以下为运行结果类似物 ## set invalid users invalid users = root

有三种方式解决此矛盾,一是允许匿名用户访问,此操作将允许任意连接到局域网内的用户访问网络存储器;二是注释掉/etc/samba/smb.conf中的“invalid users = root”,此操作将允许以root用户身份访问网络存储器;三是添加一个samba账户,用于访问网络存储器。由于前两个方法存在显而易见的信息安全问题,故以下将着重对第三种方式进行说明。

添加samba用户

修改/etc/passwd文件,添加名为“nas_user”的samba用户:

vi /etc/passwd #在文本末尾添加: nas_user:x:1919:65534:NAS User:/var:/bin/false

参数x的含义为指代密码保存在/etc/shadow中;1919为用户ID,必须确保在passwd文件中唯一;65534为对应用户的主组,在OpenWrt中指代nobody组;/var为samba用户的根目录,/bin/false表示samba用户不能登录系统,只作为服务账号使用。

添加samba用户后,使用passwd命令设置用户密码:

#以nas_user为例,按下回车就开始输密码 passwd nas_user

然后使用smbpasswd 命令设置用户nas_user的samba服务密码:

#以nas_user为例,按下回车就开始输密码 smbpasswd -a nas_user

设置samba服务

在本次配置中,使用了samba服务的luci界面进行设置,页面位置在服务->网络共享->常规设置。主要参数为接口选择lan(用于局域网访问),工作组设置为NAS,描述为Samba on OpenWRT;共享目录名称为NAS1(将作为存储器卷名),路径设置为/etc/smb1,勾选可浏览,允许用户设置为nas_user,创建权限掩码设置为666、目录权限掩码设置为777。

理论上还可以通过修改/etc/samba/smb.conf文件进行设置,但是本次设置中仅使用luci界面,以下为推测,欢迎试毒:

vi /etc/samba/smb.conf #设置以下参数 Netbios name = OpenWrt interfaces = br-lan server string = Samba on OpenWRT unix charset = UTF-8 workgroup = NAS #以下省略 #将下述代码添加到“# Filesystem and creation rules #”注释后 ######### Dynamic written config options ######### [NAS1] path = /etc/smb1 valid users = nas_user create mask = 666 directory mask = 777 read only = no guest ok = no

配置完成之后,通过以下命令重启samba服务:

/etc/init.d/samba4 restart

连接测试

反正,我测下来都能用,除了ipad,不知道为什么会出现能读取但是不能写入的问题……

就这样吧。