Migrer un système de fichier root existant sur LVM sur une machine virtuelle

Aujourd’hui dernier jour de l’année 2012… Qu’à cela ne tienne, c’est pas une raison pour rien faire. Alors hop, on va trouver un petit casse tête à régler. Je me lance dans la migration d’un système de fichier root vers du LVM.

Contexte

Un disque virtuel VMware thick que je veux migrer en thin. Système sur la machine virtuelle: Debian Squeeze, installé à l’époque sans LVM. Le système hôte est un ESXi 4.1 avec, donc du VMFS3… Un seul datastore. Le problème quand on veut passer de thick en thin, c’est qu’il faut pouvoir changer de datastore pour qu’il fasse un pseudo space reclaim, sinon, ben il reclaim rien du tout … Donc si votre disque virtuel a eu des données écrites vers la fin de la partition, même un vmkfstools -i xxx.vmdk -d thin yyy.vmdk ne permettra pas de gagner de l’espace.

Bon, devant ce constat d’échec je décide donc de refaire un disque virtuel en thin, et de migrer mon système de fichier. C’est plus simple et plus radical.

Avant

  • VMDK thick 50GB
  • Partition unique /dev/sda1 de 50GB en ext3
  • Swap de 1GB /dev/sda2
  • Espace utilisé sur le VMFS: 50GB

 

Après

  • VMDK thin 25GB
  • PV LVM de 25GB en partition étendue /dev/sda5
  • Un VG unique (vg_root) utilisant le PV /dev/sda5
  • Trois LV (boot, 100MB, Swap 1024MB, root, le reste)

 

Comment j’ai procédé

A noter que l’opération nécessite l’arrêt de la machine virtuelle.

systemrescueCD

D’abord, il faut avoir le systemrescueCD ou n’importe quel autre LiveCD. Mais le systemrescueCD est celui que j’utilise est il est très pratique. Pour des raisons pratiques, je place l’iso dans un dossier iso sur le datastore.

Ensuite, on crée un nouveau disque virtuel de 25GB qu’on attache à la machine virtuelle.

On attache l’ISO à la machine virtuelle et on démarre. Attention, il faut être rapide pour démarrer sur le CD. Il faut ouvrir la console de la machine virtuelle, cliquer à l’intérieur dès que possible, puis taper ESC afin de voir apparaitre le boot menu, et de pouvoir sélectionner le CDROM. A noter que par défaut le CD ne sera pas connecté. Il faut donc éditer les paramètres de la machine virtuelle pour connecter le CD-Rom (cocher Connecter, et Connecter au démarrage).

Quand on a enfin réussi à avoir le boot menu (si si, c’est possible, et si vraiment ça va pas, on peut tojours aller dans les options des paramètres de la machine virtuelle et choisir « entrer dans le bios au prochain démarrage » puis sélectionner le CD-ROM comme boot device), on va voir apparaitre le menu de boot du systemrescueCD. Si ce n’est pas le cas, ben… faut recommencer, vous avez merdé quelque part.

Pendant le boot, systemrescueCD à la gentillesse de demander quel clavier on veut utiliser. Sympathique attention. Dans mon cas (fr_CH), je tape 43.

Une fois le boot terminé, on se retrouve sur un prompt. Par défaut, une adresse IP aura été attribuée par votre serveur DHCP. Si ce n’est pas le cas, je vous laisse trouver comment paramétrer l’IP et pourquoi pas le mettre dans un commentaire pour les suivant. Dans mon cas, le DHCP faisait mon affaire.

A partir de là, pour que les choses soient plus facile, je décide d’utiliser putty en SSH. Il faut donc paramétrer un mot de passe root

passwd

On pourra ensuite se connecter avec putty. Youpie…

LVM

L’objectif étant d’utiliser LVM, on va configurer notre nouveau disque virtuel en conséquence. En toute logique, il se trouve en /dev/sdb. Personnellement, je crée une partition étendue puis un volume logique plutôt qu’une partition primaire, ceci afin de me libérer des contraintes d’alignement lié aux partitions primaires.

fdisk /dev/sdb
n
e
1
<enter> #valeur par défaut (début du disque)
<enter> #valeur par défaut (fin du disque)
n
l
<enter> #valeur par défaut (début de le la partition)
<enter> #valeur par défaut (fin de la partition)
t
8e      # On sélectionne le type LVM
w

Nous voilà donc avec un disque logique /dev/sdb5 prêt pour LVM.

On prépare /dev/sdb5 pour être un volume physique LVM, puis on crée un volume group que j’appelle simplement vg_root

pvcreate /dev/sdb5
vgcreate vg_root /dev/sdb5

Reste a créer trois logical volumes. Un pour le boot (100MB), un pour le swap (1024MB), et un pour le root (le reste). Adaptez la taille du volume swap à votre convenance, bien sûr.

lvcreate -n boot -L 100M vg_root
lvcreate -n swap -L 1024M vg_root
lvcreate -n root -l 100%FREE vg_root

Les systèmes de fichier

Reste a créer les systèmes de fichiers. Pas compliquer: ext3 pour root, ext2 pour boot et swap pour… swap (bravooooo).

