RAID (mdadm) - что произойдет, если диски не соответствуют по размеру?

Вопрос 1 - Прежде чем ответить «просто нужно меньше диска», послушайте меня быстро. Мой 3TB WD Reds имеет размер 3001 ГБ. Допустим, я настроил зеркало через mdadm для sdb1 и sdc1, которые охватывают 100% диска. Но вдруг один из приводов выходит из строя. Замена 3 ТБ, весом 3000 ГБ. Что происходит, когда я вставляю диск меньше, чем тот, который в данный момент существует в массиве? Я знаю, что с новым массивом, использующим 3000 против 3001, он будет составлять массив, равный 3000. Но, как я уже сказал, как насчет текущего массива @ 3001, и я добавляю диск меньшего размера? Перестраивается ли он во время перестройки до размера 3000 ГБ?

Вопрос 2 - Если я не могу добавить 3000 ГБ к массиву с существующими 3001 ГБ, и он просто уменьшается до 3000 ... можно ли немного уменьшить размер 3001?

Вопрос 3 - Или лучшая идея. Что, если я уменьшу размер своего 3 ТБ диска до 2999 ГБ. Таким образом, независимо от того, является ли диск коротким на 1 МБ, 1 байт, 10 КБ, не имеет значения, он всегда будет брать «меньший» диск с 2999 ГБ.

15
задан 1 February 2013 в 06:43

2 ответа

Я наткнулся на этот ответ по ошибке, но если кому-то интересно, вот ответ, подтвержденный экспериментами.

Краткая версия

Дополнительный вопрос: могу ли я создать md(4) RAID-массив из блочных устройств неравного размера? Да, но RAID-массив будет иметь размер самое маленькое блочное устройство (плюс некоторые накладные расходы для его собственной уборки). Если размеры устройств не находятся в пределах 1% друг от друга, вы получите предупреждение.

Вопрос 1: могу ли я добавить к существующему md(4) RAID-массиву устройство меньше, чем наименьший текущий член? Нет, извините. mdadm будет категорически отказываться делать это для защиты ваших данных.

Вопрос 2: можете ли вы изменить размер существующего массива md? Да (прочитайте manpge mdadm!), Но это может не стоить усилий. Вам придется выполнить резервное копирование всего, затем изменить размер содержимого устройства RAID, а затем изменить размер самого устройства - все это весьма подвержено ошибкам, просчетам и другим вещам, которые будут стоить вам ваших данных (болезненный опыт разговора) .

Это не стоит риска и усилий. Если у вас есть новый чистый диск, вот как его изменить размер, а также сохранить от одной до двух копий всех ваших данных без изменений (при условии, что у вас 2-дисковый RAID1):

  1. Создать новый массив md(4) (отсутствует один диск).
  2. Воссоздайте структуру содержимого массива (Crypto, LVM, таблицы разделов, любые их комбинации, что угодно, что плавает на вашей лодке).
  3. Скопируйте данные с существующего диска на новый.
  4. Перезагрузитесь, используя новый диск.
  5. Сотрите таблицу разделов старого диска (или обнулите суперблок md(4)). При необходимости создайте необходимые разделы, соответствующие схеме на новом диске.
  6. Добавьте старый диск в новый массив.
  7. Дождитесь синхронизации элементов массива. Выпей кофе. Прилетайте в Латинскую Америку и выбирайте собственные кофейные зерна. :) (Если вы живете в Латинской Америке, вместо этого летите в Африку).

Примечание: да, это та же самая техника 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

Как и ожидалось, у нас есть два петлевых устройства точно 100M (102400 КиБ = 100 МиБ) и одно из 99M (точно 99 × 1024 блоков 1K).

Создание 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

Бум! Это не позволит нам, и ошибка очень ясна.

0
ответ дан 1 February 2013 в 06:43

Существует несколько способов настройки mdX устройств. Метод должен был бы использовать gdisk (или sgdisk, если вы предпочитаете версию только для командной строки), чтобы разделить это как GPT. Если вы хотите загрузиться с массива, создайте «Раздел загрузки BIOS», введите код ef02. Это необходимо только в том случае, если вы хотите загрузиться с этого массива, в противном случае это не нужно. Затем создайте раздел того же размера или меньше, чем самый маленький диск, который будет добавлен в массив. Наконец, что не менее важно, скопируйте данные GPT на другой диск (экспертное меню в gdisk, используя x, а затем u и укажите целевое устройство). Это разрушительный процесс.

Должна быть возможность - если файловая система позволяет это сделать - изменить размер существующего раздела на что-то меньшее, а затем использовать тот же метод для копирования данных GPT. Тем не менее, это приводит вас к некоторой путанице. Потому что теперь у вас есть два диска, но все еще нет устройства mdX. Один из них должен быть подготовлен как mdX, либо по разделам (которые я подразумевал выше), либо по дискам), а затем данные должны быть перемещены с существующего диска на этот.

Итак:

  1. большой диск (/dev/sda) содержит данные, данные меньше 3001 ГБ, разделы не
  2. , диск меньшего размера /dev/sdb добавляется в систему
  3. вы разбиваете /dev/sdb на gdisk
  4. вы создаете массив из каждого соответствующего раздела (mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2)
  5. вы создаете файловые системы на новых массивах
  6. вы копируете все данные, проверяя, что ваша система будет готова к запуску с диска GPT, и давая GRUB2 понять последствия (см. Ниже)
  7. вы копируете данные разбиения GPT из /dev/sdb до /dev/sda
  8. вы добавляете «сырые» разделы из /dev/sda в существующие массивы
  9. , ожидая, пока /proc/mdstat покажет, что синхронизация выполнена

Если вы выполнили все шаги, теперь вы сможете загружаться в новую систему с массивов mdX. Однако, на всякий случай, держите под рукой спасательный CD или опцию загрузки PXE.


GRUB2 не сможет распознать установку от руки. Так что вам нужно немного "магии". Вот одна строка:

for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap

Или давайте будем более многословны:

for i in /dev/disk/by-id/md-uuid-*
do
  DEV=$(readlink $i)
  echo "(${DEV##*/}) $i"
done|sort|sudo tee /boot/grub/devicemap

Это создает (или перезаписывает) значение по умолчанию /boot/grub/devicemap с тем, которое сообщает GRUB2, где найти каждый соответствующий диск. Результатом будет что-то вроде этого списка:

(md0) /dev/disk/by-id/md-uuid-...
(md2) /dev/disk/by-id/md-uuid-...
(md3) /dev/disk/by-id/md-uuid-...
(md4) /dev/disk/by-id/md-uuid-...

Если вы используете устаревший GRUB, вам также необходимо создать «Загрузочный раздел BIOS» с метаданными версии 0.9, используя mdadm -e 0 ..., и процесс будет отличаются. Я этого еще не сделал.

0
ответ дан 1 February 2013 в 06:43

Другие вопросы по тегам:

Похожие вопросы: