Como ler a tabela de partição na memória (kernel) de / dev / sda?

14

Substitui acidentalmente minha tabela de partições / dev / sda com GParted ( história completa no AskUbuntu ). Como ainda não reinicializei e meu sistema de arquivos ainda é perfeitamente utilizável, me disseram que talvez eu consiga recuperar a tabela de partição da memória do kernel. Isso é possível? Em caso afirmativo, como faço para recuperá-lo e restaurá-lo?

insira a descrição da imagem aqui

Olivier Lalonde
fonte

Respostas:

25

Sim, você pode fazer isso com o /syssistema de arquivos.

/sysé um sistema de arquivos falso gerado dinamicamente pelos drivers do kernel e do kernel.
Nesse caso específico, você pode acessar /sys/block/sdae você verá um diretório para cada partição na unidade. Existem 2 arquivos específicos nessas pastas que você precisa starte size. startcontém o deslocamento desde o início da unidade e sizeé o tamanho da partição. Basta excluir as partições e recriá-las com exatamente os mesmos começos e tamanhos encontrados em /sys.

Por exemplo, é assim que minha unidade se parece:

   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

E é isso que eu tenho em /sys/block/sda:

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


Eu testei isso para verificar se as informações são precisas após modificar a tabela de partição em um sistema em execução

Patrick
fonte
1
Às vezes, quando voto uma pergunta, significa "ei, isso foi útil". Seu voto positivo é mais como "isso salvou minha pele". Obrigado!
Alex Hirzel
Eu não tenho um /dev/sdb/start. Foi renomeado para ext_range? Kernel:4.8.15-1-MANJARO
Tom Hale
@TomHale é /sys/block/sdb/start, não #/dev/sdb/start
Patrick #
Desculpe, citei o diretório errado. Eu tenho um statlá, mas não start.
Tom Hale
Ao recriar as partições, recomendo que você indique fdisk, pois permite inserir o número de setores diretamente e você pode verificar os valores antes de gravar no disco. Eu restaurei um disco com êxito: criando a primeira partição, aceitando estar e inserindo "+ size" (de cima) para final, segunda partição inserindo startde / sys ... e "+ size" novamente e assim por diante ... tamanho das partições antes de escrever a nova tabela. Boa sorte!
Jörg Gottschlich 28/08
10

Eu criei um script para ajudar a resolver esse problema, SEM GARANTIA . (mas eu testei na minha máquina virtual)

Executando o seguinte script, com HD danificado no primeiro parâmetro: $ ./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

A saída é um formato sfdisk. Mas cuidado , esse arquivo precisa ser modificado para ser usado. No tipo de partição estendida = 5, aumente o tamanho, usando todo o espaço lógico mais o espaço entre o início da estendida e o início da primeira partição lógica.

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

Você precisa alterar o tipo , de XX para o número do tipo de partição. Coloque a partição inicializável na primeira linha.

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

Aplique essas alterações

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

Reler tabelas de partição

partprobe 
/sbin/blockdev --rereadpt

Reinstale o grub

grub-install /dev/sda
fabceolina
fonte
1
Certifique-se de usar a opção "-u B" para sfdisk e tenha cuidado, talvez seja necessário ajustar os valores em repart.sfdisk (divida-os por dois geralmente), se o sfdisk contar no tamanho dos blocos (verifique "Units = blocks of 1024 bytes "no" sudo sfdisk -u B -l / dev / sda ") que não seja 512 bytes (normalmente 1024 atualmente).
Florian
1
Eu interpretei mal a princípio: por Id = 5, você quer dizer tipo de partição 5, que é sda4, não sda5. Além disso, no meu caso, ls -d / sys / block / sda / sda * me fornece apenas sda1 e sda5, portanto parece que o contêiner está ausente.
wau
você não deve analisar sl; usar encontrar vez
gato
3

Você já tentou o testdisk ? Ele pode verificar o disco e recuperar as tabelas de partição perdidas, mesmo após a reinicialização.

Está disponível pré-empacotado para o Debian e, presumivelmente, para o Ubuntu também. Provavelmente outras distros.

Se você estiver inicializando um CD do gparted, provavelmente vale a pena verificar se ele está pré-instalado nele.

cas
fonte
Sim ele fez. Basta verificar o link do OP (askUbuntu)
Marco