Ошибка при попытке уменьшить количество дисков в RAID-массиве Linux

Вопрос или проблема

У меня есть NAS Synology, и я пытаюсь уменьшить RAID6 массив с 12 дисков до 11 дисков.

Я уже уменьшил размер файловой системы и логического тома, но когда я пытаюсь уменьшить размер массива RAID до 11 дисков, mdadm просто выдает мне ошибку.

root@DiskStation:~# mdadm -V
mdadm - v3.4 - 28 января 2016

root@DiskStation:~# mdadm -D /dev/md2
/dev/md2:
        Версия : 1.2
  Время создания : сб. 12 июля 13:24:29 2014
     Уровень RAID : raid6
     Размер массива : 19487796480 (18585.01 GiB 19955.50 GB)
  Использованный размер устройства : 1948779648 (1858.50 GiB 1995.55 GB)
   Устройства RAID : 12
  Всего устройств : 12
    Устойчивость : Суперблок постоянен

    Время обновления : вт. 4 февраля 10:14:55 2020
          Состояние : чистое
 Активные устройства : 12
Рабочие устройства : 12
 Убитые устройства : 0
  Запасные устройства : 0

         Конфигурация : левая симметричная
     Размер блока : 64K

           Имя : DiskStation:2  (локально к хосту DiskStation)
           UUID : 263bdad7:eed15299:ff0c7a70:c97ee595
         События : 414186

    Номер   Главный   Вторичный   Устройство RAID Состояние
      15       8        5        0      активный синхронный   /dev/sda5
       1       8       21        1      активный синхронный   /dev/sdb5
       8       8       37        2      активный синхронный   /dev/sdc5
       9       8       53        3      активный синхронный   /dev/sdd5
       4       8       69        4      активный синхронный   /dev/sde5
       7       8      117        5      активный синхронный   /dev/sdh5
       6       8      101        6      активный синхронный   /dev/sdg5
       5       8       85        7      активный синхронный   /dev/sdf5
      11       8      133        8      активный синхронный   /dev/sdi5
      12       8      149        9      активный синхронный   /dev/sdj5
      13       8      165       10      активный синхронный   /dev/sdk5
      14       8      181       11      активный синхронный   /dev/sdl5

root@DiskStation:~# mdadm --grow -n11 /dev/md2
mdadm: Уменьшение числа устройств не разрешено.

У меня очень мало опыта в таких вещах, и тот факт, что я не могу найти ничего онлайн по поводу этой конкретной ошибки, оставил меня в тупике.

Я следовал этим инструкциям здесь, и они говорят, что мне должно быть предложено уменьшить размер массива. Нужно ли мне просто продолжать и уменьшать размер массива все равно, не дожидаясь предложения? Как мне узнать, каким должен быть размер?

Я знаю, что этот вопрос задавался много лет назад, но для потомков: это пользовательская патч, который Synology применил к своей версии mdadm.

Я подозреваю, что причина, по которой вы не смогли найти никакой информации об этом, заключается в том, что уменьшение RAID — это то, что Synology старается во что бы то ни стало заявить, что невозможно (пост, на который вы ссылаетесь, является единственным источником информации в сети, о котором я знаю, который не просто говорит “резервируйте свои данные, удалите RAID, создайте новый”) и тот факт, что этот патч был введен после написания того поста.

Поскольку mdadm лицензирован под GPL, все изменения должны быть открытыми, и Synology распространяет свои архивы здесь. Я изучаю DSM 7.2 и mdadm 3.4. Насколько я могу судить, архивы mdadm содержат одно и то же, но файлы упакованы в другом порядке, поэтому хэши архивов различаются – потому что, конечно же, они разные.

Если вы скачаете любой из этих архивов mdadm и сравните его с оригинальным mdadm 3.4, вы увидите это в Grow.c:

скриншот разницы файлов

Другими словами, если вы используете конфигурацию RAID, отличную от RAID-0 или RAID-1, и запрашиваемое количество дисков меньше текущего количества дисков, инструмент отказывает. Почему? Хороший вопрос.
Существует очень похожая проверка чуть выше, которая также присутствует в исходном коде, но она применяется только если обнаружена старая версия ядра Linux, и ее можно переопределить с помощью переменной окружения – проверка Synology не имеет переопределения.

На данный момент ваши варианты такие:

  • Скомпилировать исходный mdadm из исходников.
  • Удалить эту проверку из исходного кода Synology mdadm и скомпилировать это.
  • Применить двоичный патч к стандартному двоичному файлу mdadm, чтобы пропустить проверку.

Я думаю, что предложенные загрузки здесь должны быть достаточными, чтобы собрать SDK, с помощью которого вы сможете компилировать для DSM, но я этого не пробовал. Однако я знаю, что просто статические бинарные файлы x86_64 Linux ELF прекрасно работают на DSM (в моем случае собраны с помощью clang и musl).

Но в конечном итоге я выбрал двоичный патч, так как это было наименее хлопотно для меня.

Я на DSM 7.2.1-69057 Обновление 5, и мой mdadm имеет следующий sha256 хэш:

85a0b4c7bc615aef003e3fb6c368b583928c492cb02f51d58d1b23380ba469d6  /sbin/mdadm

Если вы просто хотите патченный бинарный файл, я загрузил его здесь, и это контрольная сумма:

44b463e565ad0afad77ba35957c0160bb6078ccbe30fa0afa7e0df09e6105f7e  mdadm-3.4-patched

Я предлагаю вам НЕ перезаписывать оригинальный бинарный файл этим, а просто положить его в вашу домашнюю папку и запустить с помощью ./mdadm. С помощью этого я смог успешно уменьшить пул RAID-6 с 8 дисков до 5 дисков.


