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


15

Вопрос 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 ГБ.

Ответы:


28

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

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

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

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

Вопрос 2: можете ли вы изменить размер существующего массива MD? Да (читайте mdadmmanpge!), Но это может не стоить усилий. Вам придется выполнить резервное копирование всего, затем изменить размер содержимого устройства 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

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


Synology Hybrid RAID (SHR) решает эту проблему.
Денис Денисов

1

Существует несколько способов настройки 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 ...и процесс будет отличаться. Я этого еще не сделал.


1
Спасибо за ответ. Этот массив на самом деле просто для хранения на моем сервере, поэтому он не будет обрабатывать загрузку или что-то подобное. Я просто беспокоился о микшировании и подборе жестких дисков разных размеров позже в игре. Я имею в виду, что произойдет, если у меня sdb1 @ 3001 ГБ и sdc1 @ 3001 ГБ, но sdc1 умирает и замена составляет 3000 ГБ? Уменьшает ли sdb1 до 3000? Массив @ / dev / md0 сокращается до 3000 ГБ? Чем больше я думаю об этом, тем больше смысла оставлять в конце места, как, например, в примере 2999 выше - таким образом, это должно устранить эту головную боль. Если я что-то упустил?
JaSauders

1
На самом деле, если предположить, что уровень RAID 1 здесь, mdadmв первую очередь отказался бы построить массив, если он несовместим. В RAID 5 вам понадобится больше дисков, а в RAID 0 вас это не волнует, поэтому я предположил RAID 1. Так что да, имеет смысл оставить место.
0xC0000022L

Я не хочу бить лошадь, но я немного не уверен насчет «несовместимого» заявления, которое вы сделали. Что было бы несовместимо? В моем примере вы ссылались на разницу в размерах 3000 ГБ против 3001 ГБ? В любом случае, я просто запустил свой массив с каждым разделом 2999 ГБ, хотя каждый диск был 3001 ГБ. Это должно просто устранить любые головные боли, которые могут возникнуть в случае, если я не смогу получить идентичные сменные диски. Ценю ваше понимание!
JaSauders

@JaSauders: Я думаю, что один GiB более или менее был бы несовместим. Но, честно говоря, я не знаю, где предел. Я знаю, однако, что небольшие изменения в размере будут терпимы. Для всего остального вы должны мигрировать так, как я описал.
0xC0000022L

@ 0xC0000022L: mdadmдопускает произвольную разницу в размере 1% в элементах массива.
Алексиос
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.