Я наткнулся на этот ответ по ошибке, но если кому-то интересно, вот ответ, подтвержденный экспериментами.
Короткая версия
Бонусный вопрос: могу ли я создать md(4)
RAID-массив из блочных устройств неравного размера? Да, но массив RAID будет иметь размер наименьшего блочного устройства (плюс некоторые накладные расходы на его ведение домашнего хозяйства). Если размеры устройств не находятся в пределах 1% друг от друга, вы получите предупреждение.
Вопрос 1: я могу добавить к существующему md(4)
массиву RAID устройство меньше, чем самый маленький текущий член? Нет извини. mdadm
будет отказываться делать это для защиты ваших данных.
Вопрос 2: можете ли вы изменить размер существующего массива MD? Да (читайте mdadm
manpge!), Но это может не стоить усилий. Вам придется выполнить резервное копирование всего, затем изменить размер содержимого устройства RAID, а затем изменить размер самого устройства - все это весьма подвержено ошибкам, просчетам и другим вещам, которые будут стоить вам ваших данных (болезненный опыт разговора) ,
Это не стоит риска и усилий. Если у вас есть новый чистый диск, вот как его изменить, а также сохранить от одной до двух копий всех ваших данных в неизменном виде (при условии, что у вас 2-дисковый RAID1):
- Создайте на нем новый
md(4)
массив (без одного диска).
- Воссоздайте структуру содержимого массива (Crypto, LVM, таблицы разделов, любую их комбинацию, что бы ни плавало на вашей лодке).
- Скопируйте данные с существующего диска на новый.
- Перезагрузитесь, используя новый диск.
- Протрите таблицу разделов старого диска (или обнулите
md(4)
суперблок). При необходимости создайте необходимые разделы, соответствующие схеме на новом диске.
- Добавьте старый диск в новый массив.
- Подождите, пока члены массива синхронизируются. Выпей кофе. Прилетайте в Латинскую Америку и выбирайте собственные кофейные зерна. :) (Если вы живете в Латинской Америке, летите в Африку).
Примечание: да, это та же самая техника 0xC0000022L, которая описана в его ответе.
Вопрос 3. Что делать, если диск 1G короткий? :) Не беспокойся об этом. Скорее всего, ваш запасной диск будет больше. На самом деле, со стратегией , как выше он платит , чтобы получить более дешевые большие диски , когда один выходит из строя (или для более дешевой модернизации). Вы можете получить прогрессивное обновление.
Экспериментальное Доказательство
Экспериментальная установка
Во-первых, давайте подделаем некоторые блочные устройства. Мы будем использовать /tmp/sdx
и /tmp/sdy
(каждый 100M), и /tmp/sdz
(99M).
cd /tmp
dd if=/dev/zero of=sdx bs=1M count=100
sudo losetup -f sdx
dd if=/dev/zero of=sdy bs=1M count=100
sudo losetup -f sdy
dd if=/dev/zero of=sdz bs=1M count=99 # Here's a smaller one!
sudo losetup -f sdz
Это создает три файла в качестве три петлевых блочных устройств: /dev/loop0
, /dev/loop1
и /dev/loop2
, отображения на sdx
, sdy
и sdz
соответственно. Давайте проверим размеры:
sudo grep loop[012] /proc/partitions
7 0 102400 loop0
7 1 102400 loop1
7 2 101376 loop2
Как и ожидалось, у нас есть два петлевых устройства размером 100 МБ (102400 КиБ = 100 МБ) и одно из 99 МБ (точно 99 × 1024 блоков 1 КБ).
Создание RAID-массива из устройств одинакового размера
Вот оно:
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.
Проверьте размер:
sudo grep md100 /proc/partitions
9 100 102272 md100
Это именно то, что мы ожидаем: один взгляд на руководство mdadm напоминает нам, что метаданные версии 1.2 занимают 128 КБ: 128 + 102272 = 102400. Теперь давайте уничтожим их при подготовке ко второму эксперименту.
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1
Создание RAID-массива из неравномерных устройств
На этот раз мы будем использовать маленькое блочное устройство.
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop2
mdadm: largest drive (/dev/loop0) exceeds size (101248K) by more than 1%
Continue creating array? y
mdadm: array /dev/md100 started.
Ну, мы получили предупреждение, но массив был создан. Давайте проверим размер:
sudo grep md100 /proc/partitions
9 100 101248 md100
То, что мы получаем, это 101 248 блоков. 101248 + 128 = 101376 = 99 × 1024. Используемое пространство - это пространство самого маленького устройства (плюс метаданные RAID 128K). Давайте снова разберемся с этим в нашем последнем эксперименте:
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2
И наконец: добавление меньшего устройства к работающему массиву
Во-первых, давайте создадим массив RAID1 только с одним из 100M дисков. Массив будет ухудшен, но нам все равно. Мы просто хотим запустить массив. В missing
ключевых слов является заполнителем , который говорит : «Я не устройство для вас все же, начать он массив , и теперь я добавлю один позже.
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing
Опять же, давайте проверим размер:
sudo grep md100 /proc/partitions
9 100 102272 md100
Конечно же, это 128K меньше 102400 блоков. Добавление меньшего диска:
sudo mdadm --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array
Boom! Это не позволит нам, и ошибка очень очевидна.
Существует несколько способов настройки
mdX
устройств. Метод должен был бы использоватьgdisk
(или,sgdisk
если вы предпочитаете версию только для командной строки), разделить это как GPT. Если вы хотите загрузиться из массива, создайте «Раздел загрузки BIOS», введите кодef02
. Это необходимо только в том случае, если вы хотите загрузиться с этого массива, в противном случае это не нужно. Затем создайте раздел такого же размера или меньше, чем самый маленький диск, который будет добавлен в массив. И последнее, но не менее важное: скопируйте данные GPT на другой диск (экспертное менюgdisk
, используйтеx
, а затемu
укажите целевое устройство). Это разрушительный процесс.Должна быть возможность - если файловая система допускает это - изменить размер существующего раздела на что-то меньшее, а затем использовать тот же метод для копирования данных GPT. Тем не менее, это приводит вас к некоторой путанице. Потому что теперь у вас есть два диска, но все еще нет
mdX
устройства. Один из них должен быть подготовлен как поmdX
разделам (которые я подразумевал выше), так и по дискам), а затем данные должны быть перемещены с существующего диска на этот.Так:
/dev/sda
) содержит данные, данные меньше 3001 ГБ, разделы не/dev/sdb
добавляется в систему/dev/sdb
сgdisk
mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2
)/dev/sdb
до/dev/sda
/dev/sda
существующих массивов/proc/mdstat
чтобы показать вам, что синхронизация завершенаЕсли вы выполнили все шаги, теперь вы сможете загружаться в новую систему с массивов mdX. Однако, на всякий случай, держите под рукой спасательный CD или опцию загрузки PXE.
GRUB2 не сможет распознать установку от руки. Так что вам нужно немного "магии". Вот одна строка:
Или давайте будем более многословны:
Это создает (или перезаписывает) значение по умолчанию,
/boot/grub/devicemap
которое сообщает GRUB2, где найти каждый соответствующий диск. Результатом будет что-то вроде этого списка:Если вы используете устаревшую GRUB, вам также необходимо создать «Загрузочный раздел BIOS» с метаданными версии 0.9,
mdadm -e 0 ...
и процесс будет отличаться. Я этого еще не сделал.источник
mdadm
в первую очередь отказался бы построить массив, если он несовместим. В RAID 5 вам понадобится больше дисков, а в RAID 0 вас это не волнует, поэтому я предположил RAID 1. Так что да, имеет смысл оставить место.mdadm
допускает произвольную разницу в размере 1% в элементах массива.