声明:本文仅作学习交流使用,引用需标明出处。

如有谬误,敬请指正

本次内容围绕Linux运维核心技能scp远程拷贝、源码编译安装、rsync同步、inotify+rsync实时同步展开,实验基于两台互通虚拟机(client:192.168.8.100/24、server:192.168.8.101/24),所有操作均要求关闭firewalld服务、将SELinux设为disabled

一、scp远程拷贝

1. 核心概述

scp是Linux下基于SSH协议的安全远程复制命令scp = ssh + cp),支持本地与远程主机间加密传输文件或目录;继承SSH特性,支持口令认证(输入密码)和无密码认证(SSH密钥);
核心选项

  • -r:递归拷贝,拷贝目录时必须使用
  • -P(大写):指定远程服务器SSH端口号(默认22可省略)。

我们注意到ssh指定接口使用的是-p,scp是-P,为什么会有这个区别?
ssh 的 -p = port(端口) scp 已经把小写 -p用来表示保留文件权限了,所以端口只能用大写 -P用来加以区分

scpscp的特性和cp基本一致:

  • 可同时拷贝多个数据
  • 最后一个参数必须是目标目录
  • 若scp同名文件,默认覆盖且不会有提示
  • 支持通配符 ‘?‘和’*’
  • scp也可以拷贝重命名
  • scp命令拷贝完自动退出远程连接状态

2. 实验环境准备(client+server主机均执行)与scp的使用方法

(1)client主机配置
[root@localhost ~]# hostnamectl set-hostname client    #配置主机名(退出窗口重新进入生效)
[root@client ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.8.100/24 connection.autoconnect yes 
[root@client ~]# nmcli connection up ens160 
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@client ~]# ifconfig ens160 | head -2
[root@client ~]# systemctl disable firewalld        #关闭firewalld服务开机自启
[root@client ~]# systemctl stop firewalld           #停止firewalld服务
[root@client ~]# vim /etc/selinux/config            #修改SElinux配置文件
# 配置文件中修改:SELINUX=disabled                                   
[root@client ~]# reboot                             #重启操作系统,使SELinux配置生效
[root@client ~]# getenforce                         #查看SELinux状态,确保为disabled状态
[root@client ~]# systemctl status firewalld         #查看firewalld状态,确保为停止状态
(2)server主机配置
[root@localhost ~]# hostnamectl set-hostname server    #配置主机名(退出窗口重新进入生效)
[root@server ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.8.101/24 connection.autoconnect yes 
[root@server ~]# nmcli connection up ens160 
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@server ~]# ifconfig ens160 | head -2
[root@server ~]# systemctl disable firewalld        #关闭firewalld服务开机自启
[root@server ~]# systemctl stop firewalld           #停止firewalld服务
[root@server ~]# vim /etc/selinux/config            #修改SElinux配置文件
# 配置文件中修改:SELINUX=disabled                                    
[root@server ~]# reboot                             #重启操作系统,使SELinux配置生效
[root@server ~]# getenforce                         #查看SELinux状态,确保为disabled状态
[root@server ~]# systemctl status firewalld         #查看firewalld状态,确保为停止状态

3. scp上传(本地→远程,client主机操作)

核心格式scp [选项] 本地文件或目录 用户@远程主机:/远程主机目标目录

[root@client ~]# scp   /etc/hostname    root@192.168.8.101:/opt      #远程拷贝单文件
root@192.168.8.101's password: 123456                                #输入密码不显示,直接回车
[root@server ~]# ls    /opt                                          #查看server主机/opt下的数据
[root@client ~]# scp    /etc/shells    root@192.168.8.101:/opt        #远程拷贝单文件
[root@client ~]# scp  -r  /boot        root@192.168.8.101:/opt        #远程拷贝目录(必加-r)
[root@client ~]# scp /etc/passwd  /etc/group        root@192.168.8.101:/opt  #远程批量拷贝多文件
[root@server ~]# ls  /opt             #查看server主机/opt/里的内容

4. scp下载(远程→本地,client主机操作)

核心格式scp [选项] 用户@远程主机:/远程主机文件或目录 本地目标目录

