Pesquisa de site

Como sincronizar diretórios usando Lsyncd no Ubuntu 20.04


Nesta página

  1. Pré-requisitos
  2. Primeiros passos
  3. Instalar Lsyncd
  4. Configurar Lsyncd para sincronizar diretórios locais
  5. Configurar o Lsyncd para sincronizar diretórios remotos
  6. Conclusão

Lsyncd é uma ferramenta simples e leve que permite espelhar seu diretório local em outro diretório no servidor remoto. Ele funciona monitorando continuamente o diretório especificado em busca de alterações a cada poucos segundos e, se forem feitas alterações, elas serão sincronizadas com o servidor remoto. Esta ferramenta é muito útil para sincronizar os dados de uma área segura para uma área não segura.

Neste tutorial, mostraremos como instalar e usar o Lsyncd para sincronizar diretórios locais e remotos.

Pré-requisitos

  • Um servidor rodando Ubuntu 20.04.
  • Uma senha root é configurada em seu servidor.

Começando

Antes de começar, é uma boa ideia atualizar seu pacote de sistemas para a versão mais recente. Você pode atualizá-los usando o seguinte comando:

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

Depois que todos os pacotes forem atualizados, reinicie o sistema para aplicar as alterações.

Instalar o Lsyncd

Por padrão, o pacote Lsyncd está disponível na maioria dos sistemas operacionais Linux. Você pode instalá-lo apenas executando o seguinte comando:

apt-get install lsyncd -y

Depois que o Lsyncd estiver instalado, você pode verificar a versão instalada do Lsyncd com o seguinte comando:

lsyncd --version

Você deve obter a seguinte saída:

Version: 2.2.3

Configurar Lsyncd para sincronizar diretórios locais

Nesta seção, configuraremos o Lsyncd para sincronizar o diretório /etc/ com o diretório /mnt/ no sistema local.

Primeiro, crie um diretório para Lsyncd com o seguinte comando:

mkdir /etc/lsyncd

Em seguida, crie um novo arquivo de configuração Lsyncd e defina o diretório de origem e destino que deseja sincronizar.

nano /etc/lsyncd/lsyncd.conf.lua

Adicione as seguintes linhas:

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

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

Salve e feche o arquivo quando terminar.

systemctl start lsyncd
systemctl enable lsyncd

Você também pode verificar o status do serviço Lsyncd com o seguinte comando:

systemctl status lsyncd

Você deve ver a seguinte saída:

? 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.

Você pode verificar o arquivo de log Lsyncd para obter mais detalhes, conforme mostrado abaixo:

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

Você deve ver a seguinte saída:

/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.

Você também pode verificar o status de sincronização com o seguinte comando:

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

Você deve conseguir ver as alterações no diretório /mnt com o seguinte comando:

ls /mnt/

Você deve ver que todos os arquivos e diretórios do diretório /etc foram adicionados ao diretório /mnt:

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

Configurar o Lsyncd para sincronizar diretórios remotos

Nesta seção, configuraremos o Lsyncd para sincronizar o diretório /etc/ no sistema local com o diretório /opt/ no sistema remoto.

Antes de começar, você precisará configurar a autenticação baseada em chave SSH entre o sistema local e o servidor remoto para que o sistema local possa se conectar ao servidor remoto sem senha.

No sistema local, execute o seguinte comando para gerar uma chave pública e privada:

ssh-keygen -t rsa

Você deve ver a seguinte saída:

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 
The key's randomart image is:
+---[RSA 3072]----+
| E ..            |
|  ooo            |
| oo= +           |
|=.+ % o . .      |
| oSo. o    |
|ooo=B o .o o o   |
|=o.... o    o    |
|+.    o .. o     |
|     .  ... .    |
+----[SHA256]-----+

O comando acima irá gerar uma chave pública e privada dentro do diretório ~/.ssh.

Em seguida, você precisará copiar a chave pública para o servidor remoto. Você pode copiá-lo com o seguinte comando:

ssh-copy-id 

Você será solicitado a fornecer a senha do usuário root remoto, conforme mostrado abaixo:

's password: 

Number of key(s) added: 1

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

Assim que o usuário for autenticado, a chave pública será anexada ao arquivo autorizado_chaves do usuário remoto e a conexão será encerrada.

Agora, você deve conseguir fazer login no servidor remoto sem digitar a senha.

Para testá-lo, tente acessar seu servidor remoto via SSH:

ssh 

Se tudo correu bem, você será logado imediatamente.

Em seguida, você precisará editar o arquivo de configuração Lsyncd e definir o rsyncssh e as variáveis do host de destino:

nano /etc/lsyncd/lsyncd.conf.lua

Altere o arquivo como mostrado abaixo:

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"
}

Salve e feche o arquivo quando terminar. Em seguida, reinicie o serviço Lsyncd para iniciar a sincronização.

systemctl restart lsyncd

Você pode verificar o status da sincronização com o seguinte comando:

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

Você deve ver a seguinte saída:

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

Você deve conseguir ver as alterações no diretório /opt no servidor remoto com o seguinte comando:

ls /opt

Você deve ver que todos os arquivos e diretórios do diretório /etc são adicionados ao diretório /opt dos servidores remotos:

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

Conclusão

No guia acima, aprendemos como instalar e configurar o Lsyncd para sincronização local e sincronização remota. Agora você pode usar o Lsyncd no ambiente de produção para fins de backup. Sinta-se à vontade para me perguntar se tiver alguma dúvida.

Artigos relacionados: