GNU/Linux >> Tutoriels Linux >  >> Linux

Comment lire la table de partition en mémoire (noyau) de /dev/sda ?

Oui, vous pouvez le faire avec le /sys système de fichiers.

/sys est un faux système de fichiers généré dynamiquement par le noyau et les pilotes du noyau.
Dans ce cas précis vous pouvez aller à /sys/block/sda et vous verrez un répertoire pour chaque partition sur le lecteur. Il y a 2 fichiers spécifiques dans ces dossiers dont vous avez besoin, start et size . start contient le décalage depuis le début du lecteur, et size est la taille de la partition. Supprimez simplement les partitions et recréez-les avec exactement les mêmes débuts et tailles que ceux trouvés dans /sys .

Par exemple, voici à quoi ressemble mon lecteur :

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      133119       65536   83  Linux
/dev/sda2   *      133120   134340607    67103744    7  HPFS/NTFS/exFAT
/dev/sda3       134340608   974675967   420167680   8e  Linux LVM
/dev/sda4       974675968   976773167     1048600   82  Linux swap / Solaris

Et c'est ce que j'ai en /sys/block/sda :

sda1/
 start: 2048
 size: 131072
sda2/
 start: 133120
 size: 134207488
sda3/
 start: 134340608
 size: 840335360
sda4/
 start: 974675968
 size: 2097200


J'ai testé cela pour vérifier que les informations sont exactes après avoir modifié la table de partition sur un système en cours d'exécution


J'ai fait un script pour aider à résoudre ce problème, avec AUCUNE GARANTIE .(mais j'ai testé sur ma machine virtuelle)

Exécution du script suivant, avec HD endommagé au premier paramètre, comme dans :

[email protected]:~$ ./repart.sh sda

Contenu de repart.sh :

#!/bin/bash

echo "unit: sectors" 
for i in /sys/block/$1/$1?/; do
    printf '/dev/%s : start=%d, size=%d, type=XX\n' "$(basename $i)" "$(<$i/start)" "$(<$i/size)"
done

La sortie est au format sfdisk. Mais attention , ce fichier doit être modifié pour être utilisé. À la partition étendue type=5, augmentez la taille, en utilisant tout l'espace logique plus l'espace entre le début de la partition étendue et le début de la première partition logique.

unit: sectors
/dev/sda1 : start=63, size=2040192, type=XX
/dev/sda2 : start=2040255, size=20482875, type=XX
/dev/sda3 : start=22523130, size=19197675, type=XX
/dev/sda4 : start=41720805, size=2, type=XX
/dev/sda5 : start=41720868, size=208782, type=XX

Vous devez changer le type , de XX au nombre de type de partition. Mettez le amorçable partitionner en première ligne.

unit: sectors
/dev/sda1 : start=63, size=2040192, type=83, bootable
/dev/sda2 : start=2040255, size=20482875, type=83
/dev/sda3 : start=22523130, size=19197675, type=fd
/dev/sda4 : start=41720805, size=208845, type=5
/dev/sda5 : start=41720868, size=208782, type=82

Appliquer ces modifications

cat repart.sfdisk | sfdisk -f /dev/sda

Relire les tables de partition

partprobe 
/sbin/blockdev --rereadpt

Réinstaller grub

grub-install /dev/sda

As-tu essayé testdisk ? Il peut analyser le disque et récupérer les tables de partition perdues, même après le redémarrage.

Il est disponible pré-emballé pour Debian et probablement aussi pour Ubuntu. Probablement d'autres distributions.

Si vous démarrez un CD gparted, il vaut probablement la peine de vérifier s'il est pré-installé dessus.


Linux
  1. Comment générer un mot de passe aléatoire sous Linux en utilisant /dev/random

  2. Linux :Différence entre /dev/console , /dev/tty et /dev/tty0 ?

  3. Quelle est la portabilité de /dev/stdin, /dev/stdout et /dev/stderr ?

  4. Quand utiliser /dev/random contre /dev/urandom ?

  5. Comment mapper les périphériques /dev/sdX et /dev/mapper/mpathY à partir du périphérique /dev/dm-Z

Comment encoder en base64 /dev/random ou /dev/urandom ?

Comment échanger /dev/sda avec /dev/sdb ?

Quand dois-je utiliser /dev/shm/ et quand dois-je utiliser /tmp/?

Comment puis-je modifier la quantité et la taille des disques RAM Linux (/dev/ram0 - /dev/ram15) ?

Comment Linux utilise /dev/tty et /dev/tty0

Est-ce que dd if=/dev/zero of=/dev/sda effacera une table de partition préexistante ?