Jouer avec LVM quand t’es dans la sauce

Jouer avec LVM quand t’es dans la sauce

Aujourd’hui on va voir un peu de LVM parce que je voulais documenter un cas que j’ai rencontrĂ© : un disque avec une table de partition dos sur un système en gpt avec une partition de type linux au lieu de linux lvm. Naturellement au reboot, je me suis retrouvĂ© dans le menu grub et l’OS n’a pas dĂ©marrĂ©.

Cet article est un peu la suite du précédent avec quelques mois de décalage.

Montage de la VM et partitionnement LVM

Direction proxmox, et je créé une nouvelle VM Debian 12 avec un bios OVMF (UEFI), 1 vcpu, 2G de ram et 20G de disque. Cette machine étant vouée à être supprimée, je la laisse en DHCP.

L’installation se fait comme toujours en mode expert et tant qu’Ă  jouer avec LVM, je vais documenter le partitionnement manuel ; comme ça je saurai oĂą chercher si j’ai un doute Ă  l’avenir.

La table de partition est donc gpt puisque j’ai volontairement pris un bios UEFI.

J’ajoute tout d’abord ma partition EFI de 1G (512M Ă©taient nĂ©cessaires mais avec l’arrivĂ©e de Trixie, on utilise plutĂ´t 1G directement) et je sĂ©lectionne Partition système EFI pour l’usage.

Je configure alors LVM dans lequel je dĂ©fini mon Volume Group VG_MAIN et mes Logical Volumes LV_SWAP de 2G et LV_ROOT avec ce qui reste. Je ne dois pas oublier de dĂ©finir l’usage des partitions nouvellement créées.

J’avais un doute, mais l’installeur a bien créé ma sda2 lorsque j’ai initialisĂ© lvm.

Etat initial
root@testlvm:~# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: AAF5A1B6-8B12-45B3-873E-707DE64F945D

Device       Start      End  Sectors  Size Type
/dev/sda1     2048  1953791  1951744  953M EFI System
/dev/sda2  1953792 41940991 39987200 19,1G Linux LVM


Disk /dev/mapper/VG_MAIN-LV_SWAP: 1,91 GiB, 2046820352 bytes, 3997696 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/VG_MAIN-LV_ROOT: 17,16 GiB, 18425577472 bytes, 35987456 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Note bien que :

  • Le DiskLabel type est gpt
  • le type de partition de /dev/sda2 est Linux LVM

Casser LVM

J’ajoute un disque secondaire dans proxmox et je scan les disques prĂ©sents dans le système :

Ajout du disque
root@testlvm:~# for i in /sys/class/scsi_device/*/device/rescan; do echo 1 > $i;done
root@testlvm:~# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: AAF5A1B6-8B12-45B3-873E-707DE64F945D

Device       Start      End  Sectors  Size Type
/dev/sda1     2048  1953791  1951744  953M EFI System
/dev/sda2  1953792 41940991 39987200 19,1G Linux LVM


Disk /dev/mapper/VG_MAIN-LV_SWAP: 1,91 GiB, 2046820352 bytes, 3997696 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/VG_MAIN-LV_ROOT: 17,16 GiB, 18425577472 bytes, 35987456 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Mon disque additionnel /dev/sdb est bien vu. Je vais volontairement le passer en dos linux.

Partitionnement de /dev/sdb
root@testlvm:~# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS (MBR) disklabel with disk identifier 0x34972a8f.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (1-4, default 1): 
First sector (2048-41943039, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): 

Created a new partition 1 of type 'Linux' and of size 20 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Si je vĂ©rifie avec fdisk, j’ai bien obtenu la situation conflictuelle que je souhaitais :

Bash
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x34972a8f

Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1        2048 41943039 41940992  20G 83 Linux

J’Ă©tends alors mon Volume Group LVM Ă  ce disque ainsi que mon Logical Volume :

Extension LVM
root@testlvm:~# vgextend VG_MAIN /dev/sdb1
  Volume group "VG_MAIN" successfully extended
root@testlvm:~# pvs
  PV         VG      Fmt  Attr PSize   PFree  
  /dev/sda2  VG_MAIN lvm2 a--  <19,07g      0 
  /dev/sdb1  VG_MAIN lvm2 a--  <20,00g <20,00g
root@testlvm:~# lvextend -l +100%FREE /dev/VG_MAIN/LV_ROOT
  Size of logical volume VG_MAIN/LV_ROOT changed from 17,16 GiB (4393 extents) to <37,16 GiB (9512 extents).
  Logical volume VG_MAIN/LV_ROOT successfully resized.

Vu que je suis un tocard, j’ai oubliĂ© de redimensionner mon système de fichier en mĂŞme temps que mon Logical Volume ; je le fais donc sĂ©parĂ©ment et je contrĂ´le avec df :

