Как использовать RSync на Backup-сервере Hetzner

Hetzner предлагает для владельцев выделенных серверов место для резервного хранения, доступ к которому возможен только из локальной сети Hetzner. К сожалению Hetzner на своих Backup-серверах не поддерживает RSync. Чтобы воспользоваться всеми прелестями инкрементальных-баккупов и т.п. существует решение, которое не совсем поддерживается Hetzner, но тем не менее описано в его wiki.

План такой.

  1. Примонтировать Backup-сервер через sshfs.
  2. Создать на нем образ диска при помощи утилиты dd.
  3. Примонтировать этот образ диска в локальную директорию.
  4. Сконфигурировать RSync для работы с локальной директорией.
  5. PROFIT!!!
    1. Я попробовал решить задачу влоб — mount и fstab. Не получилось. На старте системы образ диска, расположенный в директории, примонтированной через sshfs, не подключался. Backup-сервер во время работы мог отмонтироваться и не примонтироваться обратно. Опыта работы с этой темой у меня немного, поэтому если у кого-то есть рабочее решение, то не поленитесь и скиньте его в комменты. Буду очень рад его узнать.

      Я пошел по другому пути — autofs. Autofs утилита, которая автоматически примонтирует что угодно при первом обращении к ресурсу и автоматически отмонтирует ресурс через некоторое время. В DebianUbuntu autofs из репозитория не может примонтировать образ диска с backup-сервера, который перед этим нужно тоже примонтировать. Проблема в том что в репозитории версия autofs собрана без ключика —disable-mount-locking. Нам придется перекомпилировать autofs перед использованием.

      Поехали!

      Начнем с autofs. Установим необходимые пакеты для сборки:

      sudo apt-get install build-essential fakeroot dpkg-dev
      

      Получим исходники autofs. Если ваша версия autofs отличается от 5.0.7-3, то поправьте её в команде ниже.

      cd /usr/src
      mkdir autofs
      cd autofs
      apt-get source autofs
      apt-get build-dep autofs
      dpkg-source -x autofs_5.0.7-3.dsc
      

      Теперь у нас есть исходники пакета autofs. Добавим необходимый ключ в правила сборки пакета.

      cd autofs-5.0.7/debian
      vi rules
      

      Вы увидите такой фрагмент в файле:

      # Also explicitly define some dirs/locations which will be searched
      # if not defined.
              MOUNT=/bin/mount UMOUNT=/bin/umount 
              MOUNT_NFS=/sbin/mount.nfs 
              E2FSCK=/sbin/fsck.ext2 E3FSCK=/sbin/fsck.ext3 E4FSCK=/sbin/fsck.ext4 
              initdir=/etc/init.d piddir=/var/run 
              dh_auto_configure -- 
                      --enable-force-shutdown 
                      --enable-ignore-busy 
                      --mandir=/usr/share/man 
                      --with-confdir=/etc/default 
                      --with-mapdir=/etc 
                      --with-fifodir=/var/run --with-flagdir=/var/run 
                      --with-hesiod 
                      --with-openldap 
                      --with-sasl
      # Always define HAVE_SLOPPY_MOUNT (mount -s).  Also a hack and
      # the same comment as above applies: upstream should use it unconditionally.
      

      Сделайте его таким, убрав строку содержащую ключ —enable-force-shutdown и добавив строку содержащую ключ —disable-mount-locking:

      # Also explicitly define some dirs/locations which will be searched
      # if not defined.
              MOUNT=/bin/mount UMOUNT=/bin/umount 
              MOUNT_NFS=/sbin/mount.nfs 
              E2FSCK=/sbin/fsck.ext2 E3FSCK=/sbin/fsck.ext3 E4FSCK=/sbin/fsck.ext4 
              initdir=/etc/init.d piddir=/var/run 
              dh_auto_configure -- 
                      --enable-ignore-busy 
                      --disable-mount-locking 
                      --mandir=/usr/share/man 
                      --with-confdir=/etc/default 
                      --with-mapdir=/etc 
                      --with-fifodir=/var/run --with-flagdir=/var/run 
                      --with-hesiod 
                      --with-openldap 
                      --with-sasl
      # Always define HAVE_SLOPPY_MOUNT (mount -s).  Also a hack and
      # the same comment as above applies: upstream should use it unconditionally.
      

      Сохраните файл и перейдите в директории на уровень выше:

      cd ..
      

      Запускаем сборку:

      dpkg-buildpackage -rfakeroot -b
      

      И затем, если все собралось хорошо, устанавливаем пакет:

      dpkg -i ../autofs_5.0.7-3_amd64.deb
      

      У нас есть работающий autofs, теперь установим остальные компоненты:

      apt-get install sshfs
      

      Все компоненты у нас есть.

      Настроим вход без пароля на сервер резервного копирования согласно мануалу Hetzner (откроется в новом окне).

      Как только вы добьетесь того что на backup-сервер можно будет заходить по sftp без пароля можно настроить autofs. Я вдохновлялся вот этим мануалом, но у меня оно не заработало в том виде, который предлагает автор.

      Создадим каталог в который будем монтировать место для резервного копирования:

      mkdit /mnt/sshfs
      

      Добавим эту строку в файл /etc/auto.master:

      /mnt/sshfs /etc/auto.sshfs uid=0,gid=0,--timeout=30,--ghost
      

      Создадим файл /etc/auto.sshfs и добавим в него следующее (не забудте поменять uXXXXXX@uXXXXXX.your-backup.de):

      hetzner-backup-server -fstype=fuse,rw,nodev,nonempty,allow_other,reconnect,max_read=65536 :sshfs#uXXXXXX@uXXXXXX.your-backup.de:/
      

      Теперь перезапустим autofs и проверим как оно работает:

      service autofs restart
      cd /mnt/sshfs/hetzner-backup-server
      ls -lh
      

      Если вы не увидели никаких ошибок, а увидели список файлов и папок на вашем backup-сервере, то все ОК. Если не ОК, то см. ниже как отлаживать autofs.

      Теперь создадим образ диска (замените 100G на объем доступный вам):

      dd if=/dev/zero of=/mnt/sshfs/hetzner-backup-server/backup.img bs=1 seek=100G count=1
      mkfs.ext4 /mnt/sshfs/hetzner-backup-server/backup.img
      

      Добавим эту строку в файл /etc/auto.master:

      /backups /etc/auto.img --timeout=30
      

      Создадим файл /etc/auto.img и добавим в него следующее:

      hetzner-backup-server -fstype=ext4,defaults,loop :/mnt/sshfs/hetzner-backup-server/backup.img
      

      Теперь перезапустим autofs:

      service autofs restart
      

      Теперь при обращении к /backups/hetzner-backup-server сначала autofs примонтирует место для резервного копирования через sshfs, а затем с него примонтирует наш образ диска backup.img в локальную ФС /backups/hetzner-backup-server.

      Теперь настроим инкрементальное резервное копирование с помощью RSync.

      Скачайте удобный скрипт, который упрощает работу: https://github.com/florianbeer/hactar и разместите его в /usr/local/bin/hactar.

      Затем создадим файл со списоком того, что мы бы не хотели иметь в резервной копии, и разместим его в /etc/hactar.excludes. Мой файл выглядит так:

      /backups
      /backup
      /bin
      /boot
      /db
      /dev
      /lib
      /lib64
      /lost+found
      /media
      /mnt
      /proc
      /run
      /sbin
      /selinux
      /sys
      /tmp
      /var/backups
      /var/cache
      /var/lib
      /var/lock
      /var/log
      /var/opt
      /var/run
      /var/tmp
      /var/swap.img
      

      Теперь добавим задачу в cron. Будем создавать инкрементальную копию каждый день в два часа ночи, хранить копии 120 дней и выводить как можно больше информации в лог:

      0 2 * * * /usr/local/bin/hactar -v -r 120 / /backups/hetzner-backup-server > /var/log/hacktar.log
      

      Теперь настроим резервное копирование MySQL. Пока я решил попробовать использовать logrotate для этого.

      Создадим файл конфигурации для logrotate /etc/logrotate.d/mysql-backup с таким содержанием, заменив PASSWORD на ваш пароль root для mysql и DATABASES на список ваших баз данных, которые вы хотите сохранить, разделенный пробелами:

      /backups/hetzner-backup-server/mysql/all.sql.gz {
          daily
          rotate 120
          nocompress
          create 640 root adm
          postrotate
          mysqldump -uroot -pPASSWORD --databases DATABASES  > /backups/hetzner-backup-server/mysql/all.sql --single-transaction
          gzip -9f /backups/hetzner-backup-server/mysql/all.sql
          endscript
      }
      

      Делаем так

      touch /backups/hetzner-backup-server/mysql/all.sql.gz
      logrotate -f /etc/logrotate.d/mysql-backup
      

      Все.

      Что делать если autofs не монтирует ресурсы

      Отлаживать и еще раз отлаживать.

      Откройте два терминала и в одном остановите демон autofs:

      service autofs stop
      

      И запустите приложение в ручную включив режим вывода информации:

      automount -f -v
      

      Пытайтесь переходить в каталоги, которые должны содержать примонтированные ресурсы и смотреть что выводит automount.

      Если вам понравилось, пожалуйста, не поленитесь кликнуть «мне нравится» или «поделиться» или «+1» чуть ниже, или кинуть ссылку на статью в свой блог или форум. Спасибо :)

      Вы можете оценить эту статью: 12345 Загрузка...

