Делаем конфетку из... того что есть.
А есть у нас сервер Dell PowerEdge R640 с операционной системой Ubuntu Server. В сервере стоят два NVMe диска, которые собраны в RAID1 с помощью программного RAID контроллера PERC S140. SATA контроллер был переведён в режим RAID Mode, опция NVMe Settings установлена в RAID. И RAID1 из двух дисков NVMe 3.84 TB KCD5XLUG3T84 прекрасно работал.
SSD Dell EMC NVMe 3.84 TB — KCD5XLUG3T84
Потом место кончилось. Было принято решение приобрести ещё два диска такого же объёма и сделать RAID10 из четырёх NVMe дисков. Диски были куплены, немного другой модели — Dell KCD61LUL3T84. Приступил я к задаче и наткнулся на две проблемы.
Проблема первая
Новые диски оказались не Dell. Опа, вот тебе и раз!
Диск, которого не существует — Dell KCD61LUL3T84 NVMe 3.84 TB
Ну ладно, пусть не Dell, однако, программный контроллер PERC S140 отказался видеть новые диски. А в iDRAC Bus Protocol оказался PCIe, в то время как прежние два диска — NVMe.
Я честно не знаю в чём именно здесь разница между NVMe и PCIe, но подозреваю, что новые диски работают как-то иначе.
— А это хорошо или плохо?
— Это иначе.
Проблема вторая
Программный контроллер PERC S140 в Linux не поддерживает RAID10. Опа, вот тебе и два!
На самом деле я это знал заранее. Единственный вариант в данном случае — разобрать программный контроллер PERC S140 и собрать RAID10 с помощью mdadm. Была, конечно, мысль собрать два RAID1, а потом объединить их в RAID0 с помощью mdadm. Но нафига тогда PERC S140 использовать, если в mdadm можно сразу собрать RAID10 из четырёх дисков? Смысл в этом был бы, если была существенная разница между NVMe и PCIe, но, повторюсь, я не знаю в чём здесь именно разница, да и новые диски в принципе не хотят работать как NVMe, только PCIe, чем бы оно ни было.
Итак, план работ такой:
- Разбираем RAID1 в PERC S140.
- Отключаем PERC S140.
- Собираем RAID10 из четырёх NVMe дисков с помощью mdadm.
Разбираем RAID1 в PERC S140
Загружаемся в BIOS.
F2 при загрузке.
Device Settings.
DELL EMC PERC S140 Configuration Utility.
Controller Management.
Virtual Disk Management.
Select Virtual Disk Operations.
Выбираем RAID1 массив, который нужно удалить. В моём случае он один. Delete Virtual Disk(s).
Подтверждаем удаление галкой Confirm. YES.
RAID1 удалён.
Приведём в порядок диски.
Возвращаемся в Controller Management.
После удаления массива появляются новые опции. Выбираем Convert to Non-RAID Disk.
Выбираем тип интерфейса NVMe.
Отмечаем галкой диски, которые раньше были в RAID1. Apply Changes.
Нам говорят, что данные с дисков удалятся. Подтверждаем конвертацию. Yes.
Готово.
Диски стали Non-RAID.
Отключаем PERC S140
Заходим в главное меню BIOS.
Переходим в раздел System BIOS.
NVMe Settings.
NVMe mode устанавливаем как Non RAID. OK.
Back.
Переходим к SATA Settings.
Embedded SATA меняем с RAID Mode на AHCI Mode.
OK.
Back.
Finish.
Подтверждаем изменения. Yes.
Изменения сохранены. OK.
Finish.
Выходим и перезагружаем сервер. Yes.
Для проверки можно снова зайти в BIOS и убедиться что пункт DELL EMC PERC S140 Configuration Utility отсутствует.
В iDRAC все четыре диска теперь выглядят одинаково, Bus Protocol — PCIe. Уж не знаю, хуже это чем NVMe или точно так же.
Собираем RAID10 из четырёх NVMe дисков с помощью mdadm
Дальше работаем в операционной системе Ubuntu Server. Пакет для работы с nvme — nvme-cli:
apt-get install nvme-cli
Список дисков:
nvme list
Первые два диска в списке новые. Вторые два старые. Проверим, если ли какие-то разделы.
lsblk | grep nvme
Да, на новых дисках есть разделы, даже разбираться не буду, просто всё удалю с помощью fdisk. Чистим первый диск.
fdisk /dev/nvme0n1
d
d
d
w
lsblk | grep nvme
Разделов на первом диске больше нет. Чистим второй диск.
fdisk /dev/nvme1n1
d
d
d
w
lsblk | grep nvme
Разделы на всех дисках удалены.
Я планирую на каждом диске создать один GPT раздел и уже четыре полученные раздела добавить в RAID10 массив. GPT разделы создаю с помощью fdisk, сначала на первом диске.
fdisk /dev/nvme0n1
g
n
w
Повторяю процедуру для всех остальных дисков.
На старых дисках даже предупреждение выводится, что размер диска большой, и раздел DOS нельзя применять для использования всего объёма диска.
lsblk | grep nvme
Теперь у нас имеется четыре раздела, которые мы будем использовать в mdadm:
- /dev/nvme0n1p1
- /dev/nvme1n1p1
- /dev/nvme2n1p1
- /dev/nvme3n1p1
Проверим, есть ли уже массивы.
cat /proc/mdstat
Массивов нет.
Создаём RAID10 массив /dev/md127 из четырёх разделов на NVMe дисках:
mdadm --create --verbose /dev/md127 -l 10 -n 4 /dev/nvme0n1p1 /dev/nvme1n1p1 /dev/nvme2n1p1 /dev/nvme3n1p1
RAID10 массив создан.
cat /proc/mdstat
Появилось устройство md127, массив в состоянии rsync. 619 минут до завершения.
Детальная информация о массиве:
mdadm --detail /dev/md127
Чтобы после перезагрузки массив так и остался с названием md127, нужно сделать файл mdadm.conf. Создаём директорию:
mkdir /etc/mdadm
Заполняем конфигурационный файл:
echo "DEVICE partitions" > /etc/mdadm/mdadm.conf
mdadm --detail --scan | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf
Перезагружаю сервер для проверки.
После перезагрузки название массива подцепилось правильное. Только синхронизация остановилась в состоянии resync=PENDING. Пнём:
mdadm --readwrite /dev/md127
После этого синхронизация продолжится.
На этом я закончу ковырять сервер. Задача по созданию RAID10 массива из четырёх NVMe дисков выполнена. Файловую систему потом накатят другие сисадмины.
Дополнительно
Что ещё можно сделать? Например, можно увеличить скорость синхронизации, поскольку у нас быстрые NVMe диски. Синхронизацию мне удавалось ускорить в семь раз.
mdadm — увеличиваем скорость синхронизации массива
Источник:
https://internet-lab.ru/mdadm_raid10_4nvme
Если вам понравилась статья, то ставьте 👍🏻 каналу.
Пишите комментарии, задавайте вопросы, подписывайтесь.