(mini Howto) Клонирование системы с raid1, lvm на новый диск

Автор gardarea51, 02 февраля 2013, 15:05:34

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

gardarea51

Клонируемая система трудится поверх raid1 (mdadm) в lvm-партициях (lvm over software raid 1). В raid1 используются 2 диска WD RE 1Tb, на каждом диске создано по 1му разделу, которые и объединены в raid. Бэкапы самой системы выполняются по расписанию с lvm-снапшотов (раз в месяц полный бэкап, раз в день - разница от месячного) с помощью tar --listed-incremental. То есть бэкапы - это просто архивы с файлами. Уже не раз я успешно переносил с помощью tar всю систему с одного диска на другой и потому это решение показалось мне простым и удобным.

Систему нужно склонировать на третий такой же диск, как два работающих в массиве. Самый простой вариант - выдернуть из работающего массива диск, вставить чистый и добавить его в массив заместо вынутого. Но мне не хотелось вынимать диски или выключать компьютер, я решил сделать по другому. К тому же это в дальнейшем может пригодиться для подобного восстановления, когда рабочего компьютера нет, а есть только копия его системы в архиве. Теперь опишу по шагам, что я делал, надеюсь ничего не забыть, потому что пишу по памяти.

На рабочем компьютере поверх raid1 есть 3 lvm-раздела, это: /dev/lvm_group/boot, /dev/lvm_group/root, /dev/lvm_group/swap. Из названий разделов я думаю понятно что это /boot, swap и /.

Первым делом с помощью sfdisk была воссоздана структура разделов на новом диске. Если диски одинаковы, то в этом нет нужны, достаточно с помощью cfdisk создать раздел во весь диск, он будет такой-же как и на работающих дисках. Но для полной точности sfdisk подойдет лучше.
sfdisk -d /dev/sda > part.back - сохранить таблицу разделов в файл
sfdisk /dev/sda < part.back - восстановить таблицу разделов из файла на чистый диск


После этого был создан raid-масив /dev/md0, но пока из одного диска:
mdadm -C /dev/md0 -l 1 -n 2 /dev/sdc1 missing
Не помню точно запустился ли массив сразу, но если не запустился, то запустить его можно командами:mdadm --assemble --scan
mdadm --assemble /dev/md0 /dev/sdc1

После этого команда cat /proc/mdstat сообщит нам о том, что массив запущен и работает:root@area51:~# cat /proc/mdstat                                                                                                                                     
Personalities : [raid1]                                                                                                                                             
md0 : active (auto-read-only) raid1 sdc1[0]                                                                                                                         
      976628736 blocks super 1.2 [2/1] [U_]                                                                                                                         
     
unused devices: <none>

Детали созданного массива можно посмотреть так: root@area51:~# mdadm -QD /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Feb  1 18:08:09 2013
     Raid Level : raid1
     Array Size : 976628736 (931.39 GiB 1000.07 GB)
  Used Dev Size : 976628736 (931.39 GiB 1000.07 GB)
   Raid Devices : 2
  Total Devices : 1
    Persistence : Superblock is persistent

    Update Time : Sat Feb  2 14:37:34 2013
          State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
  Spare Devices : 0

           Name : area51:0  (local to host area51)
           UUID : b18057c8:8f6c1add:604d4c8d:35d5f841
         Events : 27010

    Number   Major   Minor   RaidDevice State                                                                                                                       
       0       8       33        0      active sync   /dev/sdc1                                                                                                     
       1       0        0        1      removed

Однако с массивом пока-что не все. Нам нужно, чтобы он был полностью идентичен массиву с клонируемой системой. Время посмотреть файл /etc/mdadm/mdadm.conf из архива. Вот какой он был у меня:
root@area51:/# cat /etc/mdadm/mdadm.conf
# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default, scan all partitions (/proc/partitions) for MD superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
#DEVICE partitions

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
#MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md/0 metadata=1.2 UUID=c5c0e611:ab86dc1a:ea66c714:1b3f808a name=smb:0

# This file was auto-generated on Wed, 10 Oct 2012 14:06:34 +0600
# by mkconf 3.1.4-1+8efb9d1+squeeze1

# Execute program on events
PROGRAM /root/mdadm_alert


Интересующая нас трока описания массива:
ARRAY /dev/md/0 metadata=1.2 UUID=c5c0e611:ab86dc1a:ea66c714:1b3f808a name=smb:0
в то время как созданный нами массив имеет следующие свойства (см. выше):
           Name : area51:0  (local to host area51)
           UUID : b18057c8:8f6c1add:604d4c8d:35d5f841
         Events : 27010

Нам нужно остановить массив, обновить его имя и uuid, иначе при загрузке у будущем он не сможет автоматически собираться (есть второй способ - позже поменять mdadm.conf, указав там UUID и имя новосозданного массива). Это можно сделать и в самом конце, уже после установки загрузчика, только делать это придется в busybox, когда система при попытке запуститься не сможет обнаружить lvm-тома, так как не запустился массив /dev/md0. Команды будут те же самые (останавливаем массив, запускаем обновляя uuid, останавливаем, запускаем меняя name):
mdadm -S /dev/md0
mdadm -A /dev/md0 -U uuid --uuid=c5c0e611:ab86dc1a:ea66c714:1b3f808a /dev/sda1
mdadm -S /dev/md0
mdadm -A /dev/md0 -U name --name=smb:0 /dev/sda1

Убедиться в изменениях можно с помощью вышеприведенной команды просмотра информации о массиве: mdadm -QD /dev/md0

Итак, с массивом закончили. Дальше нужно воссоздать на нем ту же самую структуру lvm, которая есть на клонируемой системе. Для этого нам понадобится файл, который мы скопировали с клонируемой системы (или достали из архива), это файл /etc/lvm/backup/lvm_group. Этот файл можно получить еще и выполнением команды (на работающей системе, которую предстоит клонировать):vgcfgbackup -f somefile.vgbackup lvm_group
Мой файл vgbackup.back выглядел следующим образом:
root@area51:~# cat /media/HP500Portable/vgbackup.back
# Generated by LVM2 version 2.02.66(2) (2010-05-20): Fri Feb  1 14:59:17 2013

contents = "Text Format Volume Group"
version = 1

description = "vgcfgbackup -f /mnt/backups_disk/vgbackup.back lvm_group"

creation_host = "smb"   # Linux smb 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64
creation_time = 1359709157      # Fri Feb  1 14:59:17 2013

lvm_group {
        id = "2zDXZZ-KSUZ-0nsA-iMfA-LoL2-HAzw-BGTQai"
        seqno = 311
        status = ["RESIZEABLE", "READ", "WRITE"]
        flags = []
        extent_size = 8192              # 4 Megabytes
        max_lv = 0
        max_pv = 0

        physical_volumes {

                pv0 {
                        id = "B8QTw8-MpHA-xLpM-cnjH-aw9k-sdwM-WT1vpT"
                        device = "/dev/md0"     # Hint only

                        status = ["ALLOCATABLE"]
                        flags = []
                        dev_size = 1953517682   # 931,51 Gigabytes
                        pe_start = 384
                        pe_count = 238466       # 931,508 Gigabytes
                }
        }

        logical_volumes {

                boot {
                        id = "oOFhWn-21Kk-YAkt-bpXg-Bx1L-2yZ9-N9bUva"
                        status = ["READ", "WRITE", "VISIBLE"]
                        flags = []
                        segment_count = 1

                        segment1 {
                                start_extent = 0
                                extent_count = 123      # 492 Megabytes

                                type = "striped"
                                stripe_count = 1        # linear

                                stripes = [
                                        "pv0", 0
                                ]
                        }
                }

                swap {
                        id = "UzL9tl-0BWN-kyV6-S6wD-wUX8-VwcN-q6hF9F"
                        status = ["READ", "WRITE", "VISIBLE"]
                        flags = []
                        segment_count = 1

                        segment1 {
                                start_extent = 0
                                extent_count = 977      # 3,81641 Gigabytes

                                type = "striped"
                                stripe_count = 1        # linear

                                stripes = [
                                        "pv0", 123
                                ]
                        }
                }

                root {
                        id = "qy2eUy-RJYa-U63a-fjMV-7zAB-7T8F-CxPz0X"
                        status = ["READ", "WRITE", "VISIBLE"]
                        flags = []
                        segment_count = 1

                        segment1 {
                                start_extent = 0
                                extent_count = 208640   # 815 Gigabytes

                                type = "striped"
                                stripe_count = 1        # linear

                                stripes = [
                                        "pv0", 1100
                                ]
                        }
                }

        }
}

