Я наткнулся на этот ответ по ошибке, но если кому-то интересно, вот ответ, подтвержденный экспериментами.
Короткая версия
Бонусный вопрос: могу ли я создать 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! Это не позволит нам, и ошибка очень очевидна.