Как создать программный RAID 1 массив (зеркало) в Porteus

Добро пожаловать!

Moderator: Blaze

User avatar
Blaze
DEV Team
DEV Team
Posts: 3869
Joined: 28 Dec 2010, 11:31
Distribution: ⟰ Porteus current ☯ all DEs ☯
Location: ☭ Russian Federation, Lipetsk region, Dankov
Contact:

Как создать программный RAID 1 массив (зеркало) в Porteus

Post#1 by Blaze » 07 May 2017, 19:07

Как создать программный RAID1 массив (зеркало) с помощью mdadm в Porteus
RAID 1 - Дисковый массив с зеркалированием. Каждый диск представляет собой полную копию другого.
Такой массив позволит вам продолжить работу даже при выходе одного диска из строя.
Для создания RAID 1 вам потребуются минимум два пустых (без разделов и таблиц), одинаковых жёстких диска.
В данной инструкции рассмотрен пример с таблицей разделов MBR. Таблица разделов GPT не рассмотрена.
Предположим, что у вас имеется два одинаковых жестких диска объемом 50 Гб.

Тогда произведем такую разбивку:
  • 20 Гб для /dev/md0 (/dev/md0p1), полученный из /dev/sda1 и /dev/sdb1 под ОС Porteus
  • 2 Гб для /dev/md1 (/dev/md1p1), полученный из /dev/sda2 и /dev/sdb2 под Swap
    Примечание: При создании raid-массива первого уровня (зеркала) с целью повышения отказоустойчивости системы рекомендуется разделы swap также объединять в массив. При использовании swap-разделов вне raid при отказе одного диска может случиться крах системы (если на поломавшийся диск была выгружена часть страниц памяти). При объединении в raid-массив разделов swap такого не произойдет, т.к. выгружаемая страница будет присутствовать на обоих дисках.
    Но лучше отказаться от swap на разделах с raid1 и использовать читкод zram=5% в /mnt/sdX/boot/syslinux/porteus.cfg
  • Остальное пространство для /dev/md2 (/dev/md2p1), полученный из /dev/sda3 и /dev/sdb3 под файловый сервер
1. Открываем терминал и вводим

Code: Select all

su
toor
fdisk -l | grep /dev/sd
Получаем два одинаковых диска

Code: Select all

Диск /dev/sda: 50 GiB, 53687091200 байт, 104857600 секторов
Диск /dev/sdb: 50 GiB, 53687091200 байт, 104857600 секторов
2. Размечаем диски

Code: Select all

fdisk /dev/sda
Для справки:

Code: Select all

Команда (m для справки): m

Справка:

  DOS (MBR)
   a   переключение флага загрузки
   b   редактирование вложенной метки диска BSD
   c   переключение флага dos-совместимости

  Общие
   d   удалить раздел
   F   показать свободное неразмеченное пространство
   l   список известных типов разделов
   n   добавление нового раздела
   p   вывести таблицу разделов
   t   изменение типа раздела
   v   проверка таблицы разделов
   i   вывести информацию о разделе

  Разное
   m   вывод этого меню
   u   изменение единиц измерения экрана/содержимого
   x   дополнительная функциональность (только для экспертов)

  Сценарий
   I   загрузить разметку из файла сценария sfdisk
   O   записать разметку в файл сценария sfdisk

  Записать и выйти
   w   запись таблицы разделов на диск и выход
   q   выход без сохранения изменений

  Создать новую метку
   g   создание новой пустой таблицы разделов GPT
   G   создание новой пустой таблицы разделов SGI (IRIX)
   o   создание новой пустой таблицы разделов DOS
   s   создание новой пустой таблицы разделов Sun

Code: Select all

