GNU/Linux >> Tutoriales Linux >  >> Linux

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

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

/sys es un sistema de archivos falso generado dinámicamente por el kernel y los controladores del kernel.
En este caso específico puedes ir a /sys/block/sda y verá un directorio para cada partición en el disco. Hay 2 archivos específicos en esas carpetas que necesita, start y size . start contiene el desplazamiento desde el comienzo de la unidad, y size es el tamaño de la partición. Simplemente elimine las particiones y vuelva a crearlas exactamente con los mismos inicios 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


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

Ejecutando el siguiente script, con HD dañado en el primer parámetro, como en:

[email protected]:~$ ./repart.sh sda

Contenido de 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

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 partició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

Tienes que cambiar el tipo , de XX al número de tipo de partición. Poner el arrancable partición 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

Vuelva a leer las tablas de particiones

partprobe 
/sbin/blockdev --rereadpt

Reinstalar grub

grub-install /dev/sda

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

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

Si está iniciando un CD con gpart, probablemente valga la pena verificar si está preinstalado en eso.


Linux
  1. Linux:¿Diferencia entre /dev/console, /dev/tty y /dev/tty0?

  2. Cómo mapear dispositivos /dev/sdX y /dev/mapper/mpathY desde el dispositivo /dev/dm-Z

  3. ¿Cuándo debo usar /dev/shm/ y cuándo debo usar /tmp/?

  4. Cómo usa Linux /dev/tty y /dev/tty0

  5. hacer eco o imprimir /dev/stdin /dev/stdout /dev/stderr

DD de /dev/zero a /dev/null... lo que realmente sucede

¿Cómo monta un kernel la partición raíz?

Linux:diferencia entre /dev/console, /dev/tty y /dev/tty0

kernel:deshabilitar /dev/kmem y /dev/mem

¿dd if=/dev/zero of=/dev/sda borrará una tabla de particiones preexistente?

Diferencias entre /dev/sda y /dev/sda1