Вопрос 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 ГБ.
Я наткнулся на этот ответ по ошибке, но если кому-то интересно, вот ответ, подтвержденный экспериментами.
Дополнительный вопрос: могу ли я создать md(4)
RAID-массив из блочных устройств неравного размера? Да, но RAID-массив будет иметь размер самое маленькое блочное устройство (плюс некоторые накладные расходы для его собственной уборки). Если размеры устройств не находятся в пределах 1% друг от друга, вы получите предупреждение.
Вопрос 1: могу ли я добавить к существующему md(4)
RAID-массиву устройство меньше, чем наименьший текущий член? Нет, извините. mdadm
будет категорически отказываться делать это для защиты ваших данных.
Вопрос 2: можете ли вы изменить размер существующего массива md? Да (прочитайте manpge mdadm
!), Но это может не стоить усилий. Вам придется выполнить резервное копирование всего, затем изменить размер содержимого устройства RAID, а затем изменить размер самого устройства - все это весьма подвержено ошибкам, просчетам и другим вещам, которые будут стоить вам ваших данных (болезненный опыт разговора) .
Это не стоит риска и усилий. Если у вас есть новый чистый диск, вот как его изменить размер, а также сохранить от одной до двух копий всех ваших данных без изменений (при условии, что у вас 2-дисковый RAID1):
md(4)
(отсутствует один диск). 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
Как и ожидалось, у нас есть два петлевых устройства точно 100M (102400 КиБ = 100 МиБ) и одно из 99M (точно 99 × 1024 блоков 1K).
Вот как:
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
На этот раз мы будем использовать малоблочное устройство.
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
Бум! Это не позволит нам, и ошибка очень ясна.
Существует несколько способов настройки 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 не сможет распознать установку от руки. Так что вам нужно немного "магии". Вот одна строка:
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 ...
, и процесс будет отличаются. Я этого еще не сделал.