Як читати таблицю розділів в пам'яті (ядро) / dev / sda?


15

Я випадково перезаписав таблицю розділів / dev / sda з GParted ( повна історія на AskUbuntu ). Оскільки я ще не перезавантажився і моя файлова система все ще є ідеально зручною, мені сказали, що я можу відновити таблицю розділів із пам’яті в ядрі. Це можливо? Якщо так, то як я відновити його та відновити?

введіть тут опис зображення

Відповіді:


26

Так, ви можете зробити це за допомогою /sysфайлової системи.

/sysце підроблена файлова система, що динамічно генерується драйверами ядра та ядра.
У цьому конкретному випадку ви можете перейти до, /sys/block/sdaі ви побачите каталог для кожного розділу на диску. У цих необхідних папках є два конкретні файли, startі size. startмістить зсув від початку диска і sizeє розміром розділу. Просто видаліть розділи та відтворіть їх із такими ж стартами та розмірами, як і у /sys.

Наприклад, ось так виглядає мій привід:

   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

І ось що я маю /sys/block/sda:

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


Я перевірив це, щоб переконатися, що інформація точна після зміни таблиці розділів у запущеній системі


1
Іноді, коли я схвалюю запитання, це означає, "ей, це було зручно". Ваше висловлювання більше нагадує "це врятувало мою шкіру". Спасибі!
Алекс Гірзель

У мене немає /dev/sdb/start. Чи перейменовано ext_range? Кернель:4.8.15-1-MANJARO
Том Хейл

@TomHale це /sys/block/sdb/start, ні/dev/sdb/start
Патрік

Вибачте, я цитував неправильний каталог. У мене statє, але ні start.
Том Хейл

При повторному створенні розділів я рекомендую usind, fdiskоскільки це дозволяє безпосередньо вводити кількість секторів, і ви можете перевірити значення перед записом на диск. Я успішно відновив диск: створивши перший розділ, прийнявши буття, потім ввівши "+ розмір" (зверху) для кінця, знову ввівши розділ startз / sys ... і "+ розмір" і так далі ... Перевірте розмір розділів перед написанням нової таблиці. Удачі!
Йорг Готчлих

11

Я створив сценарій, щоб допомогти вирішити цю проблему, БЕЗ ГАРАНТІЇ . (але я перевірив свою віртуальну машину)

Запуск наступного скрипту з пошкодженим HD першим параметром, як у:

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

Вміст 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

Вихід - формат sfdisk. Але обережно , цей файл повинен бути змінений, щоб використовувати його. При розширеному типі розділу = 5 збільште розмір, використовуючи весь логічний простір плюс пробіл між початком розширеного і початком першого логічного розділу.

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

Вам потрібно змінити тип , з XX на номер типу розділу. Помістіть завантажувальний розділ на перший рядок.

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

Застосуйте ці зміни

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

Перечитайте таблиці розділів

partprobe 
/sbin/blockdev --rereadpt

Перевстановити grub

grub-install /dev/sda

1
Не забудьте використовувати перемикач "-u B" для sfdisk, і будьте обережні, можливо, вам доведеться відрегулювати значення в repart.sfdisk (розділити їх зазвичай на два), якщо sfdisk рахується в розмірах блоків (перевірте "Units = блоки з 1024 байти "в" sudo sfdisk -u B -l / dev / sda "), крім 512 байт (зазвичай 1024 нині).
Флоріан

1
Я спочатку неправильно читаю: під Id = 5 ви маєте на увазі тип розділу 5, який є sda4, а не sda5. Крім того, у моєму випадку ls -d / sys / block / sda / sda * дає мені лише sda1 та sda5, тому здається, що контейнер відсутній.
wa

ви не повинні розбирати ls; використовувати натомість
кіт

4

Ви пробували testdisk ? Він може сканувати диск і відновити втрачені таблиці розділів, навіть після перезавантаження.

Він доступний заздалегідь упакований для Debian і, мабуть, і для Ubuntu. Напевно, інші дистрибутиви.

Якщо ви завантажуєте компакт-диск з gparted, напевно, варто перевірити, чи він попередньо встановлений на цьому.


Так, він зробив. Просто перевірте посилання OP (askUbuntu)
Марко,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.