Encontré esta respuesta por error, pero en caso de que alguien tenga curiosidad, aquí hay una respuesta respaldada por experimentos.
La versión corta
Pregunta adicional: ¿puedo crear una md(4)
matriz RAID a partir de dispositivos de bloque de tamaño desigual? Sí, pero la matriz RAID tendrá el tamaño del dispositivo de bloque más pequeño (más algunos gastos generales para su propio mantenimiento). Si los tamaños de los dispositivos no están dentro del 1% entre sí, recibirá una advertencia.
Pregunta 1: ¿puedo agregar a una md(4)
matriz RAID existente un dispositivo más pequeño que el miembro actual más pequeño? No, lo siento. mdadm
se negará rotundamente a hacer eso para proteger sus datos.
Pregunta 2: ¿puede cambiar el tamaño de una matriz md existente? Sí (¡lea el mdadm
mensaje!), Pero puede que no valga la pena el esfuerzo. Tendrá que hacer una copia de seguridad de todo, luego cambiar el tamaño del contenido del dispositivo RAID, luego cambiar el tamaño del dispositivo en sí mismo; todo esto es bastante propenso a errores, errores de cálculo y otras cosas que le costarán sus datos (experiencia dolorosa al hablar) .
No vale la pena el riesgo y el esfuerzo. Si tiene un disco nuevo en blanco, aquí le mostramos cómo cambiar su tamaño y también mantener intactas entre una y dos copias de todos sus datos en todo momento (suponiendo que tenga RAID1 de 2 discos):
- Cree una nueva
md(4)
matriz en él (con un disco faltante).
- Recree la estructura del contenido de la matriz (Crypto, LVM, tablas de particiones, cualquier combinación de las mismas, lo que sea que flote en su bote).
- Copie los datos del disco existente al nuevo.
- Reiniciar, utilizando el nuevo disco.
- Limpie la tabla de particiones del disco anterior (o
md(4)
ponga a cero el superbloque). Si es necesario, cree las particiones necesarias para que coincidan con el esquema en el nuevo disco.
- Agregue el disco viejo a la nueva matriz.
- Espere a que los miembros de la matriz se sincronicen. Toma algo de café. Vuela a América Latina y elige tus propios granos de café. :) (Si vives en América Latina, vuela a África).
Nota: sí, esta es la misma técnica que 0xC0000022L describe en su respuesta.
Pregunta 3. ¿Qué sucede si la unidad tiene 1G de corto? :) No te preocupes por eso. Lo más probable es que su unidad de reemplazo sea más grande. De hecho, con una estrategia como la anterior, vale la pena obtener unidades más grandes y baratas cada vez que falla (o para una actualización más barata). Puede obtener una actualización progresiva.
Prueba experimental
Configuración experimental
Primero, simulemos algunos dispositivos de bloque. Usaremos /tmp/sdx
y /tmp/sdy
(cada 100M) y /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
Esto crea tres archivos como tres dispositivos de bloque de bucle invertido: /dev/loop0
, /dev/loop1
y /dev/loop2
, a la cartografía sdx
, sdy
y sdz
respectivamente. Vamos a ver los tamaños:
sudo grep loop[012] /proc/partitions
7 0 102400 loop0
7 1 102400 loop1
7 2 101376 loop2
Como se esperaba, tenemos dos dispositivos de bucle de exactamente 100M (102400 KiB = 100 MiB) y uno de 99M (exactamente 99 × 1024 bloques de 1K).
Hacer una matriz RAID de dispositivos de tamaño idéntico
Aquí va:
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.
Comprueba el tamaño:
sudo grep md100 /proc/partitions
9 100 102272 md100
Esto es precisamente lo que esperamos: una mirada al manual de mdadm nos recuerda que los metadatos de la versión 1.2 ocupan 128K: 128 + 102272 = 102400. Ahora destruyémoslo en preparación para el segundo experimento.
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1
Hacer una matriz RAID de dispositivos de tamaño desigual
Esta vez usaremos el dispositivo de bloque pequeño.
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.
Bueno, nos avisaron, pero la matriz estaba hecha. Vamos a ver el tamaño:
sudo grep md100 /proc/partitions
9 100 101248 md100
Lo que tenemos aquí es 101,248 bloques. 101248 + 128 = 101376 = 99 × 1024. El espacio utilizable es el del dispositivo más pequeño (más los metadatos RAID de 128K). Bajemos todo de nuevo para nuestro último experimento:
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2
Y finalmente: Agregar un dispositivo más pequeño a una matriz en ejecución
Primero, hagamos una matriz RAID1 con solo uno de los discos de 100M. La matriz se degradará, pero realmente no nos importa. Solo queremos una matriz iniciada . Las missing
palabras clave son un marcador de posición que dice "Todavía no tengo un dispositivo para usted, inicie la matriz ahora y agregaré uno más tarde".
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing
Nuevamente, verifiquemos el tamaño:
sudo grep md100 /proc/partitions
9 100 102272 md100
Efectivamente, tiene 128K menos de 102400 bloques. Agregar el disco más pequeño:
sudo mdadm --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array
¡Auge! No nos dejará, y el error es muy claro.
Hay varias formas de configurar
mdX
dispositivos. El método sería usargdisk
(osgdisk
si prefiere la versión solo de línea de comandos) para particionar esto como GPT. Si desea iniciar desde la matriz, cree una "Partición de inicio de BIOS", escriba el códigoef02
. Esto solo es necesario si desea arrancar esta matriz, de lo contrario no necesita preocuparse. Luego, cree una partición del mismo tamaño o menor que el disco más pequeño que se agregará a la matriz. Por último, pero no menos importante, copie los datos GPT en el otro disco (menú experto engdisk
, usandox
y luegou
y especifique el dispositivo de destino). Este es un proceso destructivo.Debería ser posible, si el sistema de archivos lo permite, cambiar el tamaño de una partición existente a algo más pequeño y luego usar el mismo método para copiar los datos GPT. Sin embargo, esto te lleva a un poco de confusión. Porque ahora tienes dos discos, pero aún no tienes ningún
mdX
dispositivo. Uno de ellos tiene que estar preparado comomdX
partición (lo que implicaba anteriormente) o en forma de disco) y luego los datos se deben mover del disco existente a eso.Entonces:
/dev/sda
) contiene datos, los datos son más pequeños que 3001 GB, las particiones no son/dev/sdb
se agrega un disco más pequeño al sistema/dev/sdb
congdisk
mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2
)/dev/sdb
a/dev/sda
/dev/sda
las matrices existentes/proc/mdstat
mostrarte que la sincronización ha terminadoSi siguió todos los pasos, ahora debería poder iniciar en el nuevo sistema desde las matrices mdX. Sin embargo, tenga a mano un CD de rescate o una opción de arranque PXE, por si acaso.
GRUB2 no podrá reconocer la configuración de forma manual. Entonces necesitas algo de "magia". Aquí hay una frase:
O seamos más detallados:
Esto crea (o sobrescribe) el valor predeterminado
/boot/grub/devicemap
con uno que le dice a GRUB2 dónde encontrar cada disco respectivo. El resultado sería algo así como esta lista:Si utiliza GRUB heredado, también debe crear la "Partición de arranque del BIOS" con metadatos versión 0.9,
mdadm -e 0 ...
y el proceso será diferente. Sin embargo, no he hecho eso.fuente
mdadm
se negaría a construir la matriz en primer lugar si es incompatible. En RAID 5 necesitaría más discos eventualmente y en RAID 0 no le importaría, por eso asumí RAID 1. Entonces sí, tiene sentido dejar espacio.mdadm
tolera un 1% arbitrario de diferencia de tamaño en los miembros de la matriz.