
GPT fdisk (aussi connu sous les noms de gdisk, cgdisk et sgdisk) et FixParts par Roderick W. Smith, [email protected]
Ce paquet comprend le code source de quatre programmes de partitionnement de disques associés :
gdisk -- Ce programme est calqué sur fdisk de Linux, mais il opère sur les disques à table de partitions GUID (GPT) plutôt que sur les disques à enregistrement d'amorçage principal (MBR) que fdisk modifie. À ce titre, gdisk est un outil interactif en mode texte pour manipuler les partitions, mais il n'affecte pas le contenu de ces partitions (généralement des systèmes de fichiers, mais parfois de l'espace d'échange ou d'autres données).
cgdisk -- Ce programme est calqué sur cfdisk de Linux, mais il opère sur les disques GPT plutôt que sur les disques MBR que cfdisk modifie. Ainsi, cgdisk est un outil en mode texte basé sur curses pour manipuler les partitions, c'est-à-dire qu'il utilise une interface reposant sur les touches fléchées et un affichage dynamique plutôt que sur des lettres de commande et un affichage défilant comme gdisk.
sgdisk -- Ce programme est conceptuellement similaire aux programmes sfdisk de Linux et gpt de FreeBSD, mais ses détails opérationnels diffèrent. Il permet de manipuler les disques GPT à l'aide d'options de ligne de commande, ce qui le rend adapté à une utilisation dans des scripts ou par des experts pour effectuer des tâches spécifiques qui pourraient nécessiter plusieurs commandes dans gdisk.
fixparts -- Ce programme, contrairement aux trois précédents, opère sur les disques MBR. Il est conçu pour corriger certains problèmes pouvant être créés par divers utilitaires. Plus précisément, il peut corriger les partitions étendues mal dimensionnées et les partitions primaires situées au milieu de partitions étendues. Il permet également de modifier le statut primaire ou logique d'une partition (dans les limites de ce qui est légal dans le schéma MBR) et d'apporter quelques autres modifications mineures. Il ne prend PAS en charge la création de nouvelles partitions ; pour cela, vous devez utiliser fdisk, parted ou un autre outil.
Vous trouverez ci-dessous plus de détails sur les capacités de ces outils.
Les quatre programmes reposent sur le même ensemble de code sous-jacent ; ils ne diffèrent que par leurs interfaces de contrôle (définies respectivement dans gdisk.cc, cgdisk.cc, sgdisk.cc et fixparts.cc) et par le code de support qu'ils utilisent.
Le programme gdisk est conçu comme un programme (plus ou moins) équivalent à fdisk pour les disques partitionnés en GPT ; cgdisk est de même un équivalent de cfdisk, et sgdisk offre la plupart des fonctionnalités de gdisk dans un programme plus adapté aux scripts. Bien que libparted et les programmes qui l'utilisent (GNU Parted, gparted, etc.) permettent de gérer les disques GPT, ils présentent certaines limitations que gdisk surmonte. Parmi les avantages spécifiques de gdisk, cgdisk et sgdisk, on peut citer :
La capacité de convertir sur place des disques partitionnés en MBR au format GPT, sans perte de données
La capacité de convertir sur place des disklabels BSD pour créer des partitions GPT, sans perte de données
La capacité de convertir du format GPT au format MBR sans perte de données (gdisk et sgdisk uniquement)
Une spécification plus flexible des GUID de codes de type de système de fichiers, que GNU Parted a tendance à corrompre
Une identification claire du nombre de secteurs non alloués sur un disque
Une interface utilisateur familière aux utilisateurs de longue date de fdisk et cfdisk de Linux (gdisk et cgdisk uniquement)
Le code du chargeur d'amorçage MBR n'est pas modifié
La capacité de créer un MBR hybride, ce qui permet aux systèmes d'exploitation ignorant le GPT d'accéder à un maximum de trois partitions GPT sur le disque (gdisk et sgdisk uniquement)
Bien sûr, GPT fdisk n'est pas sans limitations. Notamment, il ne dispose pas de la connaissance des systèmes de fichiers ni des fonctionnalités liées aux systèmes de fichiers de GParted. Vous ne pouvez pas redimensionner le système de fichiers d'une partition ni créer une partition avec un système de fichiers déjà en place avec gdisk, par exemple. Il n'existe pas de version graphique de gdisk.
Le paquet GPT fdisk fournit trois fichiers de programme : le gdisk interactif en mode texte, le cgdisk interactif basé sur curses et le sgdisk piloté par ligne de commande. Les deux premiers sont destinés au partitionnement manuel des disques ou à la modification des détails de partitionnement ; sgdisk est destiné à être utilisé dans des scripts pour automatiser des tâches telles que le clonage de disques ou la préparation de plusieurs disques pour l'installation de Linux.
Ce programme a été créé en réponse aux appels à l'aide que j'ai vus sur des forums en ligne de la part d'utilisateurs ayant découvert que leurs tables de partitions avaient été corrompues par divers outils de partitionnement bogués. Bien que la plupart des systèmes d'exploitation gèrent correctement les disques affectés, les outils basés sur libparted (GParted, parted, la plupart des installeurs Linux, etc.) ont tendance à dysfonctionner face à ces disques. En général, le symptôme est un disque qui semble ne contenir aucune partition ; cependant, parfois l'outil libparted affiche des partitions autres que celles que le système d'exploitation voit.
J'ai observé quatre causes à ces symptômes, dont trois que FixParts peut corriger :
Anciennes données GPT -- Si un disque est utilisé comme disque GPT puis réutilisé comme disque MBR, les données GPT peuvent être incomplètement effacées. Cela se produit si le disque est repartitionné avec fdisk ou l'installeur Microsoft Windows, par exemple. (Les outils basés sur libparted suppriment correctement les anciennes données GPT lors de la conversion du format GPT au format MBR.) FixParts vérifie ce problème au démarrage et propose de le corriger. Si vous choisissez d'effacer les données GPT, cet effacement se produit immédiatement, contrairement aux autres modifications apportées par le programme.
Partitions étendues mal dimensionnées -- Certains outils créent une partition étendue trop grande, se terminant généralement après le dernier secteur du disque. FixParts corrige automatiquement ce problème (si vous utilisez l'option 'w' pour enregistrer la table de partitions).
Partitions primaires à l'intérieur d'une partition étendue -- Certains utilitaires créent ou déplacent des partitions primaires dans la plage couverte par la partition étendue. FixParts peut généralement corriger ce problème en transformant la partition primaire en partition logique ou en changeant une ou plusieurs autres partitions logiques en partitions primaires. De telles corrections ne sont toutefois pas toujours possibles, du moins pas sans supprimer ou redimensionner d'autres partitions.
Données RAID résiduelles -- Si un disque est utilisé dans une matrice RAID puis réutilisé comme disque non RAID, certains utilitaires peuvent être déroutés et ne pas voir le disque. FixParts ne peut PAS corriger ce problème. Vous devez détruire les anciennes données RAID, ou éventuellement supprimer le paquet dmraid du système, pour résoudre ce problème.
Lors de son exécution, FixParts présente une interface de type fdisk, vous permettant d'ajuster les types de partitions (primaire, logique ou omise), de modifier les codes de type, de changer le drapeau d'amorçage, et ainsi de suite. Bien que vous puissiez supprimer une partition (en l'omettant), vous ne pouvez pas créer de nouvelles partitions avec le programme. Si vous avez l'habitude de partitionner des disques, en particulier avec fdisk de Linux, deux caractéristiques inhabituelles de FixParts nécessitent des précisions :
Aucune partition étendue -- En interne, FixParts lit la table de partitions et ignore les données des partitions étendues qu'il trouve. Lorsque vous enregistrez la table de partitions, le programme génère une nouvelle partition étendue. Cette conception signifie que le programme corrige automatiquement de nombreux problèmes liés à la partition étendue. Cela signifie également que vous ne verrez aucune trace de partitions étendues dans l'interface utilisateur de FixParts, bien qu'il tienne compte des exigences et vous empêche de créer des dispositions illégales, comme une partition primaire entre deux partitions logiques.
Numérotation des partitions -- Dans la plupart des outils Linux, les partitions 1 à 4 sont des partitions primaires et les partitions 5 et au-delà sont des partitions logiques. Bien qu'une table de partitions valide chargée dans FixParts soit initialement conforme à cette convention, certains types de tables endommagées peuvent ne pas l'être, et diverses modifications que vous apportez peuvent également provoquer des écarts. Lorsque FixParts écrit la table de partitions, sa numérotation sera modifiée pour se conformer aux conventions MBR standard, mais vous devez utiliser l'étiquetage explicite des partitions comme primaire ou logique plutôt que les numéros de partition pour déterminer le statut d'une partition.
Pour compiler GPT fdisk, vous devez avoir installé les outils de développement appropriés, notamment la collection de compilateurs GNU (GCC) et son compilateur g++ pour le C++. J'ai également testé la compilation avec Clang, qui semble fonctionner ; cependant, je n'ai pas effectué de tests approfondis des binaires résultants, au-delà de la vérification de quelques éléments de base. Sous Windows, Microsoft Visual C++ 2008 peut être utilisé à la place. De plus, notez ces exigences :
Sous Linux, FreeBSD, OS X et Solaris, libuuid doit être installé. C'est la norme pour Linux et OS X, bien que vous deviez peut-être installer un paquet appelé uuid-dev ou quelque chose de similaire pour obtenir les en-têtes. Sous FreeBSD, le port e2fsprogs-libuuid doit être installé.
La bibliothèque ICU (http://site.icu-project.org), qui fournit la prise en charge des noms de partitions Unicode, est facultative sur toutes les plateformes sauf Windows, où elle n'est pas prise en charge. L'utilisation de cette bibliothèque était nécessaire pour obtenir une prise en charge correcte des noms de partitions UTF-16 dans les versions de GPT fdisk antérieures à 0.8.9, mais à partir de cette version, elle ne devrait plus être requise. Néanmoins, vous pouvez l'utiliser si vous rencontrez des problèmes avec la nouvelle prise en charge UTF-16. Cette bibliothèque est normalement installée sous Linux et OS X, mais vous devrez peut-être installer les en-têtes de développement (libicu-dev ou quelque chose de similaire sous Linux ; ou le paquet libicu36-dev de Fink sous OS X). Pour compiler avec la prise en charge ICU, vous devez modifier le Makefile : recherchez les lignes commentées qui font référence à USE_UTF16, -licuuc, -licudata ou -licucore. Décommentez-les et commentez les équivalents qui ne contiennent pas ces lignes.
Le programme cgdisk nécessite la bibliothèque ncurses et ses fichiers de développement (en-têtes). La plupart des distributions Linux installent ncurses par défaut, mais vous devrez peut-être installer un paquet appelé libncurses5-dev, ncurses-devel ou quelque chose de similaire pour obtenir les fichiers d'en-tête. Ces fichiers étaient déjà installés sur mon système de développement Mac OS X ; cependant, ils ont pu être installés comme dépendances d'autres programmes que j'ai installés. Si vous rencontrez des problèmes pour installer ncurses, vous pouvez compiler gdisk et/ou sgdisk sans cgdisk en spécifiant uniquement les cibles que vous souhaitez compiler avec make.
Le programme sgdisk nécessite la bibliothèque popt et ses fichiers de développement (en-têtes). La plupart des distributions Linux installent popt par défaut, mais vous devrez peut-être installer un paquet appelé popt-dev, popt-devel ou quelque chose de similaire pour obtenir les fichiers d'en-tête. Les utilisateurs de Mac OS peuvent trouver une version de popt pour Mac OS auprès de Darwin Ports (http://popt.darwinports.com) ou de Fink (http://www.finkproject.org) ; cependant, vous devrez d'abord installer DarwinPorts ou Fink (des instructions existent sur les pages des projets concernés). Vous pouvez également compiler gdisk et/ou cgdisk seuls, sans sgdisk ; gdisk ne nécessite pas popt.
Lorsque tous les outils de développement et les bibliothèques nécessaires sont installés, vous pouvez décompresser le paquet et taper "make" à l'invite de commande dans le répertoire résultant. (Vous devrez peut-être taper "make -f Makefile.mac" sur Mac OS X, "make -f Makefile.freebsd" sur FreeBSD, "make -f Makefile.solaris" sur Solaris, ou "make -f Makefile.mingw" pour compiler avec MinGW pour Windows.) Vous devrez peut-être aussi ajouter les répertoires d'en-têtes (include) ou les répertoires de bibliothèques en définissant la variable d'environnement CXXFLAGS ou en modifiant le Makefile. Le résultat devrait être des fichiers de programme appelés gdisk, cgdisk, sgdisk et fixparts. Taper "make gdisk", "make cgdisk", "make sgdisk" ou "make fixparts" ne compilera que les programmes demandés. Vous pouvez utiliser ces programmes sur place ou copier les fichiers dans un répertoire approprié, tel que /usr/local/sbin. Vous pouvez copier les pages de manuel (gdisk.8, cgdisk.8, sgdisk.8 et fixparts.8) vers /usr/local/man/man8 pour les rendre disponibles.
CE LOGICIEL EST UN LOGICIEL BÊTA ! S'IL EFFACE VOTRE DISQUE DUR OU MANGE VOTRE CHAT, NE M'EN BLÂMEZ PAS ! À ce jour, j'ai testé le logiciel sur plusieurs clés USB, disques durs physiques et disques virtuels dans les environnements QEMU et VirtualBox. Beaucoup d'autres ont également utilisé le logiciel sur leurs ordinateurs. Je crois que tous les bogues de corruption de données ont été éliminés, mais je sais très bien que les chances que j'aie oublié quelque chose sont élevées. Cela est particulièrement vrai pour les grands disques (de plus de 2 TiB) ; mes seuls tests directs avec de tels disques ont été effectués avec des disques virtuels QEMU et VirtualBox. J'ai toutefois reçu des rapports d'utilisateurs ayant réussi avec des matrices RAID de plus de 2 TiB.
Ma principale plateforme de développement est un système exécutant la version 64 bits de Gentoo Linux. J'ai également testé sur plusieurs autres distributions Linux 32 et 64 bits, Mac OS X 10.5 et 10.6 basés sur Intel, FreeBSD 7.1 64 bits et Windows 7.
Ce programme est distribué sous les termes de la GNU GPL (voir le fichier COPYING).
Ce code est en grande partie le mien ; cependant, j'ai utilisé trois fonctions provenant de deux autres programmes sous licence GPL :
Le code utilisé pour générer les CRC est tiré du programme efone de Krzysztof Dabrowski et ElysiuM deeZine. (Voir les fichiers de code source crc32.h et crc32.cc.)
Une fonction pour trouver la taille du disque est tirée de fdisk de Linux par A. V. Le Blanc. Ce code a ensuite été fortement modifié.
Les autres contributeurs de code sont :
Yves Blusseau ([email protected])
David Hubbard ([email protected])
Justin Maggard ([email protected])
Dwight Schauer ([email protected])
Florian Zumbiehl ([email protected])
Guillaume Delacour (a contribué au script gdisk_test.sh)