[root@client ~]# scp   root@192.168.8.101:/etc/hostname    /opt   #远程拷贝单文件到本地
root@192.168.8.101's password: 123456                             #输入密码不显示,直接回车
[root@client ~]# ls    /opt                                       #查看client主机/opt下的数据
[root@client ~]# scp   root@192.168.8.101:/etc/shells    /mnt        #远程拷贝单文件到本地/mnt
[root@client ~]# scp  -r   root@192.168.8.101:/boot      /mnt        #远程拷贝目录到本地(必加-r)
[root@client ~]# scp root@192.168.8.101:/etc/passwd  root@192.168.8.101:/etc/group   /opt  #远程批量拷贝多文件到本地
[root@client ~]# ls  /mnt             #查看client主机/mnt里的内容

5. 核心小结

  • 掌握scp上传本地→远程)和下载远程→本地)两大核心场景,牢记目录拷贝必须加-r
  • 口令认证时密码输入无回显,直接输入后回车即可;
  • scp基于SSH协议加密传输,保证数据传输安全性。

二、源码编译安装

基本过程:

┌────────────┐
│ 1.获取源码包│  wget / curl / 拖拽上传
└──────┬─────┘
       ↓
┌────────────┐
│ 2.解压源码  │  tar -xf xxx.tar.gz
└──────┬─────┘
       ↓
┌────────────┐
│ 3.解决依赖  │  安装 gcc、make、-devel 包
└──────┬─────┘
       ↓
┌────────────┐
│ 4.初始化    │  ./configure初始化,生成Makefile(编译说明书,仅生成在源码包解压后的目录内部)  
└──────┬─────┘   #可使用:--prefix=/usr/local/xxx 指定释放(即安装)目录,指定目录不影响makefile的生成位置
       ↓
┌────────────┐
│ 5.编译     │  make   #读取Makefile,调用gcc生成可执行的二进制程序文件
└──────┬─────┘
       ↓
┌────────────┐
│ 6.安装     │  make install       #将编译好的文件复制到安装目录
└──────┬─────┘
       ↓
┌────────────┐
│ 7.验证     │  xxx --version
└────────────┘

1. 核心优势

  • 可获取软件最新版本,及时修复官方BUG,源码包多为压缩包格式;
  • 软件功能可按需选择/定制,可选功能比预编译包(如rpm)更丰富;
  • 源码包跨平台性强,适用于各种Linux发行版;
  • 所有rpm预编译包均由源码包编译而来,最新源码包可从软件官方网站下载。

2. 前置准备:配置本地YUM仓库

为安装编译依赖工具,需配置本地光盘YUM仓库,实现光盘永久挂载

  • client主机将光盘文件永久挂载至/mydvd
  • 将现有YUM客户端文件移动至/etc/yum.repos.d/bak
  • 编写/etc/yum.repos.d/mydvd.repo客户端文件,指定本地仓库

具体操作步骤如下:

[root@client ~]# mkdir     /mydvd              #创建光盘挂载点
[root@client ~]# vim    /etc/fstab             #编写配置文件,实现光盘永久挂载
# 在配置文件最后一行下方追加:/dev/cdrom    /mydvd    iso9660    defaults    0    0
[root@client ~]# mount    -a                   #刷新配置文件,使挂载生效
[root@client ~]# df    -h                      #查看挂载信息,验证光盘挂载成功
[root@client ~]# mkdir   /etc/yum.repos.d/bak             #创建YUM配置文件备份目录
[root@client ~]# mv   /etc/yum.repos.d/*.repo   /etc/yum.repos.d/bak  #移动系统自带YUM客户端文件至备份目录
[root@client ~]# vim /etc/yum.repos.d/mydvd.repo             #编写本地YUM仓库配置文件
# 配置文件完整内容:
[AppStream]  #仓库名称AppStream
name=AppStream  #描述信息
baseurl=file:///mydvd/AppStream  #指定YUM仓库repodata位置,file://表示本地协议
enabled=1  #启用仓库
gpgcheck=0  #不做签名验证

[BaseOS]  #仓库名称BaseOS
name=BaseOS  #描述信息
baseurl=file:///mydvd/BaseOS  #指定YUM仓库repodata位置,file://表示本地协议
enabled=1  #启用仓库
gpgcheck=0  #不做签名验证
[root@client ~]# dnf    repolist    -v  #查看仓库软件包数量,验证YUM仓库配置生效

