RAID (Русский) - ArchWiki

Jump to content

# RAID (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи RAID. Дата последней синхронизации: 2026-07-12. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Related articles

- Btrfs#RAID
- Convert a single drive system to RAID
- Install Arch Linux with Fake RAID
- LVM on software RAID
- LVM#RAID
- Swap#Striping
- ZFS
- ZFS/Virtual disks

Redundant Array of Independent Disks (RAID, избыточный массив независимых дисков) — технология хранения, объединяющая несколько дисковых компонентов (обычно дисков или их разделов) в логическое устройство. В зависимости от реализации, этим логическим устройством может быть файловая система или дополнительный прозрачный слой, на котором можно разместить несколько разделов.

Данные распределяются по дискам одним из нескольких способов, называемых уровнями RAID, в зависимости от требуемого уровня избыточности и производительности. Выбранный уровень RAID может предотвратить потерю данных при отказе жёсткого диска, повысить производительность или и то, и другое одновременно.

В этой статье описывается создание и управление программным RAID-массивом с помощью mdadm(8).

Важно Перед началом работы обязательно создайте резервную копию всех данных.

## Уровни RAID

Несмотря на избыточность, подразумеваемую большинством уровней RAID, RAID не гарантирует сохранность данных. RAID не защитит данные при пожаре, краже компьютера или одновременном выходе из строя нескольких жёстких дисков. Кроме того, установка системы с RAID — сложный процесс, который может уничтожить данные.

### Стандартные уровни RAID

Существует множество различных уровней RAID; ниже перечислены наиболее распространённые.

RAID 0
  Использует чередование (striping) для объединения дисков. Хотя он не обеспечивает избыточности (фактически снижая надёжность), его всё равно относят к RAID. При этом он даёт значительный прирост скорости. Если увеличение скорости стоит вероятной потери данных (например, для раздела swap), выбирайте этот уровень. На сервере более уместны массивы RAID 1 и RAID 5. Размер блочного устройства массива RAID 0 равен размеру наименьшего раздела-компонента, умноженному на количество разделов.

RAID 1
  Самый простой уровень RAID: прямое зеркалирование. Как и другие уровни, имеет смысл только если разделы находятся на разных физических дисках. При отказе одного из дисков блочное устройство массива продолжит работать как обычно. В примере будет использоваться RAID 1 для всего, кроме swap и временных данных. Обратите внимание, что при программной реализации уровень RAID 1 — единственный вариант для загрузочного раздела, поскольку загрузчики не понимают RAID, но раздел-компонент RAID 1 может быть прочитан как обычный раздел. Размер блочного устройства массива RAID 1 равен размеру наименьшего раздела-компонента.

RAID 5
  Требует 3 или более физических дисков и сочетает избыточность RAID 1 со скоростью и объёмом RAID 0. RAID 5 использует чередование, как RAID 0, но также хранит блоки чётности, распределённые по каждому диску-участнику. В случае отказа диска эти блоки чётности используются для восстановления данных на заменяющем диске. RAID 5 выдерживает потерю одного диска-участника.
  Примечание RAID 5 — распространённый выбор благодаря сочетанию скорости и избыточности. Недостаток в том, что при отказе одного диска и последующем отказе другого до замены первого все данные будут потеряны. Более того, с современными размерами дисков и ожидаемыми показателями невосстановимых ошибок чтения (URE) на потребительских дисках восстановление массива объёмом 4 ТиБ ожидаемо (т.е. с вероятностью выше 50%) столкнётся как минимум с одной URE. Из-за этого индустрия хранения данных больше не рекомендует RAID 5.

RAID 6
  Требует 4 или более физических дисков и даёт преимущества RAID 5 с защитой от двух отказов дисков. RAID 6 также использует чередование, как RAID 5, но хранит два независимых блока чётности, распределённых по каждому диску-участнику. RAID 6 выдерживает потерю двух дисков-участников. Устойчивость к невосстановимым ошибкам чтения несколько лучше, поскольку при восстановлении после отказа одного диска массив всё ещё имеет блоки чётности. Однако из-за накладных расходов RAID 6 затратен, и в большинстве случаев RAID 10 в компоновке far2 (см. ниже) обеспечивает лучшую скорость и надёжность, и поэтому предпочтительнее.

### Вложенные уровни RAID

RAID 1+0
  RAID1+0 — это вложенный RAID, объединяющий два стандартных уровня для повышения производительности и дополнительной избыточности. Часто называется RAID10, однако Linux MD RAID10 несколько отличается от простого наслоения RAID, см. ниже.

RAID 10
  RAID10 в Linux основан на концепциях RAID1+0, но реализован как единый слой с несколькими возможными раскладками (layout).
  Раскладка near X на Y дисках повторяет каждый чанк X раз на Y/2 полосах, но X не обязан делить Y нацело. Чанки размещаются почти на одной и той же позиции на каждом зеркалируемом диске, отсюда название. Может работать с любым количеством дисков, начиная с 2. Near 2 на 2 дисках эквивалентен RAID1, near 2 на 4 дисках — RAID1+0.
  Раскладка far X на Y дисках предназначена для обеспечения производительности чередования при чтении на зеркальном массиве. Она достигается разделением каждого диска на две части, условно переднюю и заднюю, и то, что записывается на переднюю часть диска 1, зеркалируется в заднюю часть диска 2, и наоборот. Это позволяет чередовать последовательные чтения, откуда RAID0 и RAID5 берут свою производительность. Недостаток — небольшая потеря производительности последовательной записи из-за перемещения головки в другую часть диска для сохранения зеркала. RAID10 в раскладке far 2, однако, предпочтительнее наслоенного RAID1+0 и RAID5, когда важны скорость чтения и доступность/избыточность.

  Важно mdadm не может изменять форму (reshape) массивов в раскладках far X, то есть после создания массива вы не сможете использовать `mdadm --grow`. Например, если у вас массив RAID10 4x1TB и вы хотите перейти на диски по 2TB, полезная ёмкость останется 2TB. Для таких случаев придерживайтесь раскладок near X.

### Сравнение уровней RAID

Уровень RAID | Избыточность данных | Использование физических дисков | Производительность чтения | Производительность записи | Минимум дисков
--- | --- | --- | --- | --- | ---
0 | No | 100% | nX Наилучшая | nX Наилучшая | 2
1 | Yes | 50% | До nX, если несколько процессов читают одновременно, иначе 1X | 1X | 2
5 | Yes | 67% - 94% | (n−1)X Отличная | (n−1)X Отличная | 3
6 | Yes | 50% - 88% | (n−2)X | (n−2)X | 4
10,far2 | Yes | 50% | nX Наилучшая; наравне с RAID0, но с избыточностью | (n/2)X | 2
10,near2 | Yes | 50% | До nX, если несколько процессов читают одновременно, иначе 1X | (n/2)X | 2

* Где n — количество выделенных дисков.

### LINEAR

LINEAR позволяет объединить два или более устройств в одно без параллельного доступа, как у RAID0, но с возможностью полностью использовать диски разного размера. Для создания псевдо-RAID в этом режиме без mdadm можно использовать низкоуровневую утилиту dmsetup(8), высокоуровневый фреймворк LVM или файловую систему Btrfs.

## Реализация

Устройства RAID могут управляться по-разному:

Программный RAID (Software RAID)
  Это самая простая реализация, так как не зависит от проприетарных прошивок и программ. Массив управляется операционной системой с помощью:
  - слоя абстракции (например, mdadm);
    Примечание Это метод, который будет использоваться далее в этом руководстве.
  - менеджера логических томов (например, LVM);
  - компонента файловой системы (например, ZFS, Btrfs).

Аппаратный RAID (Hardware RAID)
  Массив напрямую управляется специализированной аппаратной картой, установленной в ПК, к которой непосредственно подключены диски. Логика RAID выполняется на встроенном процессоре независимо от центрального процессора (CPU). Хотя это решение не зависит от операционной системы, последней требуется драйвер для корректной работы с контроллером аппаратного RAID. Массив может быть настроен либо через интерфейс option ROM, либо, в зависимости от производителя, с помощью специального приложения после установки ОС. Конфигурация прозрачна для ядра Linux: оно не видит диски по отдельности.

FakeRAID
  Этот тип RAID правильно называть BIOS RAID или встроенным RAID, но его часто ложно рекламируют как аппаратный. Массив управляется псевдо-RAID контроллерами, где логика RAID реализована в option ROM или в самой прошивке с EFI SataDriver (в случае UEFI), но они не являются полноценными аппаратными RAID-контроллерами со всеми реализованными функциями RAID. Поэтому такой тип иногда называют FakeRAID. Для работы с такими контроллерами используется dmraid. Примеры FakeRAID-контроллеров: Intel Rapid Storage, JMicron JMB36x RAID ROM, AMD RAID, ASMedia 106x и NVIDIA MediaShield.

### Какой тип RAID у меня?

Поскольку программный RAID настраивается пользователем, его тип легко определить.

Однако различить FakeRAID и настоящий аппаратный RAID может быть сложнее. Как уже сказано, производители часто неправильно классифицируют эти два типа, и ложная реклама всегда возможна. Лучшее решение — выполнить команду `lspci` и поискать в выводе RAID-контроллер. Затем изучить информацию о нём. Аппаратные RAID-контроллеры появляются в этом списке, а реализации FakeRAID — нет. Кроме того, настоящие аппаратные RAID-контроллеры часто довольно дороги, так что если кто-то собирал систему сам, то выбор аппаратного RAID, скорее всего, заметно отразился на цене компьютера.

## Установка

Установите mdadm. mdadm используется для администрирования чисто программного RAID с использованием простых блочных устройств: оборудование не предоставляет никакой логики RAID, только набор дисков. mdadm работает с любым набором блочных устройств. Даже с необычным. Например, можно сделать RAID-массив из набора флешек.

### Подготовка устройств

Важно Эти команды стирают всё на устройстве, будьте внимательны при вводе!

Если устройство повторно используется или извлекается из существующего массива, удалите старую конфигурационную информацию RAID:

    # mdadm --misc --zero-superblock /dev/диск

или, если нужно удалить конкретный раздел на диске:

    # mdadm --misc --zero-superblock /dev/раздел

Примечание

- Обнуление суперблока раздела не должно затрагивать другие разделы на диске.
- Из-за особенностей работы RAID очень трудно надёжно затереть диски полностью на работающем массиве. Подумайте, нужно ли это делать перед его созданием.
- Вы можете выполнить всю процедуру подготовки дисков из графического интерфейса с помощью blivet-guiAUR.

### Разметка устройств

