CreateMdRAID1onLiveSystem

Материал из ALT Linux Wiki

(Различия между версиями)
Перейти к: навигация, поиск
(Import from freesource.info)
 
(14 промежуточных версий не показаны.)
Строка 1: Строка 1:
-
[[Category:Admin]]
+
== Создание загрузочного программного RAID1 с помощью средств ядра 2.6 на работающей системе ==
-
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/admin/CreateMdRAID1onLiveSystem}}
+
-
== Создание загрузочного программного RAID1 с помощью средств ядра 2.6 на работающей системе ==
 
-
Пишу по памяти, кое-что мог забыть.
 
-
Дано:
+
=== Исходные данные ===
* Два HDD
* Два HDD
* Необходимость создания md RAID1
* Необходимость создания md RAID1
-
* Инсталлятор, который не умеет создавать и ставиться на md RAID (текущий от Compact-а, к примеру)
+
* Ядро 2.6
-
* Ядро 2.6 и Sisyphus
+
* Система проинсталлирована на HDD (<tt>/dev/sda</tt>), и он имеет наименьший размер из двух доступных.
-
Шаги:
 
-
1. Инсталлируемся на первый HDD (<tt>/dev/sda</tt>), причем он должен иметь наименьший размер из двух доступных.
 
-
2. Создаем такие же разделы с такими же размерами на втором HDD:
+
===Подготовка массивов===
 +
* Создаем такие же разделы с такими же размерами на втором HDD:
<pre>sfdisk -d /dev/sda | sfdisk /dev/sdb</pre>
<pre>sfdisk -d /dev/sda | sfdisk /dev/sdb</pre>
-
3. Запускаем <tt>fdisk /dev/sdb</tt> и проставляем всем разделам тип FD (Linux RAID Auto)
+
* Запускаем <tt>fdisk /dev/sdb</tt> и проставляем корневому разделу тип FD (Linux RAID Autodetect), иначе загрузиться будет проблематично
-
4. Создаем на каждом разделе degraded md RAID1 (нумерацию удобно начинать с единицы, по номерам разделов на HDD):
+
* Создаем на каждом разделе degraded md RAID1 (нумерацию удобно начинать с единицы, по номерам разделов на HDD). Для корневого раздела создаём массив с версией metadata 0.90:
-
<pre>mdadm -Cv /dev/md1 -b internal --level=1 --raid-devices=2 missing /dev/sdb1</pre>
+
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
-
NB: '''-b internal''' включает отслеживание использования блоков на массиве, т.е. при ресинхронизации массива будет синкаться не весь массив целиком, а только блоки с данными.
+
и т. д.<br>
 +
{{Важно | '''-b internal''' включает отслеживание использования блоков на массиве, то есть при ресинхронизации массива будет синкаться не весь массив целиком, а только блоки с данными.}}
-
5. Создаем на каждом массиве нужную файловую систему:
+
* Создаем на каждом массиве нужную файловую систему:
<pre>mkfs.ext3 -E stride=16 /dev/md1</pre>
<pre>mkfs.ext3 -E stride=16 /dev/md1</pre>
-
и т.д.
+
и т. д.<br>
-
NB: для достижения более высокой производительности можно использовать опцию mkfs.ext3 '''-E stride=''', т.е. подогнать ФС под размер страйпа. stride=stripe/block-size. Т.е. в нашем случае это 64/4=16
+
{{Важно | для достижения более высокой производительности можно использовать опцию }}
 +
 
 +
  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]
-
6. Судя по всему, swap тоже нужно создавать на raid-массиве:
+
* swap тоже создаём на raid-массиве. Если диск вылетит, системе не поплохеет внезапно без откушенного куска виртулаьной памяти.
<pre>mkswap /dev/mdX</pre>
<pre>mkswap /dev/mdX</pre>
-
7. Инсталлируем grub (нынешнее lilo тоже умеет загрузку с raid)
+
* Создаем новый образ initrd:
-
 
+
mkinitrd --with-raid --with raid1 /boot/initrd-`uname -r`-raid1.img `uname -r`
-
8. Создаем новый образ initrd:
+
либо
-
<pre>mkinitrd --with-raid --with raid1 /boot/initrd-`uname -r`-raid1.img `uname -r`</pre>
+
make-initrd
-
9. Монтируем новый 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>)
+
===Копирование данных===
 +
* Монтируем новый 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>)
-
10. Копируем все файлы с текущего HDD на новый (способов много, cp -ax, cpio, rsync и т.д), не забыл пропустить <tt>/proc</tt> и <tt>/sys</tt> (но создав их в новом root). Пример с rsync:
+
* Копируем все файлы с текущего HDD на новый (способов много, cp -ax, cpio, rsync и т.д), не забыл пропустить <tt>/proc</tt> и <tt>/sys</tt> (но создав их в новом root). Пример с rsync:
<pre>#!/bin/sh
<pre>#!/bin/sh
Строка 47: Строка 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/usr
+
rsync -vaPHx --delete --delete-after --numeric-ids /usr /mnt/newroot/
-
rsync -vaPHx --delete --delete-after --numeric-ids /var /mnt/newroot/var</pre>
+
rsync -vaPHx --delete --delete-after --numeric-ids /var /mnt/newroot/</pre>
-
''Предполагается, что у нас на отдельные разделы вынесены /, /usr, /var. Применён ключ '''-x''' у rsync, чтобы он не выходил за границы одной файловой системы. Полезно, т.к. у нас могут быть примонтированы разные левые ресурсы куда-нибудь в /mnt, и ещё используются bind-mounts.''
+
''Предполагается, что у нас на отдельные разделы вынесены /, /usr, /var. Применён ключ '''-x''' у rsync, чтобы он не выходил за границы одной файловой системы. Полезно, так как у нас могут быть примонтированы разные левые ресурсы куда-нибудь в /mnt, и ещё используются bind-mounts.'' Для уменьшения downtime системы можно выполнить такой rsync два раза — на живой системе и потом перейдя в '''init 1'''
-
Для уменьшения downtime системы можно выполнить такой rsync два раза - на живой системе и потом перейдя в '''init 1'''
+
-
11. Делаем <tt>chroot /mnt/raid1/root</tt>
 