3. 准备编译环境

开源软件多基于C/C++语言开发,需安装gcc、gcc-c++、make等核心编译工具:

[root@client ~]# dnf  -y install gcc  gcc-c++  make       #安装编译依赖工具,-y自动确认
[root@client ~]# rpm -q    gcc  gcc-c++  make          #检查软件包是否安装成功
[root@client ~]# gcc --version                         #检查gcc版本
# 示例输出:gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-10)

4. 标准实现流程(以inotify-tools-3.13为例)

源码编译安装通用标准流程:获取源码包→解压 (→ 解决依赖) → 初始化(configure) → 编译(make) → 安装(make install) →验证,以下为完整实操命令:

注:inotify-tools 的依赖已在前置准备中解决

inotify-tools源码包可以自己去github上找,也可以再linux用命令来下载:

# 下载最新 4.25.9.0 
wget https://github.com/inotify-tools/inotify-tools/archive/refs/tags/4.25.9.0.tar.gz

# 或下载3.13
wget https://sourceforge.net/projects/inotify-tools/files/inotify-tools/3.13/inotify-tools-3.13.tar.gz

此处用inotify-tools-3.13为例,此版本为古早版本,安装方法相对简单,适合新手学习

(1)获取并解压源码包
  • 下载inotify-tools源码包
  • 使用WindTerm远程连接虚拟机client
  • 使用远程工具将inotify-tools-3.13.tar.gz源码包上传至虚拟机client的/root
  • WindTerm按快捷键alt w 再按alt e,打开文件管理器,将inotify-tools-3.13.tar.gz拖拽至虚拟机
# 通过WindTerm远程连接client,按alt w再按alt e打开文件管理器,将inotify-tools-3.13.tar.gz拖拽至/root
[root@client ~]# ls                         #查看源码包是否已上传至虚拟机/root
# 示例输出:公共  视频  文档  音乐  anaconda-ks.cfg       inotify-tools-3.13.tar.gz
# 模板  图片  下载  桌面  initial-setup-ks.cfg
[root@client ~]# tar    -xf    inotify-tools-3.13.tar.gz    -C    /usr/src/  #推荐释放源码包至/usr/src/,此目录专门用于存放源码软件包
[root@client ~]# ls /usr/src/                                                #查看释放结果
# 示例输出:debug  inotify-tools-3.13  kernels
(2)初始化(生成Makefile编译说明书)
  • -执行源码目录下的configure脚本,典型配置参数:–prefix=安装目录(指定软件安装的目录,但不会影响Mkfile的生成位置,因为Mkfile永远生成在当前源码目录 )
  • 通过./configure --help 可以查看帮助
[root@client ~]# cd /usr/src/inotify-tools-3.13      #切换至源码包目录
[root@client inotify-tools-3.13]# ./configure        #初始化,检查系统环境并生成Makefile
[root@client inotify-tools-3.13]# ls Makefile        #查看Makefile是否生成,验证初始化成功
(3)编译及安装
  • make编译,读取Makefile,调用gcc生成可执行的二进制程序文件
  • make install 安装,将编译好的文件复制到安装目录
[root@client inotify-tools-3.13]# make               #编译,读取Makefile调用gcc生成二进制程序
[root@client inotify-tools-3.13]# make    install    #安装,将编译好的文件复制到系统安装目录
# 注:两步可合并执行:make    &&    make    install (&&表示前方命令执行成功后再执行后方命令)
(4)验证安装结果
  • 查看安装目录,了解程序的使用方式
  • 运行软件包提供的程序/服务
  • 源码建议解压到 /usr/src,默认安装目录将是:/usr/local
[root@client inotify-tools-3.13]# ls    /usr/local/bin/inotifywa*  #查看安装的inotify相关程序
[root@client inotify-tools-3.13]# inotifywait    --help            #查看程序的帮助信息,验证程序可用

5. 核心小结

掌握源码编译安装6步标准流程,理解各步骤核心作用:

  • 解压(释放源码)
  • configure(初始化,检查环境+生成Makefile)
  • make(编译源码)
  • make install(安装程序)
  • 编译前必须安装C/C++编译依赖,且需配置可用的YUM仓库
  • ./configure --help可查看自定义配置参数,如--prefix=可指定软件安装路径

