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,这里我只对重要参数解释。
-
settings
-
logfile:文件,(必需)表示日志文件存储位置,建议文件以.log为后缀,并不强制要求文件后缀。 -
statusFile:文件,(必需)定期将状态报告写入此文件,建议以.status为后缀,不强制要求后缀。 -
nodaemon:bool,(必需)是否不以守护进程运行,这里要注意,如果要守护进程值为false,不守护进程值为true,建议设置为fasle。 -
inotifyMode:string,在 inotify 系统上指定要侦听的更改类型。可以是Modify、CloseWrite (默认) 或CloseWrite or Modify,不懂的话默认就好。 -
maxProcesses:数值类型,Lysncd 不会生成超过这些数量的进程。这将在所有 sync{} 中添加。 -
maxDelays:数值类型,表示累积到该数量的文件变更事件后执行一次同步操作,如果需要实时同步就设置为1,表示累积1个变更事件就同步一次。
-
-
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。
-
-
rsync
-
binary:rsync 所在目录,一般固定为/usr/bin/rsync。 -
archive:归档模式,表示以递归方式传输文件,并保持所有文件属性,默认false。 -
compress:是否压缩数据传输,建议true,效率高,虽然会增加些cpu消耗,默认false。 -
verbose:显示详细输出,会在日志文件中显示每一条同步记录,默认false
-
重要的配置大致就这些,具体没有写的配置请参见lsyncd和rsync的配置。
总结
以上就是手搓一个raid1的全过程了,主要就是安装lsyncd来实现文件系统的监控并通知rsync来进行同步。