Wie synchronisiert man Verzeichnisse mit Lsyncd unter Ubuntu 20.04

Lsyncd ist ein einfaches und leichtgewichtiges Tool, mit dem Sie Ihr lokales Verzeichnis in ein anderes Verzeichnis auf dem Remote-Server spiegeln können. Es funktioniert durch kontinuierliche Überwachung des angegebenen Verzeichnisses auf Änderungen alle paar Sekunden, und wenn Änderungen vorgenommen werden, werden diese mit dem entfernten Server synchronisiert. Dieses Tool ist sehr nützlich, um die Daten aus einem sicheren Bereich in einen nicht sicheren Bereich zu synchronisieren.

In diesem Tutorial zeigen wir Ihnen, wie Sie Lsyncd installieren und verwenden, um lokale Verzeichnisse und Remote-Verzeichnisse zu synchronisieren.

Voraussetzungen

  • Ein Server, auf dem Ubuntu 20.04 läuft.
  • Ein Root-Passwort wird auf Ihrem Server eingerichtet.

Erste Schritte

Bevor Sie beginnen, ist es eine gute Idee, das Paket Ihres Systems auf die neueste Version zu aktualisieren. Sie können sie mit dem folgenden Befehl aktualisieren:

apt-get update -y
apt-get upgrade -y

Sobald alle Pakete aktualisiert sind, starten Sie Ihr System neu, um die Änderungen zu übernehmen.

Lsyncd installieren

Das Lsyncd-Paket ist standardmäßig in den meisten Linux-Betriebssystemen verfügbar. Sie können es installieren, indem Sie einfach den folgenden Befehl ausführen:

apt-get install lsyncd -y

Sobald Lsyncd installiert ist, können Sie die installierte Version von Lsyncd mit dem folgenden Befehl überprüfen:

lsyncd --version

Sie sollten die folgende Ausgabe erhalten:

Version: 2.2.3

Lsyncd für die Synchronisierung lokaler Verzeichnisse konfigurieren

In diesem Abschnitt werden wir Lsyncd so konfigurieren, dass das Verzeichnis /etc/ mit dem Verzeichnis /mnt/ auf dem lokalen System synchronisiert wird.

Legen Sie zunächst mit folgendem Befehl ein Verzeichnis für Lsyncd an:

mkdir /etc/lsyncd

Legen Sie dann eine neue Lsyncd-Konfigurationsdatei an und definieren Sie das Quell- und Zielverzeichnis, das Sie synchronisieren möchten.

nano /etc/lsyncd/lsyncd.conf.lua

Fügen Sie die folgenden Zeilen hinzu:

settings {
        logfile = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/var/log/lsyncd/lsyncd.status",
   statusInterval = 20,
   nodaemon   = false
}

sync {
        default.rsync,
        source = "/etc/",
        target = "/mnt"
}

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

systemctl start lsyncd
systemctl enable lsyncd

Sie können den Status des Lsyncd-Dienstes auch mit dem folgenden Befehl überprüfen:

systemctl status lsyncd

Sie sollten die folgende Ausgabe sehen:

? lsyncd.service - LSB: lsyncd daemon init script
     Loaded: loaded (/etc/init.d/lsyncd; generated)
     Active: active (running) since Fri 2020-05-01 03:31:20 UTC; 9s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 36946 ExecStart=/etc/init.d/lsyncd start (code=exited, status=0/SUCCESS)
      Tasks: 2 (limit: 4620)
     Memory: 12.5M
     CGroup: /system.slice/lsyncd.service
             ??36921 /usr/bin/lsyncd -pidfile /var/run/lsyncd.pid /etc/lsyncd/lsyncd.conf.lua
             ??36952 /usr/bin/lsyncd -pidfile /var/run/lsyncd.pid /etc/lsyncd/lsyncd.conf.lua

May 01 03:31:20 ubuntu20 systemd[1]: lsyncd.service: Succeeded.
May 01 03:31:20 ubuntu20 systemd[1]: Stopped LSB: lsyncd daemon init script.
May 01 03:31:20 ubuntu20 systemd[1]: Starting LSB: lsyncd daemon init script...
May 01 03:31:20 ubuntu20 lsyncd[36946]:  * Starting synchronization daemon lsyncd
May 01 03:31:20 ubuntu20 lsyncd[36951]: 03:31:20 Normal: --- Startup, daemonizing ---
May 01 03:31:20 ubuntu20 lsyncd[36946]:    ...done.
May 01 03:31:20 ubuntu20 systemd[1]: Started LSB: lsyncd daemon init script.

Sie können die Lsyncd-Protokolldatei für weitere Details wie unten dargestellt überprüfen:

tail -f /var/log/lsyncd/lsyncd.log

Sie sollten die folgende Ausgabe sehen:

/lsyncd/lsyncd.conf.lua
Fri May  1 03:30:57 2020 Normal: Finished a list after exitcode: 0
Fri May  1 03:31:20 2020 Normal: --- Startup, daemonizing ---
Fri May  1 03:31:20 2020 Normal: recursive startup rsync: /etc/ -> /mnt/
Fri May  1 03:31:20 2020 Normal: Startup of /etc/ -> /mnt/ finished.