三、rsync同步

rsync的设计哲学:源文件是‘主角’,目标文件是一个用于观测源文件的镜像。‘改动’仅出现在目标文件,永远以源文件为准。

1. 核心概述

rsync(Remote Sync,远程同步)支持本地同步、远程同步,官方网址:http://rsync.samba.org/;
核心优势:增量拷贝,仅传输源目录与目标目录之间变化过的数据,区别于cp/scp完全拷贝(无论数据是否变化均全部传输),同步效率更高;(首次传输:两者速度差不多,后续同步:rsync 远快于 scp)
基于SSH协议实现远程同步,要求远程主机开启sshd服务,支持口令认证/无密码认证

  • 两种拷贝方式对比:
    • 增量拷贝(rsync):更加高效智能,适合定期备份和目录同步
    • 完全拷贝:简单直接,适合一次性传文件

2. 核心语法与关键差异

基础命令格式rsync [选项] 源目录 目标目录
核心易错点:源目录加/与不加/ 效果完全不同,是rsync使用的关键:

  • rsync [选项] /src /dst:将整个/src目录同步至/dst,结果为/dst/src
  • rsync [选项] /src/ /dst:将 /src目录内的所有数据 同步至/dst,结果为/dst直接包含src的文件/子目录。

结论:源路径加 / = 展开内容;不加 / = 保留目录名(复刻整个目录)

rsync重要特性:

  • 目标目录不存在时会自动创建(但只创建最后一层目录),若父目录不存在则会同步失败。
  • 同步方向:本地 → 远程远程 → 本地,远程 → 远程(不推荐,效率低),本地 → 本地(无意义,使用cp/mv更合适)
  • 权限问题:普通用户不能保留属主,-o(保留属主)只有 root 才能生效,普通用户执行时会静默失效,不报错
  • 指定 SSH 端口:rsync -av -e ‘ssh -p 2222’ /src/ user@host:/dst/,适用场景:当远程主机的 SSH 服务默认的 22 端口被修改时

3. rsync常用核心选项

选项 核心作用 补充说明
-a 归档模式 等价于rlptgoD,保留文件所有属性(递归、符号链接、权限、时间、属主/属组、设备文件等),所有同步场景必加
-n 测试同步 仅模拟同步过程,不做实际修改,适合先验证再执行真实同步
--delete 删除多余数据 删除目标目录中源目录没有的内容,实现源目录与目标目录完全一致
-v 详细输出 显示同步的详细操作信息,便于排查同步问题(显示本次同步新增或发生变化的内容)
-z 压缩传输 传输过程中对数据进行压缩/解压,减少带宽占用,适合大文件/远程同步

rsync的增量同步基本规则

  • 源目录有目标目录没有就增加,
  • 同名的源文件对比时间戳和大小,
    • 源文件更新就就覆盖目标文件,
    • 源文件更旧则默认跳过,
    • 源文件和目标文件时间戳一致的前提下,大小不一致,源文件就覆盖目标文件

一句话总结:缺的补、新的盖、旧的跳、时间相同比大小。

4. rsync本地同步

( 1 )验证 rsync 同步规则:源路径尾部‘ / ’的作用

[root@client ~]# mkdir    /src    /dst            #创建测试目录
[root@client ~]# touch    /src/a.txt              #创建测试文件
[root@client ~]# rsync     -a     /src      /dst  #将/src整个目录同步至/dst
[root@client ~]# ls   /dst/                       #查看同步结果,输出:src
[root@client ~]# rsync     -a     /src/     /dst  #将/src目录里边的数据同步至/dst
[root@client ~]# ls    /dst/  #查看同步结果,输出:a.txt    src

( 2 )验证-av选项的增量同步作用

例1:

[root@client ~]# touch /src/b.txt                #源目录/src中新增数据b.txt
[root@client ~]# touch /src/c.txt                #源目录/src中新增数据c.txt
[root@client ~]# rsync -av /src/  /dst           #将/src/里新增的数据同步至/dst目录(-v显示传输过程)
# 输出:
sending incremental file list
./
b.txt                
c.txt                

sent 189 bytes  received 57 bytes  492.00 bytes/sec
total size is 0  speedup is 0.00

