释放小七猫的分享欲

Linux 系统的 NAS 之路——文件共享协议

tags: NAS, Linux
@ 20/07/2026

Linux 系统的 NAS 之路——文件共享协议

这部分讲解一下如何在 Linux 系统中配置各主流的文件共享协议。

Samba4

Samba4 是 Windows 上的 SMB 协议的 Linux 实现。它的优点是与 Windows 系统集成得很好,缺点是文件权限经常把人搞晕。

安装

sudo dnf install samba

添加专用用户

建议单独创建一个 Samba 专用用户(如果就想用当前用户也可以跳过)。专用用户不登录系统,仅用于 Samba 访问,更安全:

sudo useradd -M -s /sbin/nologin test   # -M 不创建家目录,-s 禁止登录 Shell

然后设置 Samba 密码(注意不是系统密码,需要用 smbpasswd 单独设置):

sudo smbpasswd -a test

如果添加了专用用户,记得要给共享目录相应的访问权限。可以把 test 加入文件夹的用户组,或者用 ACL 精细控制。

配置 smb.conf

进入 /etc/samba/ 目录,备份原来的配置后直接编辑:

[global]
   workgroup = WORKGROUP
   server string = %h server (Samba, Fedora)
   security = user
   map to guest = Bad User
   # 解决中文文件名乱码(关键)
   unix charset = UTF-8
   dos charset = cp936
   display charset = UTF-8
   # 允许软链接
   follow symlinks = yes
   wide links = yes
   unix extensions = no

[1000]
   path = /path/to/share
   browseable = yes
   read only = no
   valid users = test
   # 强制新建文件属于指定用户,避免权限混乱
   force user = yourname
   force group = yourname
   guest ok = no
   create mask = 0755
   directory mask = 0755

几个关键配置说明:

  • force user / force group — 不管谁通过 Samba 写入文件,文件属主都强制变成你指定的用户,这是解决权限混乱最简单的方法
  • valid users — 只有这里列出的用户能访问这个共享
  • create mask / directory mask — 新建文件和目录的默认权限

配置完重启服务:

sudo systemctl restart smb

从 Windows 测试

  1. 在文件资源管理器输入 \\服务器IP
  2. 提示凭据时,输入用户名 test 和刚才设置的 Samba 密码
  3. 如果成功,会看到共享文件夹

NFS

NFS 是 Linux 和 UNIX 系统之间最常用的文件共享协议。跟 SMB 不同,NFS 在 Linux 客户端上挂载非常自然,配置也简单得多。如果你的文件共享只在 Linux 设备之间进行,NFS 是比 SMB 更轻量的选择。

安装

NFS 分为服务端和客户端。NAS 当然要装服务端:

sudo dnf install nfs-utils

配置导出目录

NFS 通过 /etc/exports 文件来配置哪些目录共享给谁。每条记录的格式是:

/要共享的目录  允许的客户端(选项)

比如我要把 /vol-mfs/媒体 共享给整个局域网:

# 编辑 /etc/exports
/vol-mfs/媒体   192.168.1.0/24(rw,sync,no_subtree_check)

常用选项说明:

  • rw — 读写权限;ro 是只读
  • sync — 写入磁盘后才返回,数据更安全(推荐);async 性能更好但可能有数据丢失风险
  • no_subtree_check — 禁用子目录检查,提升稳定性
  • root_squash — 客户端的 root 会被映射成匿名用户(默认开启,安全);no_root_squash 允许客户端的 root 保持 root 权限(权限统一但安全性太差,不推荐)

配置多个目录就写多行:

/vol-mfs/资料/1000   192.168.1.0/24(rw,sync,no_subtree_check)  # 允许网段设备访问
/vol-mfs/资料/1000   192.168.1.100(rw,sync,no_subtree_check)   # 只允许特定设备访问

启动服务

sudo systemctl enable --now nfs-server

客户端挂载

在另一台 Linux 机器上安装客户端(一般发行版都自带,如果没有就装 nfs-utils),然后挂载:

# 先看看服务端有哪些共享
showmount -e 192.168.1.100

# 挂载
sudo mount -t nfs 192.168.1.100:/vol-mfs/资料/1000 /mnt/nas-media

如果希望开机自动挂载,写入 /etc/fstab:

192.168.1.100:/vol-mfs/媒体  /mnt/nas-media  nfs  defaults  0  0

miniDLNA

DLNA 是电视、游戏机、音箱等设备发现和播放媒体文件的协议。miniDLNA(也叫 ReadyMedia)是一个轻量级的 DLNA 服务端,装上之后,你家里的智能电视就能直接播放 NAS 上的电影和音乐了。

安装

sudo dnf install minidlna

配置

配置文件在 /etc/minidlna.conf。核心要改的就几项:

# 媒体文件目录。可以指定多个,用逗号隔开
media_dir=A,/path/to/music      # A=音频
media_dir=P,/path/to/pictures   # P=图片
media_dir=V,/path/to/videos     # V=视频

# 服务器在网络上显示的名称
friendly_name=My Linux

# 数据库和缓存目录(保持默认就行)
db_dir=/var/cache/minidlna
log_dir=/var/log/minidlna

# 监听的端口,不需要改
port=8200

media_dir 前面的字母告诉 miniDLNA 这个目录里是什么类型的文件,方便客户端分类展示。如果目录里混合了各种媒体,直接用 media_dir=/path/to/media 不加前缀也可以,但分类就不那么准确了。

