liunx系统实时同步文件夹

我的nas是笔记本改装的,无法组raid,但是又想要实时保证数据的备份,所以有了以下的探索。

背景

我的笔记本内置两块硬盘,一个ssd系统盘,一个hdd机械硬盘,没有多出一个盘组raid。

因此usb挂载了一个外接硬盘,本来是想组raid的,但是飞牛系统提示外接和内置不能组,因此一直以来都是用的飞牛系统备份。

但是系统备份的频率最小只能按每天备份,如果硬盘挂了显然会丢失数据。

那么有没有一个方案能够实时将内置hdd的数据同步到外接硬盘呢?答案当然是有的!

lsyncd​ + rsync​ 手搓raid1​文件同步

Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。

inotify 触发机制就是文件系统事件接口来监视本地文件和目录的更改,无需传统的定时执行同步命令,当有文件变动的时候触发系统事件,监听到事件后通知rsync进行文件同步,非常高效。

实际上如果只是本机两个目录同步完全可以不用rsync,这个后面再说。

安装

Lsyncd 可在 Fedora、Debian 和 Ubuntu 的官方软件仓库中找到,例如:在 Debian 及其衍生版本上进行安装,可以使用 apt:

sudo apt install lsyncd

要在 Fedora 上安装 lsyncd,可以使用:

sudo dnf install lsyncd

lsyncd 不是 RHEL/CentOS 7 默认仓库的一部分,因此必须使用 EPEL 仓库安装它,可以使用以下命令安装 epel-repo:

yum -y install epel-release
yum -y install lsyncd

配置

lsyncd 是配置文件驱动的,因此只需要执行启动命令,剩下的工作交给配置文件。

lsyncd 使用 Lua 配置文件,通常位于 /etc/lsyncd/lsyncd.conf.lua,也可以通过以下方式查看路径:

systemctl status lsyncd
---输出大概如下
● lsyncd.service - LSB: lsyncd daemon init script
     Loaded: loaded (/etc/init.d/lsyncd; generated)
     Active: active (exited) since Tue 2024-07-30 00:31:05 CST; 23h ago
... ...   

查看其中的/etc/init.d/lsyncd​文件:

cat /etc/init.d/lsyncd
---输出如下
... ...
CONFIG=/etc/lsyncd/lsyncd.conf.lua
... ...

找到其中CONFIG​配置的路径就是配置文件的位置。

默认不存在这个文件,lsyncd目录都是不存在的,所以需要新建目录和文件

mkdir /etc/lsyncd
vim /etc/lsyncd/lsyncd.conf.lua

配置大致如下:

settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd.status",
   nodaemon   = false,
   maxDelays  = 1
}
sync {
    default.rsync,
    source    = "/vol2/1000",
    target    = "/vol3/1000/hs-fnos/vol2/1000",
    excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    rsync     = {
        binary    = "/usr/bin/rsync",
        archive   = true,
        compress  = true,
        verbose   = true
    }
}
sync {
    default.rsync,
    source    = "/vol1/1000",
    target    = "/vol3/1000/hs-fnos/vol1/1000",
    excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    rsync     = {
        binary    = "/usr/bin/rsync",
        archive   = true,
        compress  = true,
        verbose   = true
   }
}

其中settings​块和至少一个sync​块是必要的,我这里有两个sync​块是因为我有两个目录需要同步。

配置文件使用lua脚本语法,需要注意的是,这里面所有的lsyncd​文件和目录都是需要手动去建的,不然无法保存文件,比如:

/var/log/lsyncd/lsyncd.log
/var/log/lsyncd.status
/etc/rsyncd.d/rsync_exclude.lst

这些目录里的lsyncd​和rsyncd.d​目录都是不存在的,需要自己提前建好。

官方最小化配置:

