Делаем конфетку из... того что есть.
А есть у нас сервер 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
После изменения файла /etc/mdadm/mdadm.conf следует обновить initramfs:
update-initramfs -u
Особенно это актуально, когда загрузочная область находится на массиве. Если вы не выполните обновление initramfs, то конфигурация массива попадёт туда при обновлении системы или при обновлении образа другой программой, если такое обновление случится, конечно.
Перезагружаю сервер для проверки.
После перезагрузки название массива подцепилось правильное. Только синхронизация остановилась в состоянии resync=PENDING. Пнём:
mdadm --readwrite /dev/md127
После этого синхронизация продолжится. На этом я закончу ковырять сервер. Задача по созданию RAID10 массива из четырёх NVMe дисков выполнена. Файловую систему потом накатят другие сисадмины.
Дополнительно
Что ещё можно сделать? Например, можно увеличить скорость синхронизации, поскольку у нас быстрые NVMe диски. Синхронизацию мне удавалось ускорить в семь раз.