Настоятельно рекомендуется разметить диски, которые будут использоваться в массиве. Поскольку большинство пользователей RAID выбирают диски объёмом более 2 ТиБ, необходима и рекомендуется GPT. Подробнее о разметке и доступных инструментах разметки читайте в статье Разметка дисков.

Примечание RAID можно создать и непосредственно на «сырых» дисках (без разделов), но это не рекомендуется, так как может вызвать проблемы при замене отказавшего диска.
Совет При замене отказавшего диска в RAID новый диск должен быть точно такого же размера или больше — иначе восстановление массива не сработает. Даже жёсткие диски одного производителя и модели могут немного отличаться по размеру. Оставив немного неразмеченного пространства в конце диска, можно компенсировать разницу в размерах между дисками и упростить выбор замены. Хорошей практикой считается оставлять около 100 МиБ неразмеченного пространства в конце диска.

#### Таблица разделов GUID

- После создания разделов их GUID типа раздела должны быть `A19D880F-05FC-4D3B-A006-743F0F84911E` (можно задать, выбрав тип раздела `Linux RAID` в fdisk или `FD00` в gdisk).
- Если используется большой дисковый массив, рекомендуется назначить метки файловой системы или метки разделов, чтобы впоследствии было проще идентифицировать отдельный диск.
- Рекомендуется создавать разделы одинакового размера на каждом из устройств.

#### Главная загрузочная запись (MBR)

Для создающих разделы на HDD с таблицей разделов MBR доступны следующие идентификаторы типа раздела:

- `0xDA` для данных не-ФС (`Non-FS data` в fdisk). Это рекомендуемый тип раздела mdadm для RAID-массивов в Arch Linux.
- `0xFD` для массивов с автоопределением RAID (`Linux RAID autodetect` в fdisk). Этот тип раздела следует использовать только если требуется автоопределение RAID (система без initramfs, старый формат метаданных mdadm).

Подробнее см. Linux Raid Wiki:Partition Types.

### Создание массива

Используйте `mdadm` для создания массива. Поддерживаемые опции смотрите в mdadm(8). Ниже приведены несколько примеров.

Важно Не копируйте примеры бездумно; убедитесь, что подставляете правильные опции и буквы дисков.
Примечание

- Если это массив RAID1, с которого предполагается загружаться с помощью Syslinux, ограничение syslinux v4.07 требует использовать значение метаданных 1.0 вместо стандартного 1.2.
- При создании массива с установочного носителя Arch используйте опцию `--homehost=ваш_хост` (или `--homehost=any`, чтобы всегда иметь одно и то же имя независимо от хоста) для задания имени хоста, иначе в метаданные массива будет записано имя хоста `archiso`.

Совет Вы можете указать произвольное имя устройства RAID с помощью опции `--name=МоёИмяRAID` или задав путь к устройству как `/dev/md/МоёИмяRAID`. Udev создаст символические ссылки на массивы в `/dev/md/`, используя это имя. Если `homehost` совпадает с текущим именем хоста (или если homehost установлен в `any`), ссылка будет `/dev/md/имя`, если имя хоста не совпадает — ссылка будет `/dev/md/homehost:имя`.

Следующий пример показывает создание массива RAID1 из двух устройств:

    # mdadm --create --verbose --level=1 --raid-devices=2 /dev/md/MyRAID1Array /dev/sdb1 /dev/sdc1

Следующий пример показывает создание массива RAID5 с 4 активными устройствами и 1 резервным (spare):

    # mdadm --create --verbose --level=5 --raid-devices=4 /dev/md/MyRAID5Array /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 --spare-devices=1 /dev/sdf1

Совет `--chunk` используется для изменения размера чанка относительно значения по умолчанию. Подробнее об оптимизации размера чанка см. Chunks: the hidden key to RAID performance.

Следующий пример показывает создание массива RAID10,far2 из двух устройств:

    # mdadm --create --verbose --level=10 --raid-devices=2 --layout=f2 /dev/md/MyRAID10Array /dev/sdb1 /dev/sdc1

Массив создаётся как виртуальное устройство `/dev/mdX`, собирается и готов к использованию (в деградированном режиме). Можно сразу начинать его использовать, пока mdadm выполняет фоновую ресинхронизацию. Восстановление чётности может занять много времени. Проверить прогресс можно командой:

    $ cat /proc/mdstat

### Обновление файла конфигурации

По умолчанию большая часть `mdadm.conf` закомментирована и содержит только:

    /etc/mdadm.conf

    ...
    DEVICE partitions
    ...

Эта директива предписывает mdadm проверять устройства, перечисленные в `/proc/partitions`, и собирать как можно больше массивов. Это нормально, если вы действительно хотите запустить все доступные массивы и уверены, что неожиданных суперблоков не обнаружится (например, после установки нового накопителя). Более точный подход — явно добавить массивы в `/etc/mdadm.conf`:

    # mdadm --detail --scan >> /etc/mdadm.conf

Результат будет выглядеть примерно так:

    /etc/mdadm.conf

    ...
    DEVICE partitions
    ...
    ARRAY /dev/md/MyRAID1Array metadata=1.2 name=pine:MyRAID1Array UUID=27664f0d:111e493d:4d810213:9f291abe

Это также заставляет mdadm проверять устройства из `/proc/partitions`. Однако только устройства, суперблоки которых имеют UUID `27664…`, будут собраны в активные массивы.