Bash
root@testlvm:~# resize2fs /dev/mapper/VG_MAIN-LV_ROOT 
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/mapper/VG_MAIN-LV_ROOT is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 5
The filesystem on /dev/mapper/VG_MAIN-LV_ROOT is now 9740288 (4k) blocks long.

root@testlvm:~# df -h
Sys. de fichiers            Taille Utilisé Dispo Uti% Monté sur
udev                          961M       0  961M   0% /dev
tmpfs                         197M    468K  196M   1% /run
/dev/mapper/VG_MAIN-LV_ROOT    37G    1,6G   34G   5% /
tmpfs                         982M       0  982M   0% /dev/shm
tmpfs                         5,0M       0  5,0M   0% /run/lock
/dev/sda1                     952M    5,9M  946M   1% /boot/efi

Oh la la, quelle surprise ! Mon OS ne démarre plus !

Réparer LVM

Pour solutionner ça, je repart sur mon iso Debian que je monte dans le lecteur de galette de ma VM et je dĂ©marre en Rescue mode sans monter le système de fichier de l’hĂ´te. Je te refais pas un fdisk -l parce qu’entre temps on a continuĂ© de tenter de tout casser en modifiant le type de disque de linux Ă  linux lvm mais ça n’a pas solutionnĂ© le problème… Ca doit donc ĂŞtre liĂ© au type de table de partition (dos|gpt) plutĂ´t qu’au format de partition (linux|linux lvm).

Le principe sera de redimensionner le système de fichier et son volume logique pour tenir sur un seul disque. Si t’as dĂ©jĂ  rempli l’espace disque, t’es mal ; t’aurais dĂ» essayer de reboot avant de continuer ta prod’.

Rescue mode
Busybox v1.35.0 (Debian 1:1.35.0-4+b5) buit-in shell (ash)
Enter 'help' for a list of buit-in commands.

~ # e2fsck -f /dev/mapper/VG_MAIN-LV_ROOT
e2fsck 1.47.0 (5-Feb-2023)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/VG_MAIN-LV_ROOT: 30547/2431680 files (0.2% non-contiguous), 604737/9740288 blocks
~ # resize2fs /dev/mapper/VG_MAIN-LV_ROOT 16G
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on /dev/mapper/VG_MAIN-LV_ROOT to 4194304 (4k) blocks.
The filesystem on /dev/mapper/VG_MAIN-LV_ROOT is now 4194304 (4k) blocks long.

~ # lvreduce -L 17G -v /dev/mapper/VG_MAIN-LV_ROOT
  WARNING: Reducing active logical volume to 17.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce VG_MAIN/LV_ROOT? [y/n]: y
  Accepted input: [y]
  Reducing logical volume VG_MAIN/LV_ROOT to 17.00 GiB
  Size of logical volume VG_MAIN/LV_ROOT changed from <37.16 GiB (9512 extents) to 17.00 GiB (4352 extents).
  Archiving volume group "VG_MAIN" metadata (seqno 5).
  Loading table for VG_MAIN-LV_ROOT (253:1).
  Suspending VG_MAIN-LV_ROOT (253:1) with device flush
  Resuming VG_MAIN-LV_ROOT (253:1).
  Logical volume VG_MAIN/LV_ROOT sucessfully resized.
  Creating volume group backup "/etc/lvm/backup/VG_MAIN" (seqno 6).
~ # pvmove /dev/sdb1
  No data to move for VG_MAIN.
~ # vgreduce VG_MAIN /dev/sdb1
  Removed "/dev/sdb1" from volume group "VG_MAIN"
~ # reboot

LĂ  je retrouve mon shell habituel, ma connexion ssh et je suis plus obligĂ© de te retaper les commandes et leurs rĂ©sultats Ă  la main, ça va mieux ! Mais par contre je suis reparti avec 20G alors que j’en veux 40… Voyons comment faire.

Tout d’abord, je veux terminer d’enlever le disque secondaire. CĂ´tĂ© système et cĂ´tĂ© proxmox.

Déconnexion du disque /dev/sdb
root@testlvm:~# echo "1" >/sys/block/sdb/device/delete
root@testlvm:~# 

CĂ´tĂ© hyperviseur, je l’ai dĂ©tachĂ© dans ma VM et je l’ai supprimĂ©.

J’ai Ă©tendu le disque dans proxmox (sĂ©lection du disque > Action disque > Redimensionner) Ă  40G. Maintenant on va gĂ©rer ça cĂ´tĂ© système.

Bash
root@testlvm:~# for i in /sys/class/scsi_device/*/device/rescan; do echo 1 > $i;done
root@testlvm:~# fdisk -l
GPT PMBR size mismatch (41943039 != 83886079) will be corrected by write.
The backup GPT table is not on the end of the device.
Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: AAF5A1B6-8B12-45B3-873E-707DE64F945D