Тип раздела (введите L для получения списка типов разделов): L

 0  Пустой          24  NEC DOS         81  Minix / старый  bf  Solaris        
 1  FAT12           27  Скрытый NTFS Wi 82  Linux своп      c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux расширен  c7  Syrinx         
 5  Расширенный     41  PPC PReP Boot   86  NTFS набор томо da  Данные не ФС   
 6  FAT16           42  SFS             87  NTFS набор томо db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2-я част 8e  Linux LVM       df  BootIt         
 9  AIX загрузочный 4f  QNX4.x 3-я част 93  Amoeba          e1  DOS access     
 a  OS/2 Boot-менед 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignment
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS фс        
 f  W95 расшир. (LB 54  OnTrackDM6      a6  OpenBSD         ee  GPT            
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  Скрытый FAT12   56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC з
12  Compaq диагност 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor      
14  Скрытый FAT16 < 61  SpeedStor       ab  Darwin загрузоч f4  SpeedStor      
16  Скрытый FAT16   63  GNU HURD или Sy af  HFS / HFS+      f2  DOS вторичный  
17  Скрытый HPFS/NT 64  Novell Netware  b7  BSDI фс         fb  VMware VMFS    
18  AST SmartSleep  65  Novell Netware  b8  BSDI своп       fc  VMware VMKCORE 
1b  Скрытый W95 FAT 70  DiskSecure Mult bb  Boot Wizard скр fd  Автоопределение
1c  Скрытый W95 FAT 75  PC/IX           bc  Acronis FAT32 L fe  LANstep        
1e  Скрытый W95 FAT 80  Old Minix       be  Solaris загр.   ff  BBT            

Code: Select all

#Диск /dev/sda
fdisk /dev/sda

#Создаем /dev/sda1 на 20 Гб с флагом загрузки и типом - Автоопределение Linux raid
n
p
1
Enter
+20G
t
1
fd
a
w

#Создаем /dev/sda2 на 2 Гб с типом - Linux своп
n
p
2
Enter
+2G
t
2
82
w

#Создаем /dev/sda3 на все оставшееся пространство и типом - Автоопределение Linux raid
n
p
3
Enter
Enter
t
3
fd
p
w
В итоге получаем:

Code: Select all

Устр-во    Загрузочный   начало     Конец  Секторы Размер Идентификатор Тип
/dev/sda1  *               2048  41945087 41943040    20G            fd Автоопределение Linux raid
/dev/sda2              41945088  46139391  4194304     2G            82 Linux своп
/dev/sda3              46139392 104857599 58718208    28G            fd Автоопределение Linux raid
Заметка. Чтобы вручную, приведенными ниже командами, не размечать диск /dev/sdb
можно скопировать таблицу разделов с жесткого диска /dev/sda на жесткий диск /dev/sdb:

Code: Select all

sfdisk -d /dev/sda | sfdisk /dev/sdb
# Проверяем как скопировались таблицы разделов
fdisk /dev/sdb
p
q

Code: Select all

#Диск /dev/sdb
fdisk /dev/sdb

#Создаем /dev/sdb1 на 20 Гб с флагом загрузки и типом - Автоопределение Linux raid
n
p
1
Enter
+20G
t
1
fd
a
w

#Создаем /dev/sdb2 на 2 Гб с типом - Linux своп
n
p
2
Enter
+2G
t
2
82
w

#Создаем /dev/sdb3 на все оставшееся пространство и типом - Автоопределение Linux raid
n
p
3
Enter
Enter
t
3
fd
p
w
В итоге получаем:

Code: Select all

Устр-во    Загрузочный   начало     Конец  Секторы Размер Идентификатор Тип
/dev/sdb1  *               2048  41945087 41943040    20G            fd Автоопределение Linux raid
/dev/sdb2              41945088  46139391  4194304     2G            82 Linux своп
/dev/sdb3              46139392 104857599 58718208    28G            fd Автоопределение Linux raid
3. Создаем RAID 1. На все вопросы по созданию RAID массива отвечаем положительно, нажав клавишу y

Code: Select all

mdadm --create --verbose /dev/md0 --metadata=0.90 --level=1 --raid-devices=2 /dev/sd[ab]1
mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sd[ab]2
mdadm --create --verbose /dev/md2 --level=1 --raid-devices=2 /dev/sd[ab]3
Заметка. --metadata=0.90 необходим для раздела с загрузчиком.
GRUB и Syslinux мне установить не удалось.
4. Ждем окончания создания RAID 1

Code: Select all

watch cat /proc/mdstat
#Ctrl+C для выхода                    
5. Размечаем /dev/md0, /dev/md1 и /dev/md2

Code: Select all

fdisk /dev/md0

n
p
1
Enter
Enter
a
p
w

fdisk /dev/md1

n
p
1
Enter
Enter
t
82
p
w

fdisk /dev/md2

n
p
1
Enter
Enter
p
w
6. Создаем разделы и подключаем swap

Code: Select all

mkfs.ext4 /dev/md0p1
mkswap /dev/md1p1
mkfs.ext4 /dev/md2p1
partprobe
swapon -a
free -m
7. Чтобы ваш массив автоматически был прочитан системой, выполните команды от root пользователя:

Code: Select all

echo "DEVICE partitions" > /etc/mdadm.conf
mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm.conf
Заметка. Откройте и проверьте правильность заполнения /etc/mdadm.conf
/etc/mdadm.conf может сконфигурироваться неверно, например:

Code: Select all

DEVICE partitions
ARRAY /dev/md/porteus.example.net:0 level=raid1 num-devices=2 metadata=1.2 name=porteus.example.net:0 UUID=b1f03d4b:d14ea2f3:50c1c2df:214f3b47
в следствии чего необходимо:
  • размонтировать /mnt/md0p1 (еще может быть /mnt/md127p1) и остановить массив:

    Code: Select all

    umount /mnt/md0p1 /mnt/md127p1 
    mdadm -S /dev/md0
  • вручную исправить путь массива, поправив /dev/md/porteus.example.net:0 (у Вас может быть и другой путь) на /dev/md0:

    Code: Select all

    DEVICE partitions
    ARRAY /dev/md0 level=raid1 num-devices=2 metadata=1.2 name=porteus.example.net:0 UUID=b1f03d4b:d14ea2f3:50c1c2df:214f3b47
  • собрать массив заново:
    • Для версии 1.2

      Code: Select all

      mdadm -A --scan
    • Для версии 0.9

      Code: Select all

      mdadm -A /dev/md0 --update=super-minor /dev/sda1 /dev/sdb1
  • проверить, что выдает команда:

    Code: Select all

    mdadm --detail --scan --verbose | awk '/ARRAY/ {print}'
8. Проверяем состояние RAID 1

Code: Select all

cat /proc/mdstat
получаем:

Code: Select all

Personalities : [raid1] 
md2 : active raid1 sdb3[1] sda3[0]
      29342720 blocks super 1.2 [2/2] [UU]
      
md1 : active raid1 sdb2[1] sda2[0]
      2095104 blocks super 1.2 [2/2] [UU]
      
md0 : active raid1 sdb1[1] sda1[0]
      20955136 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>
а так же:

Code: Select all

mdadm --detail /dev/md0
mdadm --detail /dev/md1
mdadm --detail /dev/md2
получаем:

Code: Select all

root@porteus:~# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Sun May  7 10:41:27 2017
     Raid Level : raid1
     Array Size : 20955136 (19.98 GiB 21.46 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Sun May  7 10:58:32 2017
          State : clean 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : porteus:0  (local to host porteus)
           UUID : e9e2bcf7:d279d7e1:d042a7fc:dd2025bb
         Events : 17

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
root@porteus:~# mdadm --detail /dev/md1
/dev/md1:
        Version : 1.2
  Creation Time : Sun May  7 10:42:57 2017
     Raid Level : raid1
     Array Size : 2095104 (2046.00 MiB 2145.39 MB)
  Used Dev Size : 2095104 (2046.00 MiB 2145.39 MB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Sun May  7 10:58:32 2017
          State : clean 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : porteus:1  (local to host porteus)
           UUID : 61de6efe:4496c7bf:805c090c:43483f3c
         Events : 17

    Number   Major   Minor   RaidDevice State
       0       8        2        0      active sync   /dev/sda2
       1       8       18        1      active sync   /dev/sdb2
root@porteus:~# mdadm --detail /dev/md2
/dev/md2:
        Version : 1.2
  Creation Time : Sun May  7 10:44:04 2017
     Raid Level : raid1
     Array Size : 29342720 (27.98 GiB 30.05 GB)
  Used Dev Size : 29342720 (27.98 GiB 30.05 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Sun May  7 10:58:32 2017
          State : clean 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : porteus:2  (local to host porteus)
           UUID : 3489cc13:a73f47f4:2a7f8339:9ddb1e6e
         Events : 17

    Number   Major   Minor   RaidDevice State
       0       8        3        0      active sync   /dev/sda3
       1       8       19        1      active sync   /dev/sdb3
root@porteus:~#
9. В итоге имеем

Code: Select all

fdisk -l | grep /dev/md

Code: Select all

Диск /dev/md0: 20 GiB, 21458059264 байт, 41910272 секторов
/dev/md0p1               2048 41910271 41908224    20G            83 Linux
Диск /dev/md1: 2 GiB, 2145386496 байт, 4190208 секторов
/dev/md1p1               2048 4190207 4188160     2G            82 Linux своп
Диск /dev/md2: 28 GiB, 30046945280 байт, 58685440 секторов
/dev/md2p1               2048 58685439 58683392    28G            83 Linux

Code: Select all

lsblk -e7 -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

Code: Select all

NAME          SIZE FSTYPE            TYPE  MOUNTPOINT 
sda            50G                   disk  
├─sda1         20G linux_raid_member part  
│ └─md0        20G                   raid1 
│   └─md0p1    20G ext4              md    /mnt/md0p1
├─sda2          2G linux_raid_member part  
│ └─md1         2G                   raid1 
│   └─md1p1     2G swap              md    [SWAP]
└─sda3         28G linux_raid_member part  
  └─md2        28G                   raid1 
    └─md2p1    28G ext4              md    /mnt/md2p1
sdb            50G                   disk  
├─sdb1         20G linux_raid_member part  
│ └─md0        20G                   raid1 
│   └─md0p1    20G ext4              md    /mnt/md0p1
├─sdb2          2G linux_raid_member part  
│ └─md1         2G                   raid1 
│   └─md1p1     2G swap              md    [SWAP]
└─sdb3         28G linux_raid_member part  
  └─md2        28G                   raid1 
    └─md2p1    28G ext4              md    /mnt/md2p1
10. Для раздела /mnt/md2p1 (раздел может отличаться), который будет выступать в роли файлового сервера, меняем владельца и группу на guest:users

Code: Select all

chown -R guest:users /mnt/md2p1
Восстановление RAID 1 в Porteus
Имеется два диска /dev/sda и /dev/sdb в RAID 1 (см. начало статьи):

Code: Select all

/dev/sda1, /dev/sdb1 = /dev/md0
/dev/sda2, /dev/sdb2 = /dev/md1
/dev/sda3, /dev/sdb3 = /dev/md2
Допустим диск /dev/sda вышел из строя, проверяем состояние рейда командами

Code: Select all

cat /proc/mdstat
mdadm --detail /dev/md0
mdadm --detail /dev/md1
mdadm --detail /dev/md2
Если вместо [UU] видим [U_], то целостность одного из дисков нарушена.

Необходимо извлечь сбойный диск sda из массива, помечаем его сбойным для всех массивов:

Code: Select all

mdadm --manage /dev/md0 --fail /dev/sda1
mdadm --manage /dev/md1 --fail /dev/sda2
mdadm --manage /dev/md2 --fail /dev/sda3
Теперь удаляем сбойный диск sda из массивов:

Code: Select all

mdadm --manage /dev/md0 --remove /dev/sda1
mdadm --manage /dev/md1 --remove /dev/sda2
mdadm --manage /dev/md2 --remove /dev/sda3
После этого можно физически извлечь диск и заменить новым.
После подключения нового диска, нужно на нем создать такую же разметку, как и на соседнем диске, копируем разметку командой:

Code: Select all

sfdisk -d /dev/sdb | sfdisk --force /dev/sda
Сверяем таблицы на дисках:

Code: Select all

fdisk -l | grep dev
Добавим новый диск в массив:

Code: Select all

mdadm --manage /dev/md0 --add /dev/sda1
mdadm --manage /dev/md1 --add /dev/sda2
mdadm --manage /dev/md2 --add /dev/sda3
Начнется синхронизация, проверить состояние можно командами:

Code: Select all

cat /proc/mdstat
mdadm --detail /dev/md0
mdadm --detail /dev/md1
mdadm --detail /dev/md2
Удаление RAID массивов
Останавливаем массивы

Code: Select all

mdadm -S /dev/md0
mdadm -S /dev/md1
mdadm -S /dev/md2
Очищаем суперблоки RAID на разделах, из которых собраны массивы

Code: Select all

mdadm --zero-superblock /dev/sd[a-b]1
mdadm --zero-superblock /dev/sd[a-b]2
mdadm --zero-superblock /dev/sd[a-b]3
Linux 6.6.11-porteus #1 SMP PREEMPT_DYNAMIC Sun Jan 14 12:07:37 MSK 2024 x86_64 Intel(R) Xeon(R) CPU E3-1270 v6 @ 3.80GHz GenuineIntel GNU/Linux
MS-7A12 » [AMD/ATI] Navi 23 [Radeon RX 6600] [1002:73ff] (rev c7) » Vengeance LPX 16GB DDR4 K2 3200MHz C16