Решил выложить очередной внутренний туториал в паблик, так как операция повторяется не часто, а в сети сведения разрозненные. Скорее всего она не покажется интересной, если вы на неё попали не из поисковой системы по ключевым словам.

Будем добавлять диски в RAID-массив Smart Array и расширять его без перемонтирования разделов под Linux. В этом howto затронем темы ssacli/hpacucli, parted, growfs, и остальные в попытке увеличить свой диск.

Тут и далее HPE тождественно HP, ибо сначало оно было HP, а потом стало HPE.

Что мы имеем:

  • Операционная система Linux (в нашем случае актуальная LTS от Ubuntu, но это не слишком принципиально).

  • Сервер HPE с контроллером Smart Array, в нашем случае это P431, но подобные действия работают схожим образом на широкой линейке контроллеров от HPE.

  • Экспандер с дисками, не принципиально внутренний бэкплейн или внешняя полка, лишь бы их видел контроллер.

  • Собранный массив и действующая примонтированная файловая система на нём, в нашем случае это RAID-6 и XFS, но может быть и иная конфигурация. Если у вас JBOD и софтовый массив, то эта статья не про ваш случай.

Вышеперечисленная конфигурация — довольно стандартное решение для хранения большого объёма данных, к доступу к которым не предъявляются повышенные требования по производительности. В нашем случае речь идёт о внешней полке DAS, забитой дисками, к которой подключили по цепочке ещё одну полку и добавили в неё дополнительные диски. Все диски живут в одном массиве с избыточностью в два диска, он же RAID-6, который реализуется аппаратно на контроллере Smart Array.

В массиве создан один логический диск, он имеет разметку GPT с одним разделом, отформатированным в XFS, который примонтирован как точка монтирования /mnt/storage. У нас всё это используется для складирования бэкапов, то есть туда постоянно что-то пишется и мы не хотим прерывать этот процесс на время работ, которые могут затянуться на длительное время (буквально дни) при большом количестве дисков.

Коротко процедура состоит из следующих этапов:

  • физическое добавление дисков

  • доступ к утилите администрирования

  • добавление физических дисков в логический

  • расширение раздела

  • PROFIT!

В целом, вроде всё понятно, а теперь детали.

Добавление дисков

Полагаю, это будет самым простым этапом. Стоит напомнить только, что для расширения массива подойдут накопители такого же или большего объёма, относительно тех, что составляют действующий массив. Но это вроде понятно.

Если используется внешняя SAS/FC-полка то надо не забывать, что там есть multipath, позволяющий достичь некоторой отказоустойчивости. FC в данном топике не обсуждается, как и NVMe, так что не лишним будет напомнить, что multipath есть только в SAS-интерфейсе, в SATA такого нет и отвал живого кабеля приведёт к нехорошим последствиям, поэтому рекомендовано для внешних полок использовать именно SAS-диски, не обязательно быстрые, но именно с SAS интерфейсом. Это касается и HDD и SSD. На всякий случай приложу типичную схему подключения полок:

Каблинг двух полок (2-3) к одному серверу (1). Два оппозитных кабельных пути (4-5) позволят не потерять гроздь SAS-дисков в случае потери какого-то из кабелей или экспандеров. Источник: выдранная диаграмма из документации по типичному SAS DAS серии D3000.
Каблинг двух полок (2-3) к одному серверу (1). Два оппозитных кабельных пути (4-5) позволят не потерять гроздь SAS-дисков в случае потери какого-то из кабелей или экспандеров. Источник: выдранная диаграмма из документации по типичному SAS DAS серии D3000.

Утилита администрирования

У HPE есть довольно мощная утилита администрирования своих дисковых контроллеров Smart Array через CLI. А ещё она пакетирована под популярные дистрибутивы, в том числе и под deb based (в которые входит и наша Ubuntu). Не пытайтесь найти это самостоятельно на сайте HPE, это может быть опасно для психики. Надо добавить репозиторий согласно этой инструкции (внутри и для DEB и для RPM), привожу примеры в популярных форматах для Ubuntu:

  • hpe-mcp.list:

deb [arch=amd64 signed-by=/usr/share/keyrings/hpe-mcp.gpg] http://downloads.linux.hpe.com/SDR/repo/mcp {{ distribution_release }}/current non-free
Types: deb
URIs: http://downloads.linux.hpe.com/SDR/repo/mcp
Suites: {{ distribution_release }}/current
Components: non-free
Architectures: amd64
Signed-By: /usr/share/keyrings/hpe-mcp.gpg
X-Repolib-Name: hpe-mcp

Как несложно догадаться, темплейт {{ distribution_release }} надо подменить на codename дистрибутива.