Sie können den Synchronisationsstatus auch mit dem folgenden Kommando überprüfen:

tail -f /var/log/lsyncd/lsyncd.status

Sie sollten in der Lage sein, die Änderungen im Verzeichnis /mnt mit dem folgenden Befehl zu sehen:

ls /mnt/

Sie sollten sehen, dass alle Dateien und Verzeichnisse aus dem Verzeichnis /etc zum Verzeichnis /mnt hinzugefügt werden:

acpi                    dconf           hosts            logrotate.conf       newt                     rc2.d          subuid-
adduser.conf            debconf.conf    hosts.allow      logrotate.d          nginx                    rc3.d          sudoers
alternatives            debian_version  hosts.deny       lsb-release          nsswitch.conf            rc4.d          sudoers.d
apache2                 default         init             lsyncd               ntp.conf                 rc5.d          sysctl.conf
apparmor                deluser.conf    init.d           ltrace.conf          openal                   rc6.d          sysctl.d
apparmor.d              depmod.d        initramfs-tools  lvm                  opt                      rcS.d          systemd
apport                  dhcp            inputrc          machine-id           os-release               resolv.conf    terminfo
apt                     dnsmasq.d       insserv.conf.d   magic                overlayroot.conf         rmt            timezone
at.deny                 docker          iproute2         magic.mime           PackageKit               rpc            tmpfiles.d
bash.bashrc             dpkg            iscsi            mailcap              pam.conf                 rsyslog.conf   ubuntu-advantage
bash_completion         e2scrub.conf    issue            mailcap.order        pam.d                    rsyslog.d      ucf.conf
bash_completion.d       environment     issue.net        manpath.config       passwd                   screenrc       udev
bindresvport.blacklist  ethertypes      kernel           mdadm                passwd-                  securetty      ufw
binfmt.d                fonts           kernel-img.conf  mime.types           perl                     security       update-manager
byobu                   fstab           landscape        mke2fs.conf          php                      selinux        update-motd.d
ca-certificates         fuse.conf       ldap             modprobe.d           pki                      sensors3.conf  update-notifier
ca-certificates.conf    fwupd           ld.so.cache      modules              pm                       sensors.d      vdpau_wrapper.cfg
calendar                gai.conf        ld.so.conf       modules-load.d       polkit-1                 services       vim
console-setup           groff           ld.so.conf.d     mtab                 pollinate                shadow         vmware-tools
cron.d                  group           legal            multipath            popularity-contest.conf  shadow-        vtrgb
cron.daily              group-          letsencrypt      multipath.conf       profile                  shells         vulkan
cron.hourly             grub.d          libaudit.conf    mysql                profile.d                skel           wgetrc
cron.monthly            gshadow         libnl-3          nanorc               protocols                sos.conf       X11
crontab                 gshadow-        locale.alias     netplan              pulse                    ssh            xattr.conf
cron.weekly             gss             locale.gen       network              python3                  ssl            xdg
cryptsetup-initramfs    hdparm.conf     localtime        networkd-dispatcher  python3.8                subgid         zsh_command_not_found
crypttab                host.conf       logcheck         NetworkManager       rc0.d                    subgid-
dbus-1                  hostname        login.defs       networks             rc1.d                    subuid

Konfigurieren Sie Lsyncd zur Synchronisierung von Remote-Verzeichnissen

In diesem Abschnitt werden wir Lsyncd so konfigurieren, dass das Verzeichnis /etc/ auf dem lokalen System mit dem Verzeichnis /opt/ auf dem entfernten System synchronisiert wird.

Bevor Sie beginnen, müssen Sie eine auf SSH-Schlüsseln basierende Authentifizierung zwischen dem lokalen System und dem Remote-Server einrichten, so dass das lokale System sich ohne Passwort mit dem Remote-Server verbinden kann.

Führen Sie auf dem lokalen System den folgenden Befehl aus, um einen öffentlichen und einen privaten Schlüssel zu erzeugen:

ssh-keygen -t rsa

Sie sollten die folgende Ausgabe sehen:

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
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:c7fhjjhAamFjlk6OkKPhsphMnTZQFutWbr5FnQKSJjE [email protected]
The key's randomart image is:
+---[RSA 3072]----+
| E ..            |
|  ooo            |
| oo= +           |
|=.+ % o . .      |
|[email protected] oSo. o    |
|ooo=B o .o o o   |
|=o.... o    o    |
|+.    o .. o     |
|     .  ... .    |
+----[SHA256]-----+

Der obige Befehl erzeugt einen privaten und einen öffentlichen Schlüssel im Verzeichnis ~/.ssh.

Als nächstes müssen Sie den öffentlichen Schlüssel auf den Remote-Server kopieren. Sie können ihn mit dem folgenden Befehl kopieren:

ssh-copy-id [email protected]

Sie werden aufgefordert, das Passwort des entfernten Root-Benutzers wie unten gezeigt einzugeben:

[email protected]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

Sobald der Benutzer authentifiziert ist, wird der öffentliche Schlüssel an die remote user authorized_keys-Datei angehängt und die Verbindung wird geschlossen.

