
摘要
在 Linux 服务器使用过程中,经常会遇到文件传输和文件共享的问题。比如开发人员需要把代码上传到服务器,Windows 用户需要访问 Linux 服务器上的共享文件,多台 Linux 服务器需要使用同一份目录。
Linux 中常见的解决方式有 FTP、Samba 和 NFS。FTP 主要用于客户端和服务器之间的文件上传、下载;Samba 主要解决 Windows 和 Linux 之间的文件共享;NFS 则主要用于 Linux 服务器之间共享目录。
这三个服务使用场景不同,实际配置时都需要考虑服务启动、目录权限、防火墙以及客户端测试等问题。
引言
在实际的 Linux 运维环境中,文件共享是比较常见的一项工作。
FTP 使用起来比较直接,客户端连接服务器后就可以上传和下载文件。Linux 中常用的 FTP 服务软件是 vsftpd。
如果公司的员工主要使用 Windows,那么 Samba 会更加方便。配置好 Samba 后,Windows 用户可以直接通过文件资源管理器访问 Linux 服务器上的共享目录。
NFS 则更适合 Linux 服务器之间使用。客户端把服务器上的目录挂载到本地之后,就可以像操作本地目录一样使用远程文件。
所以学习这三个服务时,重点不是单独记命令,而是先搞清楚它们分别解决什么问题。
FTP文件传输
FTP基本概念
FTP 是 File Transfer Protocol,也就是文件传输协议,主要用于客户端和服务器之间传输文件。
常见用途包括:
程序代码上传、下载
企业内部文件分发
FTP 属于应用层协议,经典情况下:
21端口:控制连接
20端口:数据连接
FTP 有主动模式和被动模式。
主动模式下,客户端连接服务器 21 端口后,服务器通过 20 端口主动连接客户端的数据端口。
被动模式下,客户端先连接服务器 21 端口,服务器提供一个临时端口,然后由客户端主动连接这个端口进行数据传输。
实际使用中,被动模式更容易通过客户端防火墙。
FTP服务软件
Linux 中常见的 FTP 服务软件有:
vsftpd
proftpd
pure-ftpd
其中 vsftpd 使用比较广泛,默认安全性也比较高。
FTP服务器搭建
安装和启动
安装:
dnf install -y vsftpd
检查:
rpm -qa | grep vsftpd
启动:
systemctl start vsftpd
查看服务:
systemctl status vsftpd –no-pager
检查 21 端口:
ss -tunpl | grep 21
防火墙放行:
firewall-cmd –permanent –add-service=ftp
firewall-cmd –reload
配置FTP
先备份配置:
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
编辑:
vi /etc/vsftpd/vsftpd.conf
主要配置:
local_enable=YES
write_enable=YES
chroot_local_user=YES
local_root=/data/ftpdata
这里:
local_enable=YES
允许 Linux 本地用户登录。
write_enable=YES
允许执行写入操作,例如上传文件。
chroot_local_user=YES
限制用户访问范围。
local_root=/data/ftpdata
指定 FTP 用户登录后的根目录。
创建目录:
mkdir -p /data/ftpdata/public
创建用户:
useradd ftpuser1
useradd ftpuser2
echo 'ftpuser1:123' | chpasswd
echo 'ftpuser2:123' | chpasswd
创建用户私有目录:
mkdir -p /data/ftpdata/data1
mkdir -p /data/ftpdata/data2
设置权限:
chown ftpuser1 /data/ftpdata/data1
chmod o= /data/ftpdata/data1
chown ftpuser2 /data/ftpdata/data2
chmod o= /data/ftpdata/data2
公共目录可以设置:
chmod 1777 /data/ftpdata/public
修改完成后重启:
systemctl restart vsftpd
FTP客户端测试
node2 安装:
dnf install -y lftp
连接:
lftp ftp://ftpuser1:123@node1
常用命令:
ls 查看目录
cd 切换目录
get 下载文件
put 上传文件
bye 退出
代码解释
FTP 的配置可以简单理解成三部分:
vsftpd
↓
控制用户能不能登录
↓
控制用户能不能上传
↓
控制用户只能访问哪个目录
如果出现 550 错误,一般需要重点检查当前用户对文件或者目录有没有操作权限。
Samba文件共享
Samba是什么
Samba 是 Linux/Unix 和 Windows 之间进行文件共享的软件。
它使用 SMB/CIFS 协议,让 Windows 可以像访问普通共享文件夹一样访问 Linux 服务器。
例如 Windows 中直接输入:
\\\\192.168.88.128
就可以访问 Samba 服务器。
Samba服务搭建
安装Samba
dnf install -y samba
创建共享目录:
mkdir -p /data/smbshare
创建 Linux 用户:
useradd smbuser -s /sbin/nologin
修改目录所属:
chown smbuser:smbuser -R /data/smbshare
创建 Samba 用户:
smbpasswd -a smbuser
查看:
pdbedit -L
配置Samba
配置文件:
/etc/samba/smb.conf
先备份:
cp /etc/samba/smb.conf smb.conf.bak
增加:
[datashare]
comment = samba share
path = /data/smbshare
read only = No
这里:
[datashare]
表示共享名称。
path = /data/smbshare
表示 Linux 上真正共享的目录。
read only = No
表示允许写入。
防火墙和服务
放行:
firewall-cmd –permanent –add-service=samba
firewall-cmd –reload
启动:
systemctl start nmb
systemctl start smb
Windows访问
Windows 文件资源管理器地址栏输入:
\\\\192.168.88.128
输入 Samba 用户:
smbuser
然后输入设置好的 Samba 密码。
Linux客户端访问
node2 安装:
dnf install -y samba-client
连接:
smbclient //node1/datashare -U smbuser
进入后可以使用:
ls 查看文件
cd 切换目录
get 下载
put 上传
quit 退出
代码解释
Samba 可以理解成一个中间层:
Windows
↓
SMB/CIFS
↓
Samba
↓
Linux文件系统
↓
/data/smbshare
Windows 用户不需要直接操作 Linux 命令,只需要访问共享路径即可。
NFS目录共享
NFS基本介绍
NFS 是 Network File System,也就是网络文件系统。
它主要用于不同 Linux 主机之间共享文件和目录。
常见使用场景:
Linux服务器之间共享文件
多台服务器访问同一份数据
集中化存储
虚拟化、容器环境共享存储
NFS 通常使用 TCP/UDP 2049 端口,并配合 RPC 使用。
NFS工作原理
基本过程可以理解为:
NFS客户端
↓
发送挂载请求
↓
NFS服务器
↓
RPC提供相关服务信息
↓
客户端挂载共享目录
挂载完成后,客户端就可以像使用本地目录一样使用 NFS 目录。
NFS服务器配置
安装
node1:
dnf install -y nfs-utils
创建目录:
mkdir -p /data/web
备份:
cp /etc/exports /etc/exports.bak
编辑:
vi /etc/exports
例如:
/data/web 192.168.88.0/24(rw,sync,root_squash)
配置解释
/data/web
表示需要共享的目录。
192.168.88.0/24
表示允许这个网段的客户端访问。
rw
读写。
ro
只读。
sync
同步写入,相对安全。
async
异步写入,速度更快,但存在数据风险。
root_squash
客户端 root 权限进行映射,安全性更高。
启动服务
systemctl restart nfs-server
systemctl enable nfs-server
检查:
systemctl status nfs-server –no-pager
检查端口:
ss -tunpl | grep 2049
ss -tunpl | grep 111
防火墙:
firewall-cmd –permanent –add-service=nfs
firewall-cmd –permanent –add-service=rpc-bind
firewall-cmd –permanent –add-service=mountd
firewall-cmd –reload
NFS客户端挂载
查看共享目录
node2 安装:
dnf install -y nfs-utils
查看:
showmount -e node1
如果看到:
/data/web 192.168.88.0/24
说明服务器已经导出了这个目录。
挂载使用
创建挂载点:
mkdir -p /data/web
执行:
mount -t nfs node1:/data/web /data/web
查看:
df -h
如果出现:
node1:/data/web
说明挂载成功。
卸载:
umount /data/web
如果出现:
device is busy
通常是当前终端还在这个目录中。
先:
cd /
然后再次:
umount /data/web
如果还是无法卸载,可以检查哪个进程正在使用:
lsof /data/web
实际应用场景
场景一:开发人员上传代码
开发人员完成代码后,可以通过 FTP 上传到服务器。
例如:
hello.java
index.html
test.py
使用:
lftp ftp://ftpuser1:123@node1
进入目录:
cd public
上传:
put hello.java
这种方式适合做简单的文件上传和下载。
场景二:Windows访问Linux共享文件
公司员工使用 Windows,Linux 服务器上保存公共资料。
Linux:
/data/smbshare
Windows:
\\\\192.168.88.128\\datashare
员工登录 Samba 后,就可以直接查看、上传和下载文件。
这种场景使用 Samba 比较方便。
场景三:多台Linux服务器共享目录
例如 node1 上有:
/data/web
node2 需要使用这份数据。
node1 配置:
/data/web 192.168.88.0/24(rw,sync,root_squash)
node2:
mount -t nfs node1:/data/web /data/web
挂载以后,node2 就可以直接使用:
cd /data/web
ls
这种方式适合多台 Linux 主机共享同一份目录。
QA环节
Q1:FTP、Samba、NFS怎么区分?
简单记:
FTP → 文件上传下载
Samba → Windows和Linux文件共享
NFS → Linux和Linux目录共享
Q2:FTP可以登录,但是上传不了怎么办?
重点检查:
ls -ld /data/ftpdata/public
以及:
grep write_enable /etc/vsftpd/vsftpd.conf
主要看目录权限和 FTP 写权限。
Q3:Samba访问不了怎么办?
按照这个顺序检查:
smb服务
↓
防火墙
↓
Samba用户
↓
smb.conf配置
↓
Linux目录权限
Q4:NFS挂载出现access denied怎么办?
先检查:
cat /etc/exports
showmount -e node1
重点看客户端 IP 或网段有没有被允许。
Q5:NFS卸载提示device is busy怎么办?
先退出挂载目录:
cd /
然后:
umount /data/web
如果仍然失败,再检查:
lsof /data/web
总结
FTP、Samba 和 NFS 都可以用来解决文件共享问题,但是使用方式不同。
FTP主要解决文件上传和下载,常见的服务软件是 vsftpd。
Samba主要解决 Windows 和 Linux 之间的文件共享,Windows 用户可以直接通过共享路径访问 Linux 文件。
NFS主要解决 Linux 主机之间的目录共享,客户端通过 mount 把远程目录挂载到本地。
实际配置的时候,可以按照:
安装服务
↓
修改配置
↓
创建目录和用户
↓
配置权限
↓
配置防火墙
↓
启动服务
↓
客户端测试
↓
根据报错排查
这个流程来操作。
把这三个服务真正配置一遍之后,基本就能理解 Linux 中常见的文件传输和共享方式了。




