PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Cyrille BORNE : Conversion d'une table de partitions de type Mdos en table Gpt

jeudi 8 janvier 2015 à 08:00

Cet article est lié au précédent qui montrait comment utiliser une table de partition GPT et ceci quel que soit son type de bios. Il s'agit là de convertir une table classique MsDos en table Gpt et sans perte de données ni obligation de réinstaller son système, en notant tout de même que faire des sauvegardes est vivement conseillé.

Il est avant tout informatif, pour montrer que cela est possible et comment, même si rares seront les cas on l'on devra être obligé de convertir sa table. Il peut s'adapter à toutes les distributions sauf en ce qui concerne la reconfiguration du noyau car j'ai utilisé la commande dpkg-reconfigure propre à Debian et dérivées.

Principe - Dans l'ordre on va :
- faire des sauvegardes
- vérifier le système de fichiers
- réduire la première partition en libérant 10 Mo en tout début de disque afin d'y créer une partition de type « BIOS boot partition » indispensable sur les tables Gpt avec une machine de bios non Efi.
- faire un chroot de l'ancienne partition système pour reconfigurer le noyau et réinstaller Grub dans sa nouvelle configuration
- renommer les partitions en fonction de leur emplacement et non de leur ordre de création

Procédure :

Avant tout faire des sauvegardes de ses données et de l'emplacement des tables de partitions, par exemple avec sfdisk. Voir le man à ce sujet.  

Voici ce que donne la commande sfdisk -d /dev/sdb > backup_sdb.txt chez moi:
# partition table of /dev/sdb
unit: sectors

/dev/sdb1 : start=     2048, size= 40960000, Id=83, bootable
/dev/sdb2 : start= 40962048, size=  8192000, Id=82
/dev/sdb3 : start= 49154048, size=107147264, Id= 5
/dev/sdb4 : start=        0, size=        0, Id= 0
/dev/sdb5 : start= 49156096, size= 61440000, Id=83
/dev/sdb6 : start=110598144, size= 45703168, Id=83

Et si nécessaire on les restaurera par la commande :

 sfdisk -f /dev/sdb < backup_sdb.tx

Bien entendu ces sauvegardes ne devront pas être conservées sur le disque à modifier.

Maintenant on peut commencer la procédure proprement dite.

On vérifie qu'aucun système de fichiers de ce disque n'est monté :

:~# grep -c sdb /proc/mounts
0

Je fais une vérification et réparation si nécessaire du système de fichiers avant de le modifier :
:~# e2fsck -f -y /dev/sdb1

J'aurais pu le laisser faire par le programme de partitionnement qui d'ailleurs fera une vérification avant de procéder aux modifications mais je préfère lancer d'abord la commande.

Concernant le programme de partitionnement, il doit savoir gérer sur un système ext4 les «features» has_journal, dir_index, filetype, sparse_super, large_file. Plutôt que de faire une partie avec tune2fs puis le reste avec un autre programme, puisque je dispose d'une interface graphique je vais le faire avec Gparted  .

Alors situation de départ :

Partition Table: msdos

Number  Start   End     Size    Type      File system     Flags
 1      1049kB  21,0GB  21,0GB  primary   ext4            boot
 2      21,0GB  25,2GB  4194MB  primary   linux-swap(v1)
 3      25,2GB  80,0GB  54,9GB  extended
 5      25,2GB  56,6GB  31,5GB  logical   btrfs
 6      56,6GB  80,0GB  23,4GB  logical   ext4

Et, après passage de Gparted :
Partition Table: msdos

Number  Start   End     Size    Type      File system     Flags
 1      11,5MB  21,0GB  21,0GB  primary   ext4            boot
 2      21,0GB  25,2GB  4194MB  primary   linux-swap(v1)
 3      25,2GB  80,0GB  54,9GB  extended
 5      25,2GB  56,6GB  31,5GB  logical   btrfs
 6      56,6GB  80,0GB  23,4GB  logical   ext4

On note donc que la première partition ne débute plus sur le disque à 1049KB mais à 11,5MB tout en conservant sa position de fin.

Je vais donc maintenant avec Gdisk, qui est capable de faire la conversion, créer en tout début de disque une petite partition qui sera pour le moment numérotée N° 3 car c'est le premier «descripteur» de partitions primaires libre dans l'actuelle table msdos (il n'y a plus de notions primaires, étendues et logiques dans les tables Gpt). Je marque en caractères gras les commandes passées dans Gdisk.

:~# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.5

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present

***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format.
THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by typing 'q' if
you don't want to convert your MBR partitions to GPT format!
***************************************************************
Command (? for help): p (affichage de la situation de départ)
Disk /dev/sdb: 156301488 sectors, 74.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): B538B008-8EAC-4ADA-842D-B5BCCBA14A4B
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 156301454
Partitions will be aligned on 2048-sector boundaries
Total free space is 30829 sectors (15.1 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1           22528        40962047   19.5 GiB    8300  Linux filesystem
   2        40962048        49154047   3.9 GiB     8200  Linux swap
   5        49156096       110596095   29.3 GiB    8300  Linux filesystem
   6       110598144       156297215   21.8 GiB    8300  Linux filesystem

Command (? for help): n  (création nouvelle partition)
Partition number (3-128, default 3): 3
First sector (34-156301454, default = 2048) or {+-}size{KMGTP}: 2048
Last sector (2048-22527, default = 22527) or {+-}size{KMGTP}: 22527
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): ef02
Changed type of partition to 'BIOS boot partition'

Command (? for help): p
Disk /dev/sdb: 156301488 sectors, 74.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): B538B008-8EAC-4ADA-842D-B5BCCBA14A4B
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 156301454
Partitions will be aligned on 2048-sector boundaries
Total free space is 10349 sectors (5.1 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1           22528        40962047   19.5 GiB    8300  Linux filesystem
   2        40962048        49154047   3.9 GiB     8200  Linux swap
   3            2048           22527   10.0 MiB    EF02  BIOS boot partition
   5        49156096       110596095   29.3 GiB    8300  Linux filesystem
   6       110598144       156297215   21.8 GiB    8300  Linux filesystem

Command (? for help): w (pour écrire la nouvelle table en Gpt)

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y (confirmation de la commande)
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

On vérifie maintenant avec Parted le travail effectué par Gdisk :
:~# parted /dev/sdb print
Partition Table: gpt

Number  Start   End     Size    File system     Name                 Flags
 3      1049kB  11,5MB  10,5MB  ext4            BIOS boot partition  bios_grub
 1      11,5MB  21,0GB  21,0GB  ext4            Linux filesystem
 2      21,0GB  25,2GB  4194MB  linux-swap(v1)  Linux swap
 5      25,2GB  56,6GB  31,5GB  btrfs           Linux filesystem
 6      56,6GB  80,0GB  23,4GB  ext4            Linux filesystem

On va créer un système de fichiers sur cette nouvelle partition. À priori cela ne devrait pas être nécessaire puisque ce fs ne sera pas utilisé mais j'ai eu des problèmes avec grub qui se mélangeait les pinceaux en l'absence d'un fs sur la partition portant le drapeau  BIOS boot partition.

:~# mkfs.ext2 -v /dev/sdb3
. . .
Écriture des superblocs et de l'information de comptabilité du système de
fichiers : complété

On remet la «mémoire» de blkid à zéro et on vérifie à toutes fins utiles que le système et udev voit bien cette nouvelle partition.

:/#  blkid  -g
:/#  blkid -po udev /dev/sdb3
ID_FS_UUID=cddaedf8-e091-483d-adad-77f1f814110d
ID_FS_UUID_ENC=cddaedf8-e091-483d-adad-77f1f814110d
ID_FS_SEC_TYPE=ext2
ID_FS_VERSION=1.0
ID_FS_TYPE=ext4
ID_FS_USAGE=filesystem
ID_PART_ENTRY_SCHEME=gpt
ID_PART_ENTRY_NAME=BIOS\\x20boot\\x20partition
ID_PART_ENTRY_UUID=72bb9f7e-1836-430e-93ec-886cccc6be67
ID_PART_ENTRY_TYPE=21686148-6449-6e6f-744e-656564454649
ID_PART_ENTRY_NUMBER=3
ID_PART_ENTRY_OFFSET=2048
ID_PART_ENTRY_SIZE=20480
ID_PART_ENTRY_DISK=8:16

Comme on peut le voir sur les sorties précédentes de parted et gdisk les partitions sont numérotées dans l'ordre de création et non suivant leur emplacement sur le disque. Avec l'option -s de sgdisk (noter le s devant gdisk car il s'agit d'un autre utilitaire apporté par le paquet gdisk), on va réorganiser cela :

:~# sgdisk -s /dev/sdb
The operation has completed successfully.

Résultat :

:~# gdisk -l /dev/sdb
. . .
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048           22527   10.0 MiB    EF02  BIOS boot partition
   2           22528        40962047   19.5 GiB    8300  Linux filesystem
   3        40962048        49154047   3.9 GiB     8200  Linux swap
   4        49156096       110596095   29.3 GiB    8300  Linux filesystem
   5       110598144       156297215   21.8 GiB    8300  Linux filesystem

Voilà, maintenant on peut faire le chroot du système de fichier qui est devenu /dev/sdb2 pour les dernières modifications :

:~# mkdir /mnt/system
:~# mount /dev/sdb2 /mnt/system/
:~# mount -o bind /dev /mnt/system/dev
:~# mount -o bind /sys /mnt/system/sys
:~# mount -o bind /proc /mnt/system/proc
:~# chroot /mnt/system

On vérifie quel est le dernier noyau installé :
:/# aptitude search "linux-image ~i"
i   linux-image-3.2.0-4-686-pae

On le reconfigure :
:/# dpkg-reconfigure linux-image-3.2.0-4-686-pae

On réinstalle Grub :
:/# grub-install --recheck --debug /dev/sdb
. . .
+ echo Installation finished. No error reported.
Installation finished. No error reported.
+ exit 0

À noter qu'il n'est pas nécessaire de reconstruire le fichier grub.cfg par la commande update-grub puisque cela a déjà été fait lors du dpkg-reconfigure du noyau.

Voilà, on peut maintenant sortir du chroot et démonter le fs, sys, proc et dev :
:/# exit
:~# umount /mnt/system/proc
:~# umount /mnt/system/sys
:~# umount /mnt/system/dev/
:~# umount /mnt/system

cep

 

Gravatar de Cyrille BORNE
Original post of Cyrille BORNE.Votez pour ce billet sur Planet Libre.

Articles similaires