Итак имеем: новый установленный сервер с удаленным доступом по 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 ~]# |