Итак имеем: новый установленный сервер с удаленным доступом по ssh. В на сервере установлена CentOS 6.7, так же имеем 4 HDD по 3Tb.
Необходимо настроить два дисковых массива RAID1 без переустановки системы. Поехали.
Часть 1, делаем RAID1 на установленной системе.
Проверяем что есть на данный момент:
| 1 2 3 4 5 6 7 | [root@server ~]# df -Th Filesystem     Type   Size  Used Avail Use% Mounted on /dev/sda2      ext4   2,7T  1,2G  2,6T   1% / tmpfs          tmpfs  1,9G     0  1,9G   0% /dev/shm /dev/sda1      ext2   485M   74M  386M  17% /boot /dev/sda4      ext4   3,9G  8,1M  3,7G   1% /tmp [root@server ~]# | 
Т.к. диски с поддержкой разметки GPT, то fdisk ничего интересного не покажет, кроме одной большой парции на весь диск и ошибки поддержки GPT.
Проверяем, что нет рейдов, если есть — удаляем (возможно остались от предыдущих установок):
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # Проверяем: [root@server ~]# cat /proc/mdstat Personalities : [raid1] unused devices:  [root@server ~]# # Рейда нет # Если есть удаляем: mdadm --stop --scan mdadm --zero-superblock /dev/sdb{1..4} # В случае успеха видим: [root@server ~]# mdadm --zero-superblock /dev/sdb{1..4} mdadm: Unrecognised md component device - /dev/sdb1 mdadm: Unrecognised md component device - /dev/sdb2 mdadm: Unrecognised md component device - /dev/sdb3 mdadm: Unrecognised md component device - /dev/sdb4 [root@server ~]# | 
Для начала нужно разметить диск sdb (сейчас пустой) так же, как sda (с системой).
| 1 2 3 4 5 6 7 | sfdisk -d /dev/sda | sfdisk --force /dev/sdb # После, чтобы система подхватила новую разметку диска: partprobe /dev/sdb # Изменяем тип партиции для использования raid parted -s -m -a optimal /dev/sdb -- set 1 raid on set 2 raid on  partprobe /dev/sdb | 
Альтернативный вариант: В нашем случае в связи с тем, что диск использует GPT, sfdisk бесполезен (но у меня получилось).
Просто скопируем первые 63 блока с информацией о разметке диска так (если у вас диски без GPT, то этого делать не нужно):
| 1 | dd if=/dev/sda of=/dev/sdb count=63 | 
Проверяем
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@server ~]# ls /dev/ | grep sd sda sda1 sda2 sda3 sda4 sdb sdb1 sdb2 sdb3 sdb4 sdc sdd [root@server ~]# | 
Хорошо, у нас есть одинаковые парции, засунем в raid парции sdb и сделаем файловую систему.
Обращаем снимание на —metadata=0.90 — использовать версию 0.90 для раздела /boot !!! Для большого раздела используем версию 1.2
| 1 2 3 | mdadm --create /dev/md0 --metadata=0.90 --level=1 --raid-devices=2 /dev/sdb1 missing mdadm --create /dev/md1 --metadata=1.2 --level=1 --raid-devices=2 /dev/sdb2 missing mdadm --create /dev/md2 --metadata=0.90 --level=1 --raid-devices=2 /dev/sdb4 missing | 
/dev/sdb3 не трогаем, нет смысла делать swap в рейде. Теперь создадим файловую систему:
| 1 2 3 4 5 6 7 8 | # для /boot оптимально ext2 mkfs.ext2 /dev/md0 # для / оптимально ext4 mkfs.ext4 /dev/md1 # для /tmp оптимально ext4 mkfs.ext4 /dev/md2 # создаем swap на свободной парции второго диска mkswap /dev/sdb3 | 
raid парции с sdb готовы, теперь посмотрим что получилось и запишем в /etc/mdadm.conf
| 1 2 3 4 5 6 | [root@server ~]# mdadm --detail --scan ARRAY /dev/md0 metadata=0.90 UUID=b6ebf9a0:d273a735:2e4a7c39:81e14765 ARRAY /dev/md1 metadata=1.2 name=server.162.198.30:1 UUID=9470072a:25f3cbc2:a5195ecd:934ecd76 ARRAY /dev/md2 metadata=0.90 UUID=ac378ee4:c3617615:2e4a7c39:81e14765 [root@server ~]# mdadm --detail --scan > /etc/mdadm.conf [root@server ~]# | 
Это готово. Теперь надо сделать изменения в grub и fstab на текущей системе. Для этого идем в /boot и редактируем grub/grub.conf. Для начала проверим параметры ядра:
| 1 | cat /boot/grub/grub.conf | grep MD | 
Не должно выдать ничего. Если выдает строки с параметрами ядра rd_no_md, если есть такие – удаляем rd_no_md, без этого grud raid парции распознавать при загрузке не будет.
Далее смотрим какое ядро загружено сейчас (uname -r), находим блок для этого ядра в grub.conf, и делаем в нем замену
| 1 2 3 4 | # Ищем: ro root=UUID=6ddafb1e-55d3-4aa2-b36e-6865421d52c1 # Меняем на ro root=/dev/md1 | 
Вы должны помнить что md1 у нас – это парция c корнем (/) системы. Также заменяем в том же блоке
| 1 2 3 4 | # ищем root (hd0,0) # Меняем на root (hd1,0) | 
ИЛИ можно воспользоватся готовым скриптом
| 1 2 3 4 5 6 | cp /boot/grub/grub.conf /boot/grub/grub.conf.bak cat /boot/grub/grub.conf.bak | sed -e 's/ rd_no_md//gi'| sed -e 's/splashimage=(hd0,0)/splashimage=(hd1,0)/'| sed -e 's/root (hd0,0)/root (hd1,0)/g'| sed -e 's/ro root=UUID=.* rd_NO_LUKS/ro root=\/dev\/md1 rd_NO_LUKS/g' > /boot/grub/grub.conf | 
Здесь закончили. Идем в /etc и редактируем fstab – заменяем устройства /dev/sda* (UUID) на соответствующие им /dev/md*, вот так должен выглядеть файл после редактирования:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # # /etc/fstab # Created by anaconda on Sat Jan 30 01:07:07 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # #UUID=6ddafb1e-55d3-4aa2-b36e-6865421d52c1 /                       ext4    defaults        1 1 /dev/md1                /                       ext4    defaults        1 1 #UUID=5bf5411e-4ade-45f9-83a3-1397bb45f78f /boot                   ext2    defaults        1 2 /dev/md0                /boot                   ext2    defaults        1 2 #UUID=6783d64f-7a83-4c16-b737-09b4c2293cd4 /tmp                    ext4    noexec,nosuid,nodev        1 2 /dev/md2                /tmp                    ext4    noexec,nosuid,nodev        1 2 UUID=170bdd15-8546-40cd-8180-807900ac3458 swap                    swap    defaults        0 0 tmpfs                   /dev/shm                tmpfs   defaults        0 0 devpts                  /dev/pts                devpts  gid=5,mode=620  0 0 sysfs                   /sys                    sysfs   defaults        0 0 proc                    /proc                   proc    defaults        0 0 | 
Старые устройства у меня закомментированы (там UUID= вместо /dev/sda*, из-за GPT, сути это не меняет).
Примонтируем наши /dev/md* девайсы
| 1 2 3 4 | mkdir /mnt/md{0..2} mount /dev/md2 /mnt/md2 mount /dev/md1 /mnt/md1 mount /dev/md0 /mnt/md0 | 
После изменений в конфигурации grud нужно обновить initrd, и переделать initramfs с подключением нашего mdadm.conf
| 1 2 3 4 5 6 7 8 | # Забеками старый mv /boot/initrd-`uname -r`kdump.img /boot/initrd-`uname -r`kdump.img.old # Сделаем новый, это нужно сделать для применения изменений в grub mkinitrd /boot/initrd-`uname -r`.img `uname -r` # Забекапим mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.old # Сделаем новый ram-диск для инициализации OS (нужно для верного определения устройств md*) dracut --mdadmconf --force /boot/initramfs-$(uname -r).img $(uname -r) | 
Почти все готово к ребуту. Кроме самого важного – данные то не скопировали. Копируем (занимает какое то время)
| 1 2 3 4 5 | cp -dpRx / /mnt/md1 cd /boot cp -dpRx . /mnt/md0 cd /tmp cp -dpRx . /mnt/md2 | 
Итак, что имеем. Мы сделали raid-парции, скопировали все данные на них, сконфигурировали os на определение и монтирование raid-1 парций при инициализации и grub на загрузку с этих парций. Установим grub на диски.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | [root@server /]# grub Probing devices to guess BIOS drives. This may take a long time.     GNU GRUB  version 0.97  (640K lower / 3072K upper memory)  [ Minimal BASH-like line editing is supported.  For the first word, TAB    lists possible command completions.  Anywhere else TAB lists the possible    completions of a device/filename.] grub> root (hd0,0) root (hd0,0)  Filesystem type is ext2fs, partition type 0x83 grub> setup (hd0) setup (hd0)  Checking if "/boot/grub/stage1" exists... no  Checking if "/grub/stage1" exists... yes  Checking if "/grub/stage2" exists... yes  Checking if "/grub/e2fs_stage1_5" exists... yes  Running "embed /grub/e2fs_stage1_5 (hd0)"... failed (this is not fatal)  Running "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)  Running "install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf "... succeeded Done. grub> root (hd1,0) root (hd1,0)  Filesystem type is ext2fs, partition type 0x83 grub> setup (hd1) setup (hd1)  Checking if "/boot/grub/stage1" exists... no  Checking if "/grub/stage1" exists... yes  Checking if "/grub/stage2" exists... yes  Checking if "/grub/e2fs_stage1_5" exists... yes  Running "embed /grub/e2fs_stage1_5 (hd1)"... failed (this is not fatal)  Running "embed /grub/e2fs_stage1_5 (hd1,0)"... failed (this is not fatal)  Running "install /grub/stage1 (hd1) /grub/stage2 p /grub/grub.conf "... succeeded Done. grub> quit quit [root@server /]# | 
Теперь можно и ребут сделать.
| 1 | reboot | 
Если все прошло хорошо – сервер загрузится без проблем. Иногда время загрузки может чуть увеличиться по сравнению с обычным.
Если сервак не перезагрузился — переустанавливаем систему.
после ребута
Первым делом поглядим что и как у нас загрузилось:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@server ~]# cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sdb2[0]       2921233408 blocks super 1.2 [2/1] [U_]       bitmap: 22/22 pages [88KB], 65536KB chunk md2 : active raid1 sdb4[0]       4194240 blocks [2/1] [U_] md0 : active raid1 sdb1[0]       511936 blocks [2/1] [U_] unused devices:  [root@server ~]# df -Th Filesystem     Type   Size  Used Avail Use% Mounted on /dev/md1       ext4   2,7T  1,2G  2,6T   1% / tmpfs          tmpfs  1,9G     0  1,9G   0% /dev/shm /dev/md0       ext2   485M  132M  328M  29% /boot /dev/md2       ext4   3,9G  8,1M  3,7G   1% /tmp [root@server ~]# | 
Все в норме – raid парции определились (хотя это можно и не проверять, ничего бы не загрузилось без этого) и система загрузилась с них.
Теперь диск sda у нас уже не основной, засунем его в raid-1 массив и синхронизируем со вторым:
| 1 2 3 | mdadm --add /dev/md0 -a /dev/sda1 mdadm --add /dev/md1 -a /dev/sda2 mdadm --add /dev/md2 -a /dev/sda4 | 
Проверяем ход синхронизации:
| 1 | watch -n 1 cat /proc/mdstat | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | Personalities : [raid1] md1 : active raid1 sda2[2] sdb2[0]       2921233408 blocks super 1.2 [2/1] [U_]       [>....................]  recovery =  0.0% (912640/2921233408) finish=266.6min speed=182528K/sec       bitmap: 22/22 pages [88KB], 65536KB chunk md2 : active raid1 sda4[2] sdb4[0]       4194240 blocks [2/1] [U_]           resync=DELAYED md0 : active raid1 sda1[1] sdb1[0]       511936 blocks [2/2] [UU] unused devices:  | 
Процедура не быстрая, дождемся завершения синхронизации.
Закончилась синхронизация:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@server ~]# cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sda2[2] sdb2[0]       2921233408 blocks super 1.2 [2/2] [UU]       bitmap: 0/22 pages [0KB], 65536KB chunk md2 : active raid1 sda4[1] sdb4[0]       4194240 blocks [2/2] [UU] md0 : active raid1 sda1[1] sdb1[0]       511936 blocks [2/2] [UU] unused devices:  [root@server ~]# | 
Теперь надо переписать mdadm.conf:
| 1 | mdadm --detail --scan > /etc/mdadm.conf | 
Сделаем парции обоих дисков raid’ового типа. Для дисков с GPT запускаем gdisk и выставляем тип FD00 для каждой парции каждого диска (кроме парций под SWAP, конечно, в нашем случае это №3).
Если у вас диски без GPT, то ставим raid autodetect через fdisk, параметр (тип fd).
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | [root@server ~]# gdisk /dev/sda GPT fdisk (gdisk) version 0.8.10 Partition table scan:   MBR: protective   BSD: not present   APM: not present   GPT: present Found valid GPT with protective MBR; using GPT. Command (? for help): t Partition number (1-4): 1 Current type is 'BIOS boot partition' Hex code or GUID (L to show codes, Enter = 8300): FD00 Changed type of partition to 'Linux RAID' Command (? for help): t Partition number (1-4): 2 Current type is 'Microsoft basic data' Hex code or GUID (L to show codes, Enter = 8300): FD00 Changed type of partition to 'Linux RAID' Command (? for help): t Partition number (1-4): 4 Current type is 'Microsoft basic data' Hex code or GUID (L to show codes, Enter = 8300): FD00 Changed type of partition to 'Linux RAID' Command (? for help): p Disk /dev/sda: 5860533168 sectors, 2.7 TiB Logical sector size: 512 bytes Disk identifier (GUID): 71D8BE94-C9BA-423F-B038-5899CA30D360 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 5860533134 Partitions will be aligned on 2048-sector boundaries Total free space is 2925 sectors (1.4 MiB) Number  Start (sector)    End (sector)  Size       Code  Name    1            2048         1026047   500.0 MiB   FD00     2         1026048      5843755007   2.7 TiB     FD00     3      5843755008      5852143615   4.0 GiB     8200     4      5852143616      5860532223   4.0 GiB     FD00  Command (? for help): q [root@server ~]# | 
делаем тоже самое и на gdisk /dev/sdb
Переконфигурируем grub еще раз
| 1 | nano /boot/grub/menu.lst | 
В начале файла ищем указание до splashimage и меняем в нем hd0 на hd1 если не так (оно уже должно быть таким).
Еще раз установим grub на оба диска:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | [root@server ~]# grub Probing devices to guess BIOS drives. This may take a long time.     GNU GRUB  version 0.97  (640K lower / 3072K upper memory)  [ Minimal BASH-like line editing is supported.  For the first word, TAB    lists possible command completions.  Anywhere else TAB lists the possible    completions of a device/filename.] grub> root (hd0,0) root (hd0,0)  Filesystem type is ext2fs, partition type 0x83 grub> setup (hd0) setup (hd0)  Checking if "/boot/grub/stage1" exists... no  Checking if "/grub/stage1" exists... yes  Checking if "/grub/stage2" exists... yes  Checking if "/grub/e2fs_stage1_5" exists... yes  Running "embed /grub/e2fs_stage1_5 (hd0)"... failed (this is not fatal)  Running "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)  Running "install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf "... succeeded Done. grub> root (hd1,0) root (hd1,0)  Filesystem type is ext2fs, partition type 0x83 grub> setup (hd1) setup (hd1)  Checking if "/boot/grub/stage1" exists... no  Checking if "/grub/stage1" exists... yes  Checking if "/grub/stage2" exists... yes  Checking if "/grub/e2fs_stage1_5" exists... yes  Running "embed /grub/e2fs_stage1_5 (hd1)"... failed (this is not fatal)  Running "embed /grub/e2fs_stage1_5 (hd1,0)"... failed (this is not fatal)  Running "install /grub/stage1 (hd1) /grub/stage2 p /grub/grub.conf "... succeeded Done. grub> quit quit [root@server ~]# | 
Контрольный ребут для проверки и система готова к работе.
| 1 | reboot | 
Часть 2, создаем RAID1 на 2 оставшихся винтах
На сервере осталось еще 2 пустых диска (/dev/sdc /dev/sdd) по 3Tb, сделаем из них зеркало
Создаем партиции на обоих диска использую parted, в примере только для диска /dev/sdc
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | parted -a optimal /dev/sdc mklabel gpt # Соглашаемся, что все данные удалятся # Сделаем раздел ext4 mkpart primary ext4 0% 100% # ставим флаг, что эта партиция RAID set 1 raid on # Смотрим что получилось: (parted) p                                                                Модель: ATA TOSHIBA DT01ACA3 (scsi) Диск /dev/sdc: 3001GB Размер сектора (логич./физич.): 512B/4096B Таблица разделов: gpt Номер  Начало  Конец   Размер  Файловая система  Имя      Флаги  1     1049kB  3001GB  3001GB                    primary  raid (parted)q | 
Создаем новый массив (/dev/md4)
| 1 | mdadm --create /dev/md4 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1 | 
соглашаемся с предупреждением.
Создаем файловую систему:
| 1 | mkfs.ext4 /dev/md4 | 
Ждем пока синхронизируется массив.
| 1 | watch -n 1 cat /proc/mdstat | 
Обновим mdadm.conf
| 1 | mdadm --detail --scan > /etc/mdadm.conf | 
Делаем директорию, куда будем монтировать рейд и монтируем:
| 1 2 3 | mkdir /raid # монтируем mount /dev/md4 /raid1/ | 
Добавляем автомонтирование в fstab, добавляем строку «/dev/md4 /raid1 ext4 defaults 0 0»:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@server ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Sat Jan 30 01:07:07 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # #UUID=6ddafb1e-55d3-4aa2-b36e-6865421d52c1 /                       ext4    defaults        1 1 /dev/md1                /                       ext4    defaults        1 1 #UUID=5bf5411e-4ade-45f9-83a3-1397bb45f78f /boot                   ext2    defaults        1 2 /dev/md0                /boot                   ext2    defaults        1 2 #UUID=6783d64f-7a83-4c16-b737-09b4c2293cd4 /tmp                    ext4    noexec,nosuid,nodev        1 2 /dev/md2                /tmp                    ext4    noexec,nosuid,nodev        1 2 UUID=170bdd15-8546-40cd-8180-807900ac3458 swap                    swap    defaults        0 0 tmpfs                   /dev/shm                tmpfs   defaults        0 0 devpts                  /dev/pts                devpts  gid=5,mode=620  0 0 sysfs                   /sys                    sysfs   defaults        0 0 proc                    /proc                   proc    defaults        0 0 /dev/md4                /raid1             ext4     defaults     0 0 [root@server ~]# | 
Делаем контрольную перезагрузку
После перезагрузки проверяем результат:
| 1 2 3 4 5 6 7 8 | [root@server ~]# df -Th Filesystem     Type   Size  Used Avail Use% Mounted on /dev/md1       ext4   2,7T  1,2G  2,6T   1% / tmpfs          tmpfs  1,9G     0  1,9G   0% /dev/shm /dev/md0       ext2   485M  132M  328M  29% /boot /dev/md2       ext4   3,9G  8,1M  3,7G   1% /tmp /dev/md4       ext4   2,7T   73M  2,6T   1% /raid1 [root@server ~]# |