如何在Linux中同步本地和远程目录
本教程描述了如何使用Lsyncd(实时同步守护程序)在Linux中同步本地和远程目录。
使用Lsyncd,我们可以将本地目录镜像到本地目录,也可以将本地镜像到远程目录。
当我们要在经常用新内容更新的目录之间同步数据时,这将非常有用。
Lsyncd旨在将预期更改很少的本地目录树同步到远程镜像。
将数据从安全区域同步到不太安全的区域特别有用。
使用Lsyncd在Linux中同步本地和远程目录
安装Lsyncd
在Debian及其衍生产品(如Ubuntu)上,Linux Mint运行以下命令来安装Lsyncd:
$sudo apt-get install lsyncd
在RHEL,CentOS上,我们需要首先启用EPEL存储库。
$sudo yum install epel-release
然后,使用以下命令安装Lsyncd:
$sudo yum install lsyncd
Debian和Ubuntu及其衍生产品上的Lsyncd配置
Lsyncd在基于DEB的系统中不提供任何默认配置文件。
我们需要手动创建它。
但是,Lsyncd包含一些示例配置文件,这些文件对于了解同步的方式/方式非常有用。
示例配置文件位于“/usr/share/doc/lsyncd-*/examples”目录下。
$ls /usr/share/doc/lsyncd/examples/
输出示例:
lbash.lua lgforce.lua lpostcmd.lua lrsyncssh.lua lecho.lua limagemagic.lua lrsync.lua
如我们在上面的输出中看到的,每个配置文件都以.lua扩展名结尾。
这是因为lsync配置文件是使用Lua编程语言编写的。
让我们看一个示例配置文件。
$cat /usr/share/doc/lsyncd/examples/lrsync.lua
Lrsync配置文件如下所示:
--- -- User configuration file for lsyncd. - -- Simple example for default rsync. - settings = { statusFile = "/tmp/lsyncd.stat", statusInterval = 1, } sync{ default.rsync, source="src", target="trg", }
RHEL和CentOS上的Lsyncd配置
在RHEL和CentOS系统上,将自动创建Lsyncd配置文件。
我们可以使用以下命令查看此文件的内容:
$cat /etc/lsyncd.conf
并且,示例配置文件位于以下位置。
$ls /usr/share/doc/lsyncd-2.1.5/examples/
在Debian,Ubuntu上同步本地目录
现在,我们将同步两个本地目录。
让我们创建两个带有一些示例内容的目录。
$sudo mkdir source_dir
$sudo mkdir dest_dir
在source_dir目录中创建一些随机文件:
$sudo touch source_dir/file{1..10}
(可选)我们可以为Lysyncd创建一些日志文件。
这只是可选的。
如果我们不想使用日志文件,请跳过此步骤。
$sudo mkdir /var/log/lsyncd
$sudo touch /var/log/lsyncd/lsyncd.{log,status}
接下来,为Lsyncd创建配置文件:
$sudo mkdir /etc/lsyncd
$sudo nano /etc/lsyncd/lsyncd.conf.lua
编辑/修改以下几行:
settings { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.status" } sync { default.rsync, source = "/home/sk/source_dir", target = "/home/sk/dest_dir", }
用我们自己的值替换源和目标目录路径。
保存并关闭文件。
使用以下命令启用和启动或者重新启动Lsyncd服务:
$sudo systemctl enable lsyncd
$sudo systemctl restart lsyncd
现在,检查source_dir和dest_dir目录的内容。
$ls source_dir/
输出示例:
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
检查dest_dir的内容:
$ls dest_dir/
输出示例:
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
看到了吗?
我们仅在source_dir目录中创建了文件,并且该目录的内容已自动同步到dest_dir目录。
另外,我们可以查看日志文件以验证复制是否完成。
$tail -10 /var/log/lsyncd/lsyncd.log
输出示例:
Sat Apr 15 17:07:34 2016 Normal: recursive startup rsync: /home/sk/source_dir/-> /home/sk/dest_dir/ Sat Apr 15 17:07:34 2016 Normal: Startup of "/home/sk/source_dir/" finished.
检查Lsyncd状态文件:
$more /var/log/lsyncd/lsyncd.status
输出示例:
Lsyncd status report at Sat Apr 15 17:07:44 2016 Sync1 source=/home/sk/source_dir/ There are 0 delays Excluding: nothing. Inotify watching 1 directories 1: /home/sk/source_dir/
在RHEL,CentOS上同步本地目录
编辑Lsyncd配置文件:
$sudo nano /etc/lsyncd.conf
编辑和修改以下几行:
--- -- User configuration file for lsyncd. - -- Simple example for default rsync, but executing moves through on the target. - -- For more examples, see /usr/share/doc/lsyncd*/examples/ -- settings { logfile = "/var/log/lsyncd.log", statusFile = "/var/log/lsyncd.status" } sync { default.rsync, source = "/root/source_dir", target = "/root/dest_dir",
用我们自己的值替换源和目标目录路径。
保存并关闭文件。
使用以下命令启用和启动Lsyncd服务:
$sudo systemctl enable lsyncd
$sudo systemctl start lsyncd
现在,检查source_dir和dest_dir目录的内容。
$ls source_dir/
输出示例:
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
检查dest_dir的内容:
$ls dest_dir/
输出示例:
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
恭喜! source_dir的内容已成功同步到dest_dir目录。
另外,我们可以查看日志文件以验证复制是否完成。
$tail -10 /var/log/lsyncd.log
检查Lsyncd状态文件:
$more /var/log/lsyncd.status
在Debian,Ubuntu系统上同步远程目录
我们需要设置无密码的SSH登录。
这是因为Lsyncd将自动将本地目录的内容复制到远程目录,而无需用户干预。
$sudo su
# ssh-keygen -t rsa
请勿输入任何密码。
只需按Enter即可接受默认值。
Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/home/sk/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:dHc2aKk5F2wBq7CIc5sVHJwYNjoPdwgxDKb1KuBBkgs Hyman@theitroad The key's randomart image is: +---[RSA 2048]----+ |o*=.++.. ... | |E..*.+o. o + | |+o+ + = . o O + | |+ .B o = o * + . | |..+ + o S + . | | . o + o | | o | | | | | +----[SHA256]-----+
现在,将SSH公钥复制到远程系统:
# ssh-copy-id Hyman@theitroad
输出示例:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" The authenticity of host '192.168.43.150 (192.168.43.150)' can't be established. ECDSA key fingerprint is SHA256:U7I0O1OOzzbHFlhIG0HoGDr1usHzLBju6Jmr6bUB9Es. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys Hyman@theitroad's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'Hyman@theitroad'" and check to make sure that only the key(s) you wanted were added.
其中192.168.43.150是远程系统的IP地址。
现在,我们无需输入密码即可通过SSH连接到远程系统:
# ssh Hyman@theitroad
使用以下命令在远程系统中创建目标目录:
# mkdir remotesync
从远程系统注销:
# exit
接下来,在源计算机中编辑Lsyncd配置文件:
$sudo nano /etc/lsyncd/lsyncd.conf.lua
编辑/修改以下几行:
settings { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.status" } sync { default.rsync, source = "/home/sk/source_dir", host = "192.168.43.150", targetdir = "/root/remotesync", }
其中192.168.43.150是我的远程主机的IP地址。
并且/root/remotesync /是我的远程系统中的目标目录。
用我们自己的值替换。
保存并关闭文件。
重新启动Lsyncd服务以将源目录的内容复制到目标。
$sudo systemctl restart lsyncd
现在,SSH到远程系统:
$ssh Hyman@theitroad
并且,检查目标目录的内容(在本例中为/root/remotesync /)。
我们将看到本地系统中源目录中的所有文件都已复制到目标系统中的目标目录中。
Hyman@theitroad ~]# ls remotesync/ file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
对于RHEL和CentOS系统,此过程相同。
设置无密码SSH登录,并确保已在RHEL或者CentOS系统中的Lsyncd主配置文件(/etc/lsyncd.conf)中修改了正确的源路径和目标路径,其余步骤相同。
我们知道如何使用Lsyncd在Linux中同步本地和远程目录。
如我们所见,这是非常简单直接的方法。