Статья давно не обновлялась, поэтому информация могла устареть.
Содержание |
Запланированная замена диска
В случае конфигурации рейд-массива, где разные разделы диска находятся в разных устройствах 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:
Дальше выбираем пункт Add Configuration, если рейда до этого не было собрано, если рейд был - New Configuration
Выбираем ручное конфигурирование - Manual Configuration
Теперь нужно создать 2 группы дисков по два в каждой. Сначала выбираем два диска и жмем (Accept DG). Потом повторяем с оставшимися двумя.
Добавляем обе группы в SPAN
Выбираем, какой рейд собираем, возможно 10 и 00. Выбираем 10, в окошке SelectSize 2 пишем размер, указанный в 1, либо используем кнопку (Update Size). Нажимаем (Accept).
Соглашаемся с предупреждением (YES). Смотрим, что получилось (Next) и принимаем конфигурацию (Accept)
Ждем, когда пройдет инициализация рейда и делаем рейд загрузочными
Возвращаемся домой (Home)
Adaptec
Создание через Adaptec RAID Configuration Utility
начинается с кнопки Create Array
Выбираем диски, какие будут добавлены в RAID, добавляются на пробел, завершаем добавлением нажатием Enter
Выбираем тип рейда - RAID 10 (Stripe of mirrors). Остальные параметры оставляем по умолчанию, Label - любое название массива.
Нажимаем Done. Появится предупреждение - нажимаем любую кнопку - рейд создан.
Возможные проблемы
Установка 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 и пр.) на старые. Настоятельно рекомендую сохранить текущие файлы, "во избежание".
Удачных экспериментов.