Ключи подписи репозиториев указаны по ссылке выше, но я лично вытаскиваю в кейринг /usr/share/keyrings/hpe-mcp.gpg следующие:

После всех манипуляций нужно поставить пакет ssacli, который как раз содержит нужную нам утилиту. Она имеет достаточно богатый функционал, инлайн справка довольно тяжёлая, но чит-листы по ней вполне можно найти в поиске по вебу.

NB! Есть две утилиты со схожим наименованием: hpacucli и ssacli, в целом, вторая наследник первой, работают схожим образом, имеют общий синтаксис, но более свежая поддерживает большее число контроллеров. При прочих равных рекомендуется использовать именно ssacli.

Расширение логического диска массива

Начнём с того, что оценим, что у нас есть на текущий момент. С помощью утилиты parted посмотрим текущее состояние раздела:

# parted /dev/sdb
GNU Parted 3.4
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Model: HP LOGICAL VOLUME (scsi)
Disk /dev/sdb: 60.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name      Flags
 1      2621kB  60.0TB  60.0TB  xfs          External

Подтвердили: устройство sdb, разметка GPT, текущий объём — 60TB, файловая система XFS.

Ищем наш контроллер. Мы знаем, что у нас их два, нужно найти верный:

# ssacli ctrl all show

Smart Array P420i in Slot 0 (Embedded)    (sn: 001438025ECCA60)
Smart Array P431 in Slot 2                (sn: PCZED0ARH4201R)

Утилита оперирует понятиями "слот" при указании контроллера. Нужный нам контроллер в слоте под номером 2. Посмотрим как этот контроллер видит диски:

# ssacli ctrl slot=2 pd all show

