Вопрос или проблема
У меня есть 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
и, вероятно, является причиной вашей проблемы.
Возможные решения
Исходя из вышеупомянутого, у вас есть несколько вариантов решения проблемы:
-
Компиляция стандартной версии
mdadm
из исходников: Это позволит вам использовать оригинальный код, в котором отсутствует данная проблема. Однако, стоит учитывать, что для этого потребуется соответствующая среда разработки. -
Удаление проверки в исходном коде
mdadm
Synology и компиляция: Если у вас есть навыки программирования, вы можете модифицировать исходный кодmdadm
Synology, удалив соответствующую проверку, и скомпилировать его. -
Применение бинарного патча для обхода проверки: Для пользователей, которые не хотят рисковать изменением кода, можно использовать бинарный патч, который обойдёт данную проверку. Это наименее сложный и наиболее быстрый способ.
Патч бинарного файла mdadm
Если вы решите воспользоваться патчем, вот подробные шаги:
-
Получите бинарный файл
mdadm
с вашего NAS:ssh user@nas 'cat /sbin/mdadm' > mdadm
-
Откройте бинарный файл с использованием инструмента для анализа, например,
radare2
. -
Найдите строку с сообщением об ошибке "Not allowed to reduce the number of devices." и измените условие
jle
наjmp
, как это было описано в вашем сообщении. -
Сохраните изменения и используйте изменённый
mdadm
для выполнения команды уменьшения RAID массива.
Важно!
Не рекомендуется заменять оригинальный mdadm
. Вместо этого лучше работать с изменённым бинарником из домашней директории или другой временной папки.
Заключение
Если вы решили продолжать работу с RAID массивом на базе Synology NAS, будьте особенно внимательны к каждой команде и изменению. Уменьшение размера RAID массива может привести к потере данных, поэтому настоятельно рекомендуется создавать резервные копии всех важных данных перед выполнением таких операций. Если у вас есть дополнительные вопросы, не стесняйтесь обращаться к профессионалам или в специализированные сообщества. Использование рационального и осознанного подхода может значительно упростить вашу задачу и предотвратить возможные проблемы в будущем.