J'ai trouvé cette réponse par erreur, mais au cas où quelqu'un serait curieux, voici une réponse appuyée par des expériences.
La version courte
Question bonus: puis-je créer une md(4)
matrice RAID à partir de blocs périphériques de taille inégale? Oui, mais la matrice RAID aura la taille du plus petit périphérique de bloc (plus quelques frais généraux pour son propre entretien). Si les tailles d'appareils ne sont pas à moins de 1% les unes des autres, vous obtenez un avertissement.
Question 1: puis-je ajouter à une md(4)
matrice RAID existante un périphérique plus petit que le plus petit membre actuel? Non désolé. mdadm
refusera de le faire pour protéger vos données.
Question 2: pouvez-vous redimensionner un tableau md existant? Oui (lisez le mdadm
manpge!), Mais cela ne vaut peut-être pas la peine. Vous devrez tout sauvegarder, puis redimensionner le contenu du périphérique RAID, puis redimensionner le périphérique lui-même - tout cela est assez sujet aux erreurs, aux erreurs de calcul et à d'autres choses qui vous coûteront vos données (expérience douloureuse de parler) .
Cela ne vaut pas le risque et l'effort. Si vous avez un nouveau disque vierge, voici comment le redimensionner et également conserver à tout moment entre une et deux copies de toutes vos données (en supposant que vous avez RAID1 à 2 disques):
- Créez-y un nouveau
md(4)
tableau (avec un disque manquant).
- Recréez la structure du contenu du tableau (Crypto, LVM, tables de partitions, toute combinaison de celles-ci, tout ce qui fait flotter votre bateau).
- Copiez les données du disque existant vers le nouveau.
- Redémarrez en utilisant le nouveau disque.
- Essuyez la table de partition de l'ancien disque (ou
md(4)
mettez à zéro le superbloc). Si nécessaire, créez les partitions requises pour correspondre au schéma sur le nouveau disque.
- Ajoutez l'ancien disque à la nouvelle baie.
- Attendez que les membres du groupe se synchronisent. Prends un café. Envolez-vous vers l'Amérique latine et choisissez vos propres grains de café, d'ailleurs. :) (Si vous vivez en Amérique latine, prenez plutôt l'avion pour l'Afrique).
Remarque: oui, il s'agit de la même technique 0xC0000022L décrite dans sa réponse.
Question 3. Que se passe-t-il si le lecteur est court 1G? :) Ne vous en faites pas. Il y a de fortes chances que votre disque de remplacement soit plus grand. En fait, avec une stratégie comme ci-dessus, il est avantageux d'obtenir des disques plus gros et moins chers en cas de défaillance (ou pour une mise à niveau moins chère). Vous pouvez obtenir une mise à niveau progressive.
Preuve expérimentale
Montage expérimental
Tout d'abord, imaginons certains blocs. Nous utiliserons /tmp/sdx
et /tmp/sdy
(chaque 100M), et /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
Ceci met en place trois fichiers que trois dispositifs de bloc: réalimentation /dev/loop0
, /dev/loop1
et /dev/loop2
, cartographie à sdx
, sdy
et sdz
respectivement. Vérifions les tailles:
sudo grep loop[012] /proc/partitions
7 0 102400 loop0
7 1 102400 loop1
7 2 101376 loop2
Comme prévu, nous avons deux appareils en boucle d'exactement 100M (102400 KiB = 100 MiB) et un de 99M (exactement 99 × 1024 blocs 1K).
Création d'une matrice RAID à partir de périphériques de taille identique
Voici:
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.
Vérifiez la taille:
sudo grep md100 /proc/partitions
9 100 102272 md100
C'est précisément ce que nous attendons: un coup d'œil au manuel mdadm nous rappelle que les métadonnées de la version 1.2 occupent 128K: 128 + 102272 = 102400. Maintenant, détruisons-le en préparation de la deuxième expérience.
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1
Création d'une matrice RAID à partir de périphériques de taille inégale
Cette fois, nous utiliserons le petit bloc.
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.
Eh bien, nous avons été prévenus, mais le tableau a été créé. Vérifions la taille:
sudo grep md100 /proc/partitions
9 100 101248 md100
Ce que nous obtenons ici, c'est 101 248 blocs. 101248 + 128 = 101376 = 99 × 1024. L'espace utilisable est celui du plus petit périphérique (plus les métadonnées RAID 128K). Reprenons tout cela pour notre dernière expérience:
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2
Et enfin: ajouter un périphérique plus petit à une baie en cours d'exécution
Commençons par créer une matrice RAID1 avec un seul des 100 millions de disques. Le tableau sera dégradé, mais nous ne nous en soucions pas vraiment. Nous voulons juste un tableau démarré . Le missing
mot-clé est un espace réservé qui dit: «Je n'ai pas encore d'appareil pour vous, démarrez-le maintenant et j'en ajouterai un plus tard».
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing
Encore une fois, vérifions la taille:
sudo grep md100 /proc/partitions
9 100 102272 md100
Effectivement, il manque 128 Ko de 102400 blocs. Ajout du plus petit disque:
sudo mdadm --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array
Boom! Cela ne nous permettra pas, et l'erreur est très claire.
Il existe plusieurs façons de configurer des
mdX
appareils. La méthode serait d'utilisergdisk
(ousgdisk
si vous préférez la version en ligne de commande uniquement) pour partitionner cela en GPT. Si vous souhaitez démarrer à partir de la baie, créez une "partition de démarrage du BIOS", saisissez le codeef02
. Cela n'est nécessaire que si vous souhaitez démarrer à partir de cette baie, sinon vous n'avez pas à vous en préoccuper. Ensuite, créez une partition de la même taille ou plus petite que le plus petit disque à ajouter à la baie. Enfin, copiez les données GPT sur l'autre disque (menu expert dansgdisk
, en utilisantx
, puisu
et spécifiez le périphérique cible). Il s'agit d'un processus destructeur.Il devrait être possible - si le système de fichiers le permet - de redimensionner une partition existante en quelque chose de plus petit, puis d'utiliser la même méthode pour copier les données GPT. Cependant, cela vous met un peu dans le pétrin. Parce que maintenant vous avez deux disques, mais toujours aucun
mdX
appareil. L'un d'eux doit être préparé en tantmdX
que partition (ce que j'ai impliqué ci-dessus) ou disque) puis les données doivent être déplacées du disque existant vers celui-ci.Donc:
/dev/sda
) contient des données, les données sont inférieures à 3001 Go, les partitions ne sont pas/dev/sdb
est ajouté au système/dev/sdb
avecgdisk
mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2
)/dev/sdb
la/dev/sda
/dev/sda
des tableaux existants/proc/mdstat
vous montrer que la synchronisation est terminéeSi vous avez suivi toutes les étapes, vous devriez maintenant pouvoir démarrer sur le nouveau système à partir des baies mdX. Cependant, gardez un CD de secours ou une option de démarrage PXE à portée de main, au cas où.
GRUB2 ne pourra pas reconnaître la configuration à la main. Vous avez donc besoin d'un peu de "magie". Voici une ligne:
Ou soyons plus verbeux:
Cela crée (ou écrase) la valeur
/boot/grub/devicemap
par défaut avec une qui indique à GRUB2 où trouver chaque disque respectif. Le résultat serait quelque chose comme cette liste:Si vous utilisez GRUB hérité, vous devez également créer la "partition de démarrage du BIOS" avec les métadonnées version 0.9, en utilisant
mdadm -e 0 ...
et le processus sera différent. Mais je ne l'ai pas fait.la source
mdadm
refuserait de construire la matrice en premier lieu si elle est incompatible. En RAID 5, vous auriez éventuellement besoin de plus de disques et en RAID 0, vous ne vous en soucieriez pas, c'est pourquoi j'ai supposé RAID 1. Alors oui, il est logique de laisser de la place.mdadm
tolère une différence de taille arbitraire de 1% dans les membres du tableau.