系统运维Day04_共享文件和目录服务
1. NFS共享文件和目录
1.1 NFS基本介绍
CentOS Stream 9中的NFS(网络文件系统)是一种允许不同计算机通过网络共享文件和目录的协议,使得远程主机能够像本地磁盘一样访问和操作文件。
它基于客户端-服务器架构,NFS服务器将本地文件系统共享给客户端,客户端可以通过网络挂载这些共享目录,像访问本地文件一样进行操作。
NFS主要应用于Linux/Unix系统之间的文件共享,虽然也支持跨操作系统,但其兼容性一般较差。
1.2 NFS相关配置
需求:在 node2服务器中的根目录下,有一个/export/software目录,该目录下存储了大量的软件包,由于各个服务器都需要解压使用,为了节省空间,需要将此目录共享出来,提供给各个服务器进行使用,同时也方便各个服务器放置共享的安装包。
服务器规划:
node2 作为 NFS服务端
node1 作为客户端,获取共享目录信息
1.2.1 安装NFS服务器
# 客户端安装: dnf install nfs-utils -y# 服务端安装: dnf install nfs-utils -y注意说明:
# 执行开放端口: firewall-cmd --add-service=nfs --permanent # 核心, 有了这个, NFS即可使用共享操作 firewall-cmd --reload
1.2.2 在node2创建共享目录
# 第一步:创建需要共享的目录 mkdir -p /export/software# 第二步:NFS中设置指定需要共享的目录 vim /etc/exports# 添加以下内容: /export/software *(rw,sync,no_root_squash)参数说明:
/export/software : 这是要共享的目录路径,意味着 NFS 服务器将 /export/software 这个目录导出,允许客户端访问
* : 表示所有客户端都可以访问这个共享目录。它相当于一个通配符,代表任何 IP 地址或主机名。通常,* 用于允许整个网络中的所有主机访问此共享。也可以指定特定的 IP 地址或子网来限制访问权限,比如 192.168.1.0/24
192.168.0.0/24:代表共享给某个网段
192.168.0.0/24 192.168.1.0/24 :代表共享给不同网段,表示给192.168.0网段和192.168.1网段共享
192.168.0.254:共享给某个IP
*.itcast.cn:代表共享给某个域下的所有主机
rw : 表示客户端可以对共享目录进行读写操作,若没有指定 rw,默认是只读权限 (ro)
sync : 表示 NFS 服务器会同步写入数据,即客户端写入的数据必须被立即写入到磁盘,才能认为是完成,如果选择async异步,先缓存在内存再同步磁盘
no_root_squash :
在 NFS 默认情况下,客户端的 root 用户(即 UID 0)会被“映射”到一个普通用户,这叫做 root squashing,目的是增强安全性,防止远程 root 用户拥有过高的权限。
使用 no_root_squash 选项时,NFS 服务器将不对客户端的 root 用户进行 UID 映射,意味着客户端的 root 用户可以直接访问共享目录中的所有文件,拥有与 NFS 服务器本地 root 用户相同的权限。
1.2.3 服务启动并设置开机自启
systemctl enable nfs-server systemctl start nfs-server systemctl status nfs-server
1.2.4 验证是否成功共享
# 服务端执行: 查看服务端NFS共享信息 (早期版本兼容) showmount -e exportfs
1.2.5 挂载使用
# node1执行: 创建挂载目录 mkdir -p /export/software # (一定是一个空目录, 以免挂载后,将不显示原有磁盘的内容)# 执行挂载操作: mount -t nfs 192.168.132.202:/export/software /export/software# 执行后,可以通过df -h 的方式查看是否挂载成功
测试: 可以尝试在服务端添加内容,才客户端是否可以查看到, 或在客户端添加内容, 在服务器中是否可以查看的到
- 在服务器添加一个测试文件
# node2执行: echo 'DNS Hello' >> /export/software/a.txt# node1查看: ll /export/software
- 在客户端添加一个测试文件
# node1执行: echo 'DNS Hello2' >> /export/software/b.txt# node2查看: ll /export/software
1.3 NFS工作原理【了解】
在NFS早期版本中, 负责数据传输工作,主要采用rpcbind工具, 其底层采用的就是RPC远程过程调用协议
RPC(Remote Procedure Call Protocol): 远程过程调用协议, 它是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议
当安装NFS的时候, 由于该服务依赖了很多其他的服务,主要包括:
rpcbind(RPC 服务绑定) TCP/UDP 111
nfs-server(NFS 服务) TCP 2049(NFS 主要端口)
mountd(NFS 挂载守护进程) 动态分配,通常是 20048/tcp 和 20048/udp
statd(NFS 锁定守护进程)动态分配,通常是 TCP/UDP 32765-32766
问题一: RPC与NFS如何通讯呢?
答:客户端要与服务端进行数据传输,必须知道服务端 NFS 的具体端口号。然而,在 NFS 服务的早期版本(如 NFSv3),NFS 服务的一些组件(如 mountd, nlockmgr 等)使用动态分配的端口,导致客户端无法直接确定端口号。为了协调这些动态端口,RPC 框架通过 rpcbind 服务(监听在固定端口 111)实现以下功能:
动态端口管理:
RPC 统一管理服务端各 NFS 服务组件(mountd、nfsd 等)的动态端口,并将这些端口信息记录在 rpcbind 中。
当客户端发起请求时,客户端首先与 rpcbind 通信,查询目标 NFS 服务对应的实际端口号。
客户端与服务端的通信流程:
客户端向服务端的 rpcbind 服务(监听端口 111)发送查询请求,指定目标服务(如 mountd)。
rpcbind 返回目标服务的实际端口号。
客户端随后通过查询到的端口与 NFS 的具体服务进行通信,完成挂载、文件读写等操作。
固定端口的引入(在 NFSv4 中):
NFSv4 对架构进行了简化,将所有功能整合在一个服务中,并固定使用 TCP 2049 端口。
客户端无需再依赖 rpcbind 动态查询端口,直接与服务端通信。问题二:RPC是如何指定NFS服务的端口的呢?
1. 首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口
2. RPC记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求
3. 客户端发送请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端
4. 客户端获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了
补充说明
在 NFSv4 中,整个机制变得更加简单:
所有 NFS 功能整合到一个服务上,并使用固定的 TCP 2049 端口。
不再需要 rpcbind 管理动态端口,客户端可以直接与服务端通信,无需额外的端口查询步骤。
2. SAMBA共享文件和目录
需求:
构建一个SAMBA服务,共享node2服务器中的 /sambda/share 目录,分别在Linux和Windows访问该共享目录
2.1 SAMBA基本介绍
Samba 是一个开源的软件套件,允许 Linux 或 Unix 系统与 Windows 系统进行文件和打印共享。它实现了 SMB(Server Message Block)协议和 CIFS(Common Internet File System),这两者是 Windows 操作系统用于文件共享和打印服务的主要协议。
Samba 使 Linux/Unix 系统和 Windows 系统之间的文件共享和打印服务变得简单,广泛应用于家庭、企业和跨平台环境中。
2.2 服务端安装SAMBA服务
# node2执行: dnf -y install samba
说明: SAMBA通常会有二个主要的服务,分别用于不同的目的
Samba SMB/CIFS 服务 (smb) : 是Samba提供的主要服务,用于实现 SMB (Server Message Block) 和 CIFS (Common Internet File System) 协议的文件共享和打印服务
Samba NetBIOS 名称解析服务 (nmb) : 是Samba中另一个重要的服务,用于提供NetBIOS名称解析服务,它使得Samba服务器可以通过NetBIOS名称(而非IP地址)来识别和访问,即将计算机名(例如 server)转换为IP地址,便于其他计算机通过名称访问,同时提供Samba服务器在局域网中显示的能力,使其在网络浏览器中可见。
2.2.1 创建共享目录
mkdir -p /sambda/share

