做运维的朋友都知道,服务器之间的文件共享几乎天天都要用到。你在A服务器上生成了日志,B服务器上的应用要读取;或者团队成员想在Windows电脑上直接访问Linux服务器上的项目文件——这些问题,本质上都是"文件共享"。
今天这一期,我来把Linux下最常用的7种文件共享方式挨个捋一遍。不整那些花里胡哨的概念,直接上实操——怎么装、怎么配、怎么用,一条命令一条命令地讲清楚。不管你是刚入行的小白,还是想查漏补缺的老手,看完这篇应该都能找到适合自己场景的方案。
一、NFS:Linux之间最省事的共享方式
NFS(Network File System)是Linux世界里最老牌的文件共享协议了。说实话,如果你的环境里全是Linux服务器,NFS基本就是默认选项——装个包、写一行配置、启动服务,完事。客户端挂载之后,远程目录就跟本地磁盘一样用,体验非常丝滑。
1. 服务端配置
先装包,RHEL/CentOS系用yum,Debian/Ubuntu系用apt:
yum install -y nfs-utils
然后创建一个要共享的目录,并在 /etc/exports 文件里写规则:
mkdir -p /data/shared
echo "/data/shared 192.168.1.0/24(rw,sync,no_root_squash)" >> /etc/exports
解释一下这条规则的意思:
• /data/shared:要共享的目录路径
• 192.168.1.0/24:允许访问的客户端IP范围,写*表示允许所有
• rw:读写权限,ro表示只读
• sync:数据同步写入磁盘,更安全(对应的是async,速度快但丢数据风险高)
• no_root_squash:客户端的root用户在共享目录里保持root权限(生产环境建议用root_squash,更安全)
最后启动服务并加入开机自启:
systemctl enable --now nfs-server
验证一下共享是否正常导出:
showmount -e localhost
上面的截图就是服务端的完整操作流程——安装、配置、启动、验证,一条龙走完。
2. 客户端挂载
客户端同样需要安装 nfs-utils,然后一条命令挂载:
mkdir -p /mnt/nfs
mount -t nfs 192.168.1.100:/data/shared /mnt/nfs
挂载成功后,用 df -h 就能看到远程目录出现在本地文件系统中。往 /mnt/nfs 里写文件,服务端的 /data/shared 会实时同步——因为NFS本身就是"网络文件系统",不是"复制文件"。
如果想开机自动挂载,在 /etc/fstab 里加一行:
192.168.1.100:/data/shared /mnt/nfs nfs defaults 0 0
二、Samba:让Linux和Windows无缝互通
NFS虽好,但Windows默认不支持。如果你的团队里有Windows用户需要访问Linux服务器上的文件,Samba就是最佳方案。它实现了SMB/CIFS协议,说白了就是让Linux共享的目录在Windows的"网络"里直接出现,跟访问Windows共享文件夹一模一样。
1. 安装与配置
安装包,创建共享目录,然后编辑配置文件:
yum install -y samba samba-client
mkdir -p /srv/samba/share
chmod 0777 /srv/samba/share
编辑 /etc/samba/smb.conf,在末尾添加共享配置:
[share]
comment = Shared Folder
path = /srv/samba/share
browseable = yes
writable = yes
guest ok = no
valid users = alice
这里的关键点是:guest ok = no 表示不允许匿名访问,valid users 指定了允许访问的用户。安全起见,别开匿名共享。
2. 创建Samba用户
Samba用户必须是系统已有用户,但密码是独立的。用 smbpasswd 命令设置:
useradd alice
smbpasswd -a alice
然后启动服务:
systemctl enable --now smb nmb
防火墙别忘了放行:
firewall-cmd --permanent --add-service=samba
firewall-cmd --reload
Windows端访问的方式有两种:一是在资源管理器地址栏直接输入 \\192.168.1.100\share,弹出登录框后输入用户名密码即可;二是用 net use 命令映射为本地磁盘,以后在"此电脑"里就能看到一个新盘符,非常方便。
⚠️ 踩坑提醒:SELinux可能会阻止Samba访问目录,如果Windows端连不上但服务是正常的,执行 setsebool -P samba_export_all_rw on 放行。
三、FTP:经典但别忽视的安全隐患
FTP(File Transfer Protocol)是最早期的文件传输协议之一。说实话,在2026年还在用纯FTP,我是不太推荐的——因为它传输过程不加密,密码和文件内容都是明文,中间人攻击一抓一个准。不过它的历史地位摆在那里,很多老系统、老设备仍然在用,所以还是得了解一下。
Linux上最常用的FTP服务器软件是 vsftpd(Very Secure FTP Daemon),从名字就能看出它主打安全。
快速搭建
yum install -y vsftpd
配置文件在 /etc/vsftpd/vsftpd.conf,几个关键参数建议改一下:
• anonymous_enable=NO —— 关闭匿名访问,这条一定要改
• chroot_local_user=YES —— 把用户锁定在家目录,防止浏览系统其他文件
• allow_writeable_chroot=YES —— 允许用户在家目录有写权限(新版本vsftpd的要求)
创建FTP专用用户,禁止SSH登录:
useradd -s /sbin/nologin ftpuser
passwd ftpuser
systemctl enable --now vsftpd
客户端连接的话,命令行用 ftp 命令,图形界面用 FileZilla 之类的工具都行。
⚠️ 安全建议:如果在意安全性,别用纯FTP,直接跳到下面的SFTP部分。FTP只适合在内网隔离环境或者临时传文件用。
四、SFTP:FTP的安全升级版,零额外安装
SFTP(SSH File Transfer Protocol)这个名字容易让人误会——它跟FTP协议本身没有半毛钱关系,而是跑在SSH通道上的文件传输协议。最大的优势是:只要你的Linux装了OpenSSH(几乎所有发行版默认都装),SFTP就已经就绪了,不需要额外装任何软件。
传输全程走SSH加密通道,密码、文件内容全部加密,安全性拉满。这也是我最推荐的文件传输方式之一。
1. 最简单的用法
如果你有SSH账号,直接 sftp 用户名@服务器IP 就能连上去:
sftp user@192.168.1.100
sftp> put localfile.txt
sftp> get remotefile.txt
sftp> ls
sftp> exit
put 上传、get 下载、ls 列目录、cd 切换目录,跟FTP的操作习惯几乎一样,但全程加密。
2. 创建受限的SFTP用户
如果你想给某个用户只开放SFTP文件传输,不让他SSH登录系统,可以这样做:
在 /etc/ssh/sshd_config 末尾添加:
Match Group sftponly
ChrootDirectory /home/%u
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
这段配置的意思是:所有 sftponly 组的用户,登录后被锁定在自己的家目录(Chroot),只能使用SFTP功能,不能执行Shell命令,不能转发端口。
然后创建用户和目录:
groupadd sftponly
useradd -g sftponly -d /home/bob bob
chown root:root /home/bob
mkdir /home/bob/files && chown bob:sftponly /home/bob/files
systemctl restart sshd
⚠️ 注意一个坑:ChrootDirectory 指定的目录及其所有上级目录的属主必须是 root,且权限不能大于755。这就是为什么 /home/bob 要 chown root:root——如果属主是bob,SFTP会直接拒绝连接,报错 "Permission denied"。用户能写入的目录要建在Chroot目录的子目录里(比如 /home/bob/files)。
五、WebDAV:把文件共享变成HTTP服务
WebDAV(Web-based Distributed Authoring and Versioning)听名字很长,但其实它就是HTTP协议的扩展——在HTTP的基础上增加了写入、删除、锁等操作的支持。换句话说,你访问一个WebDAV共享目录,跟在浏览器里访问网页的地址格式是一样的。
它最大的好处是:能穿透防火墙(走80/443端口),而且很多云存储、笔记软件、文档工具原生支持WebDAV协议。比如用Obsidian做笔记同步、用Joplin同步数据,WebDAV都是首选。
用Nginx快速搭建
Nginx原生支持WebDAV(需要编译时带 --with-http_dav_module),配置非常简洁:
server {
listen 80;
server_name files.example.com;
location /webdav/ {
alias /data/webdav/;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
create_full_put_path on;
dav_access user:rw group:r all:r;
auth_basic "WebDAV Login";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
创建密码文件(需要 apache2-utils 或 httpd-tools):
htpasswd -c /etc/nginx/.htpasswd alice
客户端访问方式:
• Linux:mount -t davfs http://server/webdav/ /mnt/webdav/
• Windows:在资源管理器"添加网络位置"中输入 http://server/webdav/
• macOS:Finder → 连接服务器 → 输入地址
⚠️ 安全提醒:WebDAV走HTTP明文传输,生产环境务必配合HTTPS使用。用 certbot 申请一个免费证书,Nginx配置里 listen 443 ssl 就好了。
六、rsync:增量同步的神器
严格来说,rsync不是一个"实时共享"方案,而是一个"文件同步"工具。但它的地位太重要了,任何一个运维人员的工具箱里都该有它。核心能力就四个字:增量传输。
假设你有一个50GB的项目目录,第一次同步需要传输全部50GB。第二天你只改了3个文件,总共10MB——rsync只会传输这10MB,而不是重新传50GB。这就是 rsync 算法的厉害之处:它通过比较文件的差异块,只传输变化的部分。
常用场景与命令
场景1:本地目录备份
rsync -avz --delete /data/webapp/ /backup/webapp/
场景2:远程服务器同步(走SSH)
rsync -avz -e ssh /data/ user@backup-server:/data/backup/
场景3:从远程服务器拉取数据
rsync -avz user@server:/data/reports/ /local/reports/
几个核心参数解释一下:
• -a:归档模式,等价于 -rlptgoD,保留递归、链接、权限、时间戳、属组、属主、设备文件
• -v:详细输出,告诉你传输了哪些文件
• -z:传输时压缩,减少网络带宽占用
• --delete:删除目标端多余的文件,让两边完全镜像。慎用!如果源端误删了文件,目标端也会跟着删
• -e ssh:指定使用SSH作为传输通道,加密传输
⚠️ 重要细节:源目录路径末尾有没有斜杠 /,含义完全不同。/data/webapp/(带斜杠)表示同步目录内的内容到目标;/data/webapp(不带斜杠)表示把webapp整个目录同步到目标下。这个坑我踩过,第一次用的时候同步出来的目录结构套了两层,排查了半天。
如果想定时自动同步,把rsync命令写到 crontab 里就行:
# 每天凌晨2点执行同步
0 2 * * * rsync -avz --delete /data/ backup@192.168.1.200:/backup/
七、iSCSI:把远程磁盘当本地硬盘用
前面6种方式共享的都是"文件"(File Level),而iSCSI共享的是"块设备"(Block Level)。这两者的区别在于:文件级共享是在操作系统层面共享目录和文件;块级共享则是把远端的一块磁盘直接"映射"到本地,本地系统拿到的是一个裸磁盘设备,可以格式化、分区、建文件系统,就跟本地插了一块新硬盘一模一样。
适用场景:虚拟机需要额外磁盘空间、数据库需要独立的存储空间、或者需要跨服务器共享一个块设备。
1. 服务端配置(Target)
安装 targetcli 工具:
yum install -y targetcli
用 targetcli 交互式命令行配置:
targetcli
/> backstores/block create disk01 /dev/sdb1
/> iscsi/ create iqn.2026-01.com.example:server01
/> iscsi/iqn.2026.../tpg1/luns create /backstores/block/disk01
/> iscsi/iqn.2026.../tpg1/acls create iqn.2026-01.com.example:client01
/> saveconfig
/> exit
这里 iqn 是 iSCSI Qualified Name 的缩写,格式是 iqn.年-月.域名反转:标识符,需要全球唯一。
2. 客户端配置(Initiator)
yum install -y iscsi-initiator-utils
iscsiadm -m discovery -t st -p 192.168.1.100
iscsiadm -m node -T iqn.2026-01.com.example:server01 -l
登录成功后,用 lsblk 就能看到一块新的磁盘设备(比如 /dev/sdc),然后就可以分区、格式化、挂载了:
mkfs.ext4 /dev/sdc1
mount /dev/sdc1 /mnt/iscsi
⚠️ 注意事项:iSCSI是块级共享,同一块磁盘不建议被多个客户端同时挂载和写入——会导致文件系统损坏。如果需要多客户端并发读写,应该配合集群文件系统(如 GFS2、OCFS2)使用。
八、7种方式横向对比:到底该选哪个?
讲了这么多,你可能还是有点晕。别急,我用最直白的方式帮你总结一下:
• Linux对Linux的文件共享:首选 NFS,简单高效
• 让Windows访问Linux文件:用 Samba,无缝兼容
• 临时传个文件:SFTP最方便,零配置,SSH自带
• 需要加密的文件传输:SFTP 或 rsync -e ssh
• 定时备份/镜像目录:rsync,增量同步省带宽
• 需要穿透防火墙、通过HTTP访问:WebDAV
• 需要像本地磁盘一样用远程存储:iSCSI
• 纯FTP:不推荐,除非是老系统兼容性要求
我自己的经验是:日常工作里 80% 的场景用 NFS + SFTP 就搞定了。Samba 是给Windows用户准备的,rsync 是做备份和同步的。WebDAV 和 iSCSI 算是特定场景的专精工具,用到了再查也不迟。
写在最后
文件共享这东西,看着简单,但真正在生产环境里用好,还是有很多细节要注意的。比如NFS的 no_root_squash 开不开、Samba的SELinux放行、SFTP的Chroot目录权限、rsync的斜杠陷阱——这些坑我都踩过,写在这篇里就是希望大家少走弯路。
下一期想写点什么?可以在后台留言告诉我。如果觉得这篇对你有帮助,转发给你身边做运维的朋友,大家一起少踩坑。