¿Cómo leer la tabla de particiones en memoria (kernel) de / dev / sda?

14

Accidentalmente sobrescribí mi tabla de particiones / dev / sda con GParted ( historia completa en AskUbuntu ). Como todavía no he reiniciado y mi sistema de archivos sigue siendo perfectamente utilizable, me dijeron que podría recuperar la tabla de particiones de la memoria del núcleo. ¿Es eso posible? Si es así, ¿cómo lo recupero y lo restauro?

ingrese la descripción de la imagen aquí

Olivier Lalonde
fuente

Respuestas:

25

Sí, puedes hacer esto con el /sys sistema de archivos.

/syses un sistema de archivos falso generado dinámicamente por el núcleo y los controladores del núcleo.
En este caso específico, puede ir /sys/block/sday verá un directorio para cada partición en la unidad. Hay 2 archivos específicos en esas carpetas que necesita, starty size. startcontiene el desplazamiento desde el comienzo de la unidad y sizees el tamaño de la partición. Simplemente elimine las particiones y vuelva a crearlas con exactamente los mismos comienzos y tamaños que se encuentran en /sys.

Por ejemplo, así es como se ve mi disco:

   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

Y esto es lo que tengo en /sys/block/sda:

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


He probado esto para verificar que la información sea precisa después de modificar la tabla de particiones en un sistema en ejecución

Patricio
fuente
1
A veces, cuando votaba una pregunta, significa "oye, esto fue útil". Su voto es más como "esto salvó mi piel". ¡Gracias!
Alex Hirzel
Yo no tengo una /dev/sdb/start. ¿Se le ha cambiado el nombre ext_range? Kernel:4.8.15-1-MANJARO
Tom Hale
@TomHale es /sys/block/sdb/start, no/dev/sdb/start
Patrick
Lo siento, cité el directorio incorrecto. Tengo un statallí, pero no start.
Tom Hale
Al volver a crear las particiones, le recomiendo usind fdiskya que permite ingresar el número de sectores directamente y puede verificar los valores antes de escribir en el disco. He restaurado un disco con éxito: creando la primera partición, aceptando ser, luego ingresando "+ tamaño" (desde arriba) para el final, la segunda partición ingresando startdesde / sys ... y "+ tamaño" nuevamente y así sucesivamente ... Verifique tamaño de las particiones antes de escribir la nueva tabla. ¡Buena suerte!
Jörg Gottschlich
10

Hice un script para ayudar a resolver este problema, SIN GARANTÍA . (pero lo probé en mi máquina virtual)

Ejecutando el siguiente script, con HD dañado en el primer 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

La salida es un formato sfdisk. Pero precaución , este archivo tiene que ser modificado para ser utilizado. En el tipo de partición extendida = 5, aumente el tamaño, utilizando todo el espacio lógico más el espacio entre el inicio de la extensión extendida y el inicio de la primera partición 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

Debe cambiar el tipo , de XX al número de tipo de partición. Ponga la partición de arranque en la primera línea.

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 estos cambios

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

Volver a leer las tablas de partición

partprobe 
/sbin/blockdev --rereadpt

Vuelva a instalar grub

grub-install /dev/sda
fabceolin
fuente
1
Asegúrese de usar el interruptor "-u B" para sfdisk y tenga cuidado, es posible que tenga que ajustar los valores en repart.sfdisk (dividirlos por dos generalmente), si sfdisk cuenta en tamaños de bloques (verifique "Unidades = bloques de 1024 bytes "en el" sudo sfdisk -u B -l / dev / sda ") que no sean 512 bytes (generalmente 1024 hoy en día).
Florian
1
Al principio leí mal: por Id = 5 te refieres al tipo de partición 5, que es sda4, no sda5. Además, en mi caso ls -d / sys / block / sda / sda * solo me da sda1 y sda5, por lo que parece que falta el contenedor.
wau
no deberías analizar ls; use find en su lugar
cat
3

¿Has probado testdisk ? Puede escanear el disco y recuperar las tablas de partición perdidas, incluso después de reiniciar.

Está disponible preempaquetado para Debian y presumiblemente también para Ubuntu. Probablemente otras distribuciones.

Si está arrancando un CD separado, probablemente valga la pena verificar si está preinstalado en eso.

cas
fuente
Sí lo hizo. Simplemente revise el enlace del OP (askUbuntu)
Marco