Pull to refresh

Настраиваем RAID1+LVM (для снапшотов файловой системы) в Hetzner и ServerLoft

Reading time 4 min
Views 25K

Завалялась у меня тут инструкция, как включить LVM для корневой файловой системы на двух популярных dedicated-хостингах: Hetzner и ServerLoft. Публикую ее здесь.

LVM в Linux используется, в частности, чтобы единомоментно создавать «замороженные» снапшоты файловой системы, которые можно потом спокойно бэкапить, в то время как сервер продолжает работать. Это очень удобная функция, особенно для серверов баз данных: можно делать инкрементный бэкап базы данных, например, при помощи файлового rdiff-backup или duplicity (в том числе на удаленный FTP-сервер, бесплатное и быстрое место на котором предоставляют многие хостеры). Что касается RAID-1 (зеркалирование на 2 дисках), то оно абсолютно необходимо на сервере, чтобы при выходе из строя одного из дисков его можно было заменить, не останавливая машину. Конечно же, нужно ставить LVM поверх RAID-1.

Но беда в том, что ни Hetzner, ни ServerLoft не позволяют включить LVM при первичном создании машины «при помощи одной лишь мышки». Вместо этого они дают возможность установить один из фиксированных образов ОС, максимум что — с включенным RAID-1. Ниже — две инструкции, как переключить такую «налитую» машину на использование LVM для корневой файловой системы, а потом — короткий пример того, как работать со снапшотами. Работать будем с Ubuntu Server 12.04 minimal (для других ОС конфигурация может отличаться).

Внимание: если решили попробовать, выполняйте все эти действия только там, где не жалко потерять данные. Ни в коем случае не экспериментируйте с «живым» сервером, если не разбираетесь досконально в вопросе.

Включаем LVM на машине в Hetzner

Ниже предполагается, что вам нужно только 220G на диске (всего LVM-том содержит 300G, но оставшееся место нам потребуется для создания снапшотов). Если диск больше, но вам совершенно не нужно лишнее место, лучше оставить меньшее значение — это ускоряет перестроение RAID-1 в случае аварий.

  1. Select OS type «recover» when you install a new machine.
  2. Login via SSH and run «installimage» command (just type «installimage» and press Enter).
  3. Select Ubuntu-1204-precise-64-minimal.
  4. Enter the following configuration in the opened editor:
    DRIVE1 /dev/sda
    DRIVE2 /dev/sdb
    SWRAID 1
    SWRAIDLEVEL 1
    BOOTLOADER grub
    HOSTNAME newhost
    PART /boot  ext2     512M
    PART lvm    vg0      300G
    # We use only 300G of our large HDD to speedup RAID1 rebuild if it happens.
    # Anyway, we do not need so much space typically, so 300G is enough.
    LV vg0  swap  swap  swap      4G
    LV vg0  tmp   /tmp  reiserfs  10G
    LV vg0  root  /     ext3      220G
    IMAGE /root/.oldroot/nfs/install/../images/Ubuntu-1204-precise-64-minimal.tar.gz
    
  5. Press F2, then F10 and wait until the installation is finished.

Включаем LVM на машине в ServerLoft

