![Обновлено](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}