Как прочитать таблицу разделов в памяти (ядра) в / dev / sda?

14

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

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

Оливье Лалонд
источник

Ответы:

25

Да, вы можете сделать это с /sysфайловой системой.

/sysподдельная файловая система, динамически генерируемая ядром и драйверами ядра
В этом конкретном случае вы можете перейти на /sys/block/sdaи вы увидите каталог для каждого раздела на диске. В этих папках есть 2 определенных файла, 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
Иногда, когда я поднимаю вопрос, это означает «эй, это было удобно». Ваш upvote больше похож на "это спасло мою кожу". Благодарность!
Алекс Хирзель
У меня нет /dev/sdb/start. Был ли он переименован в ext_range? Ядро:4.8.15-1-MANJARO
Том Хейл,
@ TomHale это /sys/block/sdb/start, нет/dev/sdb/start
Патрик
Извините, я указал неправильный каталог. У меня statесть, но нет start.
Том Хейл,
При воссоздании разделов я рекомендую использовать usind, так fdiskкак он позволяет напрямую вводить количество секторов, и вы можете проверить значения перед записью на диск. Я успешно восстановил диск следующим образом: создал первый раздел, принял существо, затем ввел «+ размер» (сверху) для завершения, второй раздел ввел startиз / sys ... и снова «+ размер» и т. Д. Проверьте Размер разделов перед записью новой таблицы. Удачи!
Йорг
10

Я сделал сценарий, чтобы помочь решить эту проблему, без ГАРАНТИИ . (но я проверил на моей виртуальной машине)

Запуск следующего скрипта с поврежденным HD в первом параметре: $ ./repart.sh sda

#!/bin/bash

HARDDISK=$1

PARTITIONS=$(ls -d /sys/block/${HARDDISK}/${HARDDISK}?/)

echo "unit: sectors" 
for i in $PARTITIONS; do
    DEVICE=$(basename $i)
    START=$(cat $i/start)
    SIZE=$(cat $i/size)
    echo "/dev/$DEVICE : start=$START, size=$SIZE, type=XX" 
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-install /dev/sda
fabceolin
источник
1
Убедитесь, что вы используете переключатель «-u B» для sfdisk и будьте осторожны, возможно, вам придется настроить значения в repart.sfdisk (обычно делите их на два), если sfdisk считает в размерах блоков (проверьте «Units = blocks of 1024 байта "в" sudo sfdisk -u B -l / dev / sda "), кроме 512 байтов (обычно 1024 в настоящее время).
Флориан
1
Сначала я неправильно прочитал: под Id = 5 вы подразумеваете тип раздела 5, то есть sda4, а не sda5. Кроме того, в моем случае ls -d / sys / block / sda / sda * дает мне только sda1 и sda5, поэтому кажется, что контейнер отсутствует.
Вау
ты не должен разбирать ls; используйте вместо этого поиск
кошка
3

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

Он доступен предварительно упакованным для Debian и, вероятно, для Ubuntu. Вероятно, другие дистрибутивы.

Если вы загружаете gparted CD, вероятно, стоит проверить, установлен ли он на нем.

саз
источник
Да, он сделал. Просто проверьте ссылку на OP (askUbuntu)
Марко