В ServerLoft нет такой богатой утилиты конфигурирования, как Hetzner-овский installimage, а также lvm2 не включен по умолчанию в список пакетов, поэтому инструкция получается сложнее. Немало крови было пролито на ее составление. Ниже мы создаем LVM-том размером 80% от свободного места на диске, оставляя 20% для поддержки снапшота. Скрипт работает правильно как для software RAID, так и для hardware RAID (да, некоторые конфигурации в ServerLoft имеют hardware RAID — я бы не рекомендовал такие брать из-за ухудшения прозрачности, конечно, но они встречаются).

  1. Select OS type «Ubuntu 12.04 Minimal, software RAID1» at my.serverloft.com/en/Dedicated/Restore
  2. Enter the recovery mode after the installation is finished at my.serverloft.com/en/Dedicated/Recovery/Index
  3. Run the following commands to prepare partitions:
    if mdadm -A --scan; then
      export DEV_BOOT=/dev/md0
      export DEV_LARGE=/dev/md2
    else
      export DEV_BOOT=/dev/sda2
      export DEV_LARGE=/dev/sda4
    fi
    mount $DEV_LARGE /mnt
      mkdir /rootcopy
      if [ -d /mnt/rootcopy ]; then
        echo "Please enter the recovery mode before running this script!"
        rmdir /rootcopy; sleep 5; exit
      fi
      cp -a /mnt/* /rootcopy
      umount $DEV_LARGE
    pvcreate $DEV_LARGE
      vgcreate vg0 $DEV_LARGE
      lvcreate --name tmp  --size 10G vg0
      lvcreate --name root -l 80%FREE vg0
      mkfs.ext3 /dev/mapper/vg0-tmp
      mkfs.ext3 /dev/mapper/vg0-root
    mount /dev/mapper/vg0-root /mnt
      cp -a /rootcopy/* /mnt
      rm -rf /rootcopy
      mount $DEV_BOOT /mnt/boot
        mount -o bind /dev /mnt/dev
        mount -t proc none /mnt/proc
        mount -t sysfs none /mnt/sys
        perl -p -i -e 's{^[^\s#]+\s+/\s+\S+}{/dev/mapper/vg0-root / ext3}s' /mnt/etc/fstab
        echo "/dev/mapper/vg0-tmp  /tmp  ext3  defaults,noatime 0 4" >> /mnt/etc/fstab
        chroot /mnt apt-get install lvm2 --yes
        chroot /mnt update-grub
        chroot /mnt grub-install /dev/sda
        chroot /mnt grub-install /dev/sdb
        umount /mnt/sys
        umount /mnt/proc
        umount /mnt/dev
        umount $DEV_BOOT
      umount /dev/mapper/vg0-root
    
  4. Reboot the server, then in 30 seconds — stop the recovery mode at my.serverloft.com/en/Dedicated/Recovery/Index (maybe reboot twice if the first reboot will not succeed).

Пример, как пользоваться снапшотами

Собственно, имея настроенный LVM, можно делать вот такую магию:

# На случай, если в прошлый раз забыли отмонтировать, отмонтируем сейчас.
lvremove -f /dev/vg0/snap 2>/dev/null
# Создаем новый снапшот (40G — это макс. объем, который может быть записан в корневую
# файловую систему, пока снапшот активен). Потом монтируем его для использования.

lvcreate -L40G -s -n snap /dev/vg0/root
mount /dev/vg0/snap /mnt -o ro
# Дальше спокойно делаете бэкап /mnt/* — там будет «замороженное» состояние корневой файловой системы.
duplicity… /mnt…
# Отмонтируем и удаляем снапшот.
umount /mnt
lvremove -f /dev/vg0/snap

Памятка тому, кто использует OpenVZ

По умолчанию в OpenVZ-ядрах не включена поддержка LVM — точнее, Device Mapper-а (в /boot/initrd* отсутствует dm-mod в conf/modules). Если вы хотите потом использовать OpenVZ поверх LVM, можно запустить вот такой скрипт для добавления в существующий initrd модуля dm-mod (распаковали-добавили-запаковали), а также превращения OpenVZ в ядро по умолчанию. Вероятно, есть и более простой способ, но я приведу тот, который когда-то использовал:

FILE=`ls /boot/initrd.img-*stab* 2>/dev/null | head -n 1`
if [ "$FILE" == "" ]; then
  echo Cannot find an OpenVZ initrd in /boot. Aborting.
  exit 1
fi
rm -rf /tmp/initrd* 2>/dev/null
mkdir /tmp/initrd
cd /tmp/initrd
zcat $FILE | cpio -i
if ! grep "dm-mod" conf/modules >/dev/null; then
  echo dm-mod >> conf/modules
  find ./ | cpio -H newc -o | gzip > /tmp/initrd-new
  cat /tmp/initrd-new > $FILE
fi
cd /
rm -rf /tmp/initrd*
sed -i '
  s/GRUB_DEFAULT=.*/GRUB_DEFAULT=1/;
  s/#GRUB_DISABLE_RECOVERY=.*/GRUB_DISABLE_RECOVERY=true/;
  s/GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX="selinux=no"/;
' /etc/default/grub
update-grub
Tags:
Hubs:
+15
Comments 13
Comments Comments 13

Articles