diff options
Diffstat (limited to 'LINUX/DISK/MDADM организация RAID.md')
| -rw-r--r-- | LINUX/DISK/MDADM организация RAID.md | 535 |
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 @@ + Обновлено: 28.09.2023  Опубликовано: 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} + |