Если вам интересен процесс, я использую radare2 для этого.

Сначала получите бинарный файл с вашего NAS:

ssh user@nas 'cat /sbin/mdadm' >mdadm

Откройте бинарный файл для записи:

r2 -w mdadm

Оказавшись в оболочке r2, мы будем искать нашу строку с ошибкой:

iz~Не разрешено уменьшить количество устройств.

Это выведет что-то вроде:

1010 0x00075188 0x00075188 49   50   .rodata ascii %s: Не разрешено уменьшить количество устройств.\n

Таким образом, наша строка находится по адресу 0x00075188 (если два адреса различаются, возьмите второй). Затем мы запускаем анализ на бинарном файле и выводим все ссылки на эту строку:

aaaa
axt 0x00075188

Это должно дать вам только один результат:

fcn.0002e920 0x2ece2 [DATA:r--] lea rdx, str._s:_Не_разрешено_уменьшить_количество_устройств._n

Теперь мы переходим к этому адресу и выводим некоторые окрестные инструкции:

0x2ece2
pd -5
pd 5

Это должно дать вам что-то вроде этого:

0x0002ecc0      0f8ffa060000   jg 0x2f3c0
0x0002ecc6      83bc249000..   cmp dword [rsp + 0x90], 1
0x0002ecce      0f8e57fdffff   jle 0x2ea2b
0x0002ecd4      488b3d6535..   mov rdi, qword [obj.stderr]
0x0002ecdb      488d0dbaf0..   lea rcx, str.mdadm
0x0002ece2      488d159f64..   lea rdx, str._s:_Не_разрешено_уменьшить_количество_устройств._n
0x0002ece9      31c0           xor eax, eax
0x0002eceb      be02000000     mov esi, 2
0x0002ecf0      e8cb7bfdff     call sym.imp.__fprintf_chk
0x0002ecf5      e9e7fcffff     jmp 0x2e9e1

Команда cmp и jle, которые вы видите вверху, соответствуют проверке array.level > 1 в разнице, которую я показал выше. Мы хотим сделать так, чтобы jle 0x2ea2b превратилось в безусловный jmp 0x2ea2b. Поэтому мы переходим к этому адресу и выполняем это:

0x0002ecce
"wa jmp 0x2ea2b; nop"

Я добавляю одну инструкцию NOP здесь, чтобы соответствовать размеру оригинальной инструкции jle – функционально это не требуется, но это делает дизассемблирование немного чище.

И потом остается лишь выйти из r2:

q

И у вас есть патченный бинарный файл.

Ответ или решение

Ошибки при попытке уменьшить количество дисков в RAID массиве на Linux

Когда дело доходит до управления RAID массивами в Linux, особенно с использованием инструментов, таких как mdadm, пользователи могут столкнуться с различными трудностями. Одной из распространённых проблем является ошибка при попытке уменьшить количество устройств в RAID. Ваша ситуация, связанная с уменьшением массива RAID 6 на Synology NAS с 12 дисков до 11, требует тщательного анализа.

Описание проблемы

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

mdadm: Not allowed to reduce the number of devices.

Работающий установленный на вашем устройстве mdadm — версия 3.4 от 28 января 2016 года. По всей видимости, ваша система не позволяет уменьшать количество дисков в RAID массиве из-за специфических изменений, внесённых в код mdadm компанией Synology. Эти изменения направлены на предотвращение сокращения RAID массивов в целях безопасности и целостности данных.

Причины возникновения ошибки

Как вы уже описали, код mdadm на Synology NAS модифицирован, и в него добавлена проверка, которая препятствует уменьшению массива, если он использует уровни, отличные от RAID 0 и RAID 1. Эта проверка отсутствует в стандартной версии mdadm и, вероятно, является причиной вашей проблемы.

Возможные решения

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

  1. Компиляция стандартной версии mdadm из исходников: Это позволит вам использовать оригинальный код, в котором отсутствует данная проблема. Однако, стоит учитывать, что для этого потребуется соответствующая среда разработки.

  2. Удаление проверки в исходном коде mdadm Synology и компиляция: Если у вас есть навыки программирования, вы можете модифицировать исходный код mdadm Synology, удалив соответствующую проверку, и скомпилировать его.

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

Патч бинарного файла mdadm

Если вы решите воспользоваться патчем, вот подробные шаги:

  1. Получите бинарный файл mdadm с вашего NAS:

    ssh user@nas 'cat /sbin/mdadm' > mdadm
  2. Откройте бинарный файл с использованием инструмента для анализа, например, radare2.

  3. Найдите строку с сообщением об ошибке "Not allowed to reduce the number of devices." и измените условие jle на jmp, как это было описано в вашем сообщении.

  4. Сохраните изменения и используйте изменённый mdadm для выполнения команды уменьшения RAID массива.

Важно!

Не рекомендуется заменять оригинальный mdadm. Вместо этого лучше работать с изменённым бинарником из домашней директории или другой временной папки.

Заключение

Если вы решили продолжать работу с RAID массивом на базе Synology NAS, будьте особенно внимательны к каждой команде и изменению. Уменьшение размера RAID массива может привести к потере данных, поэтому настоятельно рекомендуется создавать резервные копии всех важных данных перед выполнением таких операций. Если у вас есть дополнительные вопросы, не стесняйтесь обращаться к профессионалам или в специализированные сообщества. Использование рационального и осознанного подхода может значительно упростить вашу задачу и предотвратить возможные проблемы в будущем.

Оцените материал
Добавить комментарий

Капча загружается...