Увеличение / изменение размера RAID при обновлении видимого размера дисков

10

Первоначально я создал программный RAID с использованием контроллера, который может адресовать только 2 ТБ на диск. Диски 3 ТБ. Он работал нормально, но использовал только первые 2 ТБ каждого диска.

Теперь я изменил контроллер, чтобы увидеть полный 3 ТБ. Поэтому я бы тоже хотел /dev/md0использовать последний 1 ТБ.

Я пытался:

# mdadm --grow /dev/md0 --size=max
mdadm: component size of /dev/md0 has been set to 2147479552K

Но, как вы можете видеть, он видит только 2 ТБ. Если я попытаюсь заставить его выше:

# mdadm --grow /dev/md0 --size=2147483648
mdadm: Cannot set device size for /dev/md0: No space left on device

Так что каким-то образом система может видеть диски размером 3 ТБ (дюйма /proc/partitions), но RAID не может видеть их как 3 ТБ.

подробности mdadm:

# mdadm --detail /dev/md0
/dev/md0:
    Version : 1.2
Creation Time : Fri Mar  2 15:14:46 2012
 Raid Level : raid6
 Array Size : 38654631936 (36863.93 GiB 39582.34 GB)
Used Dev Size : 2147479552 (2048.00 GiB 2199.02 GB)
Raid Devices : 20
Total Devices : 21
Persistence : Superblock is persistent

Update Time : Wed Apr 25 19:47:09 2012
      State : active
Active Devices : 20
Working Devices : 21
Failed Devices : 0
Spare Devices : 1

     Layout : left-symmetric
 Chunk Size : 4096K

       Name : node5:1
       UUID : 8603c3df:b740ba22:8c9c82fd:a18b3133
     Events : 845

Number   Major   Minor   RaidDevice State
  20      65       32        0      active sync   /dev/sds
   1      65       64        1      active sync   /dev/sdu
   2      65       80        2      active sync   /dev/sdv
   3      65       96        3      active sync   /dev/sdw
   4       8      192        4      active sync   /dev/sdm
   5       8       32        5      active sync   /dev/sdc
   6       8       48        6      active sync   /dev/sdd
   7       8       64        7      active sync   /dev/sde
   8       8       80        8      active sync   /dev/sdf
   9       8       96        9      active sync   /dev/sdg
  10       8      112       10      active sync   /dev/sdh
  11       8      128       11      active sync   /dev/sdi
  12       8      144       12      active sync   /dev/sdj
  13       8      160       13      active sync   /dev/sdk
  14       8      176       14      active sync   /dev/sdl
  15       8      208       15      active sync   /dev/sdn
  16       8      224       16      active sync   /dev/sdo
  17       8      240       17      active sync   /dev/sdp
  18      65        0       18      active sync   /dev/sdq
  19      65       16       19      active sync   /dev/sdr

  21      65       48        -      spare   /dev/sdt

Размеры диска:

# cat /proc/partitions |grep 2930266584
   8       48 2930266584 sdd
   8       32 2930266584 sdc
   8      112 2930266584 sdh
   8       96 2930266584 sdg
   8       80 2930266584 sdf
   8      128 2930266584 sdi
   8      176 2930266584 sdl
   8       64 2930266584 sde
  65       32 2930266584 sds
   8      192 2930266584 sdm
   8      144 2930266584 sdj
  65       80 2930266584 sdv
   8      224 2930266584 sdo
   8      208 2930266584 sdn
   8      160 2930266584 sdk
   8      240 2930266584 sdp
  65        0 2930266584 sdq
  65       64 2930266584 sdu
  65       16 2930266584 sdr
  65       48 2930266584 sdt
  65       96 2930266584 sdw

Редактировать:

# mdadm --version
mdadm - v3.1.4 - 31st August 2010
# uname -a
Linux lemaitre 3.2.0-0.bpo.1-amd64 #1 SMP Sat Feb 11 08:41:32 UTC 2012 x86_64 GNU/Linux

RAID6 использует полные диски (то есть без разделов)

Сегодня утром система рухнула. После перезагрузки система не нашла RAID (что было ужасно). Все диски были показаны как запасные (S):

cat /proc/mdstat 
Personalities : 
md0 : inactive sdr[20](S) sds[21](S) sdq[18](S) sdp[17](S) sdo[16](S) sdn[15](S) sdl[14](S) sdk[13](S) sdj[12](S) sdi[11](S) sdh[10](S) sdg[9](S) sdf[8](S) sde[7](S) sdd[6](S) sdc[5](S) sdm[4](S) sdv[3](S) sdu[2](S) sdt[1](S)
      42949652460 blocks super 1.2

Даже здесь понятно, что mdadmне нашли 3 ТБ размера.

Я побежал mdadm --stop /dev/md0. Удалена запись в /etc/mdadm/mdadm.conf. Побежал mdadm -A --scan --force, что привело к подключению RAID и его восстановлению.

Оле Танге
источник
Вы используете 20 целых дисков для RAID6 - правильно? На каждом диске нет раздела? Что fdisk -l /dev/sddпоказывает? Какую ОС вы используете, что такое mdadm-версия?
Нильс

Ответы:

5

Я обошел вокруг / sys и стал намного ближе к ответу.

# cd /sys/block/md0/md
# cat component_size
2147479552

Это согласуется с тем, что мы видели раньше. Но это:

# grep . dev-sd*/size
dev-sdc/size:2147482623
dev-sdd/size:2147482623
dev-sde/size:2147482623
dev-sdf/size:2930265560
dev-sdg/size:2147482623
dev-sdh/size:2147482623
dev-sdi/size:2147482623
dev-sdj/size:2147482623
dev-sdk/size:2147482623
dev-sdl/size:2147483648
dev-sdm/size:2147482623
dev-sdn/size:2147482623
dev-sdo/size:2147482623
dev-sdp/size:2147482623
dev-sdq/size:2147482623
dev-sdr/size:2147482623
dev-sds/size:2147482623
dev-sdt/size:2147482623
dev-sdu/size:2147482623
dev-sdv/size:2147482623
dev-sdw/size:2930265560

Кажется, объясняет, почему RAID видит неправильный размер: большинство дисков отображается как 2 ТБ, в то время как замененные 2 отображаются как 3 ТБ. Все диски одной модели, поэтому давайте посмотрим, сможем ли мы изменить воспринимаемый размер:

# parallel echo 2930265560 \> ::: dev-sd*/size
# grep . dev-sd*/size
dev-sdc/size:2930265560
dev-sdd/size:2930265560
dev-sde/size:2930265560
dev-sdf/size:2930265560
dev-sdg/size:2930265560
dev-sdh/size:2930265560
dev-sdi/size:2930265560
dev-sdj/size:2930265560
dev-sdk/size:2930265560
dev-sdl/size:2930265560
dev-sdm/size:2930265560
dev-sdn/size:2930265560
dev-sdo/size:2930265560
dev-sdp/size:2930265560
dev-sdq/size:2930265560
dev-sdr/size:2930265560
dev-sds/size:2930265560
dev-sdt/size:2930265560
dev-sdu/size:2930265560
dev-sdv/size:2930265560
dev-sdw/size:2930265560

Вуаля. Component_size все еще маленький, хотя:

# cat component_size
2147479552

Может быть, это можно изменить с помощью mdadm:

# mdadm --grow /dev/md0 --size=max

К сожалению, это блокируется, mdadmи последующий доступ к / dev / md0 блокируется. И так же доступ к component_size:

# cat component_size   # This blocks

Отстой. Но хорошая часть в том, что в системном журнале говорится:

Apr 27 20:45:50 server kernel: [124731.725019] md0: detected capacity change from 39582343102464 to 54010589478912

Файловая система в / dev / md0 все еще работала.

После перезагрузки мне пришлось снова выполнить «mdadm --grow / dev / md0 --size = max». Затем дождитесь resyncзавершения. Снова доступ к / dev / md0 был заблокирован. Итак, еще одна перезагрузка, затем, xfs_growfs /dev/md0а затем изменение размера было завершено.

Оле Танге
источник
Мне очень понравился параллельный (1) штекер, Оле :) Спасибо за расследование, просто попал в аналогичный случай.
Михаил Шигорин
1
Я полагаю, что "mdadm --update = devicesize" тоже сделает это, см. Справочную страницу: "Это заставит mdadm определить максимально полезный объем пространства на каждом устройстве и обновить соответствующее поле в метаданных".
rudimeier
3

Я думаю, что при создании размер устройства был записан где-то в метаданных. Смена контроллера не меняет метаданные.

Извлеките запасную часть из md, затем повторно добавьте ее в набор RAID как новый диск. Вам, вероятно, придется удалить метаданные (проверьте страницу руководства для --zero-superblock или сотрите весь диск). Если это работает для одного диска, повторите процедуру для всех дисков оставшихся. Тогда, наконец, сделайте --grow.

Не удаляйте дополнительные диски до окончания синхронизации !!

jippie
источник
Мне неясно, проверяли ли вы, что это действительно работает. Восстановление занимает около 1,5 дней. Замена всех 20 дисков приведет к ухудшению работы в течение полного месяца. Когда вы пишете «Если это работает для одного диска», как вы проверяете, что это работает для одного диска?
Оле Танге
Нет, я не проверял это, но я видел некоторые проблемы с MD ранее, и у меня есть некоторое представление о том, как это работает ... и не удается. У меня нет дисков с плохими метаданными, чтобы проверить их. Я знаю о длительном времени синхронизации, поэтому советую использовать запасное. У вас есть RAID6, что означает, что 2 диска могут выйти из строя, а у вас есть запасной. Это означает, что в общей сложности 3 диска могут выйти из строя до возникновения проблемы. Вы можете проверить с одного диска, по крайней мере, вы знаете, если это ваша проблема. У меня есть только ограниченная информация о вашей настройке. Не извлекайте диски из своего набора RAID, если вам неудобно это делать
jippie
О, я понимаю твой вопрос. mdadm предупредит вас, что вы пытаетесь добавить устройство намного большего размера, чем другие. Он не возражает против нескольких байтов, но предупреждает вас, когда разница относительно велика.
Джиппи
1
Вы можете failдиск, затем removeэто, затем zero-superblockэто, чтобы удалить метаданные. Поскольку ваш RAID-массив используется, вы можете добавить его как запасной, что означает, что он не будет синхронизироваться до тех пор, пока другой диск не выйдет из строя (это нормальное поведение), но он будет работать только для одного диска ИЛИ для вас, addи для этого потребуется синхронизация. Я знаю, что это занимает вечность. Или вы принимаете тот факт, что вы не можете адресовать все доступное хранилище. Одно из преимуществ использования таблицы разделов, которой вы не делали. Не использовать таблицу разделов - это неплохо, но в этом конкретном случае вам бы это помогло.
Джиппи
1
Смотрите мой комментарий выше: «mdadm предупредит вас, что вы пытаетесь добавить устройство, которое намного больше других».
Джиппи