2.2.2 修改配置文件
配置文件所在位置:/etc/samba/smb.conf
增加共享配置文件信息:
vim /etc/samba/smb.conf# 添加以下内容 [smbshare]comment = samba sharepath = /sambda/shareread only = No
配置文件内容说明:
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
[homes]
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes
[printers]
comment = All Printers
path = /var/tmp
printable = Yes
create mask = 0600
browseable = No
[print$]
comment = Printer Drivers
path = /var/lib/samba/drivers
write list = @printadmin root
force group = @printadmin
create mask = 0664
directory mask = 0775
说明:
[global]
[global]部分包含了Samba服务器的全局配置,影响到整个Samba服务的行为。
1. workgroup = SAMBA
设置Samba服务器所属的工作组名称。这里设置为"SAMBA",可以根据需要修改为其它工作组名。它与Windows工作组相对应。
2. security = user
设置Samba服务器的安全模式。`user`模式表示用户需要提供有效的用户名和密码才能访问共享资源。常见的安全模式还有`share`和`domain`。
3. passdb backend = tdbsam
指定密码数据库后端,`tdbsam`是默认的后端,用于存储用户的密码信息。
4. printing = cups
配置Samba与CUPS(Common UNIX Printing System)的集成,表示使用CUPS来管理打印服务。
5. printcap name = cups
设置Samba使用的打印配置文件的名称,这里指定为CUPS。
6. load printers = yes
启用打印机共享。设置为`yes`时,Samba会自动检测系统中安装的打印机并共享它们。
7. cups options = raw
指定CUPS打印机的选项。`raw`表示直接将打印数据发送到打印机,而不进行任何格式转换。
[homes]
[homes]部分配置了用户的家目录共享。
1. comment = Home Directories
提供共享的描述信息。这里标明该共享是用户的家目录。
2. valid users = %S, %D%w%S
限制访问该共享的用户。`%S`是当前用户的用户名,`%D`是域名,`%w`是工作组。该配置允许用户仅访问他们自己的家目录。
3. browseable = No
设置为`No`表示此共享不出现在网络浏览器中,不允许被列出。
4. read only = No
设置为`No`表示该共享可读写。
5. inherit acls = Yes
启用ACL(访问控制列表)继承,这意味着共享目录将继承父目录的ACL设置。
[printers]
[printers]部分配置了打印机共享。
1. comment = All Printers
提供共享的描述信息。这里标明该共享包含所有的打印机。
2. path = /var/tmp
指定打印文件的存储路径。`/var/tmp`是一个常见的临时目录,用于存储打印作业的文件。
3. printable = Yes
表示该共享是一个打印共享(即它代表一个打印机)。
4. create mask = 0600
设置新创建文件的权限掩码,这里设置为0600,意味着新文件只能由文件所有者读写。
5. browseable = No
设置为`No`表示此共享不会在网络浏览器中列出。
[print$]
[print$]部分配置了打印机驱动程序共享。
1. comment = Printer Drivers
提供共享的描述信息。这里标明该共享用于存储打印机驱动程序。
2. path = /var/lib/samba/drivers
指定存储打印机驱动程序的路径。`/var/lib/samba/drivers`是Samba存放打印机驱动程序的默认目录。
3. write list = @printadmin root
允许`@printadmin`组和`root`用户具有写权限,从而管理和上传打印机驱动程序。
4. force group = @printadmin
强制设置共享中文件的所属组为`@printadmin`组。
5. create mask = 0664
设置新创建文件的权限掩码,允许文件的所有者和所属组具有读写权限,而其他用户只有读权限。
6. directory mask = 0775
设置目录的权限掩码,允许目录的所有者和所属组具有读、写、执行权限,其他用户只有读、执行权限。
2.2.3 配置用户信息
创建一个本地用户, 添加到SMB服务中, 便于后续基于这个用户来访问
# 创建本地用户,并设置密码 useradd user01 echo 123 | passwd --stdin user01# 基于本地用户创建smb用户 smbpasswd -a user01# 验证用户是否添加成功 pdbedit -L
2.2.4 启动samba服务
systemctl enable nmb systemctl enable smbsystemctl start nmb systemctl start smb验证是否启动: systemctl status nmb systemctl status smb
2.2.5 开启防火墙
firewall-cmd --add-service samba --permanent firewall-cmd --reload firewall-cmd --list-all
2.2.6 访问操作
2.2.6.1 在Linnux主机访问
node1执行:
# 如果是第一次使用smb客户端,需要先安装: # 查看是否存在smb客户端 rpm -qa | grep samba
没有安装执行下面命令:
dnf -y install samba-client
查看sambda服务共享资源:
smbclient -L 192.168.132.202 -U user01
访问共享目录:
smbclient //192.168.132.202/smbshare -U user01# 进入共享目录, 输入 ? 可以查看支持的命令
注意一个前提:操作用户对该目录一定要有权限
建议: 可以直接将共享目录的所属用户更改为SAMBA的登录用户即可
2.2.6.2 在windows主机访问


用户名:user01
密码:123
2.2.6.3 在windows中基于添加网络位置【挂载】







添加成功后, 即可访问该位置, 后续的操作就类似于访问一个本地的文件系统操作
注意一个前提:操作用户对该目录一定要有权限
3. 清空操作
node1执行:
dnf -y remove nfs-utils dnf -y remove samba-client dnf clean all rm -rf nfs.conf exports* /export/softwarenode2执行:
dnf -y remove nfs-utils dnf -y remove samba dnf clean all rm -rf nfs.conf /etc/samba exports* /export/software /sambda/share
【综合】跨平台文件共享与自动化备份管理
公司多个服务器需要进行文件共享、日志管理和定期备份。具体需求如下:
- 文件共享: 服务器间需要共享安装包、配置文件,避免重复存储和传输。
- 共享目录:
- 安装包: /export/software
- 配置文件: /export/properties
- 跨平台共享: Linux 服务器与 Windows 客户端需要共享特定目录。
- 特定共享目录: /export/software
- 日志管理: 所有服务器的日志文件需集中到一个目录进行查看和管理。
- 日志目录: /var/log
- 备份与同步: 需要确保文件数据和日志定期同步到备份服务器。
- 定时同步: 每日凌晨2点同步各个服务器的日志目录/var/log
- 实时同步: 实时同步/export/properties
- 目的地路径: 实时同步路径地址/all_server_data_log/data 、日志同步路径地址 /all_server_data_log/log/node1、 日志同步路径地址/all_server_data_log/log/node2
系统架构
- node1 和 node2 为 Linux 服务器,分别用作客户端和 共享服务器。
- node3 作为备份服务器,负责所有文件和日志的备份。
- node1、node2、node3三个服务器SSH免密
- Windows 10/11 客户端,通过 Samba 访问 Linux 共享目录,请在windwos中添加远程网络位置【可选】。















