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
#valeur par défaut (début du disque)
#valeur par défaut (fin du disque)
n
l
#valeur par défaut (début de le la partition)
#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
#
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.