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

от автора


Завалялась у меня тут инструкция, как включить 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 to 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 200M of our large HDD to speedup RAID1 rebuild if it happens. # Anyway, we do not need so much space, so 200G 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% для поддержки снапшота.

  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:
     export DEV_BOOT=/dev/md0 export DEV_LARGE=/dev/md2 mdadm -A --scan mkdir /rootcopy   mount $DEV_LARGE /mnt   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.ext4 /dev/mapper/vg0-tmp   mkfs.ext4 /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+)}{/dev/mapper/vg0-root$1}s' /mnt/etc/fstab     echo "/dev/mapper/vg0-tmp  /tmp  ext4  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 

ссылка на оригинал статьи http://habrahabr.ru/post/176369/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *