Тариф успешно добавлен в корзину
В корзину
url image

Зеркалирование дисков на выделенном сервере

Статья давно не обновлялась, поэтому информация могла устареть.

Содержание

Запланированная замена диска

В случае конфигурации рейд-массива, где разные разделы диска находятся в разных устройствах md, следует повторить операции для каждого их них. Информация об этом доступна при команде cat /proc/mdstat

Помечаем диск sdb как сбойный

# mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0

Удаляем диск из массива

# mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0

Производим замену диска

Копирование информации с диска на диск

dd

Копирование дисков с одинаковым размером, или на диск большего объема, с потерей “лишнего” места.

# dd if=/dev/sda of=/dev/sdb bs=1M

Создание образа диска и его восстановление

  • Копирование:
# dd if=/dev/sda of=/mnt/bak/sda.img bs=1M
  • Восстановление:
# dd if=/mnt/bak/sda.img of=/dev/sda bs=1M

rsync

Для того чтобы скопировать информацию при помощи rsync, нужно сначала скопировать таблицу разделов, либо создать ее самому.

Маунтим новый диск:

# mount /dev/sda1 /mnt/root/

После этого запустить копирование информации при помощи rsync:

# rsync -avP --exclude='/mnt/*' / /mnt/root/

dump/restore

Копировние с диска

Для того чтобы скопировать информацию при помощи dump/restore, нужно сначала скопировать таблицу разделов, либо создать ее самому на новом диске.

Маунтим новый диск:

# mount /dev/sda1 /mnt/root/

Если несколько разделов, то маунтим все разделы, которые будем копировать.

После этого запустить копирование информации при помощи dump/restore

# dump -0Lf - / | (cd /mnt/root ; restore -rf -)

Так же выполняем для других разделов, например boot:

# dump -0Lf - /boot | (cd /mnt/boot ; restore -rf -)

Копирование из ранее подготовленного дампа

Подготавливаем простой дамп:

# dump -0Lf /путь/до/файла/sda1.img /dev/sda1

Подготовка диска для восстановления такая же как и в копировании с диска на диск напрямую. После того как диск подготовлен выполняем восстановление:

# cd /mnt/root
# restore -rf /путь/до/файла/sda1.img

Raid 1 (зеркало)

Про RAID и их уровни можно прочитать здесь Остановимся на зеркалировании и посмотрим, как можно настроить его на FreeBSD (8,9) и Linux. ВНИМАНИЕ! Рекомендую сразу прочитать пункт Возможные проблемы. Это может помочь в решении некоторых проблем.

FreeBSD 8

Настройка зеркалирования на этой ОС приятное и наименее трудозатратное действо.

Устанавливаем разрешение записи в таблицу разделов.

# sysctl kern.geom.debugflags=16
kern.geom.debugflags 0 -> 16

Создаем зеркало из первого диска

# gmirror label -v -b round-robin gm0 /dev/ad0
Metadata value stored on /dev/ad0

Добавим загрузку GEOM в файл /boot/loader.conf:

# echo 'geom_mirror_load="YES"' » /boot/loader.conf

Правим /etc/fstab

# cp /etc/fstab /etc/fstab_orig
# vi /etc/fstab

Следующие записи

# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b none swap sw 0 0
/dev/ad0s1a / ufs rw 1 1

меняем на

# Device Mountpoint FStype Options Dump Pass#
/dev/mirror/gm0s1b none swap sw 0 0
/dev/mirror/gm0s1a / ufs rw 1 1

Если у Вас диск размечен по-своему, то выполняйте замену соответственно Вашей структуре. Т.е. все строки вида /dev/adX меняются на /dev/mirror/gm0

Перезагружаем. Сервер должен загрузиться с зеркала.

Теперь добавляем второй диск:

# gmirror insert gm0 /dev/ad1
GEOM_MIRROR: Device gm0: provider ad1 detected.
GEOM_MIRROR: Device gm0: rebuilding provider provider ad1.

Сразу после добавления диска система начнет синхронизацию дисков. Посмотреть текущий статус можно командой:

# gmirror status
     Name    Status  Components
mirror/gm0  DEGRADED  ada0
                      ada1 (1%)

FreeBSD 9

По умолчанию 9-я версия FreeBSD использует таблицу разделов GPT

Посмотреть, какая таблица разделов используется (mbr или GPT), можно так

# gpart show

Понадобится:

  • Установленная FreeBSD на один из дисков.
  • Пустой второй диск такого же размера.
  • KVM для доступа к серверу в Single User Mode или загрузка сервера в режим восстановления (rescue/LiveCD)

Копируем таблицу раздела исходного диска на второй.

# gpart backup ada0 | gpart restore -F /dev/ada1

Сверяем таблицу через

# gpart show

Записи для обоих дисков должны быть одинаковыми. Примерно так:

free# gpart show 
=>      34  20971453  ada0  GPT  (10G) 
        34       128               1  freebsd-boot  (64k) 
       162  19920768         2  freebsd-ufs  (9.5G) 
  19920930   1048576     3  freebsd-swap  (512M) 
  20969506      1981        - free -  (990k) 

=>      34  20971453  ada1  GPT  (10G) 
        34       128     	    1  freebsd-boot  (64k) 
       162  19920768         2  freebsd-ufs  (9.5G) 
  19920930   1048576     3  freebsd-swap  (512M) 
  20969506      1981        - free -  (990k)

Добавим загрузку GEOM в файл /boot/loader.conf:

# echo 'geom_mirror_load="YES"' » /boot/loader.conf

Перезагружаемся в режим восстановления, придется выполнить gmirror load, чтобы загрузить GEOM.

Создаем зеркало.

Эта последовательность команд создаст три устройства (boot/root/swap).

# gmirror label -vb round-robin boot /dev/ada0p1
# gmirror label -vb round-robin root /dev/ada0p2
# gmirror label -vb round-robin swap /dev/ada0p3

Учтите, что во FreeBSD 8 разделы именуются по другому (ad4s1(2,3); ad6s1(2,3)).

После нужно поправить fstab, который находится «в корне». В нашем случае — это /dev/mirror/root

# mount -rw /dev/mirror/root /mnt
# cp /mnt/etc/fstab /mnt/etc/fstab_orig
# ee /mnt/etc/fstab
# Device Mountpoint Fstype Options Dump Pass#
/dev/ada0p2  / ufs rw 1 1
/dev/ada0p3  none swap sw 0 0

меняем на

# Device Mountpoint Fstype Options Dump Pass#
/dev/mirror/root  / ufs rw 1 1
/dev/mirror/swap  none swap sw 0 0

отмонтируем устройство

# umount /mnt

и перезагружаемся

# reboot 

Сервер должен загрузиться с зеркала, которое мы только что создали.

Этими командами мы добавляем второй диск в каждое из зеркалирующих устройств GEOM. Теперь необходимо дождаться окончания синхронизации.

# gmirror insert boot /dev/ada1p1
# gmirror insert root /dev/ada1p2
# gmirror insert swap /dev/ada1p3

Проверяем зеркало через

# gmirror status
 
       Name    Status  Components 
mirror/boot  COMPLETE  ada0p1 (ACTIVE) 
	               ada1p1 (ACTIVE) 
mirror/root  COMPLETE   ada0p2 (ACTIVE) 
   	                ada1p2 (ACTIVE) 
mirror/swap  COMPLETE ada0p3 (ACTIVE) 
	              ada1p3 (ACTIVE) 

Linux

Ставим необходимые пакеты если их нету

aptitude install initramfs-tools mdadm
yum install mdadm

Смотрим, как разбиты диски

# fdisk -l

   Device Boot Start End Blocks Id System
/dev/sda1 * 1 122 979933+ 83 Linux
/dev/sda2 123 608 3903795 83 Linux
/dev/sda3 609 38913 307684912+ 83 Linux

