summaryrefslogtreecommitdiff
path: root/LINUX/DISK/MDADM организация RAID.md
diff options
context:
space:
mode:
authorvlapa <vlapa@ya.ru>2026-06-13 20:33:26 +0300
committervlapa <vlapa@ya.ru>2026-06-13 20:33:26 +0300
commite5abc1fe99340b979b18864d978179f71fe8f5c5 (patch)
tree98fd0ad7c6d0744894d6e74e446daacd9e6dd1b5 /LINUX/DISK/MDADM организация RAID.md
First
Diffstat (limited to 'LINUX/DISK/MDADM организация RAID.md')
-rw-r--r--LINUX/DISK/MDADM организация RAID.md535
1 files changed, 535 insertions, 0 deletions
diff --git a/LINUX/DISK/MDADM организация RAID.md b/LINUX/DISK/MDADM организация RAID.md
new file mode 100644
index 0000000..7a50f40
--- /dev/null
+++ b/LINUX/DISK/MDADM организация RAID.md
@@ -0,0 +1,535 @@
+![Обновлено](https://www.dmosk.ru/img/public/time.jpg "Дата обновления") Обновлено: 28.09.2023  ![Опубликовано](https://www.dmosk.ru/img/public/time.jpg "Дата публикации") Опубликовано: 08.03.2019
+
+mdadm — утилита для работы с программными RAID-массивами различных уровней. В данной инструкции рассмотрим примеры ее использования.
+
+[Установка утилиты mdadm](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#install)
+[Создание RAID](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#create)
+    [Подготовка носителей](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#create-prepare)
+    [Сборка отказоустойчивого массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#create-raid)
+[Файл mdadm.conf](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#conf)
+[Создание файловой системы и монтирование](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#fs-mount)
+[Получение информации о RAID](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#info)
+[Проверка целостности массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#check)
+[Восстановление RAID](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#restore)
+    [Заменой диска](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#restore-disk)
+    [Пересборка массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#restore-assemble)
+[Использование Hot Spare](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#spare)
+[Добавление диска к массиву](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#add-to-raid)
+[Удаление массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#remove)
+
+## Установка mdadm
+
+`apt-get install mdadm
+
+## Сборка RAID
+
+Перед сборкой, стоит подготовить наши носители. Затем можно приступать к созданию рейд-массива.
+
+### Подготовка носителей
+
+Сначала необходимо занулить суперблоки на дисках, которые мы будем использовать для построения RAID (если диски ранее использовались, их суперблоки могут содержать служебную информацию о других RAID):
+
+`mdadm --zero-superblock --force /dev/sd{b,c}
+
+_* в данном примере мы зануляем суперблоки для дисков **sdb** и **sdc**._
+
+> Посмотреть, какие в вашей системе есть устройства можно командой:
+>
+> `lsblk
+
+Если мы получили ответ:
+
+`mdadm: Unrecognised md component device - /dev/sdb
+`mdadm: Unrecognised md component device - /dev/sdc
+
+... то значит, что диски не использовались ранее для RAID. Просто продолжаем настройку.
+
+Далее нужно удалить старые метаданные и подпись на дисках:
+
+`wipefs --all --force /dev/sd{b,c}
+
+### Создание рейда
+
+Для сборки избыточного массива применяем следующую команду:
+
+`mdadm --create --verbose /dev/md0 -l 1 -n 2 /dev/sd{b,c}
+
+_* где:_
+- _**/dev/md0** — устройство RAID, которое появится после сборки;_ 
+- _**-l 1** — уровень RAID;_ 
+- _**-n 2** — количество дисков, из которых собирается массив;_ 
+- _**/dev/sd{b,c}** — сборка выполняется из дисков sdb и sdc._
+
+Мы должны увидеть что-то на подобие:
+
+`mdadm: Note: this array has metadata at the start and
+    `may not be suitable as a boot device.  If you plan to
+    `store '/boot' on this device please ensure that
+    `your boot-loader understands md/v1.x metadata, or use
+    `--metadata=0.90
+`mdadm: size set to 1046528K
+
+Также система задаст контрольный вопрос, хотим ли мы продолжить и создать RAID — нужно ответить **y**:
+
+`Continue creating array? y
+
+Мы увидим что-то на подобие:
+
+`mdadm: Defaulting to version 1.2 metadata
+`mdadm: array /dev/md0 started.
+
+Вводим команду:
+
+`lsblk
+
+... и находим информацию о том, что у наших дисков sdb и sdc появился раздел md0, например:
+...
+sdb                     8:16   0    2G  0 disk  
+??md0                   9:0    0    2G  0 raid1 
+sdc                     8:32   0    2G  0 disk  
+??md0                   9:0    0    2G  0 raid1 
+...
+
+_* в примере мы видим собранный raid1 из дисков sdb и sdc._
+
+## Создание файла mdadm.conf
+
+В файле mdadm.conf находится информация о RAID-массивах и компонентах, которые в них входят. Для его создания выполняем следующие команды:
+
+`mkdir /etc/mdadm
+
+`echo "DEVICE partitions" > /etc/mdadm/mdadm.conf
+
+`mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf
+
+Пример содержимого:
+
+`DEVICE partitions
+`ARRAY /dev/md0 level=raid1 num-devices=2 metadata=1.2 name=proxy.dmosk.local:0 UUID=411f9848:0fae25f9:85736344:ff18e41d
+
+_* в данном примере хранится информация о массиве **/dev/md0** — его уровень 1, он собирается из 2-х дисков._
+
+## Создание файловой системы и монтирование массива
+
+Создание файловой системы для массива выполняется также, как для раздела, например:
+
+`mkfs.ext4 /dev/md0
+
+_* данной командой мы создаем на **md0** файловую систему **ext4**._
+или:
+
+`mkfs.xfs /dev/md0
+
+_* для файловой системы **xfs**._
+
+Примонтировать раздел можно командой:
+
+`mount /dev/md0 /mnt
+
+_* в данном случае мы примонтировали наш массив в каталог **/mnt**._
+
+Чтобы данный раздел также монтировался при загрузке системы, добавляем в fstab.
+
+Сначала смотрим идентификатор раздела:
+
+`blkid
+
+Мы увидим что-то на подобие:
+
+`/dev/md0: UUID="ffa7c082-7613-4dbc-ae62-3f5508652cf6" TYPE="ext4"
+
+_* в моем примере мы будем использовать идентификатор **ffa7c082-7613-4dbc-ae62-3f5508652cf6**._
+
+Открываем теперь fstab и добавляем строку:
+
+`vim /etc/fstab
+
+`UUID="ffa7c082-7613-4dbc-ae62-3f5508652cf6"    /mnt    ext4    defaults    0 0
+
+Если ранее мы монтировали раздел в каталог /mnt, вводим:
+
+`umount /mnt
+
+И после: 
+
+`mount -a
+
+Мы должны увидеть примонтированный раздел md, например:
+
+`df -h
+
+`/dev/md0               990M         2,6M  921M            1% /mnt
+
+## Информация о RAID
+
+Посмотреть состояние всех RAID можно командой:
+
+`cat /proc/mdstat
+
+В ответ мы получим что-то на подобие:
+
+`md0 : active raid1 sdc[1] sdb[0]
+      `1046528 blocks super 1.2 [2/2] [UU]
+
+_* где **md0** — имя RAID устройства; **raid1 sdc[1] sdb[0]** — уровень избыточности и из каких дисков собран; **1046528 blocks** — размер массива; **[2/2] [UU]** — количество юнитов, которые на данный момент используются.
+** мы можем увидеть строку **md0 : active(auto-read-only)** — это означает, что после монтирования массива, он не использовался для записи._
+
+Подробную информацию о конкретном массиве можно посмотреть командой:
+
+`mdadm -D /dev/md0
+
+_* где **/dev/md0** — имя RAID устройства._
+
+Пример ответа:
+
+           Version : 1.2
+     Creation Time : Wed Mar  6 09:41:06 2019
+        Raid Level : raid1
+        Array Size : 1046528 (1022.00 MiB 1071.64 MB)
+     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
+      Raid Devices : 2
+     Total Devices : 2
+       Persistence : Superblock is persistent
+
+       Update Time : Wed Mar  6 09:41:26 2019
+             State : clean 
+    Active Devices : 2
+   Working Devices : 2
+    Failed Devices : 0
+     Spare Devices : 0
+
+Consistency Policy : resync
+
+              Name : proxy.dmosk.local:0  (local to host proxy.dmosk.local)
+              UUID : 304ad447:a04cda4a:90457d04:d9a4e884
+            Events : 17
+
+    Number   Major   Minor   RaidDevice State
+       0       8       16        0      active sync   /dev/sdb
+       1       8       32        1      active sync   /dev/sdc
+
+_* где:_
+
+- _**Version —** версия метаданных._
+- _**Creation Time —** дата в время создания массива._
+- _**Raid Level —** уровень RAID._
+- _**Array Size —** объем дискового пространства для RAID._
+- _**Used Dev Size —** используемый объем для устройств. Для каждого уровня будет индивидуальный расчет: RAID1 — равен половине общего размера дисков, RAID5 — равен размеру, используемому для контроля четности._
+- _**Raid Devices —** количество используемых устройств для RAID._
+- _**Total Devices —** количество добавленных в RAID устройств._
+- _**Update Time —** дата и время последнего изменения массива._
+- _**State —** текущее состояние. clean — все в порядке._
+- _**Active Devices —** количество работающих в массиве устройств._
+- _**Working Devices —** количество добавленных в массив устройств в рабочем состоянии._
+- _**Failed Devices —** количество сбойных устройств._
+- _**Spare Devices —** количество запасных устройств._
+- _**Consistency Policy —** политика согласованности активного массива (при неожиданном сбое). По умолчанию используется **resync** — полная ресинхронизация после восстановления. Также могут быть bitmap, journal, ppl._
+- _**Name —** имя компьютера._
+- _**UUID —** идентификатор для массива._
+- _**Events —** количество событий обновления._
+- **Chunk Size** (для RAID5) — размер блока в килобайтах, который пишется на разные диски.
+
+Подробнее про каждый параметр можно прочитать в мануале для mdadm:
+
+`man mdadm
+
+Также, информацию о разделах и дисковом пространстве массива можно посмотреть командой fdisk:
+
+`fdisk -l /dev/md0
+
+## Проверка целостности
+
+Для проверки целостности вводим:
+
+`echo 'check' > /sys/block/md0/md/sync_action
+
+Результат проверки смотрим командой:
+
+`cat /sys/block/md0/md/mismatch_cnt
+
+_* если команда возвращает **0**, то с массивом все в порядке._
+
+Остановка проверки:
+
+`echo 'idle' > /sys/block/md0/md/sync_action
+
+## Восстановление RAID
+
+Рассмотрим два варианта восстановлении массива.
+
+### Замена диска
+
+В случае выхода из строя одного из дисков массива, команда cat /proc/mdstat покажет следующее:
+
+`cat /proc/mdstat
+
+Personalities : [raid1] 
+md0 : active raid1 sdb[0]
+      1046528 blocks super 1.2 [2/1] [U_]
+
+_* о наличии проблемы нам говорит нижнее подчеркивание вместо U — **[U_]** вместо **[UU]**._
+
+Или:
+
+`mdadm -D /dev/md0
+
+...
+       Update Time : Thu Mar  7 20:20:40 2019
+             State : clean, degraded
+...
+
+_* статус **degraded** говорит о проблемах с RAID._
+
+Для восстановления, сначала удалим сбойный диск, например:
+
+`mdadm /dev/md0 --remove /dev/sdc
+
+> Если нам нужно заменить диск, но при этом он в mdadm имеет рабочее состояние, мы получим ошибку:
+>
+> ... device or resource busy
+>
+> Сначала, нам нужно пометить диск как сбойный:
+>
+> `mdadm /dev/md0 --manage --fail /dev/sdc
+>
+> _* в данном примере диск **sdb** массива **md0** будет помечен сбойным._
+>
+> Теперь удаляем:
+>
+> `mdadm /dev/md0 --remove /dev/sdc
+
+Теперь добавим новый:
+
+`mdadm /dev/md0 --add /dev/sde
+
+Смотрим состояние массива:
+
+`mdadm -D /dev/md0
+
+...
+       Update Time : Thu Mar  7 20:57:13 2019
+             State : clean, degraded, recovering
+...
+    Rebuild Status : 40% complete
+...
+
+_* **recovering** говорит, что RAID восстанавливается; **Rebuild Status** — текущее состояние восстановления массива (в данном примере он восстановлен на **40%**)._
+
+Если синхронизация выполняется слишком медленно, можно увеличить ее скорость. Для изменения скорости синхронизации вводим:
+
+`echo '10000' > /proc/sys/dev/raid/speed_limit_min
+
+_* по умолчанию скорость **speed_limit_min** = 1000 Кб, **speed_limit_max** — 200000 Кб. Для изменения скорости, можно поменять только минимальную._
+
+### Пересборка массива
+
+Если нам нужно вернуть ранее разобранный или развалившийся массив из дисков, которые уже входили в состав RAID, вводим:
+
+`mdadm --assemble --scan
+
+_* данная команда сама найдет необходимую конфигурацию и восстановит RAID._
+
+Также, мы можем указать, из каких дисков пересобрать массив:
+
+`mdadm --assemble /dev/md0 /dev/sdb /dev/sdc
+
+===============================================
+
+**Чтобы вытащить данные из одного диска RAID-1 в Ubuntu, можно попробовать следующее:**
+
+При подключении одного жесткого диска к моей машине Ubuntu `fdisk -l`отчеты:
+
+```
+Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
+ Units: sectors of 1 * 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 4096 bytes
+I/O size (minimum/optimal): 4096 bytes / 4096 bytes
+Disklabel type: gpt
+Disk identifier: D1C4E003-11FD-4223-AA98-61CB9C6322BD
+
+Device Start End Sectors Size Type
+/dev/sdb1 2048 1050623 1048576 512M Linux swap
+/dev/sdb2 3147776 3904929899 3901782124 1.8T Microsoft basic data
+/dev/sdb3 3904931840 3907029134 2097295 1G Microsoft basic data
+/dev/sdb4 1050624 3147775 2097152 1G Microsoft basic data
+```
+
+Я попробовал шаги из похожего вопроса на этом сайте:
+
+```
+root@host:/mnt# mount /dev/sdb2 /mnt/old_nas/
+mount: /mnt/old_nas: unknown filesystem type 'linux_raid_member'.
+
+root@host:/mnt# mdadm --assemble --run /dev/md0 /dev/sdb2
+mdadm: failed to RUN_ARRAY /dev/md0: Invalid argument
+mdadm: Not enough devices to start the array.
+```
+
+Предположим, /deb/sdb2 — это старый участник raid 1, который вы хотите восстановить.
+
+**Первый вариант** : попробуйте заново собрать RAID 1 со старым диском:
+
+Вам необходимо собрать деградировавший RAID-массив на новой машине, используя что-то вроде этого:
+
+```
+mdadm --force --assemble --run /dev/md0 /dev/sdb2
+```
+
+Конечно, выберите номер помимо md0, если он уже используется. Затем вы можете смонтировать /dev/md0, где захотите.
+
+Другой вариант:
+
+```
+mdadm --force --run --assemble --scan
+```
+
+Вы получите что-то вроде этого:
+
+```
+mdadm: /dev/md/0 has been started with 1 drive (out of 2)
+```
+
+Затем смонтируйте и просмотрите свои файлы:
+
+```
+cd /mnt && mkdir md0 && mount /dev/md0 md0
+ls -la md0
+```
+
+Наконец, вы можете добавить второй диск в массив:
+
+```
+mdadm /dev/md0 --manage --add /dev/sdc1
+```
+
+**Второй вариант** : использование циклического устройства только для чтения
+
+Получите смещение данных для старого диска:
+
+```
+mdadm --examine /dev/sdb2 | grep -i offset
+```
+
+Создайте петлевое устройство (представим, что смещение данных равно 2048):
+
+```
+losetup --find --show --read-only --offset $((2048*512)) /dev/sdb2
+```
+
+Смонтируйте печатное устройство петли, полученное в результате предыдущей команды.
+
+```
+mount -o ro /dev/loo1 /mnt/
+```
+
+Mount может сделать это напрямую с помощью опций -o ro,loop,offset=:
+
+```
+mount -o ro,loop,offset=$((2048*512)) /dev/sdb2 /mnt
+```
+
+Насколько я понимаю, проблема, с которой вы столкнулись, может быть связана с тем, что mdadm считает ваш массив RAID 1 "чистым", что не так. Перед тем, как извлечь диск из массива, вы должны явно сообщить mdadm, что ваш второй диск (sdb2) вышел из строя:
+
+```
+mdadm --manage /dev/md0 --fail /dev/sdb2
+mdadm --manage /dev/md0 --remove /dev/sdb2
+```
+
+===============================================
+## Запасной диск (Hot Spare)
+
+Если в массиве будет запасной диск для горячей замены, при выходе из строя одного из основных дисков, его место займет запасной.
+
+Диском Hot Spare станет тот, который просто будет добавлен к массиву:
+
+`mdadm /dev/md0 --add /dev/sdd
+
+Информация о массиве изменится, например:
+
+`mdadm -D /dev/md0
+
+...
+    Number   Major   Minor   RaidDevice State
+       0       8       16        0      active sync   /dev/sdb
+       2       8       48        1      active sync   /dev/sdc
+
+       3       8       32        -      spare   /dev/sdd
+
+Проверить работоспособность резерва можно вручную, симулировав выход из строя одного из дисков:
+
+`mdadm /dev/md0 --fail /dev/sdb
+
+И смотрим состояние:
+
+`mdadm -D /dev/md0
+
+...
+    Rebuild Status : 37% complete
+...
+    Number   Major   Minor   RaidDevice State
+       3       8       32        0      spare rebuilding   /dev/sdd
+       2       8       48        1      active sync   /dev/sdc
+
+       0       8       16        -      faulty   /dev/sdb
+...
+
+_* как видим, начинается ребилд. На замену вышедшему из строя **sdb** встал hot-spare **sdd**._
+
+## Добавить диск к массиву
+
+В данном примере рассмотрим вариант добавления активного диска к RAID, который будет использоваться для работы, а не в качестве запасного.
+
+Добавляем диск к массиву:
+
+`mdadm /dev/md0 --add /dev/sde
+
+Новый диск мы увидим в качестве spare:
+
+4       8       16        -      spare   /dev/sde
+
+Теперь расширяем RAID:
+
+`mdadm -G /dev/md0 --raid-devices=3
+
+_* в данном примере подразумевается, что у нас RAID 1 и мы добавили к нему 3-й диск._
+
+## Удаление массива
+
+При удалении массива внимательнее смотрите на имена массива и дисков и подставляйте свои значения.
+
+Если нам нужно полностью разобрать RAID, сначала размонтируем и остановим его:
+
+`umount /mnt
+
+_* где **/mnt** — каталог монтирования нашего RAID._
+
+> Если мы получим ошибку **umount: /mnt: target is busy**, то смотрим пользовательские процессы, которые мешают отмонтировать раздел:
+>
+> `fuser -vm /mnt
+>
+> И останавливаем их.
+
+`mdadm -S /dev/md0
+
+_* где **/dev/md0** — массив, который мы хотим разобрать._
+
+> Если мы получим ошибку **mdadm: fail to stop array /dev/md0: Device or resource busy**, с помощью команды
+>
+> `lsof -f -- /dev/md0
+>
+> ... смотрим процессы, которые используют раздел и останавливаем их.
+
+Затем очищаем суперблоки на всех дисках, из которых он был собран:
+
+`mdadm --zero-superblock /dev/sdb
+
+`mdadm --zero-superblock /dev/sdc
+
+`mdadm --zero-superblock /dev/sdd
+
+_* где диски **/dev/sdb**, **/dev/sdc**, **/dev/sdd** были частью массива md0._
+
+А также удаляем метаданные и подпись:
+
+`wipefs --all --force /dev/sd{b,c,d}
+