Convertir une partition root en ext4 par du LVM
Par Dju » 24 janvier 2015 (00:14) - Debian
Lorsqu'on a qu'une seule partition sur sa machine, ici un serveur sous Debian, qui plus est une machine distante, et que l'on veut réorganiser ses données car les besoins ont évolué, c'est bien embêtant...
Voici comment convertir sa partition en LVM pour pouvoir ainsi avoir différents espaces de stockage (et block devices )
Ici l'opération se fait sur une machine distante, hebergée chez l'hebergeur du nord mais l'équivalent peut se faire aussi sur une machine locale, qu'on fera booter sur un live CD.
Attention: pour réussir, il faut pouvoir disposer d'un endroit ou copier ses données temporairement (ici la partition de swap ). sinon ce n'est pas la peine
Version courte :
1/ booter en mode rescue (ou live CD)
2/ monter sa partition root et l'espace temporaraire ou copier les données
3/ copier les données avec rsync
4/ Convertir en LVM sa partition et créer des volumes LVM
5/ recopier ses données sur le nouveau volume créé
6/ Adapter grub
7/ croiser les doigts et rebooter
1/ Boot rescue / live CD
On se connecte à l'interface de l'hebergeur, on choisit le mode rescue, et on reboot.
Pour une machine locale sur laquelle on a claver/ecran, un simple live CD suffira
2/ Montage de la partition
Une fois la machine démarrée, on va se créer 2 repertoires, permettant de distinguer l'ancien et le nouveau volume
mkdir /mnt/root_old mkdir /mnt/root_temp mount /dev/sda1 /mnt/root_old
Comme espace temporarire, on peut éventuellement disposer d'un disque usb clé usb.
Si ce n'est pas le cas, on peut utiliser sa partition swap
Bien entendu, il faut que cet espace soit suffisant. pour le savoir, la commande
df -hl
vous dira ce qu'il en est. Par exemple, sur mon serveur distant :
Sys. fich. Taille Util. Dispo Uti% Monté sur rootfs 116G 1,4G 46G 1% / udev 10M 0 10M 0% /dev tmpfs 3,2G 224K 3,2G 1% /run /dev/md0 116G 1,4G 46G 1% / tmpfs 5,0M 0 5,0M 0% /run/lock tmpfs 6,9G 0 6,9G 0% /dev/shm
Ici, j'ai une partition ext4 (montée sur un raid soft mdadm) de 116 Go, occupée par 1,4 Go de données.
(je l'avais installé et il y a peu, et j'avais la flemme de tout refaire, j'ai donc rusé )
On a alors plusieurs choix :
a) on dispose d'une clé/disque USB, on le monte
mount /dev/sdb1 /mnt/root_temp
b) on n'a pas d'usb dispo, mais on a une partition swap assez grande. on la convertit temporairement en partition ext4 ou copier les données
mkfs.ext4 /dev/sda2 && mount /dev/sda2 /mnt/root_temp
c) cas vicieux qui m'est arrivé : on a 3 disques, et sur chacun, 1 partition swap d'1Go. soit pas assez pour y copier 1,4 Go.
mais que faire..........
solution: créer temporairement un volume raid5 soft avec mdadm \o/
on utilise parted ou fdisk pour changer le type de partition de linux-swap (82) à linux raid (fd). puis on créé et formate le volume raid
mdadm --create /dev/md1 --level=5 --assume-clean --raid-devices=3 /dev/sda2 /dev/sdb2 /dev/sdc2 mkfs.ext4 /dev/md1 mount /dev/md1 /mnt/root_temp
On a désormais un espace de 2 Go
d) si plusieurs partitions, on peut aussi utiliser LVM pour les agréger :
apt-get update && apt-get install lvm2 pvcreate /dev/sda2 pvcreate /dev/sdb2 pvcreate /dev/sdc2 vgcreate vgTMP /dev/sda2 vgextend vgTMP /dev/sdb2 vgextend vgTMP /dev/sdc2 lvcreate -L3G -n root_temp vgTMP mkfs.ext4 /dev/vgTMP/root_temp mount /dev/vgTMP/root_temp /mnt/root_temp
et voila, on cumule 3 partitions en un seul volume
3/ copie des données
Cela est la partie la plus courte et la plus facile :
rsync -ravzx /mnt/root_old/ /mnt/root_temp/ umount /mnt/root_old
Donc on copie les données de la partition root actuelle vers la temporarire, tout en conservant les attributs des fichiers (date, permissions, owner...)%% Puis on démonte la partition, car on va la bricoler.
4/ Convertion ext4 > lvm
Si vous avez une partition, il faut changer son type de ext4 à LVM, avec fdisk ou parted.
Si comme moi vous avez un device type mdadm, pas besoin. On peut donc attaquer LVM :
pvcreate /dev/md0 vgcreate vg0 /dev/md0
(remplacer md0 par sda1 (par exemple) si vous avez une partition)
A présent, on peut se créer des volumes LVM.
Pour par part, j'avais besoin de 3 volumes: 1 pour l'os (sans blague !), 1 pour les données en local, et 1 pour drbd.
lvcreate -L 20G -n os vg0 lvcreate -L 30G -n datas vg0 lvcreate -L 60G -n drbd vg0
on n'oublie pas de formater au moins le volume pour l'OS
mkfs.ext4 /dev/vg0/os
5/ recopie des données sur le volume LVM pareil que l'étape 3, mais dans l'autre sens, en montant le nouveau volume
mount /dev/vg0/os /mnt/root_old rsync -ravzx /mnt/root_temp/ /mnt/root_old/
on peut à présent démonter le volume temporaire.
umount /mnt/root_temp
/!\ Si on a du créer un mdadm temporaire, ne pas oublier de l'arreter
mdadm -S /dev/md1
/!\ Si on a du créer un LVM temporaire, le supprimer
lvremove /dev/vgTMP/root_temp vgremove vgTMP pvremove /dev/sdc2 pvremove /dev/sdb2 pvremove /dev/sda2
et si on utilisait sa(ses) partition(s) de swap, ré-utiliser fdisk ou parted pour changer le type de partition, puis refaire le swap
mkswap /dev/sda2 mkswap /dev/sdb2 mkswap /dev/sdc2
6/ Adaptation de grub
Cela se fait très simplement. on va se chrooter dans le volume, installer LVM si il n'y était pas déja, et re-installer grub sur le(s) disque(s)
mount -o bind /proc /mnt/root_old/proc mount -o bind /sys /mnt/root_old/sys mount -o bind /dev /mnt/root_old/dev LANG=C chroot /mnt/root_old /bin/bash aptitude update aptitude install lvm2 grub-install /dev/sda # éventuellement, si on a du raid1, le faire sur l'autre disque grub-install /dev/sdb update-grub
Grub devrait vous dire que tout s'est bien passé.
Afin de s'assurer qu'il a bien reconnu LVM, on peut aller faire un tour dans /boot/grub/grub.cfg
On devrait y trouver, entre autre
insmod lvm
et un peu plus bas dans la section "menuentry" décrivant l'OS
set root='(vg0-os)' linux /boot/vmlinuz-3.2.0-4-amd64 root=/dev/mapper/vg0-os .....
ici tout est bon, on change le fstab pour indiquer que la partition / est en LVM
/dev/vg0/os / ext4 errors=remount-ro,noatime 0 1
puis on peut sortir du chroot, tout demonter et rebooter
Ne pas oublier, si vous êtes sur un serveur distant, de vous reconnecter sur l'interface de l'hebergeur, et de repasser le boot de rescue à disque dur
exit umount /mnt/root_old/proc umount /mnt/root_old/sys umount /mnt/root_old/dev umount /mnt/root_old /sbin/reboot
et voila. aucune donnée/configuration n'a été perdue, et pas besoin de résintaller votre machine
merci Dju
intéressant article !!
si ça peut aider...
c'est malheureusement un cas concret dans lequel je me suis retrouvé, ça doit bien arriver à d'autres :D
je confirme Dju merci
article intéressant merci
Fil des commentaires de ce billet
URL de rétrolien : https://blog.crifo.org/trackback/97