Jak czytać tablicę partycji w pamięci (jądro) / dev / sda?

15

Przypadkowo nadpisałem swoją tabelę partycji / dev / sda za pomocą GParted ( pełna historia na AskUbuntu ). Ponieważ nie uruchomiłem się jeszcze, a mój system plików jest nadal w pełni użyteczny, powiedziano mi, że mogę odzyskać tablicę partycji z pamięci wbudowanej w jądro. Czy to jest możliwe? Jeśli tak, to jak go odzyskać i przywrócić?

wprowadź opis zdjęcia tutaj

Olivier Lalonde
źródło

Odpowiedzi:

26

Tak, możesz to zrobić z systemem /sysplików.

/systo fałszywy system plików generowany dynamicznie przez jądro i sterowniki jądra.
W tym konkretnym przypadku możesz przejść do, /sys/block/sdaa zobaczysz katalog dla każdej partycji na dysku. W tych folderach potrzebujesz 2 określonych plików starti size. startzawiera przesunięcie od początku dysku i sizejest wielkością partycji. Wystarczy usunąć partycje i odtworzyć je z dokładnie takimi samymi początkami i rozmiarami, jak w /sys.

Na przykład tak wygląda mój dysk:

   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

I to właśnie mam /sys/block/sda:

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


Przetestowałem to, aby zweryfikować poprawność informacji po zmodyfikowaniu tabeli partycji w działającym systemie

Patrick
źródło
1
Czasami, gdy głosuję za pytaniem, oznacza to „hej, to było przydatne”. Twoja opinia jest bardziej jak „to uratowało moją skórę”. Dzięki!
Alex Hirzel
Nie mam /dev/sdb/start. Czy zmieniono jego nazwę na ext_range? Jądro:4.8.15-1-MANJARO
Tom Hale,
@TomHale It's /sys/block/sdb/start, not/dev/sdb/start
Patrick
Przepraszam, podałem zły katalog. Mam stattam, ale nie start.
Tom Hale,
Podczas ponownego tworzenia partycji zalecam usind, fdiskponieważ pozwala on bezpośrednio wprowadzić liczbę sektorów i możesz sprawdzić wartości przed zapisaniem na dysk. Pomyślnie przywróciłem dysk: tworząc pierwszą partycję, akceptując bycie, a następnie wpisując „+ size” (od góry) dla końca, drugą partycję wchodząc startz / sys ... i „+ size” ponownie i tak dalej ... Sprawdź rozmiar partycji przed zapisaniem nowej tabeli. Powodzenia!
Jörg Gottschlich,
11

Stworzyłem skrypt, który pomoże rozwiązać ten problem, BEZ GWARANCJI . (ale testowałem na mojej maszynie wirtualnej)

Uruchamianie następującego skryptu z uszkodzonym HD przy pierwszym parametrze, jak w:

user@host:~$ ./repart.sh sda

Treść 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

Dane wyjściowe mają format sfdisk. Ale uwaga , ten plik musi zostać zmodyfikowany, aby go użyć. Przy typie partycji rozszerzonej = 5, zwiększ rozmiar, używając całej przestrzeni logicznej plus spacji między początkiem partycji rozszerzonej a początkiem pierwszej partycji logicznej.

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

Musisz zmienić typ , z XX na liczbę typów partycji. Umieść partycję startową w pierwszej linii.

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

Zastosuj te zmiany

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

Odczytaj tabele partycji

partprobe 
/sbin/blockdev --rereadpt

Zainstaluj ponownie grub

grub-install /dev/sda
fabceolin
źródło
1
Upewnij się, że używasz przełącznika „-u B” dla sfdisk i bądź ostrożny, być może będziesz musiał dostosować wartości w repart.sfdisk (zwykle dzielimy je przez dwa), jeśli sfdisk liczy się w rozmiarach bloków (zaznacz „Units = blocks of 1024 bajtów ”w„ sudo sfdisk -u B -l / dev / sda ”) innych niż 512 bajtów (zwykle obecnie 1024).
Florian
1
Na początku źle odczytałem: przez Id = 5 rozumiesz typ partycji 5, czyli sda4, a nie sda5. Ponadto w moim przypadku ls -d / sys / block / sda / sda * daje mi tylko sda1 i sda5, więc wydaje się, że brakuje kontenera.
wau
nie powinieneś analizować ls; zamiast tego użyj find
cat
4

Próbowałeś już testdisk ? Może skanować dysk i odzyskać utracone tabele partycji, nawet po ponownym uruchomieniu.

Jest dostępny w pakiecie dla Debiana i prawdopodobnie również dla Ubuntu. Prawdopodobnie inne dystrybucje.

Jeśli uruchamiasz płytę CD z partycjami, prawdopodobnie warto sprawdzić, czy jest na niej wstępnie zainstalowana.

cas
źródło
Tak, zrobił. Wystarczy sprawdzić link OP (askUbuntu)
Marco