Комментарии приветствуются (уже оставили 1 комментарий)
  1. avatar Игорь:

    Поделюсь своим опытом монтирования хранилища hetzner к linux и последующего расшаривания через NFS для подключения к гипервизору esxi.
    Добавить в /etc/fstab следующую строку:
    //your-user-number.your-backup.de/backup /mnt/hetzner-backup cifs iocharset=utf8,rw,username=your-user-number,password=your-password,uid=root,gid=root,file_mode=0660,dir_mode=0770 0 0

    sudo apt install fuse-convmvfs

    sudo mkdir /mnt/hetzner-backup-fuse

    Добавить в файл /etc/exports:
    /mnt/hetzner-backup-fuse/ your-ip-address(rw,sync,fsid=0,no_subtree_check,no_root_squash)

    В файл /etc/fstab добавить:
    convmvfs /mnt/hetzner-backup-fuse fuse srcdir=/mnt/hetzner-backup,icharset=utf8,ocharset=utf8 0 0

    После такой манипуляции на внешнем адресе будет NFS шара хранилища hetzner.

    Из минусов нельзя прописать несколько шар в файле /etc/exports, будет светиться только последняя строчка, хотя в саму систему в файл /etc/fstab может примонтировать сколько угодно fuse фс.

Добавить комментарий

Ваш e-mail не будет опубликован.

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.