Jetzt sollten Sie in der Lage sein, sich ohne Eingabe des Kennworts am Remote-Server anzumelden.

Um es zu testen, versuchen Sie einfach, sich über SSH auf Ihrem entfernten Server anzumelden:

ssh [email protected]

Wenn alles gut gegangen ist, werden Sie sofort eingeloggt.

Als nächstes müssen Sie die Lsyncd-Konfigurationsdatei bearbeiten und die rsyncssh- und Ziel-Host-Variablen definieren:

nano /etc/lsyncd/lsyncd.conf.lua

Ändern Sie die Datei wie unten gezeigt:

settings {
        logfile = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/var/log/lsyncd/lsyncd.status",
   statusInterval = 20,
   nodaemon   = false
}

sync {
        default.rsyncssh,
        source = "/etc/",
	host = "remote-server-ip",
        targetdir = "/opt"
}

Speichern und schließen Sie die Datei, wenn Sie fertig sind. Starten Sie dann den Lsyncd-Dienst neu, um die Synchronisierung zu starten.

systemctl restart lsyncd

Sie können den Status der Synchronisation mit dem folgenden Befehl überprüfen:

tail -f /var/log/lsyncd/lsyncd.log

Sie sollten die folgende Ausgabe sehen können:

Fri May  1 04:32:05 2020 Normal: --- Startup, daemonizing ---
Fri May  1 04:32:05 2020 Normal: recursive startup rsync: /etc/ -> 45.58.38.21:/opt/
Fri May  1 04:32:06 2020 Normal: Startup of "/etc/" finished: 0

Sie sollten in der Lage sein, die Änderungen im Verzeichnis /opt auf dem entfernten Server mit dem folgenden Befehl zu sehen:

ls /opt

Sie sollten sehen, dass alle Dateien und Verzeichnisse aus dem Verzeichnis /etc zum Verzeichnis /opt des Remote-Servers hinzugefügt werden:

acpi                    dconf           hosts            logrotate.conf       newt                     rc2.d          subuid-
adduser.conf            debconf.conf    hosts.allow      logrotate.d          nginx                    rc3.d          sudoers
alternatives            debian_version  hosts.deny       lsb-release          nsswitch.conf            rc4.d          sudoers.d
apache2                 default         init             lsyncd               ntp.conf                 rc5.d          sysctl.conf
apparmor                deluser.conf    init.d           ltrace.conf          openal                   rc6.d          sysctl.d
apparmor.d              depmod.d        initramfs-tools  lvm                  opt                      rcS.d          systemd
apport                  dhcp            inputrc          machine-id           os-release               resolv.conf    terminfo
apt                     dnsmasq.d       insserv.conf.d   magic                overlayroot.conf         rmt            timezone
at.deny                 docker          iproute2         magic.mime           PackageKit               rpc            tmpfiles.d
bash.bashrc             dpkg            iscsi            mailcap              pam.conf                 rsyslog.conf   ubuntu-advantage
bash_completion         e2scrub.conf    issue            mailcap.order        pam.d                    rsyslog.d      ucf.conf
bash_completion.d       environment     issue.net        manpath.config       passwd                   screenrc       udev
bindresvport.blacklist  ethertypes      kernel           mdadm                passwd-                  securetty      ufw
binfmt.d                fonts           kernel-img.conf  mime.types           perl                     security       update-manager
byobu                   fstab           landscape        mke2fs.conf          php                      selinux        update-motd.d
ca-certificates         fuse.conf       ldap             modprobe.d           pki                      sensors3.conf  update-notifier
ca-certificates.conf    fwupd           ld.so.cache      modules              pm                       sensors.d      vdpau_wrapper.cfg
calendar                gai.conf        ld.so.conf       modules-load.d       polkit-1                 services       vim
console-setup           groff           ld.so.conf.d     mtab                 pollinate                shadow         vmware-tools
cron.d                  group           legal            multipath            popularity-contest.conf  shadow-        vtrgb
cron.daily              group-          letsencrypt      multipath.conf       profile                  shells         vulkan
cron.hourly             grub.d          libaudit.conf    mysql                profile.d                skel           wgetrc
cron.monthly            gshadow         libnl-3          nanorc               protocols                sos.conf       X11
crontab                 gshadow-        locale.alias     netplan              pulse                    ssh            xattr.conf
cron.weekly             gss             locale.gen       network              python3                  ssl            xdg
cryptsetup-initramfs    hdparm.conf     localtime        networkd-dispatcher  python3.8                subgid         zsh_command_not_found
crypttab                host.conf       logcheck         NetworkManager       rc0.d                    subgid-
dbus-1                  hostname        login.defs       networks             rc1.d                    subuid

Schlussfolgerung

In der obigen Anleitung haben wir gelernt, wie man Lsyncd für die lokale Synchronisation und die Fernsynchronisation installiert und konfiguriert. Sie können Lsyncd jetzt in der Produktionsumgebung für Sicherungszwecke verwenden. Zögern Sie nicht, mich zu fragen, wenn Sie Fragen haben.

Das könnte Dich auch interessieren …