此处的命令是源目录带‘ / ’的,我们可以用源目录不带/的对比一下:

例2:

[root@client ~]# rsync -av /src /dst
sending incremental file list
src/
src/b.txt
src/c.txt

sent 203 bytes  received 58 bytes  522.00 bytes/sec
total size is 0  speedup is 0.00

能看到输出多了src/,意思是连带整个源目录都同步塞进目标目录了

经过对比,对输出内容进行解读:

  1. 第一行:sending incremental file list:
    rsync 开始发送【增量文件列表】,
    只同步新增 / 变化的文件,
    不会重复传已存在、没修改的文件。
  2. 第二行:./
    最重要!这就是目录本身。
    ./ = 当前目录 /src/(即源目录),
    它不是文件,只是告诉 rsync:
    我要同步这个目录下的内容,而不是把目录本身拷过去。
    经过与例2的对比很明显能看出来,例2因为没有带/,所以连带整个源目录都同步塞进目标目录了
  3. 第三行:b.txt
    发现 /src/ 下有 b.txt
    这个文件不存在于 /dst 或已修改
    正在同步到 /dst/b.txt
  4. 第四行:c.txt
    发现 /src/ 下有 c.txt
    同步到 /dst/c.txt

例3:

[root@client ~]# touch /src/nn.txt
[root@client ~]# rsync -av /src/ /dst
sending incremental file list
./
nn.txt

sent 171 bytes  received 38 bytes  418.00 bytes/sec
total size is 0  speedup is 0.00
[root@client ~]# ls /dst
a.txt  b.txt  c.txt  nn.txt  src

本次新建一个新的nn.txt进行同步,输出的内容是:

由此可以看出rsync -av的特性:

仅显示 ‘本次’ 同步新增或发生变化的内容

什么情况下会显示?
情况 是否显示
目标目录不存在该文件 ✅ 显示
源文件比目标文件新 ✅ 显示
源文件大小/时间不同 ✅ 显示
文件完全相同 ❌ 不显示
目录已存在且内容一致 ❌ 不显示

目标文件不存在,或源文件比目标文件“新”时。源文件如果是旧文件默认不覆盖目标文件,这是为了保护新数据不被旧数据冲掉

补充说明:什么是“源文件比目标文件新”?

rsync -av 判断“要不要同步 / 要不要显示”的核心条件(满足任一就会显示):

条件 说明
目标不存在该文件 ✅ 显示
源文件的修改时间比目标新 ✅ 显示
源文件的大小与目标不同 ✅ 显示

“新” ≠ 名字新,而是“内容或时间比目标新”

注意:rsync优先对比时间戳。时间戳不同时,只看时间戳(新的覆盖旧的);时间戳相同时,才看大小(大小不同就覆盖)。

( 3 )验证 --delete 选项的完全同步作用


[root@client ~]# touch /dst/ddd.txt            #目标目录/dst中新增数据ddd.txt
[root@client ~]# touch /src/sss.txt            #源目录/src中新增数据sss.txt
[root@client ~]# ls /src /dst                  #查看源目录和目标目录现有数据
# 输出:
/dst:
/dst:
a.txt  b.txt  c.txt  ddd.txt  nn.txt  src

/src:
a.txt  b.txt  c.txt  nn.txt  sss.txt
[root@client ~]# rsync -av --delete /src/    /dst        #删除目标多余数据,实现完全同步
# 输出:
sending incremental file list
deleting src/c.txt   #deleate 开头的就是删掉的内容
deleting src/b.txt
deleting src/a.txt
deleting src/
deleting ddd.txt
./                    #代表源目录本身
sss.txt               #代表新增内容

sent 191 bytes  received 96 bytes  574.00 bytes/sec
total size is 0  speedup is 0.00

可以看到,源目录与目标目录完全一致了

[root@client ~]# ls /dst
a.txt  b.txt  c.txt  nn.txt  sss.txt
[root@client ~]# ls /src
a.txt  b.txt  c.txt  nn.txt  sss.txt
[root@client ~]# 

因此,–delete的作用便是:使目标与源完全相同,多删少补
示例中的同步命令是带 / 的。那么倘若同步命令源目录不带尾 / ,结果将是什么呢?

  • 整个源目录 → 被完整复制进目标目录里,变成一个子文件夹
  • 目标目录本层 → 和原本一模一样,仅多了源目录的文件夹。

所以,不管加不加 --delete,只要源目录后面不带 / ,结果永远只有一种:
1.目标目录本层 保持原样,不会变成源目录的内容
2.只会把 「源目录整个文件夹」 复制进目标目录里
3.–delete 只会删除目标目录里多余的东西,但不会不改变源和目标之间的目录层级关系

5. rsync远程同步(client主机操作)

上行同步(本地→远程)下行同步(远程→本地),服务端要求:开启sshd服务、提供远程用户名/密码、本地与远程可通信。

(1)上行同步(client→server,本地同步至远程)

-z压缩传输本质:

  • 发送端:先把文件在内存里压缩(一边读文件、一边压缩、一边传)
  • 网络上:传的是压缩后的数据(更小、更快)
  • 接收端:自动解压还原(一边收、一边解压、一边写进硬盘)
  • 最终结果:文件跟源一模一样,没有任何压缩包、没有变小
[root@client ~]# rsync   -avz    /boot/  root@192.168.8.101:/opt          #client远程同步至server,-z压缩传输
[root@server ~]# ls    /opt                      #server主机查看同步结果
[root@client ~]# touch    /boot/test01.txt       #client主机新增数据
[root@server ~]# touch    /opt/server.txt        #server主机新增多余数据
[root@client ~]# rsync  -av  --delete  /boot/  root@192.168.8.101:/opt    #完全同步,删除远程多余数据
[root@client ~]# ls     /boot          #client主机查看源数据
[root@server ~]# ls    /opt            #server主机查看同步结果,与源数据一致
(2)下行同步(server→client,远程同步至本地)
[root@client ~]# rsync  -avz  root@192.168.8.101:/boot/   /opt/  #server远程同步至client,-z压缩传输
[root@client ~]# ls    /opt                       #client主机查看同步结果
[root@server ~]# touch    /boot/srv.txt           #server主机新增数据
[root@client ~]# touch    /opt/client.txt         #client主机新增多余数据
[root@client ~]# rsync  -av  --delete root@192.168.8.101:/boot/  /opt/ #完全同步,删除本地多余数据
[root@server ~]# ls     /boot          #server主机查看源数据
[root@client ~]# ls    /opt            #client主机查看同步结果,与源数据一致

6. 核心小结

  • 掌握rsync本地同步的核心语法,重点区分源目录加/与不加/的差异,这是使用rsync的关键;
  • 牢记-a为核心必加选项,实现文件属性的完整保留;
  • 远程同步分上行/下行,结合-avz实现高效压缩同步,--delete实现源与目标的完全一致。

四、inotify+rsync实时同步

1. 核心背景

普通rsync为手动/定时同步,时间间隔难以把控,数据同步时效性差;
Linux内核自带inotify机制,提供事件响应式的文件系统通知机制,可实时监控目录/文件的变化(如创建、删除、修改);
需安装inotify-tools控制工具(含inotifywait/inotifywatch),才能调用inotify机制实现监控,结合rsync可实现数据变化即触发同步的实时效果,是生产环境数据实时备份的核心方案。

2. 源码编译安装inotify-tools工具(client主机)

实时同步依赖inotify-tools,以下为完整的编译安装命令(与前文一致,保留原代码):

[root@client ~]# dnf -y install gcc gcc-c++ make                  #安装依赖包
[root@client ~]# tar  -xf inotify-tools-3.13.tar.gz -C /usr/src/  #1.解压源码包至/usr/src/
[root@client ~]# cd /usr/src/inotify-tools-3.13/                  #切换解压目录
[root@client inotify-tools-3.13]# ./configure                     #2.初始化,生成Makefile
[root@client inotify-tools-3.13]# make                            #3.编译
[root@client inotify-tools-3.13]# make install                    #4.编译安装
[root@client inotify-tools-3.13]# ls /usr/local/bin/inotifywa*    #查看是否安装成功,验证程序存在

3. inotifywait监控工具(client主机)

inotifywait是inotify机制的核心监控工具,用于实时捕获目录/文件的变化事件,命令格式inotifywait [选项] 目标目录