mkfs.ext3 /dev/vg_root/root
mkfs.ext2 /dev/vg_root/boot
mkswap /dev/vg_root/swap

Nous voilà paré. La prochaine étape est le montage de root et de boot, et la copie des fichiers

Migration du système de fichier

On reste dans « La vie est simple », et on crée deux points de montages distincts pour l’ancien système de fichier, qu’on va monter en lecture seule, et pour le nouveau, en lecture/écriture (bien sûr). Mon ancien système est dans /dev/sda1 et je n’avais pas un boot séparé. Je décris pas les commandes, mais demandez-vous au moins à quoi elles servent avant de bêtement faire un copier-coller. Z’êtes la pour apprendre.

mkdir /mnt/old
mkdir /mnt/new
mount /dev/sda1 /mnt/old -o ro
mount /dev/vg_root/root /mnt/new
mkdir /mnt/new/boot
mount /dev/vg_root/boot /mnt/new/boot

Nous avons donc: l’ancien système de fichier dans /mnt/old et le nouveau dans /mnt/new prêt à recevoir la copie. De là, un simple cp -a fait l’affaire. Attention toutefois: Si vous travaillez avec différents filesystems pour home, var, etc…., il faudra adapter tout ça. Ne suivez pas bêtement mon exemple sans y réfléchir avant. Je vous aurez prévenu.

cp -a /mnt/old/* /mnt/new

Et on attend que ça se passe… Après, c’est une histoire de foi. Je n’ai pas fait une comparaison des dossiers à la fin de l’opération. Je me suis contenté d’un test de capacité pour vérifier que la capacité était la même dans les deux dossiers:

du -sh /mnt/*

C’était le cas.

Mise en place du nouvel environnement

Maintenant il faut mettre à jour fstab et reconfigurer grub. Et pour ce faire, on va chrooter (quel joli verbe français) dans notre nouveau filesystem.

chroot dans le nouvel environnement

Notre nouveau système est dans /mnt/new et le boot dans /mnt/new/boot. Pour chrooter, il faut maintenant lier /proc /dev et /sys de la façon suivante:

mount -o bind /sys /mnt/new/sys
mount -o bind /dev /mnt/new/dev
mount -o bind /proc /mnt/new/proc

Maintenant on peut chrooter:

chroot /mnt/new /bin/bash

Nous voilà dans le nouvel environnement.

Edition de fstab

fstab doit bien entendu être mis à jour pour monter le nouveau système de fichier. On édite donc /etc/fstab (du nouvel environnement)

Afin de ne pas se casser la tête avec des inodes qui pourraient changer, je suggère fortement d’utiliser les UUID pour le montage des volumes. Pour les récupérer, on utilise blkid. blkid va retourner les UUID. Voilà ce que ça donne.

root@intranet:~# blkid
/dev/sr0: LABEL="sysrcd-3.1.2" TYPE="iso9660"
/dev/sda5: UUID="9aFHU2-1THU-yR8B-Z5zy-5gcS-yrPj-ftBI0Z" TYPE="LVM2_member"
/dev/mapper/vg_root-boot: UUID="1759c47e-ac8b-4156-90a4-99908d6965da" TYPE="ext2"
/dev/mapper/vg_root-swap: UUID="78002cc0-c4e9-4a9b-8e3a-f2018204949c" TYPE="swap"
/dev/mapper/vg_root-root: UUID="aca498c5-d6aa-477a-afa4-dbdec81f15b9" TYPE="ext3"

ici, c’est donc vg_root-boot, swap et root qui nous intéressent. On édite donc fstab pour y mettre ceci

# <file system>                                 <dir>           <type>          <options>               <dump>  <pass>
UUID=aca498c5-d6aa-477a-afa4-dbdec81f15b9       /               ext3            errors=remount-ro       0       1
UUID=1759c47e-ac8b-4156-90a4-99908d6965da       /boot           ext2            defaults                0       2
UUID=78002cc0-c4e9-4a9b-8e3a-f2018204949c       none            swap            sw                      0       0
/dev/scd0                                       /media/cdrom0   udf,iso9660     user,noauto             0       0

Reconfiguration de grub

On install GRUB sur le disque /dev/sdb (le nouveau disque virtuel):

grub-install /dev/sdb

Puis on met à jour la configuration de grub

update-grub

Finalisation

Reste à retirer le volume et démarrer avec le nouveau.

On arrête la machine virtuelle

shutdown -h now

On édite les paramètres de la machine virtuelle et on retire les DEUX disques virtuels. L’ancien ET le nouveau. MAIS ATTENTION: On les retire de la configuration, mais on ne les efface pas du disque… On effacera l’ancien disque virtuel quand on sera sûr que ça marche.

Une fosi les deux disques retirés, on réédite les paramètres et on rajoute le nouveau disque en ID 0:0. Puis on démarre la machine virtuelle.

Si tout va bien, la machine va démarrer, et tout va fonctionner comme avant. Si c’est bien le cas, on peut ensuite ouvrir le datastore, aller dans le dossier de la machine virtuelle, et effacer manuellement l’ancien disque virtuel. Attention à ne pas effacer le mauvais.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *