Ayuda, por favor: recuperar tabla de particiones de Linux

Tengo un portátil con Ubuntu y windows, y acabo de cargarme accidentalmente la tabla de particiones intentando recuperar un iPod (he borrado todas las particiones de /dev/sda con fdisk, y en realidad el iPod era /dev/sdb).
Por suerte me he dado cuenta antes de reiniciar el portátil, así que ahora mismo me funciona, pero en cuanto lo apague ya no podré acceder ni montar ninguna de las particiones... fdisk me ha avisado de que es necesario reiniciar para aplicar los cambios, pero creo que la tabla de particiones ya está borrada.

Esto es lo que tengo en /etc/fstab:
# /etc/fstab: static file system information.
#
# <file system> <mount point>     <type>      <options>                                  <dump>  <pass>
proc            /proc             proc        defaults                                   0       0
/dev/sda6       /                 ext3        defaults,acl,errors=remount-ro             0       1
/dev/sda8       /home             ext3        defaults,acl                               0       2
/dev/sda1       /win/sys          vfat        auto,user,owner,uid=nephiel,gid=nephiel,rw 0       0
/dev/sda5       /win/data         vfat        auto,user,owner,uid=nephiel,gid=nephiel,rw 0       0
/dev/sda7       none              swap        sw                                         0       0
/dev/scd0       /media/optical    udf,iso9660 noauto,user                                0       0
/dev/sdb1       /media/usbdrive1  auto        noauto,user,owner,rw                       0       0
/dev/sdc1       /media/usbdrive2  auto        noauto,user,owner,rw                       0       0
/dev/sdd1       /media/usbdrive3  auto        noauto,user,owner,rw                       0       0
/dev/mmcblk0p1  /media/card       auto        noauto,user,owner,rw                       0       0
/dev/ipod       /mnt/ipod         auto        nodev,nosuid,user,rw,noauto,check=r        0       0

df me dice lo siguiente:
/dev/sda6              8123168   4229116   3474760  55% /
varrun                  517476        68    517408   1% /var/run
varlock                 517476         4    517472   1% /var/lock
udev                    517476       124    517352   1% /dev
devshm                  517476         0    517476   0% /dev/shm
lrm                     517476     18856    498620   4% /lib/modules/2.6.15-51-386/volatile
/dev/sda8             36211572  29501860   4840552  86% /home
/dev/sda1             16771648  12598432   4173216  76% /win/sys
/dev/sda5             16771648  13522608   3249040  81% /win/data

Ahora, tanto fdisk como qtparted me muestran el disco /dev/sda sin particionar.

¿Existe alguna manera de recuperar o restaurar la tabla de particiones con estos datos?
¿Qué puedo hacer?
Afortunadamente no he tenido que arreglar nunca una situación de este tipo, pero buscando buscando, he encontrado este cacharro que igual te vale para regenerarla: http://www.cgsecurity.org/wiki/TestDisk
Probé el TestDisk, pero no conseguí que funcionara. Creo que tuvo algo que ver con que las particiones estuvieran montadas, y no quería arriesgarme a reiniciar el equipo. Afortunadamente pude recrear la tabla de particiones, gracias a la info que encontré en esta página. Posteo cómo lo hice por si a alguien (yo incluido XD) le pasa algo parecido alguna vez.

Resumiendo, como no había reiniciado, la información de la tabla aún estaba disponible:
#cat /proc/partitions
major minor  #blocks  name

   8     0   97685784 sda
   8     1   16779861 sda1
   8     2          1 sda2
   8     5   16779861 sda5
   8     6    8385898 sda6
   8     7    1574338 sda7
   8     8   37383223 sda8
   8     9   16779861 sda9
#hdparm -g /dev/sda*
/dev/sda:
geometry     = 12161/255/63, sectors = 195371568, start = 0
/dev/sda1:
geometry     = 12161/255/63, sectors = 33559722, start = 63
/dev/sda2:
geometry     = 12161/255/63, sectors = 2, start = 33559785
/dev/sda5:
geometry     = 12161/255/63, sectors = 33559722, start = 33559848
/dev/sda6:
geometry     = 12161/255/63, sectors = 16771797, start = 67119633
/dev/sda7:
geometry     = 12161/255/63, sectors = 3148677, start = 83891493
/dev/sda8:
geometry     = 12161/255/63, sectors = 74766447, start = 87040233
/dev/sda9:
geometry     = 12161/255/63, sectors = 33559722, start = 161806743


Con estos datos y los del fichero /etc/fstab, tengo dónde empieza y termina cada partición, así que pude ejecutar fdisk y recrearlas una a una. Por defecto, fdisk muestra las unidades en cilindros, tuve que utilizar la opción "u" para que las mostrara en sectores.

En mi caso, la primera partición, /dev/sda1, es primaria, empieza en el sector 63, y tiene un tamaño de 33559722 sectores, por tanto con fdisk creé una nueva partición en la que el primer sector es el 63 y el último es +33559721 (ojo que aquí hay que restar 1 al tamaño y poner un + delante, si nos equivocamos aquí, al intentar crear la siguiente partición fdisk no nos dejará que comience en el primer sector correcto):

# fdisk /dev/sda
Command (m for help): u
Changing display/entry units to sectors
Command (m for help): n         
Command action                 
   e   extended                 
   p   primary partition (1-4) 
p                               
Partition number (1-4): 1
First sector (63-xxxxxxx, default 63): 63
Last sector or +size or +sizeM or +sizeK (63-xxxxxxx, default xxxxxxx): +33559721

La siguiente partición /dev/sda2 se crea igual, salvo que es extendida y no primaria, y que ocupa todo el resto del disco, no sólo 2 sectores.

El resto de las particiones /dev/sda5 hasta /dev/sda9 las creé igual que la primera; son unidades lógicas dentro de la partición extendida /dev/sda2.
Luego cambié el tipo de cada partición (fat32, linux o swap) para que quedaran igual que en el fichero /etc/fstab, establecí las particiones 1 y 6 (win-sys y linux /) como activas (bootable flag) y salvé los cambios.
El resultado:
Command (m for help): p

Disk /dev/sda: 100.0 GB, 100030242816 bytes
255 heads, 63 sectors/track, 12161 cylinders, total 195371568 sectors
Units = sectors of 1 * 512 = 512 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          63    33559784    16779861    b  W95 FAT32
/dev/sda2        33559785   195371567    80905891+   5  Extended
/dev/sda5        33559848    67119569    16779861    b  W95 FAT32
/dev/sda6   *    67119633    83891429     8385898+  83  Linux
/dev/sda7        83891493    87040169     1574338+  82  Linux swap / Solaris
/dev/sda8        87040233   161806679    37383223+  83  Linux
/dev/sda9       161806743   195366464    16779861   83  Linux

Uf! [tomaaa] Solucionado, menos mal ;)
jeje la peich esa la vi yo tb buscando, pero como vi eso otro y me pareció más facil pensé que mejor probar primero eso xD. Me alegro de que lo hayas sacado adelante.
3 respuestas