GNU/Linux >> Znalost Linux >  >> Linux

Jak číst tabulku oddílů v paměti (kernel) /dev/sda?

Ano, můžete to udělat pomocí /sys souborový systém.

/sys je falešný souborový systém dynamicky generovaný jádrem a ovladači jádra.
V tomto konkrétním případě můžete přejít na /sys/block/sda a uvidíte adresář pro každý oddíl na jednotce. V těchto složkách jsou 2 konkrétní soubory, které potřebujete, start a size . start obsahuje posun od začátku jednotky a size je velikost oddílu. Stačí odstranit oddíly a znovu je vytvořit s přesně stejnými počátky a velikostmi, jaké najdete v /sys .

Například takto vypadá můj disk:

   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

A to je to, co mám v /sys/block/sda :

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


Testoval jsem to, abych ověřil správnost informací po úpravě tabulky oddílů na běžícím systému


Vytvořil jsem skript, který pomůže vyřešit tento problém, bez BEZ ZÁRUKY .(ale testoval jsem na svém virtuálním počítači)

Spuštění následujícího skriptu s poškozeným HD na prvním parametru, jako v:

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

Obsah 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

Výstupem je formát sfdisk. Ale pozor , musí být tento soubor upraven, aby mohl být použit. U rozšířeného oddílu typu=5 zvětšete velikost s využitím veškerého logického prostoru plus mezery mezi začátkem rozšířeného a začátkem prvního logického oddílu.

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

Musíte změnit typ , od XX do čísla typu oddílu. Vložte zaváděcí oddíl na prvním řádku.

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

Použít tyto změny

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

Znovu si přečtěte tabulky oddílů

partprobe 
/sbin/blockdev --rereadpt

Znovu nainstalujte grub

grub-install /dev/sda

Zkoušel jsi testdisk? Dokáže prohledat disk a obnovit ztracené tabulky oddílů i po restartu.

Je k dispozici předem zabalený pro Debian a pravděpodobně také pro Ubuntu. Pravděpodobně další distribuce.

Pokud spouštíte gparted CD, pravděpodobně stojí za to zkontrolovat, zda na něm není předinstalované.


Linux
  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. Kdy použít /dev/random vs /dev/urandom?

  3. Kdy mám použít /dev/shm/ a kdy /tmp/?

  1. DD z /dev/zero do /dev/null...co se vlastně stane

  2. Linux:Rozdíl mezi /dev/console , /dev/tty a /dev/tty0

  3. jádro:deaktivace /dev/kmem a /dev/mem

  1. Jak vygenerovat náhodné heslo v linuxu pomocí /dev/random

  2. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  3. Rozdíly mezi /dev/sda a /dev/sda1