Подробнее см. mdadm.conf(5).

### Сборка массива

После обновления файла конфигурации массив можно собрать с помощью mdadm:

    # mdadm --assemble --scan

### Форматирование файловой системы RAID

Совет Чтобы создать несколько томов внутри RAID-массива, следуйте статье LVM on software RAID.

Теперь массив можно отформатировать в файловую систему, как и любой другой раздел, но учтите следующее:

- Из-за большого размера тома подходят не все файловые системы (см.: Wikipedia:Comparison of file systems#Limits).
- Файловая система должна поддерживать увеличение и уменьшение размера на лету (см.: Wikipedia:Comparison of file systems#Features).
- Следует вычислить правильные stride и stripe-width для оптимальной производительности.

#### Расчёт stride и stripe width

Два параметра необходимы для оптимизации структуры файловой системы под лежащую в основе структуру RAID: stride и stripe width. Они вычисляются на основе размера чанка RAID, размера блока файловой системы и количества «дисков данных».

Размер чанка — свойство RAID-массива, задаваемое при его создании. Текущее значение по умолчанию в `mdadm` — 512 КиБ. Его можно узнать с помощью `mdadm`:

    # mdadm --detail /dev/mdX | grep 'Chunk Size'

Размер блока — свойство файловой системы, задаваемое при её создании. По умолчанию для многих файловых систем, включая ext4, он равен 4 КиБ. Подробнее о ext4 см. `/etc/mke2fs.conf`.

Количество «дисков данных» — минимальное количество устройств в массиве, необходимое для его полного восстановления без потери данных. Например, это N для массива raid0 из N устройств и N-1 для raid5.

Получив эти три значения, stride и stripe width можно вычислить по формулам:

    stride = размер чанка / размер блока
    stripe width = количество дисков данных * stride

##### Пример 1. RAID0

Форматирование в ext4 с правильными stripe width и stride:

- Гипотетический массив RAID0 состоит из 2 физических дисков.
- Размер чанка — 512 КиБ.
- Размер блока — 4 КиБ.

stride = размер чанка / размер блока. В этом примере: 512/4, значит stride = 128.

stripe width = количество физических дисков данных * stride. В этом примере: 2*128, значит stripe width = 256.

    # mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=256 /dev/md0

##### Пример 2. RAID5

Форматирование в ext4 с правильными stripe width и stride:

- Гипотетический массив RAID5 состоит из 4 физических дисков: 3 диска данных и 1 диск чётности.
- Размер чанка — 512 КиБ.
- Размер блока — 4 КиБ.

stride = размер чанка / размер блока. В этом примере: 512/4, значит stride = 128.

stripe width = количество физических дисков данных * stride. В этом примере: 3*128, значит stripe width = 384.

    # mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=384 /dev/md0

Подробнее о stride и stripe width см.: RAID Math.

##### Пример 3. RAID10,far2

Форматирование в ext4 с правильными stripe width и stride:

- Гипотетический массив RAID10 состоит из 2 физических дисков. Из-за свойств RAID10 в раскладке far2 оба считаются дисками данных.
- Размер чанка — 512 КиБ.
- Размер блока — 4 КиБ.

stride = размер чанка / размер блока. В этом примере: 512/4, значит stride = 128.

stripe width = количество физических дисков данных * stride. В этом примере: 2*128, значит stripe width = 256.

    # mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=256 /dev/md0

## Монтирование с Live CD

Чтобы смонтировать RAID-раздел с Live CD, используйте:

    # mdadm --assemble /dev/mdномер /dev/диск1 /dev/диск2 /dev/диск3 /dev/диск4

Если ваш массив RAID 1 с отсутствующим диском был ошибочно автоопределён как RAID 1 (согласно `mdadm --detail /dev/mdномер`) и отмечен как неактивный (согласно `cat /proc/mdstat`), сначала остановите массив:

    # mdadm --stop /dev/mdномер

## Установка Arch Linux на RAID

Примечание Этот раздел применим, только если корневая файловая система находится на массиве. Если массив содержит только разделы с данными, этот раздел можно пропустить.

Создать RAID-массив следует между этапами разметки и форматирования процедуры установки. Вместо того чтобы напрямую форматировать раздел для корневой файловой системы, она будет создана на RAID-массиве. Следуйте разделу #Установка для создания RAID-массива. Затем продолжайте процедуру установки до завершения шага pacstrap. При использовании UEFI также прочитайте EFI system partition (Русский)#ESP на программном RAID1.

### Обновление файла конфигурации

Примечание Это нужно делать вне chroot, поэтому к пути добавлен префикс `/mnt`.

После установки базовой системы необходимо обновить файл конфигурации по умолчанию `mdadm.conf` следующим образом:

    # mdadm --detail --scan >> /mnt/etc/mdadm.conf

Всегда проверяйте файл `mdadm.conf` в текстовом редакторе после выполнения этой команды, чтобы убедиться, что его содержимое выглядит разумно.

Примечание Чтобы предотвратить сбой `mdmonitor.service` при загрузке (активируется через udev), нужно раскомментировать `MAILADDR` и указать адрес электронной почты и/или приложение для обработки уведомлений о проблемах с массивом в нижней части `mdadm.conf`. См. #Уведомления по электронной почте.

Продолжайте процедуру установки до шага Installation guide (Русский)#Initramfs, затем следуйте следующему разделу.

### Настройка mkinitcpio

Примечание Это нужно делать внутри chroot.

Установите mdadm и добавьте хук `mdadm_udev` в массив HOOKS в файле `mkinitcpio.conf`, чтобы добавить поддержку mdadm в образ initramfs:

    /etc/mkinitcpio.conf

    ...
    HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block mdadm_udev filesystems fsck)
    ...

Затем пересоберите initramfs.

Примечание При каждом изменении `/etc/mdadm.conf` необходимо пересобирать initramfs.

### Настройка загрузчика

#### Корневое устройство

Укажите параметр `root` на mapped-устройство. Например:

    root=/dev/md/MyRAIDArray

Если загрузка с программного RAID-раздела не удаётся с использованием указанного выше метода с узлом устройства ядра, альтернативный способ — использовать один из методов постоянного именования блочных устройств, например:

    root=LABEL=Root_Label

Смотрите также GRUB (Русский)#RAID.

#### Компоновка RAID0

Примечание Это также затрагивает существующих пользователей mdraid RAID0, обновляющихся со старой версии ядра Linux до 5.3.4 или новее.

Начиная с версии 5.3.4 ядра Linux, необходимо явно указать ядру, какую компоновку RAID0 следует использовать: RAID0_ORIG_LAYOUT (`1`) или RAID0_ALT_MULTIZONE_LAYOUT (`2`).[1] Это можно сделать, передав параметр ядра следующим образом:

    raid0.default_layout=2

Правильное значение зависит от версии ядра, которая использовалась для создания массива: используйте `1`, если массив создан при ядре 3.14 или более раннем, используйте `2` при более новой версии ядра. Один из способов проверить это — посмотреть время создания массива:

    mdadm --detail /dev/md1

    /dev/md1:
               Version : 1.2
         Creation Time : Thu Sep 24 10:17:41 2015
            Raid Level : raid0
            Array Size : 975859712 (930.65 GiB 999.28 GB)
          Raid Devices : 3
         Total Devices : 3
           Persistence : Superblock is persistent

           Update Time : Thu Sep 24 10:17:41 2015
                 State : clean
        Active Devices : 3
       Working Devices : 3
        Failed Devices : 0
         Spare Devices : 0

            Chunk Size : 512K

    Consistency Policy : none

                  Name : archiso:root
                  UUID : 028de718:20a81234:4db79a2c:e94fd560
                Events : 0

        Number   Major   Minor   RaidDevice State
           0     259        2        0      active sync   /dev/nvme0n1p1
           1     259        6        1      active sync   /dev/nvme2n1p1
           2     259        5        2      active sync   /dev/nvme1n1p2

Здесь видно, что этот массив был создан 24 сентября 2015 года. Дата выпуска Linux Kernel 3.14 — 30 марта 2014 года, и поэтому этот массив, скорее всего, создан с использованием multizone layout (`2`).

## Обслуживание RAID

### Очистка (Scrubbing)

Рекомендуется регулярно выполнять очистку данных для поиска и исправления ошибок. В зависимости от размера и конфигурации массива очистка может занять несколько часов.

Чтобы запустить очистку данных:

    # echo check > /sys/block/mdX/md/sync_action

Также можно включить входящий в комплект таймер `mdcheck_start.timer`, который выполняет еженедельные проверки.

Операция check сканирует диски на наличие плохих секторов и автоматически исправляет их. Если обнаружены хорошие сектора, содержащие плохие данные (т.е. несовпадение: данные в секторе не соответствуют тому, что должно быть согласно данным с другого диска — например, блок чётности + другие блоки данных указывают, что этот блок данных неверен), никаких действий не предпринимается, но событие регистрируется (см. ниже). Это «бездействие» позволяет администраторам проверить данные в секторе и данные, которые были бы получены при восстановлении секторов из избыточной информации, и выбрать правильные данные для сохранения.

Как и для многих задач, связанных с mdadm, статус очистки можно узнать, прочитав `/proc/mdstat`.

Пример:

    $ cat /proc/mdstat

    Personalities : [raid6] [raid5] [raid4] [raid1]
    md0 : active raid1 sdb1[0] sdc1[1]
          3906778112 blocks super 1.2 [2/2] [UU]
          [>....................]  check =  4.0% (158288320/3906778112) finish=386.5min speed=161604K/sec
          bitmap: 0/30 pages [0KB], 65536KB chunk

Чтобы безопасно остановить текущую очистку данных:

    # echo idle > /sys/block/md0/md/sync_action

Примечание Если система будет перезагружена после приостановки частичной очистки, очистка начнётся заново.

По завершении очистки администраторы могут проверить, сколько блоков (если они есть) было помечено как плохие:

    # cat /sys/block/md0/md/mismatch_cnt

#### Общие замечания по очистке

Примечание Вместо `check` можно записать `repair` в `/sys/block/md0/md/sync_action`, но это не рекомендуется, так как при обнаружении несовпадения данных они будут автоматически обновлены до согласованного состояния. Опасность в том, что мы не знаем, что верно — чётность или блок данных (или какой именно блок данных в случае RAID1). Это дело случая — получит ли операция правильные данные вместо плохих.

Хорошей идеей будет настроить задание cron от root для периодической очистки. В этом может помочь raid-checkAUR. Для выполнения периодической очистки с помощью systemd-таймеров вместо cron используйте raid-check-systemdAUR, который содержит тот же скрипт вместе с соответствующими файлами юнитов systemd-таймеров.

Примечание Для обычных дисков (platter drives) очистка может занимать примерно шесть секунд на гигабайт (то есть один час сорок пять минут на терабайт), поэтому планируйте запуск cron или таймера соответствующим образом.

#### Замечания по очистке RAID1 и RAID10

Из-за того, что запись в ядре для RAID1 и RAID10 не буферизована, массив может иметь ненулевые счётчики несовпадений (mismatch count), даже если массив исправен. Эти ненулевые счётчики будут существовать только в областях с временными данными, где они не представляют проблемы. Однако мы не можем отличить ненулевой счётчик, связанный просто с временными данными, от ненулевого счётчика, означающего реальную проблему. Этот факт является источником ложных срабатываний для массивов RAID1 и RAID10. Тем не менее, всё равно рекомендуется регулярно выполнять очистку, чтобы обнаруживать и исправлять возможные плохие сектора на устройствах.

### Удаление устройств из массива

Можно удалить блочное устройство из массива, предварительно пометив его как неисправное:

    # mdadm --fail /dev/md0 /dev/удаляемый_элемент_массива

Затем удалить его из массива:

    # mdadm --remove /dev/md0 /dev/удаляемый_элемент_массива

Если устройство не полностью вышло из строя, но вы хотите его заменить (например, потому что оно выглядит умирающим), замену можно выполнить более аккуратно, сначала добавив новый диск, а затем указав mdadm заменить им старый.

Например, если `/dev/sdc1` — новый диск, а `/dev/sdb1` — сбойный:

    # mdadm /dev/md0 --add /dev/sdc1
    # mdadm /dev/md0 --replace /dev/sdb1 --with /dev/sdc1

Часть `--with /dev/sdc1` необязательна, но более явная. Подробнее см. [2].

Чтобы удалить устройство навсегда (например, чтобы использовать его отдельно отныне), выполните описанные выше шаги (fail/remove или add/replace), а затем:

    # mdadm --zero-superblock /dev/удаляемый_элемент_массива

Важно

- Не выполняйте эту команду на массивах linear или RAID0, иначе произойдёт потеря данных!
- Повторное использование удалённого диска без обнуления суперблока приведёт к потере всех данных при следующей загрузке (mdadm попытается использовать его как часть RAID-массива).

Полное отключение массива:

1. Размонтируйте целевой массив
2. Остановите массив командой: `mdadm --stop /dev/md0`
3. Повторите три команды, описанные в начале этого раздела, на каждом устройстве.
4. Удалите соответствующую строку из `/etc/mdadm.conf`.

### Добавление нового устройства в массив

Добавление новых устройств с помощью mdadm можно выполнять на работающей системе со смонтированными устройствами. Разметьте новое устройство по той же схеме, что и уже используемые в массиве, как описано выше.

Соберите RAID-массив, если он ещё не собран:

    # mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1

Добавьте новое устройство в массив:

    # mdadm --add /dev/md0 /dev/sdc1

Это не должно занять много времени для mdadm.

В зависимости от типа RAID (например, для RAID1) mdadm может добавить устройство как резервное (spare), не синхронизируя на него данные. Вы можете увеличить количество дисков, используемых RAID, с помощью `--grow` с опцией `--raid-devices`. Например, чтобы увеличить массив до четырёх дисков:

    # mdadm --grow /dev/md0 --raid-devices=4

Проверить прогресс можно командой:

    # cat /proc/mdstat

Проверьте, что устройство добавлено, командой:

    # mdadm --misc --detail /dev/md0

Примечание Для массивов RAID0 вы можете получить следующее сообщение об ошибке:

    mdadm: add new device failed for /dev/sdc1 as 2: Invalid argument

Это происходит потому, что приведённые выше команды добавят новый диск как «запасной», но RAID0 не имеет запасных. Если вы хотите добавить устройство в массив RAID0, нужно выполнить «grow» и «add» одной командой, как показано ниже:

    # mdadm --grow /dev/md0 --raid-devices=3 --add /dev/sdc1

### Увеличение размера RAID-тома

Если в RAID-массив установлены диски большего размера или размер раздела был увеличен, может потребоваться увеличить размер RAID-тома, чтобы заполнить доступное пространство. Этот процесс можно начать, сначала выполнив действия из разделов выше, касающихся замены дисков. После того как RAID-том будет перестроен на диски большего размера, его нужно «расширить» (grow), чтобы заполнить пространство.

    # mdadm --grow /dev/md0 --size=max

Затем может потребоваться изменить размер разделов, присутствующих на RAID-томе `/dev/md0`. Подробнее см. Разметка дисков. Наконец, потребуется изменить размер файловой системы на этом разделе. Если разметка выполнялась с помощью `gparted`, это будет сделано автоматически. Если использовались другие инструменты, размонтируйте и измените размер файловой системы вручную.

    # umount /storage
    # fsck.ext4 -f /dev/md0p1
    # resize2fs /dev/md0p1

### Изменение ограничений скорости синхронизации

Синхронизация может занять много времени. Если машина не нужна для других задач, ограничение скорости можно увеличить.

    # cat /proc/mdstat

     Personalities : [raid10]
     md127 : active raid10 sdd1[3] sdc1[2] sdb1[1] sda1[0]
         31251490816 blocks super 1.2 512K chunks 2 far-copies [4/4] [UUUU]
         [=>...................]  resync =  5.2% (1629533760/31251490816) finish=2071.7min speed=238293K/sec
         bitmap: 221/233 pages [884KB], 65536KB chunk

В приведённом выше примере максимальная скорость, по-видимому, ограничена примерно 238 M/с.

Проверьте текущий предел скорости (в кибибайтах в секунду, KiB/s):

    # sysctl dev.raid.speed_limit_min

    dev.raid.speed_limit_min = 1000

    # sysctl dev.raid.speed_limit_max

    dev.raid.speed_limit_max = 200000

Установите новую максимальную скорость операций ресинхронизации RAID с помощью sysctl:

    # sysctl -w dev.raid.speed_limit_min=600000
    # sysctl -w dev.raid.speed_limit_max=600000

Затем проверьте скорость синхронизации и расчётное время завершения.

    # cat /proc/mdstat

     Personalities : [raid10]
     md127 : active raid10 sdd1[3] sdc1[2] sdb1[1] sda1[0]
         31251490816 blocks super 1.2 512K chunks 2 far-copies [4/4] [UUUU]
         [=>...................]  resync =  5.3% (1657016448/31251490816) finish=1234.9min speed=399407K/sec
         bitmap: 221/233 pages [884KB], 65536KB chunk

### Производительность RAID5

Чтобы улучшить производительность RAID5 для быстрых накопителей (например, NVMe), увеличьте `/sys/block/mdx/md/group_thread_cnt` для использования большего числа потоков. Например, чтобы использовать 8 потоков для устройства RAID5:

    # echo 8 > /sys/block/md0/md/group_thread_cnt

См. git kernel commit 851c30c9badf.

### Обновление суперблока RAID

Чтобы обновить суперблок RAID, сначала необходимо размонтировать массив, а затем остановить его следующей командой:

    # mdadm --stop /dev/md0

Затем можно обновить определённые параметры, пересобрав массив. Например, чтобы обновить `homehost`:

    # mdadm --assemble --update=homehost --homehost=NAS /dev/md0 /dev/sda1 /dev/sdb1

Подробнее об аргументах `--update` см. в документации.

## Мониторинг

Простая однострочная команда для вывода статуса RAID-устройств:

    # awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' </proc/mdstat

    md1: [UU]
    md0: [UU]

### Наблюдение за mdstat

    # watch -t 'cat /proc/mdstat'

Или, что предпочтительнее, с помощью tmux:

    # tmux split-window -l 12 "watch -t 'cat /proc/mdstat'"

### Отслеживание ввода-вывода с помощью iotop

Пакет iotop отображает статистику ввода-вывода для процессов. Используйте эту команду для просмотра ввода-вывода потоков raid.

    # iotop -a $(sed 's/^/-p /g' <<<`pgrep "_raid|_resync|jbd2"`)

### Отслеживание ввода-вывода с помощью iostat

Утилита iostat из пакета sysstat отображает статистику ввода-вывода для устройств и разделов.

    # iostat -dmy 1 /dev/md0
    # iostat -dmy 1 # все

### mdadm через systemd

mdadm предоставляет службу systemd `mdmonitor.service`, которая может быть полезна для мониторинга состояния ваших RAID-массивов и уведомления в случае неполадок.

Особенность этой службы в том, что её нельзя активировать вручную, как обычную службу; mdadm позаботится об её активации через udev при сборке массивов при старте системы, но только если для её уведомлений настроен адрес электронной почты и/или программа (см. ниже).

#### Уведомления по электронной почте

Важно Если не настроить адрес электронной почты, служба мониторинга не запустится, причём без уведомлений.
Примечание Для отправки писем требуется правильно настроенный почтовый агент.

Чтобы включить эту функцию, отредактируйте `/etc/mdadm.conf` и укажите адрес электронной почты:

    MAILADDR пользователь@домен

Затем, чтобы убедиться, что всё работает как надо, выполните команду:

    # mdadm --monitor --scan --oneshot --test

Если проверка прошла успешно и письмо доставлено, то всё готово; при следующей сборке массивов `mdmonitor.service` начнёт отслеживать их на предмет ошибок.

#### Программные уведомления

Аналогично уведомлениям по почте, отредактируйте `/etc/mdadm.conf` и измените строку:

    PROGRAM /usr/sbin/handle-mdadm-events

В качестве аргумента PROGRAM указывается скрипт, который будет запускаться при любом событии. Он может взаимодействовать с агентами сетевого мониторинга, IM-клиентами или службами push-уведомлений, такими как ntfy.sh для домашних пользователей.

Проверка выполняется так же, как для уведомлений по электронной почте.

## Устранение неполадок

Если при перезагрузке вы получаете ошибку "invalid raid superblock magic" и у вас есть дополнительные жёсткие диски помимо тех, на которые вы устанавливали систему, проверьте правильность порядка дисков. Во время установки ваши устройства RAID могли быть hdd, hde и hdf, но при загрузке они могут оказаться hda, hdb и hdc. Соответствующим образом скорректируйте строку ядра. (Так, во всяком случае, было у меня.)

### Зависание системы из-за отсутствующих файловых систем RAID

Это скорее превентивная мера, но если вы используете файловые системы с RAID-бэкендом и RAID не собирается при загрузке, система может перейти в режим восстановления. Если эти файловые системы не являются критическими для системы (например, используются для документов), рассмотрите добавление опции `nofail` в fstab для соответствующих разделов. В случае сбоя сборки RAID система останется работоспособной в многопользовательском режиме (так что удалённый доступ, например, по SSH, останется возможным).

### Отсутствующий массив, невозможно запустить его вручную

Проверьте, загружен ли модуль `md_mod`:

    $ lsmod | grep md_mod

Если нет, загрузите его вручную:

    $ modprobe md_mod

А затем пересоберите RAID:

    $ mdadm --assemble --scan

Если это решило проблему, можно сделать загрузку модуля `md_mod` постоянной, либо с помощью systemd:

    /etc/modules-load.d/md_mod.conf

    # Загрузка md_mod.ko при старте
    md_mod

Либо загрузите его на раннем этапе, например, при использовании mkinitcpio, добавив в список модулей:

    /etc/mkinitcpio.conf

    MODULES=(... md_mod ...)

Не забудьте пересобрать mkinitcpio.

### Ошибка: "kernel: ataX.00: revalidation failed"

Если вы внезапно (после перезагрузки, изменения настроек BIOS) сталкиваетесь с сообщениями об ошибках вроде:

    Feb  9 08:15:46 hostserver kernel: ata8.00: revalidation failed (errno=-5)

Это не обязательно означает, что диск сломан. В интернете вы часто найдёте панические ссылки, предполагающие худшее. Не паникуйте. Возможно, вы просто изменили настройки APIC или ACPI в BIOS либо параметры ядра. Верните их обратно, и всё должно заработать. Обычно отключение ACPI помогает.

### Запуск массивов в режиме только для чтения

При запуске массива md записывается суперблок, и может начаться ресинхронизация. Чтобы запустить массив в режиме только для чтения, установите параметр модуля ядра `md_mod` `start_ro`. При установке этого параметра новые массивы получают режим 'auto-ro', который отключает все операции внутреннего ввода-вывода (обновление суперблока, ресинхронизацию, восстановление) и автоматически переключается в 'rw' при первом запросе на запись.

Примечание Массив можно перевести в настоящий режим 'ro' с помощью `mdadm --readonly` до первого запроса на запись, либо запустить ресинхронизацию без записи с помощью `mdadm --readwrite`.

Чтобы установить параметр при загрузке, добавьте `md_mod.start_ro=1` в строку ядра.

Либо установите его при загрузке модуля с помощью modprobe.d или напрямую через `/sys/`:

    # echo 1 > /sys/module/md_mod/parameters/start_ro

### Восстановление после выхода из строя или отсутствия диска в RAID

Вы можете получить вышеупомянутую ошибку также в случае, если один из дисков вышел из строя по любой причине. В этом случае придётся принудительно запустить RAID даже с отсутствующим диском. Выполните (при необходимости изменив параметры):

    # mdadm --manage /dev/md0 --run

Теперь массив можно снова смонтировать, например так (если он был прописан в fstab):

    # mount /dev/md0

Теперь RAID должен снова работать и быть доступным для использования, хотя и с отсутствующим диском. Итак, чтобы добавить этот диск, разметьте его так, как описано в разделе #Подготовка устройств. После этого можно добавить новый диск в массив:

    # mdadm --manage --add /dev/md0 /dev/sdd1

Если вы выполните:

    # cat /proc/mdstat

то, вероятно, увидите, что RAID активен и выполняется перестроение.

Также может потребоваться обновить конфигурацию (см. #Обновление файла конфигурации).

## Бенчмаркинг

Существует несколько инструментов для тестирования производительности RAID. Наиболее заметное улучшение — увеличение скорости при чтении несколькими потоками с одного RAID-тома.

bonnie++ тестирует доступ типа баз данных к одному или нескольким файлам, а также создание, чтение и удаление маленьких файлов, что может симулировать использование программ, таких как Squid, INN или почта в формате Maildir. Входящая в его состав программа ZCAV тестирует производительность различных зон жёсткого диска без записи каких-либо данных на диск.

hdparm не следует использовать для тестирования RAID, так как он даёт очень противоречивые результаты.

## Смотрите также

- Документация Linux kernel RAID
- Linux Software RAID (thomas-krenn.com)
- Статья Linux RAID wiki в архивах Linux kernel
- Как работают битовые карты (bitmaps)
- Глава 19. Управление RAID документации Red Hat Enterprise Linux 9
- Linux-RAID FAQ проекта Linux documentation
- BAARF(Archive.org), включая Почему не стоит использовать RAID 5?(Archive.org) от Art S. Kagel
- Введение в RAID, Nested-RAID: конфигурации на базе RAID-5 и RAID-6, Введение в Nested-RAID: RAID-01 и RAID-10 и Nested-RAID: The Triple Lindy в Linux Magazine
- HowTo: ускорение построения и ресинхронизации программного RAID
- Wikipedia:Non-RAID drive architectures

Списки рассылки

- Список рассылки Kernel Linux-Raid

mdadm

- Исходный код mdadm
- Программный RAID в Linux с помощью mdadm в Linux Magazine
- Википедия: mdadm

Темы на форумах

- Улучшение производительности RAID с помощью битовых карт
- GRUB и GRUB2
- Не удаётся установить grub2 на программный RAID
- Использование метаданных RAID 1.2 в загрузочном и корневом разделе

Category:

- Storage virtualization (Русский)

RAID (Русский)
Add topic