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

13

Eu acidentalmente substituí minha tabela de partições / dev / sda pelo GParted ( história completa no AskUbuntu . Como ainda não reiniciei e meu sistema de arquivos ainda é perfeitamente utilizável, me disseram que eu poderia recuperar a tabela de partições da memória do kernel. Isso é possível? Se sim, como posso recuperá-lo e restaurá-lo?

    
por Olivier Lalonde 25.07.2012 / 13:16

3 respostas

25

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

/sys é um sistema de arquivos falso gerado dinamicamente pelo kernel & drivers do kernel.
Neste caso específico, você pode ir para /sys/block/sda e você verá um diretório para cada partição na unidade. Existem dois arquivos específicos nas pastas de que você precisa, start e size . start contém o deslocamento do início da unidade e size é o tamanho da partição. Basta excluir as partições e recriá-las com os mesmos inícios e tamanhos encontrados em /sys .

Por exemplo, esta é a aparência da minha unidade:

   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 é o 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 estão corretas depois de modificar a tabela de partições em um sistema em execução

    
por 25.07.2012 / 14:14
10

Eu fiz um script para ajudar a resolver este problema, com SEM GARANTIA . (mas 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 caution , 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 do estendido 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

Aplicar essas alterações

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

Releia as tabelas de partições

partprobe 
/sbin/blockdev --rereadpt

Reinstale o grub

grub-install /dev/sda
    
por 02.11.2012 / 03:57
3

Já experimentou o testdisk ? Ele pode varrer o disco e recuperar tabelas de partições perdidas, mesmo depois de você ter reiniciado.

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

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

    
por 25.07.2012 / 13:57