Smart Array P431 in Slot 2

   Array A

      physicaldrive 1E:1:1 (port 1E:box 1:bay 1, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:2 (port 1E:box 1:bay 2, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:3 (port 1E:box 1:bay 3, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:4 (port 1E:box 1:bay 4, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:5 (port 1E:box 1:bay 5, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:6 (port 1E:box 1:bay 6, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:7 (port 1E:box 1:bay 7, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:9 (port 1E:box 1:bay 9, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:10 (port 1E:box 1:bay 10, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:11 (port 1E:box 1:bay 11, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:12 (port 1E:box 1:bay 12, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:1 (port 1E:box 2:bay 1, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:8 (port 1E:box 1:bay 8, SAS HDD, 6 TB, OK, spare)

   Unassigned

      physicaldrive 1E:2:2 (port 1E:box 2:bay 2, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:3 (port 1E:box 2:bay 3, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:4 (port 1E:box 2:bay 4, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:5 (port 1E:box 2:bay 5, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:6 (port 1E:box 2:bay 6, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:7 (port 1E:box 2:bay 7, SAS HDD, 6 TB, OK)

Выяснили: пачка дисков в массиве и шесть дисков не назначены. Теперь посмотрим как выглядят логические диски этого контроллера:

# ssacli ctrl slot=2 ld all show

Smart Array P431 in Slot 2

   Array A

      logicaldrive 1 (54.6 TB, RAID 6, OK)

В массиве один логический диск и это наш пациент. На всякий случай посмотрим ещё на состояние массива, вдруг там есть нераспределённое место:

# ssacli ctrl slot=2 array a show

Smart Array P431 in Slot 2
   Array: A
      Interface Type: SAS
      Unused Space: 0  MB (0.0%)
      Used Space: 65.5 TB (100.0%)
      Status: OK
      MultiDomain Status: OK
      Array Type: Data 
      Spare Type: dedicated
      Smart Path: disable

Всё распределено и вроде как в порядке, пора подкинуть диски. Это выполняется одной командой, перечисляем идентификаторы слотов дисков, руководствуясь предыдущими листингами. Я предпочитаю указывать через запятую, мне кажется, что так надёжнее:

# ssacli ctrl slot=2 ld 1 add drives=1E:2:2,1E:2:3,1E:2:4,1E:2:5,1E:2:6,1E:2:7

Если всё хорошо, утилита ничего не скажет. Для отчаянных и ленивых есть опция не перечислять диски, а вместо этого указать ключ add drives=all, которая заджойнит в массив все неназначенные диски.

С этого момента можно оставить задачу в покое на продолжительный срок, так как экспанд массива занимает продолжительное время. Сколько? Считайте сами, так как можно увидеть прогресс в процентах с точностью до двух знаков после запятой, сделать замер с определённым интервалом и произвести подсчёт estimated time с помощью несложной арифметической операции. В моём случае это заняло примерно пару дней на моей конфигурации:

# ssacli ctrl slot=2 ld all show

Smart Array P431 in Slot 2

   Array A

      logicaldrive 1 (54.6 TB, RAID 6, Transforming, 0.01% complete)

A few days later:

# ssacli ctrl slot=2 ld all show

Smart Array P431 in Slot 2

   Array A

      logicaldrive 1 (54.6 TB, RAID 6, Transforming, 81.65% complete)

Осталось совсем чуть-чуть, по завершении мы увидим результат:

# ssacli ctrl slot=2 ld all show

Smart Array P431 in Slot 2

   Array A

      logicaldrive 1 (54.6 TB, RAID 6, OK)

Собственно, трансформация кончилось, но "где деньги, Лебовски"? На самом деле этот вопрос мы будем задавать себе ещё несколько раз, так как почти ничего не бывает автоматически. Посмотрим на статус не логического диска, а массива, которому он принадлежит и увидим что добавленные диски отразились как неиспользованное пространство:

# ssacli ctrl slot=2 array a show

Smart Array P431 in Slot 2
   Array: A
      Interface Type: SAS
      Unused Space: 38631161  MB (37.5%)
      Used Space: 61.4 TB (62.5%)
      Status: OK
      MultiDomain Status: OK
      Array Type: Data 
      Spare Type: dedicated
      Smart Path: disable

На всякий случай проверим, что все диски уже в массиве:

# ssacli ctrl slot=2 pd all show

Smart Array P431 in Slot 2

   Array A

      physicaldrive 1E:1:1 (port 1E:box 1:bay 1, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:2 (port 1E:box 1:bay 2, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:3 (port 1E:box 1:bay 3, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:4 (port 1E:box 1:bay 4, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:5 (port 1E:box 1:bay 5, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:6 (port 1E:box 1:bay 6, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:7 (port 1E:box 1:bay 7, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:9 (port 1E:box 1:bay 9, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:10 (port 1E:box 1:bay 10, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:11 (port 1E:box 1:bay 11, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:12 (port 1E:box 1:bay 12, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:1 (port 1E:box 2:bay 1, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:2 (port 1E:box 2:bay 2, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:3 (port 1E:box 2:bay 3, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:4 (port 1E:box 2:bay 4, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:5 (port 1E:box 2:bay 5, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:6 (port 1E:box 2:bay 6, SAS HDD, 6 TB, OK)
      physicaldrive 1E:2:7 (port 1E:box 2:bay 7, SAS HDD, 6 TB, OK)
      physicaldrive 1E:1:8 (port 1E:box 1:bay 8, SAS HDD, 6 TB, OK, spare)

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

# ssacli ctrl slot=2 ld 1 modify size=max forced

Если всё хорошо, команда ничего не отдаст. Флаг forced позволит совершить операцию на примонтированном в операционной системе блочном устройстве без лишнего интерактива. Проверим как теперь выглядят массив и логический диск:

# ssacli ctrl slot=2 array a show

Smart Array P431 in Slot 2
   Array: A
      Interface Type: SAS
      Unused Space: 0  MB (0.0%)
      Used Space: 98.2 TB (100.0%)
      Status: OK
      MultiDomain Status: OK
      Array Type: Data 
      Spare Type: dedicated
      Smart Path: disable


# ssacli ctrl slot=2 ld all show

Smart Array P431 in Slot 2

   Array A

      logicaldrive 1 (87.3 TB, RAID 6, OK)

На этом часть с расширением на массиве закончена. Пора переходить к разделам и операционной системе.

Расширение раздела

Для начала можно открыть parted и убедиться, что новое пространство... не появилось:

# parted /dev/sdb
GNU Parted 3.4
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p free                                                           
Model: HP LOGICAL VOLUME (scsi)
Disk /dev/sdb: 60.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name      Flags
        17.4kB  2621kB  2604kB  Free Space
 1      2621kB  60.0TB  60.0TB  xfs          External

Видимо, операционная система ничего не знает о новой геометрии блочного устройства, принудим её к получению новой информации тривиальной командой, а потом посмотрим что у нас об этом скажет ядро:

# echo 1 > /sys/block/sdb/device/rescan 

# dmesg
...
[1383976.667022] sd 3:1:0:0: [sdb] 187535656112 512-byte logical blocks: (96.0 TB/87.3 TiB)
[1383976.667031] sd 3:1:0:0: [sdb] 4096-byte physical blocks
[1383976.667142] sdb: detected capacity change from 117209785520 to 187535656112

Ага, объём блочного устройства изменился в нашу пользу, смотрим снова в parted, который сообщит что он обнаружил новое место, позволим ему его учитывать:

# parted /dev/sdb
GNU Parted 3.4
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) p free                                                           
Warning: Not all of the space available to /dev/sdb appears to be used, you can fix the GPT to use all of the space (an extra 70325870592 blocks) or continue with the current setting? 
Fix/Ignore? fix                                                           
Model: HP LOGICAL VOLUME (scsi)
Disk /dev/sdb: 96.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name      Flags
        17.4kB  2621kB  2604kB  Free Space
 1      2621kB  60.0TB  60.0TB  xfs          External
        60.0TB  96.0TB  36.0TB  Free Space

Настала пора расширить раздел. У нас всего один раздел с индексом 1, свободное место образовалось сразу за ним. Это очень простой случай и мы назначаем разделу 1 всё свободное место, подтвердив, что мы это делаем онлайн (без отмонтирования раздела):

(parted) resizepart 1 100%                                                
Warning: Partition /dev/sdb1 is being used. Are you sure you want to continue?
Yes/No? y                                                                 

(parted) p free                                                           
Model: HP LOGICAL VOLUME (scsi)
Disk /dev/sdb: 96.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name      Flags
        17.4kB  2621kB  2604kB  Free Space
 1      2621kB  96.0TB  96.0TB  xfs          External

Осталось немного. Нужно пофиксить файловую систему, в нашем случае XFS, чтобы новое место стало доступным для использования. Для этого воспользуемся утилитой xfs_growfs, которая примет новое количество блоков и место появится в операционной системе:

# xfs_growfs -d /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=103, agsize=228925312 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=23441956369, imaxpct=5
         =                       sunit=128    swidth=640 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=521728, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 14651222786 to 23441956369

Как не сложно догадаться, для иных файловых систем есть свои версии утилит growfs. А для любителей LVM существует утилиты lvextend/lvresize со схожим функционалом.

Финализируем видимость пространства с помощью df:

# df -h /dev/sdb1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1        88T   44T   45T  50% /mnt/storage

Итак, мы увеличили свой массив за счёт добавления новых дисков и не разу не прервали его работу. Что дальше? А дальше можно продолжить забивать его мусором, подкинув потом ещё одну полку по цепочке SAS-шины. Только не надо забывать, что статистически риск отказа растёт при добавлении каждого диска, вплоть до того, что избыточность в два диска не вывезет.

А можно заменить по очереди все существующие в массиве диски на новые большего объёма и расширить пространство за счёт этого — только потом придётся думать, куда девать старые диски, скорее всего только в утиль.

Если хочется новых приключений, можно переехать на софтовое решение, манипулирующее физическими дисками aka JBOD, начиная от Linux MD, ZFS и заканчивая чем-то типа Ceph, жизнь может после этого стать куда более увлекательной.

Комментарии (3)


  1. CherryPah
    13.02.2025 20:31

    add drives=1E:2:2,1E:2:3,1E:2:4,1E:2:5,1E:2:6,1E:2:7

    add drives=all unassigned. Гулять так на все =)

    A few days later:

    Вот где-то тут я не выдержал, переложил данные и просто пересоздал массив xD. Понятно что не всегда такое возможно, но тем кто решит пройти расширение на лету - помните что few days тут не опечатка

    Не пытайтесь найти это самостоятельно на сайте HPE, это может быть опасно для психики. 

    Там вообще весь сайт опасен для психики, но со временем привыкаешь и даже начинаешь понимать их логику как искать нужное, логику понять все равно не удается. Ну и репо иногда приходится подбирать методом научного поиска, мне так и не удалось убедить XCP-NG что он XenServer, а вот древняя rpmка от какой-то древней центоси подошла, ну и несколько зависимостей тоже пришлось руками.

    У нас всё это используется для складирования бэкапов, то есть туда постоянно что-то пишется и мы не хотим прерывать этот процесс на время работ

    Скорость не падала не смотрели?

    Спасибо, хорошая готовая шпаргалка, в закладки

    Press ssacli ctrl slot=2 pd 1E:1:1,1E:1:4,1E:1:5,1E:1:7,1E:1:10,1E:1:11,1E:1:12 modify led=on


    1. Pas Автор
      13.02.2025 20:31

      Да, вполне годится на то, чтобы закинуть в хаутушку. Повторяю процедуру раз в год-полтора, всё время приходится вспоминать. Спасибо.

      Скорость оcобо не упала, заметили, что дампы может чуть дольше по времени делаться стали. Там довольно узкое горлышко сама шина 2 * x4 SAS, полагаю что на текущей нагрузке особо не заметили. Вот что удалось вытащить из графаны:

      Недельный график, ресайз пришёлся где-то примерно на 5-6 дни.
      Недельный график, ресайз пришёлся где-то примерно на 5-6 дни.


  1. werter_l
    13.02.2025 20:31

    1 Cпасибо.

    2 Нафиг-нафиг, завтра оно сдохнет, а в ЗИПах 99%, что его нет (

    Для такого только jbod\it mode\hba mode и софтовый рейд.

    Зы. А если оно еще и на матплате распаяно, а не дискретное, то совсем все плохо (