Изначально в нем, кроме указанных разделов была информация о снапшотах, но я просто удалил ее в текстовом редакторе. Мне нужны 3 основных lv-тома. Теперь нужно на созданном /dev/md0 воссоздать структуру lvm, используя этот файл. Если внимательно посмотреть на файл бэкапа lvm-таблицы, то можно увидеть следующую запись:
physical_volumes {

                pv0 {
                        id = "B8QTw8-MpHA-xLpM-cnjH-aw9k-sdwM-WT1vpT"
                        device = "/dev/md0"     # Hint only

Это часть описания pv, на котром работает vg lvm_group, в качестве pv выступает /dev/md0. Идентификатор pv при создании генерируется случайно, но нам нужно, чтобы на новом диске он был такой же (нет полной уверенности, но думаю это так). Я сделал это следующим образом:
pvcreate --uuid="B8QTw8-MpHA-xLpM-cnjH-aw9k-sdwM-WT1vpT" --restorefile vgbackup.back /dev/md0
vgcfgrestore -f vgbackup.back lvm_group

Теперь на новом диске появилась такая же структура lvm, как и на клонируемой системе. Не помню точно запускаются ли vg и lv после выполнения этой команды, если нет, то:
vgscan
vgchange -ay lvm_group

Для получения сведений о том, что тома видятся и работают можно воспользоваться командами: lvs, vgs, pvs.

Итак, массив работает, lvm-тома поверх него созданы и запущены, теперь нужно скопировать файлы системы в /boot и / из архивных копий. Для этого нужно создать ФС (mkfs.ext4 и mkswap) на lvm-томах и смонтировать тома к примеру в /mnt. Я смонтировал их так:
mount /dev/lvm_group/root /mnt/root/
mount /dev/lvm_group/boot /mnt/root/boot/


После завершения копирования всех файлов нужно сделать chroot в клонируемую систему, пересобрать initrd (кажется это необязательно) и установить grub. Для этого я выполнил примерно следующее:
mount --bind /dev/ /mnt/root/dev/
mount --bind /proc/ /mnt/root/proc/
mount --bind /sys/ /mnt/root/sys/
chroot /mnt/root

Теперь мы в нашей клонируемой системе.
После этого нужно запустить команду
update-initramfs -u -k all
если что-то не так (вы забыли поменять UUID и имя масива - она выдаст вам наводящие предупреждения. Если все прошло нормально, то осталось только устаносить загрузчик, я сделал это так:
grub-install --recheck /dev/sdc
update-grub

После этого я вышел из chroot-окружения, отмонтировал lvm-тома и перезагрузился, загрузившись уже с диска со склонированной системой. Система запустилась и прекрасно работает.


Надеюсь, что описал весь процесс клонирования системы, ничего не забыв. Буду рад, если это кому-то поможет сделать нечто подобное.

rayanAyar

Цитата: gardarea51 от 02 февраля 2013, 15:05:34Из названий разделов я думаю понятно что это /boot, swap и /
А зачем отдельный boot?

gardarea51

Незнаю даже, видимо просто привычка и желание разместить свой вторым номером.