settings {
   logfile    = "/tmp/lsyncd.log",
   statusFile = "/tmp/lsyncd.status",
   nodaemon   = true,
}
sync {
   default.rsync,
   source = "DIRNAME", #必须使用绝对路径
   target = "DIRNAME" #必须使用绝对路径
}

关于参数详解请看下文。

启动和管理

  • 启动命令:

    sudo systemctl start lsyncd
    
  • 重启命令:

    sudo systemctl restart lsyncd
    
  • 查看状态:

    sudo systemctl status lsyncd
    
  • 加入开机自启动:

    sudo systemctl enble lsyncd
    
  • 禁止开机自启动:

    sudo systemctl disable lsyncd
    
  • 查看日志:

    tail -f /var/log/lsyncd/lsyncd.log #日志目录为配置文件里settings里logFile目录
    

到这一步已经可以正常工作了,接下来是配置文件参数详解。

配置文件参数详解

关于参数建议查看官网配置文件章节Lsyncd - The Configuration File,这里我只对重要参数解释。

  1. settings

    • logfile​:文件,(必需)表示日志文件存储位置,建议文件以.log为后缀,并不强制要求文件后缀。
    • statusFile​:文件,(必需)定期将状态报告写入此文件,建议以.status为后缀,不强制要求后缀。
    • nodaemon​:bool,(必需)是否不以守护进程运行,这里要注意,如果要守护进程值为false​,不守护进程值为true​,建议设置为fasle​。
    • inotifyMode​:string,在 inotify 系统上指定要侦听的更改类型。可以是 Modify​、CloseWrite​ (默认) 或 CloseWrite or Modify​,不懂的话默认就好。
    • maxProcesses​:数值类型,Lysncd 不会生成超过这些数量的进程。这将在所有 sync{} 中添加。
    • maxDelays​:数值类型,表示累积到该数量的文件变更事件后执行一次同步操作,如果需要实时同步就设置为1,表示累积1个变更事件就同步一次。
  2. sync

    • default​:(必需),rsync/rsyncssh/direct​,rsyncssh​可用于ssh同步,不过不能同步多个目录,direct​使用系统命令cp/mv/rm​来同步,与使用 default.rsync 相比,性能更好。

    • source​:(必需),同步的源目录,必须使用绝对路径。

    • target​:(必需),同步的目标目录,必须使用绝对路径。

    • delay​:number,同步延迟时间(秒),表示在检测到文件更改后等待多长时间再进行同步,默认无延迟,这个参数可以防止短时间大量更新。

    • exclude​:正则,指定要排除的文件或目录的模式列表。{ "*.tmp", "*.log", "cache/", "temp/" }​,可以正则匹配。

      • 监控路径里的任何部分匹配到一个文本,都会被排除,例如/bin/foo/bar​可以匹配规则foo
      • 如果规则以斜线/​开头,则从头开始要匹配全部
      • 如果规则以/​结尾,则要匹配监控路径的末尾
      • ?​匹配任何字符,但不包括/
      • *​匹配0或多个字符,但不包括/
      • **​匹配0或多个字符,可以是/
    • excludeFrom​:和exclude的区别就是把规则放到一个文件里。

    • init​:是否在启动时执行,默认启动就会执行同步,如果你两个目录的内容本来就是一致的,可以改为false,或者可以使用函数做其它操作。

    • delete​:bool,是否删除目标目录中不在源目录中的文件,默认为true​。

  3. rsync

    • binary​:rsync 所在目录,一般固定为/usr/bin/rsync​。
    • archive​:归档模式,表示以递归方式传输文件,并保持所有文件属性,默认false​。
    • compress​:是否压缩数据传输,建议true,效率高,虽然会增加些cpu消耗,默认false​。
    • verbose​:显示详细输出,会在日志文件中显示每一条同步记录,默认false

重要的配置大致就这些,具体没有写的配置请参见lsyncd和rsync的配置。

总结

以上就是手搓一个raid1的全过程了,主要就是安装lsyncd​来实现文件系统的监控并通知rsync​来进行同步。