WebDAV

WebDAV 是 HTTP 协议的扩展,让你可以通过网络像操作本地文件一样对远程文件进行增删改查。

相比 SMB,WebDAV 在外网访问方面更友好(走 443 端口,不会被运营商封),但权限管理不如 SMB 精细。

Apache / Nginx 模块方案

Apache 的 mod_dav 和 Nginx 的 WebDAV 模块都能实现,但配置比较麻烦,已经不推荐自己折腾了。

私有云自带的 WebDAV

可道云、NextCloud、Seafile 等主流私有云网盘都已经内置了 WebDAV 功能,可以直接作为附属服务使用。

用 OpenList 聚合所有 WebDAV(推荐)

OpenList 是一个轻量的 WebDAV 服务端,我比较推荐这个方案,比手动配 Apache 省心很多。

OpenList 作为系统底层的文件共享服务,我建议用非容器方式部署:

一键安装到 /opt/:

curl -fsSL https://res.oplist.org/script/v4.sh > install-openlist-v4.sh && sudo bash install-openlist-v4.sh

这种方式 OpenList 以 root 运行,拥有全部文件访问权限。

也可以手动安装,从 OpenList Releases 下载后:

tar -zxvf openlist-xxxx.tar.gz
chmod +x openlist
./openlist server
./openlist admin
./openlist admin random
./openlist admin set NEW_PASSWORD

然后配置为用户级 systemd 服务,写入 ~/.config/systemd/user/openlist.service:

[Unit]
Description=Openlist WebDAV Service
After=network-online.target

[Service]
WorkingDirectory=/path/to/openlist/
ExecStart=/path/to/openlist/openlist server
Restart=on-failure

[Install]
WantedBy=default.target

启动后进入 OpenList 管理页面,在"存储"中添加"本机存储",注意修改创建文件夹的权限——个人文件设为 700,需要共享的媒体库设为 755 或 775。

OpenList 还能挂载网盘,把各路网盘文件统一到 NAS 上,搭配 rclone 玩法更丰富。

iSCSI

前面讲的 SMB、NFS、WebDAV 都是文件级共享协议,客户端看到的是一个个文件和文件夹。iSCSI 则不同,它是在网络上传送块设备——客户端连接后会多出一块"硬盘",你需要像用本地硬盘一样去格式化、分区、挂载它。

iSCSI 适合什么场景?

  • 给 Windows 电脑通过网络加一块"本地硬盘",用来装 Steam 游戏或软件
  • 给 VMware / Proxmox 当共享存储
  • 需要块级别的访问控制(比如某块盘只能某个客户端使用)

其实就是创建一个虚拟磁盘,然后把这个虚拟磁盘直接共享给其他设备。iSCSI 配置起来比较复杂,使用场景也较少,只有存储游戏,反网络文件夹检测等需求才会用到,了解即可。

  • iSCSI 是块级协议,不要在多个设备上同时挂载同一块 iSCSI 盘,否则会损坏文件系统(除非你用了集群文件系统,但那很复杂)
  • iSCSI 对网络延迟比较敏感,建议在千兆以上网络中使用
  • 如果不想用单独的硬盘,用文件模拟块设备(fileio)完全可以满足日常需求

服务端配置(Target)

在 Fedora 上使用 LIO(Linux-IO Target)作为 iSCSI 目标端:

sudo dnf install targetcli
sudo systemctl enable --now target

targetcli 是一个交互式配置工具,在里面输入命令会实时生效。下面演示如何创建一个 iSCSI target:

sudo targetcli

进入 targetcli 的交互界面后,依次执行:

# 创建块设备(假设你有一块单独的硬盘 /dev/sdb,或者用文件模拟)
> backstores/fileio create disk1 /path/to/disk1.img 500G

# 创建 iSCSI target(IQN 名称需要唯一,格式固定)
> /iscsi create iqn.2026-07.local.nas:target1

# 把块设备和 target 关联起来
> /iscsi/iqn.2026-07.local.nas:target1/tpg1/luns create /backstores/fileio/disk1

# 配置访问控制(只允许特定客户端连接)
> /iscsi/iqn.2026-07.local.nas:target1/tpg1/acls create iqn.2026-07.local.client:initiator1

# 查看配置结果
> ls /

# 退出并保存配置
> saveconfig
> exit

saveconfig 会让配置持久化到 /etc/target/saveconfig.json,重启 target 服务后依然生效。

关于磁盘映像文件:/path/to/disk1.img 不用提前创建,targetcli 的 fileio create 会自动生成一个稀疏文件(sparse file),一开始不占空间,随着写入慢慢增长。

客户端连接(Initiator)

Linux 客户端:

# 安装客户端
sudo dnf install iscsi-initiator-utils

# 发现目标
sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.100

# 连接
sudo iscsiadm -m node --targetname iqn.2026-07.local.nas:target1 --login

连接成功后执行 lsblk 就能看到新硬盘了,像用本地硬盘一样分区格式化即可。

Windows 客户端:

Windows 自带 iSCSI 发起程序,在"管理工具"中找到它:

  1. 在"目标"输入框填写 NAS 的 IP 地址,点击"快速连接"
  2. 如果已经配置了 ACL,需要把 Windows 的 Initiator Name 填到服务端的 ACL 中(Windows 的发起程序名称可以在 iSCSI 发起程序属性页面找到)
  3. 连接成功后,打开"磁盘管理",会看到新加的磁盘,初始化并创建分区即可