Новый диск еще не размечен, разметим его (тип указываем raid это FD)

# cfdisk /dev/sdb
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 122 979933+ fd Linux raid autodetect
/dev/sdb2 123 608 3903795 fd Linux raid autodetect
/dev/sdb3 609 38913 307684912+ fd Linux raid autodetect

Или можно скопировать таблицу разделов

# sfdisk -d /dev/sda | sfdisk /dev/sdb 

и поправить тип через fdisk на fd.

Для GPT нужно поставить gdisk и можно использовать

sgdisk -R /dev/sdb /dev/sda

sgdisk -G /dev/sdb 

Здесь sdb - приемник!!! А sda - источник!!!


Чтобы убедиться, что не осталось никаких следов от возможных предыдущих установок RAID

# mdadm --zero-superblock /dev/sdb{1,2,3}

если все хорошо, то создаем три массива уровня RAID1:

# mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
# mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
# mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3

Проверяем:

# cat /proc/mdstat
Personalities : [raid1]
md2 : active (auto-read-only) raid1 sdb3[1] 307683752 blocks super 1.2 [2/1] [_U]
md1 : active (auto-read-only) raid1 sdb2[1] 3902759 blocks super 1.2 [2/1] [_U]
md0 : active (auto-read-only) raid1 sdb1[1] 979921 blocks super 1.2 [2/1] [_U]
unused devices: none

форматируем

# mkfs.ext2 /dev/md0
# mkswap /dev/md1
# mkfs.ext4 /dev/md2

и отредактируем конфигурационный файл /etc/mdadm/mdadm.conf

# cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
# mdadm --examine --scan > /etc/mdadm/mdadm.conf

монтируем и копируем все файлы

# mount /dev/md2 /mnt
# mkdir /mnt/boot
# mount /dev/md0 /mnt/boot
# cp -dpRx / /mnt
# cp -dpRx /boot/* /mnt/boot/

Редактируем /mnt/etc/fstab

# cp /mnt/etc/fstab /mnt/etc/fstab_orig
# vi /mnt/etc/fstab


proc /proc proc defaults 0 0
/dev/sda3 / ext4 errors=remount-ro 0 1
/dev/sda1 /boot ext2 defaults 0 2
/dev/sda2 none swap sw 0 0

меняем на

proc /proc proc defaults 0 0
/dev/md2 / ext4 errors=remount-ro 0 1
/dev/md0 /boot ext2 defaults 0 2
/dev/md1 none swap sw 0 0

Если вы используете UUID в своем fstab, нужные идентификаторы можно посмотреть командой:

# blkid

Завершающий этап — нужно установить grub на новый диск и обновить конфиг grub /boot/grub/grub.cfg

# mount --bind /dev /mnt/dev
# mount --bind /sys /mnt/sys
# mount --bind /proc /mnt/proc
# chroot /mnt
# grub-install /dev/sdb
# update-initramfs -u (для Debian)

Раскомментируем в /etc/default/grub ”GRUB terminal=console”

и обновим grub.cfg

# cp /boot/grub/grub.cfg /boot/grub/grub.cfg_orig
# update-grub

Для CentOS необходимо поправить файл /boot/grub/menu.lst Указать правильное устройство для root в строке kernel и строке root, например, так:

# kernel /vmlinuz-2.6.23.1-42.el5 ro root=/dev/md2

Или указать UUID вместо /dev/md2. Также для CentOS необходимо обновить initrd

# mv /boot/initramfs-`uname -r`.img /boot/initramfs-`uname -r`.img_orig 
# mkinitrd /boot/initramfs-`uname -r`.img `uname -r`

Проверьте, чтобы в menu.lst не было строчек, которые запрещают загружать mdraid (rd_NO_MD, rd_NO_DM).

Проверяем, чтобы в /boot/grub/grub.cfg были прописаны правильные устройства/UUID для дисков. Выходим из chroot по Ctrl+D или командой exit. Перезагружаем сервер и меняем порядок загрузки дисков в BIOS. Сервер должен загрузиться с рэйда на sdb (втором диске).

# umount /mnt/{boot,sys,proc,dev}
# umount /mnt
# reboot

Проверяем через

# cat /proc/mdstat
# mount
# df -h

Добавляем в массив разделы с sda

# mdadm --add /dev/md0 /dev/sda1
# mdadm --add /dev/md1 /dev/sda2
# mdadm --add /dev/md2 /dev/sda3
# cat /proc/mdstat 

покажет прогресс синхронизации

Linux + GPT

Таблица разделов GPT используется при работе с дисками объемом свыше 2Тб. Опознать таблицу разделов поможет fdisk.

# fdisk -l /dev/sda

WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.


Disk /dev/sda: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x7992a1f7

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1      243202  1953514583+  ee  GPT
Partition 1 does not start on physical sector boundary.

Процесс работы с GPT в Linux не сильно отличается от работы с MBR. Выделим лишь пару моментов на примере ОС Debian. Для работы нам потребуются утилита gdisk. Ее можно поставить из репозитория sid.

Разбиваем диск вручную через интерактивный шелл gdisk (работа с ним не отличается от работы с fdisk):

# gdisk /dev/sdb

Нам необходимо создать один раздел размером в 1Мб для установки загрузчика. Тип этого раздела должен быть EF02. В самом простом случае таблица получится примерно такой:

# gdisk -l /dev/sdb

Number  Start (sector)    End (sector)  Size       Code  Name
   1              40            2087   1024.0 KiB  EF02  BIOS boot partition
   2            2088          206887   100.0 MiB   8300  Linux filesystem
   3          206888        63121447   4.0 GiB     8200  Linux swap
   4        63121448      3907029134   1.8 TiB     8300  Linux filesystem

Остальные действия идентичны описанным в разделе Linux

Хотелось бы обратить внимание, что в md устройства необходимо подключать разделы, начиная с sdb2. sdb1 используется для записи загрузчика и не участвует в формировании raid.

# mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb2
# mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb3
# mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb4

После того как зеркало было собрано на втором диске и вы загрузили с него сервер, необходимо скопировать таблицу разделов на первый диск и добавить эти разделы в raid.

# sgdisk -G -R=/dev/sda /dev/sdb
# mdadm --add /dev/md0 /dev/sda2
# mdadm --add /dev/md1 /dev/sda3
# mdadm --add /dev/md2 /dev/sda4

RAID 10

LSI

Создание RAID через MegaRAID BIOS Config Utility Все довольно просто, рейд создается через Configuration Wizard:

Raid 001.png

Дальше выбираем пункт Add Configuration, если рейда до этого не было собрано, если рейд был - New Configuration

Raid 002.png

Выбираем ручное конфигурирование - Manual Configuration

Raid 003.png

Теперь нужно создать 2 группы дисков по два в каждой. Сначала выбираем два диска и жмем (Accept DG). Потом повторяем с оставшимися двумя.

Raid 004.png

Добавляем обе группы в SPAN

Raid 005.png

Выбираем, какой рейд собираем, возможно 10 и 00. Выбираем 10, в окошке SelectSize 2 пишем размер, указанный в 1, либо используем кнопку (Update Size). Нажимаем (Accept).

Raid 006.png

Соглашаемся с предупреждением (YES). Смотрим, что получилось (Next) и принимаем конфигурацию (Accept)

Raid 010.png

Ждем, когда пройдет инициализация рейда и делаем рейд загрузочными

Raid 011.png

Возвращаемся домой (Home)

Adaptec

Создание через Adaptec RAID Configuration Utility

начинается с кнопки Create Array

Raid adaptec 001.png

Выбираем диски, какие будут добавлены в RAID, добавляются на пробел, завершаем добавлением нажатием Enter

Raid adaptec 002.png

Выбираем тип рейда - RAID 10 (Stripe of mirrors). Остальные параметры оставляем по умолчанию, Label - любое название массива.

