RAID (mdadm) - Que se passe-t-il si les disques n'ont pas la même taille?

15

Question 1 - Avant de répondre avec "il suffit du plus petit disque", écoutez-moi vite. Mes 3 To WD Reds ont une taille de 3001 Go. Disons que j'ai configuré un miroir via mdadm pour sdb1 et sdc1 qui couvrent 100% du lecteur. Mais soudain, l'un des disques tombe en panne. Le remplacement est un 3 To, pesant 3000 Go. Que se passe-t-il lorsque j'installe un lecteur plus petit que celui existant actuellement sur la baie? Je sais qu'avec une nouvelle matrice utilisant 3000 vs 3001, cela créerait la matrice à 3000. Mais comme je l'ai dit, qu'en est-il d'une matrice actuelle @ 3001 et j'ajoute un lecteur plus petit? Se restructure-t-il pendant la reconstruction pour avoir une taille de 3000 Go?

Question 2 - Dans le cas où je ne peux pas ajouter un 3000 Go à la baie avec un 3001 Go existant et qu'il réduit simplement à 3000 ... puis-je redimensionner un peu le 3001?

Question 3 - Ou, une meilleure idée. Et si je réduis mon disque de 3 To à 2999 Go. De cette façon, que le disque soit court de 1 Mo, 1 octet, 10 Ko, peu importe, il récupérera toujours le "plus petit" disque à 2999 Go.

JaSauders
la source

Réponses:

28

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é. mdadmrefusera de le faire pour protéger vos données.

Question 2: pouvez-vous redimensionner un tableau md existant? Oui (lisez le mdadmmanpge!), 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):

  1. Créez-y un nouveau md(4)tableau (avec un disque manquant).
  2. 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).
  3. Copiez les données du disque existant vers le nouveau.
  4. Redémarrez en utilisant le nouveau disque.
  5. 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.
  6. Ajoutez l'ancien disque à la nouvelle baie.
  7. 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/sdxet /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/loop1et /dev/loop2, cartographie à sdx, sdyet sdzrespectivement. 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 missingmot-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.

Alexios
la source
Synology Hybrid RAID (SHR) résout ce problème.
Denis Denisov
1

Il existe plusieurs façons de configurer des mdXappareils. La méthode serait d'utiliser gdisk(ou sgdisksi 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 code ef02. 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 dans gdisk, en utilisant x, puis uet 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 mdXappareil. L'un d'eux doit être préparé en tant mdXque 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:

  1. le grand disque ( /dev/sda) contient des données, les données sont inférieures à 3001 Go, les partitions ne sont pas
  2. un disque plus petit /dev/sdbest ajouté au système
  3. vous partitionnez /dev/sdbavecgdisk
  4. vous créez un tableau à partir de chaque partition respective ( mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2)
  5. vous créez des systèmes de fichiers sur les nouveaux tableaux
  6. vous copiez toutes les données, en vous assurant que votre système sera prêt à fonctionner avec un disque GPT et en faisant comprendre à GRUB2 les implications (voir ci-dessous)
  7. vous copiez les données de partitionnement GPT au- dessus de /dev/sdbla/dev/sda
  8. vous ajoutez les partitions "brutes" à partir /dev/sdades tableaux existants
  9. vous attendez pour /proc/mdstatvous montrer que la synchronisation est terminée

Si 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:

for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap

Ou soyons plus verbeux:

for i in /dev/disk/by-id/md-uuid-*
do
  DEV=$(readlink $i)
  echo "(${DEV##*/}) $i"
done|sort|sudo tee /boot/grub/devicemap

Cela crée (ou écrase) la valeur /boot/grub/devicemappar défaut avec une qui indique à GRUB2 où trouver chaque disque respectif. Le résultat serait quelque chose comme cette liste:

(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-...

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.

0xC0000022L
la source
1
Merci pour votre réponse. Ce tableau est en fait juste pour le stockage brut sur mon serveur, donc il ne gérera pas le démarrage ou quelque chose comme ça. Je voulais juste mélanger et faire correspondre des disques durs de différentes tailles plus tard dans le jeu. Je veux dire, que se passerait-il si j'ai sdb1 @ 3001 Go et sdc1 @ 3001 Go, mais sdc1 meurt et le remplacement est de 3000 Go? Sdb1 est-il réduit à 3000? La baie @ / dev / md0 est-elle réduite à 3000 Go? Plus j'y pense, plus il est logique de laisser de la place à la fin, comme l'exemple 2999 ci-dessus - de cette façon, cela devrait éliminer ce mal de tête. A moins que je manque quelque chose?
JaSauders
1
En fait, en supposant que le niveau RAID 1 ici, mdadmrefuserait 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.
0xC0000022L
Je ne veux pas battre le cheval, mais je ne suis pas certain de la déclaration "incompatible" que vous avez faite. Qu'est-ce qui serait incompatible? Avez-vous fait référence aux différences de taille en termes de 3000 Go contre 3001 Go dans mon exemple? Quoi qu'il en soit, je viens d'exécuter ma baie avec chaque partition faisant 2999 Go, même si chaque disque faisait 3001 Go. Cela devrait simplement supprimer tous les maux de tête qui se produisent au cas où je ne pourrais pas obtenir des disques de remplacement identiques. Appréciez votre perspicacité!
JaSauders
@JaSauders: Je pense qu'un Gio de plus ou moins serait déjà incompatible. Mais franchement, je ne sais pas où est la limite. Je sais cependant que de légères variations de taille seront tolérées. Pour tout le reste, vous devez migrer d'une manière similaire à ce que j'ai décrit.
0xC0000022L
@ 0xC0000022L: mdadmtolère une différence de taille arbitraire de 1% dans les membres du tableau.
Alexios