-
12. Правим <tt>/etc/fstab</tt>, изменяя все разделы <tt>/dev/sdaX</tt> на массивы <tt>/dev/mdX</tt>
+
===Установка загрузчика===
 +
* Прокидываем в новое окружении /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]]
-
13. Создаем в #/boot/grub/menu.lst## записи вида:
+
====grub1====
 +
/boot/grub/menu.lst:
<pre># Boot automatically after 3 secs.
<pre># Boot automatically after 3 secs.
timeout 3
timeout 3
Строка 73: Строка 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>
-
14. Инсталлируем grub.
+
Инсталлируем grub:
<pre>#!/bin/sh
<pre>#!/bin/sh
Строка 86: Строка 112:
EOF</pre>
EOF</pre>
-
15. Отмонтируем все и перегружается. Если все правильно, то вы должны загрузиться с md raid1 массивов, которые пока располагаются на втором HDD
+
====lilo====
 +
lilo.conf:
 +
raid-extra-boot="mbr-only"
 +
boot="/dev/md1"
 +
# и везде, где требуется
 +
root="/dev/md1"
-
16. Если все работает, то запускаем <tt>fdisk /dev/sda</tt> и проставляем всем разделам тип FD (Linux RAID Auto)
+
===Перезагрузка с raid===
 +
* Отмонтируем все и перегружается. Если все правильно, то вы должны загрузиться с md raid1 массивов, которые пока располагаются на втором HDD
-
17. Далее делаем для каждого raid-массива:
+
* Если все работает, то запускаем <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>
-
и т.д.
+
и т. д.
-
18. После этого регулярно поглядываем в <tt>/proc/mdstat</tt>, нам нужно дождаться, когда ядро синхронизирует все массивы (при этом в <tt>/proc/mdstat</tt> исчезнут все упоминания о прогрессе синхронизации)
+
* После этого регулярно поглядываем в <tt>/proc/mdstat</tt>, нам нужно дождаться, когда ядро синхронизирует все массивы (при этом в <tt>/proc/mdstat</tt> исчезнут все упоминания о прогрессе синхронизации)
-
19. Перегружаемся и, если все хорошо, прописываем в <tt>/etc/mdadm.conf</tt> что-то вроде:
+
* Перегружаемся и, если все хорошо, прописываем в <tt>/etc/mdadm.conf</tt> что-то вроде:
<pre>MAILADDR root
<pre>MAILADDR root
PROGRAM /usr/sbin/mdadm-syslog-events
PROGRAM /usr/sbin/mdadm-syslog-events
Строка 102: Строка 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
-
20. Включаем сервис mdadm
+
* Включаем сервис mdadm
-
21. Пробуем отключить каждый HDD по очереди и загрузиться.
+
* Пробуем отключить каждый HDD по очереди и загрузиться.
-
<div style="display: inline; color: red;">Это, похоже, уже не актуально:</div>
 
-
p.s. В некоторых случаях устройства <tt>/dev/md*</tt> будут не доступны. В данном случае могут помочь:
 
-
<pre>service udevd stop</pre>
 
-
и/или
 
-
<pre>/lib/mkinitd/busybox raidautorun /dev/mdX</pre>
 
-
FIXME
+
=== Разрешение проблем ===
-
How to speed up raid1 resync ?
+
* 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>.
-
Just echo large numbers into both min and max resync speed proc entries:
+
* Не удаётся установить lilo
-
/proc/sys/dev/raid/spped_limit_max and speed_limit_min
+
** <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
-
e.g. as root do:
+
* Загрузка останавливается на этапе 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>/lib/mkinitd/busybox raidautorun /dev/mdX</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>
-
And watch the speed fly up till it maxes out your hardware. (-:
+
{{Category navigation|title=RAID|category=RAID|sortkey={{SUBPAGENAME}}}}
-
 
+
{{Category navigation|title=HOWTO|category=HOWTO|sortkey={{SUBPAGENAME}}}}
-
The above will set both speeds to 200MiB/s which ought to be more than
+
-
your devices can do...
+

Текущая версия на 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

и т. д.

-b internal включает отслеживание использования блоков на массиве, то есть при ресинхронизации массива будет синкаться не весь массив целиком, а только блоки с данными.


  • Создаем на каждом массиве нужную файловую систему:
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

FIXME: (продолжаем уже не в chroot-е)

Примечание: grub-mkconfig надо делать опять в chroot
 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
 
Личные инструменты