Device       Start      End  Sectors  Size Type
/dev/sda1     2048  1953791  1951744  953M EFI System
/dev/sda2  1953792 41940991 39987200 19,1G Linux LVM


Disk /dev/mapper/VG_MAIN-LV_SWAP: 1,91 GiB, 2046820352 bytes, 3997696 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/VG_MAIN-LV_ROOT: 17 GiB, 18253611008 bytes, 35651584 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

fdisk n’est pas content parce que la table de partition n’est pas en fin de disque : c’est normal, on vient de l’Ă©tendre au niveau « physique » et il faut maintenant le faire de manière logique. Tu le sais probablement dĂ©jĂ , j’aime bien utiliser fdisk pour faire ça.

Extension de /dev/sda
root@testlvm:~# fdisk /dev/sda

Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

GPT PMBR size mismatch (41943039 != 83886079) will be corrected by write.
The backup GPT table is not on the end of the device. This problem will be corrected by write.
This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.


Command (m for help): d
Partition number (1,2, default 2): 2

Partition 2 has been deleted.

Command (m for help): n
Partition number (2-128, default 2): 2
First sector (1953792-83886046, default 1953792): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1953792-83886046, default 83884031): 

Created a new partition 2 of type 'Linux filesystem' and of size 39,1 GiB.
Partition #2 contains a LVM2_member signature.

Do you want to remove the signature? [Y]es/[N]o: N

Command (m for help): p

Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: AAF5A1B6-8B12-45B3-873E-707DE64F945D

Device       Start      End  Sectors  Size Type
/dev/sda1     2048  1953791  1951744  953M EFI System
/dev/sda2  1953792 83884031 81930240 39,1G Linux filesystem

Command (m for help): 

On va pas se faire avoir deux fois, donc avant d’Ă©crire la partition on la print pour se rendre compte que fdisk nous a pondu un beau Linux filesystem et c’est pas du tout ce qu’on veut !

Attention au type de partition
Command (m for help): t
Partition number (1,2, default 2): 2
Partition type or alias (type L to list all): L
  1 EFI System                     C12A7328-F81F-11D2-BA4B-00A0C93EC93B
  2 MBR partition scheme           024DEE41-33E7-11D3-9D69-0008C781F39F
[...]
 43 Linux LVM                      E6D6D379-F507-44C2-A23C-238F2A3DF928
[...]
Partition type or alias (type L to list all): 43

Changed type of partition 'Linux filesystem' to 'Linux LVM'.

Command (m for help): w
The partition table has been altered.
Syncing disks.

root@testlvm:~# 

Je t’Ă©pargne le contrĂ´le fdisk -l mais tu devrais avoir une partoche /dev/sda1 d’environs 40G. Chez moi, ça donne 39,1G de type Linux LVM.

Il me reste plus qu’Ă  Ă©tendre le Physical Volume et le Logical Volume et cette fois-ci, je faire le resize en mĂŞme temps.

Extension LVM sur /dev/sda
root@testlvm:~# pvs
  PV         VG      Fmt  Attr PSize   PFree  
  /dev/sda2  VG_MAIN lvm2 a--  <19,07g 164,00m
root@testlvm:~# pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

root@testlvm:~# lvextend -l +100%FREE /dev/mapper/VG_MAIN-LV_ROOT -r
  Size of logical volume VG_MAIN/LV_ROOT changed from 17,00 GiB (4352 extents) to 37,16 GiB (9513 extents).
  Logical volume VG_MAIN/LV_ROOT successfully resized.
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/mapper/VG_MAIN-LV_ROOT is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 5
The filesystem on /dev/mapper/VG_MAIN-LV_ROOT is now 9741312 (4k) blocks long.

root@testlvm:~# df -h
Sys. de fichiers            Taille Utilisé Dispo Uti% Monté sur
udev                          961M       0  961M   0% /dev
tmpfs                         197M    484K  196M   1% /run
/dev/mapper/VG_MAIN-LV_ROOT    37G    1,6G   34G   5% /
tmpfs                         982M       0  982M   0% /dev/shm
tmpfs                         5,0M       0  5,0M   0% /run/lock
/dev/sda1                     952M    5,9M  946M   1% /boot/efi
tmpfs                         197M       0  197M   0% /run/user/0

Bon, je suis pas en prod donc j’ai quand mĂŞme tentĂ© le reboot pour ĂŞtre certain que tout roule et c’est bien le cas.

Je suis content d’avoir rencontrĂ© ce cas qui m’a permis de mieux connaĂ®tre mon système et je remercie Monsieur C. pour son aide Ă  la rĂ©solution. On aurait probablement pu modifier le type de table de partition mais aurait-ce Ă©tĂ© aussi marrant ?

Laisser un commentaire

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