阶段六:共享文件目录与NTP服务

1. NFS共享文件和目录

1.1 NFS基本介绍

CentOS Stream 9中的NFS(网络文件系统)是一种允许不同计算机通过网络共享文件和目录的协议,使得远程主机能够像本地磁盘一样访问和操作文件。

它基于客户端-服务器架构,NFS服务器将本地文件系统共享给客户端,客户端可以通过网络挂载这些共享目录,像访问本地文件一样进行操作。

NFS主要应用于Linux/Unix系统之间的文件共享,虽然也支持跨操作系统,但其兼容性一般较差

image

1.2 NFS相关配置

需求:在 node2服务器中的根目录下,有一个/export/software目录,该目录下存储了大量的软件包,由于各个服务器都需要解压使用,为了节省空间,需要将此目录共享出来,提供给各个服务器进行使用,同时也方便各个服务器放置共享的安装包

服务器规划:

node2 作为 NFS服务端

node1 作为客户端,获取共享目录信息

1.2.1 安装NFS服务器

客户端安装:
dnf install nfs-utils

服务端安装:
dnf install nfs-utils

注意事项:

执行开放端口:
firewall-cmd --add-service=nfs --permanent  # 核心, 有了这个, NFS即可使用共享操作
firewall-cmd --reload

注意事项:

1.2.2 在node2创建共享目录

第一步:创建需要共享的目录
mkdir -p /export/software

第二步:NFS中设置指定需要共享的目录
vi  /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

注意事项:

1.2.4 验证是否成功共享

服务端执行: 查看服务端NFS共享信息
showmount -e   (早期版本兼容)

exportfs

注意事项:

1.2.5 挂载使用

node1执行: 创建挂载目录
mkdir -p /export/software  (一定是一个空目录, 以免挂载后,将不显示原有磁盘的内容)

执行挂载操作:临时挂载, 后续磁盘管理学习完成后,可以尝试永久挂载
mount -t nfs 192.168.88.102:/export/software /export/software

执行后,可以通过df -h 的方式查看是否挂载成功

注意事项:

node2执行:
echo 'DNS Hello' >> /export/software/a.txt

node1查看:

注意事项:

node1执行:
echo 'DNS Hello2' >> /export/software/b.txt

node2查看:

注意事项:

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 动态查询端口,直接与服务端通信。

注意事项:

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

注意事项:

2.2.1 创建共享目录

mkdir -p /sambda/share

注意事项:

2.2.2 修改配置文件

配置文件所在位置:/etc/samba/smb.conf

配置文件内容说明:

[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  
   设置目录的权限掩码,允许目录的所有者和所属组具有读、写、执行权限,其他用户只有读、执行权限。

注意事项:

vi /etc/samba/smb.conf

# 添加以下内容
[smbshare]
        comment = samba share
        path = /sambda/share
        read only = No

注意事项:

2.2.3 配置用户信息

创建一个本地用户, 添加到SMB服务中, 便于后续基于这个用户来访问

# 创建本地用户,并设置密码
useradd user01
passwd user01
密码为123456

# 基于本地用户创建smb用户
smbpasswd -a user01

# 验证用户是否添加成功
pdbedit -L

注意事项:

2.2.4 启动samba服务

systemctl enable nmb
systemctl enable smb

systemctl start nmb
systemctl start smb

验证是否启动:
systemctl status nmb
systemctl status smb

注意事项:

2.2.6 开启防火墙

firewall-cmd --add-service samba --permanent
firewall-cmd --reload
firewall-cmd --list-all

注意事项:

2.2.5 访问操作

2.2.5.1 在Linux主机访问

node1执行:

如果是第一次使用smb客户端,需要先安装:
# 查看是否存在smb客户端
rpm -qa | grep samba

注意事项:

dnf -y install samba-client

注意事项:

smbclient -L 192.168.88.102 -U user01

注意事项:

smbclient //192.168.88.102/smbshare -U user01

进入共享目录, 输入 ?  可以查看支持的命令
image

注意一个前提:操作用户对该目录一定要有权限

建议: 可以直接将共享目录的所属用户更改为SAMBA的登录用户即可

注意事项:

2.2.5.2 在windows主机访问

image
image
image

2.2.5.3 在windows中基于添加网络位置【挂载】

image
image
image
image
image
image
image

添加成功后, 即可访问该位置, 后续的操作就类似于访问一个本地的文件系统操作

注意一个前提:操作用户对该目录一定要有权限

3. NTP时间同步服务

3.1 什么是NTP

NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。

在机房中,各个服务器的时间务必要保持一致,同时也要和实际的时间保持一致

保持一致性的必要性原因:

1: 保证分布式系统的一致性: 多个服务器需要协同工作。如果时间不同步,可能导致:
        日志时间线混乱,难以排查问题。
        数据写入顺序错误,影响数据一致性

2: 保障安全性:时间同步对服务器安全机制至关重要:
        认证和加密:许多安全协议(如 TLS/SSL、Kerberos)依赖精确的时间戳来验证会话有效性。如果时间不同步,认证可能失败。
        防止重放攻击:时间戳是防止数据包重放的重要依据,时间不一致会导致安全漏洞。

3: 日志管理和故障排查
        日志对比: 在多台服务器上排查问题时,需要通过日志时间线分析故障原因。如果时间不同步,日志无法对齐,排查问题变得困难。
        事件追踪: 跟踪用户行为、事务处理等需要精确的时间戳。

....

注意事项:

3.2 NTP同步服务器原理

获取系统时间的基本命令:

date

注意事项:

date +"%F"                年月日
date +"%T"                时分秒
date +"%F %T"             年月日 时分秒
# 其他格式,如%Y年,%m月,%d日,%H时,%M分,%S秒
# 例如: date  +"%Y-%m-%d %H:%M:%S"
# 输出: 2024-12-26 14:49:31

注意事项:

3.3 获取国内最稳定的NTP服务器

到哪里去找NTP服务器?答:可以通过NTP授时网站:http://www.ntp.org.cn/

image

如何查看当前我们的服务器采用的那个NTP服务器来完成的同步呢?

查看当前正在使用的时间源: chronyc sources

注意事项:

MS:显示时间源的同步状态:
    +:表示候选的时间源
    *:表示当前服务器正在使用的时间源
    -:表示时间源可用,但未被选中
    ?:表示无法与时间源通信或时间源无效
Name/IP address: 显示时间源的域名或 IP 地址,例如 time.neu.edu.cn

Stratum:显示时间源的层级:
    层级 1 表示直接连接到原子时钟的服务器
    层级 2 表示从层级 1 的服务器同步,依此类推

Poll:显示时间同步的轮询间隔,以秒为单位的指数(如 6 表示 2^6 = 64 秒轮询一次)

Reach:表示与时间源的通信状态,8 位二进制值(显示为八进制)
        377 表示最近的 8 次尝试均成功(满分状态),值越低表示通信失败次数越多

LastRx:显示上一次从该时间源接收数据的时间(以秒为单位)

Last sample: 显示上一次时间样本的偏差值(单位为微秒 us 或毫秒 ms),格式为 [偏差] +/- [精度] 方括号中的值是未经校正的时间偏差

注意事项:

chronyc tracking

结果为:
Reference ID    : CA760151 (time.neu.edu.cn)  这是系统当前正在同步的时间源的标识符。

Stratum         : 3 表示时间源的层级

Ref time (UTC)  : Tue Dec 24 16:30:58 2024  这是当前时间源提供的参考时间(UTC,协调世界时)。表示 time.neu.edu.cn 服务器最后一次更新时间的时刻

System time     : 0.000350876 seconds fast of NTP time  表示当前系统时间与 NTP 时间之间的偏差。这个值表示系统时间比 NTP 时间快了 0.000350876 秒。

Last offset     : +0.000258952 seconds  上一次时间同步时的偏差,表示系统时钟与 NTP 服务器时间的差值。此值为正,意味着系统时间在上次同步时比 NTP 时间快了 0.000258952 秒

RMS offset      : 0.001568094 seconds RMS (Root Mean Square) 偏差,表示系统时钟与 NTP 服务器时间之间的平均偏差。该值越小,表示时间同步越准确。

Frequency       : 8.446 ppm fast  频率偏差,表示系统时钟的增速或减速。ppm 是 "每百万分之一"(parts per million)的单位。

Residual freq   : +0.031 ppm 剩余频率偏差,表示调整后系统时钟的频率偏差。+0.031 ppm 表示系统时钟仍然比 NTP 时间快 0.031 个百万分之一。

Skew            : 1.666 ppm 时钟偏差的变化率,即时钟偏差变化的速率。如果这个值较大,表示系统时钟的频率不稳定,可能需要更频繁地进行同步。

Root delay      : 0.023006978 seconds 根延迟,指从本地系统到时间源服务器的网络延迟。0.023 秒表示从本机到 time.neu.edu.cn 服务器的往返延迟。

Root dispersion : 0.000833949 seconds 根扩散,表示时间源的不确定性,指的是时间源本身的误差范围。这个值越小,表示时间源的精度越高。

Update interval : 129.9 seconds 更新时间间隔,表示系统每次同步时间的间隔。129.9 秒表示大约每 2 分钟同步一次。

Leap status     : Normal 跳秒状态,表示当前是否有跳秒调整。Normal 表示没有发生跳秒调整。

注意事项:

3.4 chrony时间同步服务

Chrony 是一个高效的时间同步服务,主要用于在 Linux 系统中通过网络时间协议 (NTP) 进行时间同步。

特点:

3.4.1 安装与基本配置

Chrony 通常默认安装在 CentOS Stream 9 上。如果未安装,可以通过以下命令安装:

dnf install chrony -y

注意事项:

systemctl start  chronyd
systemctl enable  chronyd

查看状态: systemctl status  chronyd

注意事项:

vim /etc/chrony.conf

默认内容如下:
# 配置 chronyd 使用 pool.ntp.org 提供的公共时间源进行同步
# pool:使用多个时间源进行负载均衡。
# iburst:当服务器不可达时,发送 4 个快速请求包以加速连接。
pool 2.centos.pool.ntp.org iburst

# 从 DHCP 服务中动态获取 NTP 服务器地址,如果是静态网络可忽略
sourcedir /run/chrony-dhcp

# 记录系统时钟的频率偏差(增/减速),以便重启后快速调整。
driftfile /var/lib/chrony/drift

# 允许 chronyd 在系统启动的前 3 次同步中直接调整时间(如果时间偏差超过 1 秒)。
makestep 1.0 3

# 启用系统时钟与硬件时钟 (RTC) 的自动同步。
rtcsync

# 启用支持硬件时间戳的网络接口。注释掉,通常用于高精度时间同步场景(如金融行业)。
#hwtimestamp *

# 设置最少需要的时间源数量。
# 默认状态:注释掉,chronyd 自动选择。
#minsources 2

# 允许指定 IP 段的设备访问本机时间服务。默认不支持
#allow 192.168.0.0/16

# 允许本机在没有时间源时,充当时间服务器(Stratum 10)。一般注释掉
#local stratum 10

# 启用 NTP 数据包的认证功能。 注释掉,如使用,需生成密钥文件 /etc/chrony.keys。
#authselectmode require
keyfile /etc/chrony.keys

# 用于指定存储 NTS(Network Time Security)密钥和 cookie 的目录。
ntsdumpdir /var/lib/chrony

# 通过调整时间速度而非直接跳秒的方式插入/删除闰秒。
#leapsecmode slew

# 从系统时区数据库中获取闰秒和 TAI-UTC 偏移信息。
leapsectz right/UTC

# 指定 Chrony 的日志存储路径。
logdir /var/log/chrony
# 启用更多日志 如果需要记录时间同步详细信息,可取消注释以下选项
#log measurements statistics tracking

注意事项:

3.4.2 实施配置操作

需求如下: 基于原有的node1服务器

1- 完成调整公共时间源, 使用 中国国家授时中心时间服务器 阿里云和腾讯云提供的统一ntp服务
ntp.org.cn(中国国家授时中心时间服务器)
ntp.aliyun.com(阿里云NTP时间服务器)
ntp.tencent.com(腾讯云NTP时间服务器)

2- 开启允许局域网访问, 统一为 192.168.88.0/24 开放

3- 启用详细日志

4- 打开 硬件时钟同步

5- 让node2连接node1完成时间同步

注意事项:

vim /etc/chrony.conf

修改以下内容:
# 注释掉原有的pool 新增三个pool (文件头部)
# pool 2.centos.pool.ntp.org iburst
pool ntp.org.cn iburst
pool ntp.aliyun.com iburst
pool ntp.tencent.com iburst

# 新增(第31行范围)
allow 192.168.88.0/24

# 新增(最后一行)
log measurements statistics tracking

注意事项:

systemctl restart chronyd
systemctl status chronyd

注意事项:

firewall-cmd --add-service=ntp --permanent
firewall-cmd --reload

firewall-cmd --list-all

注意事项:

vim /etc/chrony.conf

修改以下内容:
# 注释掉原有的pool 新增一个pool (文件头部)
# pool 2.centos.pool.ntp.org iburst
pool 192.168.88.101 iburst

:x 保存退出

注意事项:

systemctl restart chronyd
systemctl status chronyd

注意事项:

chronyc sources

注意事项:

4. 【作业】跨平台文件共享与自动化备份管理

先清空所有内容:

node1执行:
    dnf -y remove nfs-utils
    dnf -y remove samba-client
    dnf clean all
    rm -rf nfs.conf exports* /export/software 

node2执行:
    dnf -y remove nfs-utils
    dnf -y remove samba
    dnf clean all
    rm -rf nfs.conf /etc/samba exports* /export/software /sambda/share

命令作用:

执行结果:

关键参数:

注意事项:

它基于客户端-服务器架构,NFS服务器将本地文件系统共享给客户端,客户端可以通过网络挂载这些共享目录,像访问本地文件一样进行操作。

NFS主要应用于Linux/Unix系统之间的文件共享,虽然也支持跨操作系统,但其兼容性一般较差

image

服务器规划:

客户端安装:

服务端安装:


**注意事项:**

执行开放端口:

注意事项:

第一步:创建需要共享的目录

第二步:NFS中设置指定需要共享的目录

添加以下内容:

参数说明:

192.168.0.0/24:代表共享给某个网段 192.168.0.254:共享给某个IP *.itcast.cn:代表共享给某个域下的所有主机


**注意事项:**

注意事项:


**注意事项:**



注意事项:

node2执行:

node1查看:


**注意事项:**

node1执行:

node2查看:

注意事项:

动态端口管理:

客户端与服务端的通信流程:


**注意事项:**


补充说明

注意事项:

需求:

本文由飞书云文档同步生成。涉及命令、SQL、配置示例时,请以飞书源文档和实际环境执行结果为准。