RAID (mdadm) - Що станеться, якщо накопичувачі не відповідають розміру?


15

Запитання 1 - Перш ніж відповісти "просто забирає менший диск", почуйте мене швидко. Мої 3 ТБ WD Reds вийшли розміром 3001 ГБ. Скажімо, я встановив дзеркало через mdadm для sdb1 та sdc1, які охоплюють 100% диска. Але раптом один з приводів виходить з ладу. Заміна - 3 ТБ, вагою 3000 ГБ. Що станеться, коли я вставлю диск, менший за той, що існує в масиві? Я знаю, що з новим масивом, що використовує 3000 проти 3001, він створив би масив до 3000. Але, як я вже сказав, що з поточним масивом @ 3001 і я додаю менший диск? Чи переструктурує вона себе під час відновлення, щоб вона була розміром 3000 ГБ?

Питання 2 - Якщо я не можу додати до масиву 3000 ГБ вже наявний 3001 Гб, і він просто зменшиться до 3000 ... чи можу я трохи змінити розмір 3001 вниз?

Питання 3 - Або краща ідея. Що робити, якщо я зменшую розмір 3TB накопичувача до 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(кожен 100 млн.), І /tmp/sdz(99 млн.).

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 містять 128K: 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

Звичайно, це не більше 128 Кб з 102400 блоків. Додавання меншого диска:

sudo mdadm  --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array

Бум! Це не дозволить нам, і помилка дуже зрозуміла.


Synology Hybrid RAID (SHR) вирішує цю проблему.
Денис Денисов

1

Існує кілька способів налаштування mdXпристроїв. Методом було б використання gdisk(або sgdiskякщо ви віддаєте перевагу версії лише командного рядка) для розділення цього розділу як GPT. Якщо ви хочете завантажитися з масиву, створіть "BIOS Boot Partition", введіть код 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. Однак, зберігайте рятувальний компакт-диск або варіант завантаження 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 Boot Partition" з метаданими версії 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.