GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie liest man die In-Memory (Kernel) Partitionstabelle von /dev/sda?

Ja, das geht mit dem /sys Dateisystem.

/sys ist ein gefälschtes Dateisystem, das vom Kernel und den Kernel-Treibern dynamisch generiert wird.
In diesem speziellen Fall können Sie zu /sys/block/sda gehen und Sie sehen ein Verzeichnis für jede Partition auf dem Laufwerk. Es gibt 2 spezifische Dateien in diesen Ordnern, die Sie benötigen, start und size . start enthält den Offset vom Anfang des Laufwerks und size ist die Größe der Partition. Löschen Sie einfach die Partitionen und erstellen Sie sie mit genau den gleichen Starts und Größen wie in /sys .

Zum Beispiel sieht mein Laufwerk so aus:

   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

Und das habe ich in /sys/block/sda :

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


Ich habe dies getestet, um zu überprüfen, ob die Informationen korrekt sind, nachdem die Partitionstabelle auf einem laufenden System geändert wurde


Ich habe ein Skript erstellt, um dieses Problem zu lösen, ohne KEINE GEWÄHRLEISTUNG .(aber ich habe es auf meiner virtuellen Maschine getestet)

Ausführen des folgenden Skripts mit beschädigtem HD am ersten Parameter, wie in:

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

Inhalt von 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

Die Ausgabe ist ein sfdisk-Format. Aber Vorsicht , muss diese Datei modifiziert werden, um verwendet zu werden. Erhöhen Sie die Größe beim erweiterten Partitionstyp =5, indem Sie den gesamten logischen Speicherplatz plus den Speicherplatz zwischen dem Beginn der erweiterten und dem Beginn der ersten logischen Partition verwenden.

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

Sie müssen den Typ ändern , von XX bis Nummer des Partitionstyps. Legen Sie die bootfähige Partition in der ersten Zeile.

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

Übernehmen Sie diese Änderungen

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

Partitionstabellen erneut lesen

partprobe 
/sbin/blockdev --rereadpt

Grub neu installieren

grub-install /dev/sda

Testdisk schon probiert? Es kann die Festplatte scannen und verlorene Partitionstabellen wiederherstellen, selbst nachdem Sie neu gestartet haben.

Es ist vorkonfiguriert für Debian und vermutlich auch für Ubuntu erhältlich. Wahrscheinlich andere Distributionen.

Wenn Sie eine gparted-CD booten, lohnt es sich wahrscheinlich zu prüfen, ob sie darauf vorinstalliert ist.


Linux
  1. So generieren Sie ein zufälliges Passwort unter Linux mit /dev/random

  2. Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0?

  3. Wann sollte /dev/random vs. /dev/urandom verwendet werden?

  4. So ordnen Sie /dev/sdX- und /dev/mapper/mpathY-Geräte vom /dev/dm-Z-Gerät zu

  5. Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

Wie tauscht man /dev/sda mit /dev/sdb aus?

DD von /dev/zero nach /dev/null ... was eigentlich passiert

Wie mountet ein Kernel die Root-Partition?

Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0

Kernel:/dev/kmem und /dev/mem deaktivieren

Wird dd if=/dev/zero of=/dev/sda eine bereits vorhandene Partitionstabelle löschen?