Aumentar / redimensionar RAID al actualizar el tamaño visible de los discos

10

Originalmente creé un RAID de software usando un controlador que solo podía direccionar 2TB por disco. Los discos son discos de 3 TB. Funcionó bien, pero solo usó los primeros 2 TB de cada disco.

Ahora he cambiado el controlador para ver los 3 TB completos. Por lo tanto, me gustaría /dev/md0usar la última 1 TB también.

Yo he tratado:

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

Pero como puede ver, solo ve los 2TB. Si trato de forzarlo más alto:

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

Entonces, de alguna manera, el sistema puede ver que los discos son de 3TB (in /proc/partitions), pero el RAID no puede verlos como 3TB.

Detalles de 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

Tamaños de disco:

# 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

Editar:

# 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

El RAID6 usa los discos completos (es decir, sin particiones)

Esta mañana el sistema falló. Después de reiniciar el sistema no encontró el RAID (lo cual fue terrible). Todos los discos aparecieron como repuestos (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

Incluso aquí está claro que mdadmno encontró el tamaño de 3 TB.

Me encontré mdadm --stop /dev/md0. Se eliminó la entrada en /etc/mdadm/mdadm.conf. Ran mdadm -A --scan --force, lo que provocó que el RAID se conectara y reconstruyera.

Ole Tange
fuente
Está utilizando 20 discos completos para RAID6, ¿correcto? ¿No hay partición en cada disco? ¿Qué fdisk -l /dev/sddmuestra? ¿Qué sistema operativo está utilizando, cuál es la versión mdadm?
Nils

Respuestas:

5

Busqué / sys y me acerqué mucho a la respuesta.

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

Eso concuerda con lo que hemos visto antes. Pero esto:

# 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

parece explicar por qué el RAID ve el tamaño incorrecto: la mayoría de las unidades se muestran como 2 TB mientras que las 2 que se han reemplazado se muestran como 3 TB. Todas las unidades son del mismo modelo, así que veamos si podemos cambiar el tamaño percibido:

# 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

Voila Sin embargo, Component_size todavía es pequeño:

# cat component_size
2147479552

Tal vez pueda ser cambiado por mdadm:

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

Desafortunadamente, esto se bloquea mdadmy el acceso posterior a / dev / md0 está bloqueado. Y también lo es el acceso a component_size:

# cat component_size   # This blocks

Apesta Pero lo bueno es que en syslog dice:

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

El sistema de archivos en / dev / md0 todavía se ejecutó.

Después de reiniciar tuve que hacer 'mdadm --grow / dev / md0 --size = max' nuevamente. Luego espera para resynccompletar. Nuevamente se bloqueó el acceso a / dev / md0. Entonces, otro reinicio, seguido por xfs_growfs /dev/md0y luego se completó el cambio de tamaño.

Ole Tange
fuente
Me gustó mucho el conector paralelo (1), Ole :) Gracias por la investigación, acabo de encontrar un caso similar.
Michael Shigorin
1
Supongo que "mdadm --update = devicesize" también lo haría, vea la página de manual: "Esto hará que mdadm determine la cantidad máxima de espacio utilizable en cada dispositivo y actualice el campo relevante en los metadatos".
rudimeier
3

Creo que durante la creación, el tamaño del dispositivo se registró en algún lugar de los metadatos. Cambiar el controlador no cambia los metadatos.

Retire el repuesto del md, luego vuelva a agregarlo al conjunto RAID como una nueva unidad. Probablemente tenga que eliminar los metadatos (consulte la página de manual para --zero-superblock o limpie todo el disco). Si eso funciona para un solo disco, repita el procedimiento para todas las unidades restantes también. Luego, finalmente, haz el ...

¡No elimines discos adicionales hasta que finalice la sincronización!

jippie
fuente
No me queda claro si has probado que esto realmente funciona. Una reconstrucción lleva alrededor de 1,5 días. Reemplazar las 20 unidades hará que el funcionamiento se degrade durante un mes completo. Cuando escribe "Si eso funciona para un solo disco", ¿cómo prueba que funcionó para un solo disco?
Ole Tange
No, no he probado esto, pero he visto algunos problemas de md antes y tengo algunos sentimientos sobre cómo funciona ... y falla. No tengo las unidades con metadatos malos por ahí para probarlo. Soy consciente del largo tiempo de sincronización, es por eso que aconsejo usar el repuesto. Tiene RAID6, lo que significa que 2 unidades pueden fallar y tiene una de repuesto. Eso significa un total de 3 unidades que pueden fallar antes de que tenga un problema. Puede verificar con una sola unidad, al menos sabe si este es su problema. Solo tengo información limitada sobre su configuración. No extraiga unidades de su conjunto RAID si no se siente cómodo haciéndolo
jippie
Oh, entiendo tu pregunta. mdadm le advertirá que está intentando agregar un dispositivo que es mucho más grande que los otros. No le importan unos pocos bytes, pero le advierte cuando la diferencia es relativamente grande.
jippie
1
Puede failconducir, luego remove, zero-superblockpara eliminar los metadatos. Como su conjunto RAID está en uso, puede agregarlo como repuesto, lo que significa que no se sincronizará hasta que falle otra unidad (ese es el comportamiento normal), pero solo funciona para una sola unidad O usted addy requiere una sincronización. Sé que lleva una eternidad. O acepta el hecho de que no puede agregar todo el almacenamiento disponible. Una de las ventajas de usar una tabla de particiones que no hiciste. No usar una tabla de particiones no está mal, pero en este caso particular te habría ayudado.
jippie
1
Vea mi comentario anterior: "mdadm le advertirá que está intentando agregar un dispositivo que es mucho más grande que los otros".
jippie