Raid adaptec 003.png

Нажимаем Done. Появится предупреждение - нажимаем любую кнопку - рейд создан.

Raid adaptec 004.png

Возможные проблемы

Установка grub на новый диск

После копирования информации на новый диск, сервер загружен по сети, новый диск примаунчен в /sdb

# chroot /sdb
# grub2-install /dev/sdb
# grub2-mkconfig

При этом /boot если находится на отдельном разделе, он должен быть примаунчен в /sdb/boot

Rescue mode grub

В rescue mode доступно всего четыре команды:

ls
set
unset
insmod

Вначале следует дать команду ls в ответ она выведет список всех дисков и разделов. Если вы не знаете на каком разделе что находится, то выполните команду ls на нужное устройство:

ls (hdX,Y)/ - Х - диск, а Y - раздел

Сообщаем загрузчику на каком разделе у нас находится root и на каком boot, в примере boot находится на одном разделе:

set prefix=(hd0,1)/boot/grub 
set root=(hd0,1)

Проверим что все корректно:

ls /boot/grub

Подключаем модули для дальнейшей загрузки и производим загрузку:

insmod normal
normal
boot

После этого загрузится стандартное меню загрузки.

Частые ошибки

/sbin/grub-setup: warn: This msdos-style partition label has no post-MBR gap; embedding won't be possible!
/sbin/grub-setup: warn Embedding is not possible. Grub can only be installed in this setup by using blocklists.
При выполнении grub-install

Для установки grub2 необходимо свободное место в начале диска. Если sda разбит так, что не предусматривает этого, при копировании таблицы с первого диска установить загрузчик на sdb не удастся. Разбейте диск вручную


Сервер на Debian загружается с RAID, но сеть не работает.
ifconfig —a
не показывает интерфейсов, кроме lo

Загрузите сервер в режим восстановления (доступен в DCImanager по кнопке "Операция" - в выпадающемсписке "Тип операции" - выбрать "Загрузить шаблон восстановления"), примонтируйте устройство, на котором расположен корень mount /dev/md`номер_устройства` /mnt

скопируйте библиотеку mv /lib/modules/2.6.32-5-amd64/kernel/drivers/net/e1000/e1000.ko /mnt/lib/modules/2.6.32-5-amd64/kernel/drivers/net/e1000/e1000.ko

и пропишите в конец /mnt/etc/modules e1000e


Если возникают проблемы с установкой grub с помощью grub-install, установить его можно из командной строки grub.


Если возникает проблема

# grub-install /dev/sdb
Searching for GRUB installation directory ... found: /boot/grub
The file /boot/grub/stage1 not read correctly.

То вероятнее всего установлен у вас старый grub 0.97, убедитесь, что установлена версия 1.98, установите пакет grub-pc командой apt-get grub-pc и командой dpkg-reconfigure grub-pc установите его на диски sda и sdb


Если возникает ошибка с установкой grub

Could not find device for /boot: Not found or not a block device.

Проверьте /etc/mtab. Вероятнее всего, он некорректен. Восстановить его можно так

cat /proc/mounts > /etc/mtab

"Шеф! Все пропало!"
Сервер не грузится с указанного диска.
"Мы все умрем!"

Без паники. Ведь основные файлы конфигурации, влияющие на загрузку (fstab, grub.cfg), мы "резервно" копировали (копировали же, правда?). В данном случае есть, как минимум 2 варианта:

  • попробовать указать загрузку со "старого" диска прямо в консоли загрузчика
  • загрузить сервер в режиме восстановления и заменить файлы fstab, grub.cfg (со всеми манипуляциями, типа update-initramfs и пр.) на старые. Настоятельно рекомендую сохранить текущие файлы, "во избежание".

Удачных экспериментов.

Полезные ссылки

GRUB2_wiki

Linux_MD_Raid

Этот материал был полезен?

Скидка 25% новым клиентам!
Закажи сервер сегодня и получи скидку на первый месяц аренды!