CreateMdRAID1onLiveSystem
Материал из ALT Linux Wiki
(13 промежуточных версий не показаны.) | |||
Строка 1: | Строка 1: | ||
- | + | == Создание загрузочного программного RAID1 с помощью средств ядра 2.6 на работающей системе == | |
- | |||
- | |||
- | + | === Исходные данные === | |
* Два HDD | * Два HDD | ||
* Необходимость создания md RAID1 | * Необходимость создания md RAID1 | ||
- | + | * Ядро 2.6 | |
- | * Ядро 2.6 и | + | * Система проинсталлирована на HDD (<tt>/dev/sda</tt>), и он имеет наименьший размер из двух доступных. |
- | === | + | ===Подготовка массивов=== |
- | + | * Создаем такие же разделы с такими же размерами на втором HDD: | |
- | + | ||
- | + | ||
- | + | ||
<pre>sfdisk -d /dev/sda | sfdisk /dev/sdb</pre> | <pre>sfdisk -d /dev/sda | sfdisk /dev/sdb</pre> | ||
- | + | * Запускаем <tt>fdisk /dev/sdb</tt> и проставляем корневому разделу тип FD (Linux RAID Autodetect), иначе загрузиться будет проблематично | |
- | + | * Создаем на каждом разделе degraded md RAID1 (нумерацию удобно начинать с единицы, по номерам разделов на HDD). Для корневого раздела создаём массив с версией metadata 0.90: | |
- | + | mdadm -Cv /dev/md1 -b internal --level=1 --raid-devices=2 missing /dev/sdb1 --metadata 0.90 | |
- | + | mdadm -Cv /dev/mdX -b internal --level=1 --raid-devices=2 missing /dev/sdbX | |
- | + | и т. д.<br> | |
+ | {{Важно | '''-b internal''' включает отслеживание использования блоков на массиве, то есть при ресинхронизации массива будет синкаться не весь массив целиком, а только блоки с данными.}} | ||
- | + | * Создаем на каждом массиве нужную файловую систему: | |
<pre>mkfs.ext3 -E stride=16 /dev/md1</pre> | <pre>mkfs.ext3 -E stride=16 /dev/md1</pre> | ||
- | + | и т. д.<br> | |
- | + | {{Важно | для достижения более высокой производительности можно использовать опцию }} | |
+ | |||
+ | mkfs.ext3 '''-E stride=''', | ||
+ | |||
+ | то есть подогнать ФС под размер страйпа. stride=stripe/block-size. | ||
+ | То есть в нашем случае это 64/4=16 }} | ||
+ | |||
+ | <br> | ||
См. [http://wiki.centos.org/HowTos/Disk_Optimization http://wiki.centos.org/HowTos/Disk_Optimization] | См. [http://wiki.centos.org/HowTos/Disk_Optimization http://wiki.centos.org/HowTos/Disk_Optimization] | ||
- | + | * swap тоже создаём на raid-массиве. Если диск вылетит, системе не поплохеет внезапно без откушенного куска виртулаьной памяти. | |
<pre>mkswap /dev/mdX</pre> | <pre>mkswap /dev/mdX</pre> | ||
- | + | * Создаем новый образ initrd: | |
+ | mkinitrd --with-raid --with raid1 /boot/initrd-`uname -r`-raid1.img `uname -r` | ||
+ | либо | ||
+ | make-initrd | ||
- | + | ===Копирование данных=== | |
- | < | + | * Монтируем новый root (который <tt>/dev/mdX</tt>) куда-нибудь в <tt>/mnt/raid1/root</tt>, создаем в нем нужные каталоги из нашего текущего корня, далее в них монтируем новые разделы, если такие есть (то бишь, создаем <tt>/mnt/raid1/root/var</tt>, к нему монтируем какой-нибудь <tt>/dev/md6</tt>, уже после этого создаем <tt>/mnt/raid1/root/var/log</tt> и к нему уже монтируем какой-нибудь <tt>/dev/md7</tt>) |
- | + | * Копируем все файлы с текущего HDD на новый (способов много, cp -ax, cpio, rsync и т.д), не забыл пропустить <tt>/proc</tt> и <tt>/sys</tt> (но создав их в новом root). Пример с rsync: | |
- | + | ||
- | + | ||
<pre>#!/bin/sh | <pre>#!/bin/sh | ||
Строка 48: | Строка 52: | ||
rsync -vaPHx --delete --delete-after --numeric-ids / /mnt/newroot/ | rsync -vaPHx --delete --delete-after --numeric-ids / /mnt/newroot/ | ||
- | rsync -vaPHx --delete --delete-after --numeric-ids /usr /mnt/newroot/ | + | rsync -vaPHx --delete --delete-after --numeric-ids /usr /mnt/newroot/ |
- | rsync -vaPHx --delete --delete-after --numeric-ids /var /mnt/newroot/ | + | rsync -vaPHx --delete --delete-after --numeric-ids /var /mnt/newroot/</pre> |
- | ''Предполагается, что у нас на отдельные разделы вынесены /, /usr, /var. Применён ключ '''-x''' у rsync, чтобы он не выходил за границы одной файловой системы. Полезно, | + | ''Предполагается, что у нас на отдельные разделы вынесены /, /usr, /var. Применён ключ '''-x''' у rsync, чтобы он не выходил за границы одной файловой системы. Полезно, так как у нас могут быть примонтированы разные левые ресурсы куда-нибудь в /mnt, и ещё используются bind-mounts.'' Для уменьшения downtime системы можно выполнить такой rsync два раза — на живой системе и потом перейдя в '''init 1''' |
- | Для уменьшения downtime системы можно выполнить такой rsync два | + | |
- | |||
- | + | ===Установка загрузчика=== | |
+ | * Прокидываем в новое окружении /proc, /sys, /dev | ||
+ | <pre>#!/bin/sh | ||
+ | mount --bind /proc /mnt/newroot/proc | ||
+ | mount --bind /sys /mnt/newroot/sys | ||
+ | mount --bind /dev /mnt/newroot/dev | ||
+ | </pre> | ||
+ | * Делаем <tt>chroot /mnt/raid1/root</tt> | ||
+ | * Правим <tt>/etc/fstab</tt>, изменяя все разделы <tt>/dev/sdaX</tt> на массивы <tt>/dev/mdX</tt> | ||
+ | |||
+ | ====grub2==== | ||
+ | {{Fixme | (продолжаем уже не в chroot-е) }} | ||
+ | {{Note | grub-mkconfig надо делать опять в chroot}} | ||
+ | <source lang=bash> | ||
+ | grub-install --recheck /dev/sdb # На sda загрузчик уже есть, чтобы система загружалась без первого диска, нужен ещё и на sdb | ||
+ | </source> | ||
+ | Входим опять в chroot | ||
+ | <source lang=bash> | ||
+ | grub-mkconfig -o /boot/grub/grub.cfg | ||
+ | </source> | ||
+ | |||
+ | |||
+ | См. [[grub|статью про grub2]] | ||
- | + | ====grub1==== | |
+ | /boot/grub/menu.lst: | ||
<pre># Boot automatically after 3 secs. | <pre># Boot automatically after 3 secs. | ||
timeout 3 | timeout 3 | ||
Строка 74: | Строка 99: | ||
initrd (hd1,0)/initrd-2.6.14-vs26-smp-alt5-raid1.img</pre> | initrd (hd1,0)/initrd-2.6.14-vs26-smp-alt5-raid1.img</pre> | ||
- | + | Инсталлируем grub: | |
<pre>#!/bin/sh | <pre>#!/bin/sh | ||
Строка 87: | Строка 112: | ||
EOF</pre> | EOF</pre> | ||
- | + | ====lilo==== | |
+ | lilo.conf: | ||
+ | raid-extra-boot="mbr-only" | ||
+ | boot="/dev/md1" | ||
+ | # и везде, где требуется | ||
+ | root="/dev/md1" | ||
- | + | ===Перезагрузка с raid=== | |
+ | * Отмонтируем все и перегружается. Если все правильно, то вы должны загрузиться с md raid1 массивов, которые пока располагаются на втором HDD | ||
- | + | * Если все работает, то запускаем <tt>fdisk /dev/sda</tt> и проставляем корневому разделу тип FD (Linux RAID Auto) | |
+ | |||
+ | * Далее делаем для каждого raid-массива: | ||
<pre>mdadm /dev/md1 --add /dev/sda1</pre> | <pre>mdadm /dev/md1 --add /dev/sda1</pre> | ||
- | + | и т. д. | |
- | + | * После этого регулярно поглядываем в <tt>/proc/mdstat</tt>, нам нужно дождаться, когда ядро синхронизирует все массивы (при этом в <tt>/proc/mdstat</tt> исчезнут все упоминания о прогрессе синхронизации) | |
- | + | * Перегружаемся и, если все хорошо, прописываем в <tt>/etc/mdadm.conf</tt> что-то вроде: | |
<pre>MAILADDR root | <pre>MAILADDR root | ||
PROGRAM /usr/sbin/mdadm-syslog-events | PROGRAM /usr/sbin/mdadm-syslog-events | ||
Строка 103: | Строка 136: | ||
ARRAY /dev/md1 devices=/dev/sda1,/dev/sdb1 | ARRAY /dev/md1 devices=/dev/sda1,/dev/sdb1 | ||
ARRAY /dev/md2 devices=/dev/sda2,/dev/sdb2</pre> | ARRAY /dev/md2 devices=/dev/sda2,/dev/sdb2</pre> | ||
- | + | Записи ARRAY можно сформировать автоматически: | |
+ | mdadm --examine --scan | ||
- | + | * Включаем сервис mdadm | |
- | + | * Пробуем отключить каждый HDD по очереди и загрузиться. | |
- | === | + | === Разрешение проблем === |
- | В некоторых случаях устройства <tt>/dev/md*</tt> будут не доступны. В данном случае могут помочь: | + | * md-массивы с версией метаданных > 0.90 не стартуют при загрузке, но <tt>mdadm --assemble --scan</tt> работает. Наблюдается ошибка: |
+ | Error returned from evms_commit_changes(): No such device | ||
+ | Из-за ошибки в evms из rc.sysinit не производится вызов raidstart, в котором находится вызов mdadm. Если evms не используется, можно прописать в опции init <tt>noevms</tt>. | ||
+ | |||
+ | * Не удаётся установить lilo | ||
+ | ** <pre>Fatal: Unusual RAID bios device code: 0xFF</pre> lilo не хочет ставиться на неполный масив. В таком случае ставим lilo в 2 этапа - вначале только на sdb, а после дополнения масива и синхронизации - на mdX | ||
+ | ** <pre>Fatal: Unusual RAID bios device code: 0xFF</pre> либо | ||
+ | ** <pre>Fatal: Linux experimental device 0xfd00 needs to be defined.</pre> Способ решение проблемы точно не известен. FIXME. Как вариант, можно поставить lilo из старой системы: | ||
+ | lilo -C /mnt/newroot/etc/lilo.conf | ||
+ | |||
+ | * Загрузка останавливается на этапе initrd | ||
+ | ** сообщение | ||
+ | udevd: running netdev handler | ||
+ | сопровождающееся длительной задержкой, с последующими ошибками | ||
+ | initrd: udev: ERROR: unable to mount root | ||
+ | initrd: stage 'udev' failed | ||
+ | Причина: | ||
+ | * не перегенерировано initrd, либо была использована версия make-initrd, содержащая ошибку. Убедитесь, что вы используете версию пакета make-initrd не ниже 0.3.9-alt1 | ||
+ | * используется загрузчик lilo. Решение: воспользоваться grub2 | ||
+ | |||
+ | * В некоторых случаях устройства <tt>/dev/md*</tt> будут не доступны. В данном случае могут помочь: | ||
<pre>service udevd stop</pre> | <pre>service udevd stop</pre> | ||
и/или | и/или | ||
<pre>/lib/mkinitd/busybox raidautorun /dev/mdX</pre> | <pre>/lib/mkinitd/busybox raidautorun /dev/mdX</pre> | ||
- | + | * Скорость синхронизации массивов очень низкая | |
- | + | ||
<pre> | <pre> | ||
echo 200000 > /proc/sys/dev/raid/speed_limit_max | echo 200000 > /proc/sys/dev/raid/speed_limit_max | ||
echo 200000 > /proc/sys/dev/raid/speed_limit_min | echo 200000 > /proc/sys/dev/raid/speed_limit_min | ||
</pre> | </pre> | ||
+ | |||
+ | {{Category navigation|title=RAID|category=RAID|sortkey={{SUBPAGENAME}}}} | ||
+ | {{Category navigation|title=HOWTO|category=HOWTO|sortkey={{SUBPAGENAME}}}} |
Текущая версия на 11:48, 19 июля 2015
Содержание |
Создание загрузочного программного RAID1 с помощью средств ядра 2.6 на работающей системе
Исходные данные
- Два HDD
- Необходимость создания md RAID1
- Ядро 2.6
- Система проинсталлирована на HDD (/dev/sda), и он имеет наименьший размер из двух доступных.
Подготовка массивов
- Создаем такие же разделы с такими же размерами на втором HDD:
sfdisk -d /dev/sda | sfdisk /dev/sdb
- Запускаем fdisk /dev/sdb и проставляем корневому разделу тип FD (Linux RAID Autodetect), иначе загрузиться будет проблематично
- Создаем на каждом разделе degraded md RAID1 (нумерацию удобно начинать с единицы, по номерам разделов на HDD). Для корневого раздела создаём массив с версией metadata 0.90:
mdadm -Cv /dev/md1 -b internal --level=1 --raid-devices=2 missing /dev/sdb1 --metadata 0.90 mdadm -Cv /dev/mdX -b internal --level=1 --raid-devices=2 missing /dev/sdbX
и т. д.
- Создаем на каждом массиве нужную файловую систему:
mkfs.ext3 -E stride=16 /dev/md1
и т. д.
mkfs.ext3 -E stride=,
то есть подогнать ФС под размер страйпа. stride=stripe/block-size. То есть в нашем случае это 64/4=16 }}
См. http://wiki.centos.org/HowTos/Disk_Optimization
- swap тоже создаём на raid-массиве. Если диск вылетит, системе не поплохеет внезапно без откушенного куска виртулаьной памяти.
mkswap /dev/mdX
- Создаем новый образ initrd:
mkinitrd --with-raid --with raid1 /boot/initrd-`uname -r`-raid1.img `uname -r`
либо
make-initrd
Копирование данных
- Монтируем новый root (который /dev/mdX) куда-нибудь в /mnt/raid1/root, создаем в нем нужные каталоги из нашего текущего корня, далее в них монтируем новые разделы, если такие есть (то бишь, создаем /mnt/raid1/root/var, к нему монтируем какой-нибудь /dev/md6, уже после этого создаем /mnt/raid1/root/var/log и к нему уже монтируем какой-нибудь /dev/md7)
- Копируем все файлы с текущего HDD на новый (способов много, cp -ax, cpio, rsync и т.д), не забыл пропустить /proc и /sys (но создав их в новом root). Пример с rsync:
#!/bin/sh renice 19 -p $$ ||: ionice -c3 -p$$ ||: rsync -vaPHx --delete --delete-after --numeric-ids / /mnt/newroot/ rsync -vaPHx --delete --delete-after --numeric-ids /usr /mnt/newroot/ rsync -vaPHx --delete --delete-after --numeric-ids /var /mnt/newroot/
Предполагается, что у нас на отдельные разделы вынесены /, /usr, /var. Применён ключ -x у rsync, чтобы он не выходил за границы одной файловой системы. Полезно, так как у нас могут быть примонтированы разные левые ресурсы куда-нибудь в /mnt, и ещё используются bind-mounts. Для уменьшения downtime системы можно выполнить такой rsync два раза — на живой системе и потом перейдя в init 1
Установка загрузчика
- Прокидываем в новое окружении /proc, /sys, /dev
#!/bin/sh mount --bind /proc /mnt/newroot/proc mount --bind /sys /mnt/newroot/sys mount --bind /dev /mnt/newroot/dev
- Делаем chroot /mnt/raid1/root
- Правим /etc/fstab, изменяя все разделы /dev/sdaX на массивы /dev/mdX
grub2
grub-install --recheck /dev/sdb # На sda загрузчик уже есть, чтобы система загружалась без первого диска, нужен ещё и на sdb
Входим опять в chroot
grub-mkconfig -o /boot/grub/grub.cfg
См. статью про grub2
grub1
/boot/grub/menu.lst:
# Boot automatically after 3 secs. timeout 3 # By default, boot the first entry. default 2614-vs26-smp-raid1 (hd0,0) title 2614-vs26-smp-raid1 (hd0,0) root (hd0,0) kernel (hd0,0)/vmlinuz-2.6.14-vs26-smp-alt5 root=/dev/md2 vga=normal initrd (hd0,0)/initrd-2.6.14-vs26-smp-alt5-raid1.img title 2614-vs26-smp-raid1 (hd1,0) root (hd1,0) kernel (hd1,0)/vmlinuz-2.6.14-vs26-smp-alt5 root=/dev/md2 vga=normal initrd (hd1,0)/initrd-2.6.14-vs26-smp-alt5-raid1.img
Инсталлируем grub:
#!/bin/sh grub --batch <<EOF device (hd0) /dev/sda root (hd0,0) # (0 - это тот раздел, где у вас /boot, обычно /dev/sdX1, в grub-е просто нумерация с 0) setup (hd0) device (hd0) /dev/sdb root (hd0,0) setup (hd0) quit EOF
lilo
lilo.conf:
raid-extra-boot="mbr-only" boot="/dev/md1" # и везде, где требуется root="/dev/md1"
Перезагрузка с raid
- Отмонтируем все и перегружается. Если все правильно, то вы должны загрузиться с md raid1 массивов, которые пока располагаются на втором HDD
- Если все работает, то запускаем fdisk /dev/sda и проставляем корневому разделу тип FD (Linux RAID Auto)
- Далее делаем для каждого raid-массива:
mdadm /dev/md1 --add /dev/sda1
и т. д.
- После этого регулярно поглядываем в /proc/mdstat, нам нужно дождаться, когда ядро синхронизирует все массивы (при этом в /proc/mdstat исчезнут все упоминания о прогрессе синхронизации)
- Перегружаемся и, если все хорошо, прописываем в /etc/mdadm.conf что-то вроде:
MAILADDR root PROGRAM /usr/sbin/mdadm-syslog-events DEVICE partitions ARRAY /dev/md1 devices=/dev/sda1,/dev/sdb1 ARRAY /dev/md2 devices=/dev/sda2,/dev/sdb2
Записи ARRAY можно сформировать автоматически:
mdadm --examine --scan
- Включаем сервис mdadm
- Пробуем отключить каждый HDD по очереди и загрузиться.
Разрешение проблем
- md-массивы с версией метаданных > 0.90 не стартуют при загрузке, но mdadm --assemble --scan работает. Наблюдается ошибка:
Error returned from evms_commit_changes(): No such device
Из-за ошибки в evms из rc.sysinit не производится вызов raidstart, в котором находится вызов mdadm. Если evms не используется, можно прописать в опции init noevms.
- Не удаётся установить lilo
-
Fatal: Unusual RAID bios device code: 0xFF
lilo не хочет ставиться на неполный масив. В таком случае ставим lilo в 2 этапа - вначале только на sdb, а после дополнения масива и синхронизации - на mdX -
Fatal: Unusual RAID bios device code: 0xFF
либо -
Fatal: Linux experimental device 0xfd00 needs to be defined.
Способ решение проблемы точно не известен. FIXME. Как вариант, можно поставить lilo из старой системы:
-
lilo -C /mnt/newroot/etc/lilo.conf
- Загрузка останавливается на этапе initrd
- сообщение
udevd: running netdev handler
сопровождающееся длительной задержкой, с последующими ошибками
initrd: udev: ERROR: unable to mount root initrd: stage 'udev' failed
Причина:
- не перегенерировано initrd, либо была использована версия make-initrd, содержащая ошибку. Убедитесь, что вы используете версию пакета make-initrd не ниже 0.3.9-alt1
- используется загрузчик lilo. Решение: воспользоваться grub2
- В некоторых случаях устройства /dev/md* будут не доступны. В данном случае могут помочь:
service udevd stop
и/или
/lib/mkinitd/busybox raidautorun /dev/mdX
- Скорость синхронизации массивов очень низкая
echo 200000 > /proc/sys/dev/raid/speed_limit_max echo 200000 > /proc/sys/dev/raid/speed_limit_min