(1)inotifywait常用选项
选项 核心作用
-m 持续监控,捕获一个事件后不退出,保持持续监控(默认捕获一次即退出)
-r 递归监控,监控目标目录及其所有子目录、文件
-q 减少屏幕输出信息,-qq 为静默模式(无任何输出)
-e 指定监控事件,仅监控指定的文件系统事件,如 modify(修改)、move(移动)、create(创建)、delete(删除)、attrib(属性变化,如归属等)等
(2)inotifywait监控实操(双窗口操作)
# 第一个窗口:执行监控命令,持续递归静默监控/opt目录
[root@client ~]# inotifywait -mrq  /opt/     #第一个窗口监控/opt变化

# 第二个窗口:对/opt执行写操作,触发监控事件
[root@client ~]# touch    /opt/a.txt         #第二个窗口在/opt目录中创建a.txt文件(触发create创建动作)

# 第一个窗口:立即给出监控提示,输出结果:
/opt/ CREATE a.txt
/opt/ OPEN a.txt
/opt/ ATTRIB a.txt
/opt/ CLOSE_WRITE,CLOSE a.txt

4. inotify+rsync实时同步完整实现(client→server)(补充内容)

核心思路:SSH免密认证(避免同步输密码)+ Shell脚本(监控+同步)+ 后台运行(不占用终端),实现client主机/boot目录实时同步至server主机/opt目录,步骤如下:

(1)前置条件:client主机实现无密码远程连接server主机
[root@client ~]# ssh-keygen                          #生成SSH密钥对,一路回车默认生成(~/.ssh/id_rsa私钥、id_rsa.pub公钥)
[root@client ~]# ssh-copy-id root@192.168.8.101      #将公钥拷贝至server主机
root@192.168.8.101's password: 123456                #输入server主机root密码,输入无回显
[root@client ~]# ssh root@192.168.8.101              #远程连接验证,无需密码即为成功
[root@server ~]# exit                                #退出server主机
(2)编写Shell脚本,实现监控+实时同步
[root@client ~]# vim    /root/inotifywait.sh      #编写shell脚本
# 脚本完整内容(保留原代码,无删减):
#!/bin/bash
while inotifywait -rqq  /boot/                    #监控/boot目录变化,-rqq表示递归+静默模式
do
        rsync -az --delete /boot/  root@192.168.8.101:/opt/   #触发变化后执行实时同步,实现完全一致
done

[root@client ~]# chmod    +x    /root/inotifywait.sh  #为脚本赋予可执行权限(x权限)
[root@client ~]# /root/inotifywait.sh    &  #后台运行脚本,&表示不占用当前终端
(3)验证实时同步效果
[root@client ~]# touch   /boot/haha.txt     #在client被监控的/boot目录下增加数据,自动触发同步
[root@server ~]# ls    /opt                 #server主机验证,/opt目录中已实时出现haha.txt,同步成功

5. 核心小结

  • 理解inotify机制的核心作用:事件响应式的实时文件监控,区别于传统的定时轮询;
  • 掌握inotifywait核心选项的使用,-mrq为最常用的监控组合选项;
  • 实现实时同步的关键是SSH免密认证,避免同步过程中手动输入密码;
  • Shell脚本通过while循环实现“监控事件→触发同步”的自动化,&实现脚本后台运行,不占用终端。

五、整体课程核心总结

本次Day06内容为Linux云计算/运维必备的核心实操技能,四大模块层层递进,从基础的远程文件传输到高级的实时数据同步,所有操作均基于生产环境需求设计,核心掌握要点

  1. scp远程拷贝:掌握上传/下载完整命令,牢记目录拷贝加-r,理解SSH加密传输的特性,能完成本地与远程的文件/目录双向传输;
  2. 源码编译安装:掌握6步标准流程,能独立配置本地YUM仓库、安装编译依赖,理解各步骤的核心作用,可完成开源软件的自定义安装;
  3. rsync同步:掌握本地/远程同步的完整命令,区分源目录加/与不加/的差异,熟记核心选项(-a/--delete/-z),理解增量拷贝的优势,能实现源与目标的高效同步/完全同步;
  4. inotify+rsync实时同步:掌握inotifywait监控工具的使用,能独立配置SSH免密认证,编写简单的Shell脚本实现“监控→触发同步”,理解生产环境实时数据备份的核心逻辑。
Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