lunes, 31 de diciembre de 2007

Recuperando tabla de particiones perdida

Ayer pasé una "divertida" tarde luchando a brazo partido por recuperar la tabla de particiones de mi disco duro. Todo empezó cuando tuve la feliz idea de probar el comando grub-reboot, que sirve para reiniciar un sistema Linux y hacer que se arranque con la entrada del menú de GRUB que le indiquemos.

No se por qué (aunque lo intuyo, ver final del post) cuando se reinició el ordenador en lugar de arrancar el Windows (que era lo que estaba probando), lo que arrancó fue... nada. Así que cogí el CD de instalación de mi Kubuntu y arranqué con él, esperando que se arreglara simplemente reinstalando el GRUB, cosa sencilla y que ya he hecho otras veces.

Tras arrancar desde el CD, abro una consola como root y me aseguro de que se ve la partición del disco, ejecutando fdisk -l. ¡Horror! No es que no vea la partición del Linux, es que no ve ninguna, el mensaje que devuelve dice que el disco ¡no tiene particiones!

Gracias a que el CD con el que he arrancado es live puedo utilizar el entorno gráfico y el navegador para buscar en Internet la forma de arreglarlo. Encuentro una utilidad llamada gpart que escanea el disco duro en busca de particiones. Sus creadores han pensado en todo y hay una versión compilada estáticamente para Linux, con lo que solo hay que descargársela y ejecutarla. Al hacerlo encuentra algunas de las particiones que tenía, y me da la opción de escribir la tabla en el disco. Como no tengo mucho que perder, le digo que sí y lo hace inmediatamente. Sin necesidad de reiniciar, compruebo que puedo montar la partición de mi Linux, y que está todo ahí. No sería demasiado catastrófico que se perdiera porque tengo la buena costumbre de hacer backup de vez en cuando en otro disco, pero sería un rollo tener que instalar otra vez el sistema y configurarlo a mi gusto.

Bien, reinicio y me sale el GRUB. El Windows no lo puedo arrancar, pero el Linux sí, así que eso hago. Mi objetivo ahora es intentar recuperar la partición de Windows. Tampoco tengo datos en ella, pero hay dos cosas por las que me interesa: Porque es un XP legal instalado en lugar del Vista que traía, y porque tengo ahí mis partidas del Zero Hour :-)

Antes de hacer ningún experimento me guardo en una memoria USB la tabla de particiones actual, por si acaso. Aunque no sea la correcta, por lo menos me arranca el ordenador con ella.

Busco y encuentro otra utilidad, TestDisk, similar a la anterior y que también revisa todo el disco duro buscando vestigios de particiones. Esta parece que funciona algo mejor, ya que encuentra incluso la definición de la partición original del Windows Vista que venía preinstalado en mi portátil. La de XP no aparece, pero da la opción de hacer un escaneo más profundo y tras unos minutos la encuentra. Le digo cuales son las particiones que tenía y las restauro.

Reinicio de nuevo y ya puedo arrancar el Windows. Perfecto, pienso, pero aun no ha terminado la cosa, porque cuando vuelvo a reiniciar para volver a mi querido Linux ahora no arranca, al seleccionarlo en el GRUB me da este error:
Error 17, cannot mount selected partition
Vuelvo a arrancar con el CD y busco información. Hay que reinstalar el GRUB, así que ejecuto:

grub-install /dev/sda

Pero da un error de que no encuentra el directorio de instalación de GRUB. Para solucionarlo tengo que indicarle dónde está, así que primero hay que montar la partición en algún sitio, por ejemplo en /mnt:

mount /dev/sda6 /mnt

A continuación reinstalar GRUB indicándole el sitio anterior:

grub-install --root-directory=/mnt /dev/sda

Con esto es suficiente el 99% de las veces, pero dado el problema que he tenido con la tabla de particiones me da un error, de que no encuentra el fichero stage1. Vuelvo a buscar y encuentro la solución. Primero hay que ejecutar grub a secas, lo que hace que se le puedan ejecutar comandos interactivamente, y entonces hago lo siguiente:

grub> find /boot/grub/stage1
Me devuelve (hd0,5)
grub> root (hd0,5)
grub> setup(hd0)

Y se instala sin errores. Vuelvo a reiniciar, y al elegir la entrada del GRUB para arrancar me vuelve a decir que no puede montar la partición. Presiono la 'e' para editarla, y veo que hay una entrada en la que pone root (hd0,6), así que la sustituyo por (hd0,5), y presiono la 'b' para que arranque de ella, y por fin todo vuelve a funcionar como antes. Por alguna razón ha cambiado el número de la partición del sistema con todo este lío (antes era la 6 y ahora es la 5). Para que no vuelva a ocurrir lo del arranque, corrijo el fichero /boot/grub/menu.lst con la nueva información.

Y ahora, las conclusiones:
  1. Hay que hacer copia de seguridad de nuestros datos de vez en cuando. Yo tenía hecha una reciente, así que todo este proceso para recuperarlos ha sido para mi simplemente una molestia. Si no los hubiera tenido, hubiera sido una lucha desesperada. Prefiero las molestias a la desesperación.

  2. Hacer copia de seguridad del sector de arranque (MBR), que contiene la tabla de particiones es muy simple, basta ejecutar:

    dd if=/dev/sda of=copia_tabla.bin bs=512 count=1

    Que copia los primeros 512 bytes del disco en el fichero copia_tabla.bin. Para restaurarla hay que ejecutar el comando contrario. Desde hoy, este fichero lo he añadido a mi copia de seguridad.

  3. ¿Por qué me pasó todo esto simplemente por ejecutar grub-reboot? No lo se, puede ser debido a algún problema con la tabla de particiones original o algún tema de comunicación BIOS - sistema sobre la geometría del disco. Lo miraré con calma un día de estos.


Links de utilidad:

- gpart, programa de recuperación de particiones.
- TestDisk, otro programa de recuperación de particiones, más grande, más completo, y para más sistemas (incluido Windows).
- Solución al problema de reinstalación de GRUB.

miércoles, 12 de diciembre de 2007

Configuración de un NAP bluetooth en Ubuntu Linux

En la jerga de bluetooth un NAP es un Network Access Point. Es decir, podemos hacer que nuestro ordenador actúe cómo router o pasarela para conectarse a Internet desde algún dispositivo que se comunique por bluetooth, como una PDA o un teléfono móvil.

Ubuntu tiene unas buenas utilidades gráficas para el manejo de dispositivos bluetooth, pero están orientadas al intercambio de ficheros y utilización como módem de los teléfonos móviles. No he sido capaz de configurar un NAP solo con esas utilidades, así que hay que hacerlo por línea de comandos. Para ello, hay que configurar por un lado la parte concreta de bluetooth, y por otro la parte más general de red del sistema. Estos pasos están pensados para Ubuntu y Debian, pero en otros sabores de Linux serán similares.

Configuración de la parte bluetooth

Para empezar, si no lo tenemos ya hay que instalar las utilidades bluetooth, ejecutando como root:

aptitude install bluez-utils

Lo primero será comprobar que el sistema detecta el adaptador de bluetooth que tengamos en el PC, mediante el comando:

hcitool dev

Deberá aparecer algo parecido a:

Devices:
hci0 00:03:7A:EE:B6:16

Donde hci0 es el dispositivo bluetooth y los números su dirección MAC. Si no aparece nada, es que el sistema no está detectando el adaptador.

Editar el fichero /etc/default/bluetooth. Está muy bien comentado qué es cada parámetro de los que aparecen en él, para nuestros propósitos será necesario asegurarse de que, al menos, los siguiente valores están así:

BLUETOOTH_ENABLED = 1

PAND_ENABLED = 1
PAND_OPTIONS="--devup /etc/bluetooth/pan/dev-up"
PAND_OPTIONS=$PAND_OPTIONS" --listen --role NAP "

SDPTOOL_OPTIONS="add NAP"

Aquí hay un par de cosas importantes que no vienen configuradas por defecto y que no he visto bien explicado en ningún sitio: En la primera línea PAND_OPTIONS indicamos la ruta de un script que se ejecutará cuando se establezca la conexión para levantar el interface. Este script no existe, hay que crearlo; es muy simple y más abajo se explica cómo hacerlo. El otro detalle es que en la otra línea donde pone PAND_OPTIONS, si no le añadimos lo que hemos puesto en la línea anterior se perderá. Para que no ocurra, se pone primero el valor que ya tenía, con $PAND_OPTIONS, y a continuación se le concatenan los nuevos valores.

A continuación, editar el fichero /etc/bluetooth/hcid.conf, y modificar la que pone passkey, donde indicaremos un password para la conexión desde la PDA. Más abajo donde pone Default link mode deberá poner: lm accept,master;

En el paquete bluez-utils hay una cosa mal en el script de arranque /etc/init.d/bluetooth, y es que no se lanza el demonio del servicio SDP, que se encarga de mostrar los servicios ofrecidos por nuestro servidor a los dispositivos que se quieran conectar a él. Para que lo lance deberemos buscar en el mencionado fichero la parte donde pone start) y veremos que hay varias líneas donde pone 'start_algo || true'. Añadiremos run_sdptool || true



Configuración de la parte de red del sistema

Cuando se establezca la conexión bluetooth se creará un interface llamado bnep0, que deberá tener su dirección IP. Para hacerlo más simple, suponemos que esta dirección es estática, y lo configuramos en el fichero donde se encuentran todos los interfaces de red del sistema, en /etc/network/interfaces :

auto bnep0
iface bnep0 inet static
address 192.168.2.1
netmask 255.255.255.0
gateway 192.168.0.1 (o el que tengamos en nuestra conexión a Internet por defecto)

Con esto configuramos la IP, pero el interface no estará activo hasta que no se conecte un dispositivo como una PDA. Para activarlo cuando llegue ese momento es necesario un pequeño script al que nos hemos referido más arriba. Lo habíamos configurado para que se llamara /etc/bluetooth/pan/dev-up, pero podría estar en cualquier otro sitio. Su contenido es el siguiente:

#!/bin/sh
ifup --force $1

La opción de --force es mejor ponerla porque a veces al terminar la conexión el interface se queda creado y la siguiente vez no se vuelve a levantar porque se piensa que sigue activo. El script este es ejecutado por el demonio que atiende las conexiones bluetooth, y le pasa como parámetro el nombre del interfaz creado, en nuestro caso bnep0.

Para que el PC haga de router y conseguir así que la PDA se conecte a internet, deberemos ejecutar estos dos comandos:

echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Suponiendo que sea eth0 la tarjeta de red por la que salimos. Estos comandos pueden ponerse en algún script de arranque para que se ejecuten al iniciar el sistema.

Para terminar, reiniciaremos los servicios de bluetooth y de red para asegurarnos de que los cambios se aplican:

/etc/init.d/networking restart
/etc/init.d/bluetooth restart

Conexión desde la PDA

Esta parte ya depende del dispositivo que tengamos. En mi caso, una PDA HP iPAQ.

Lo primero es configurarle una dirección IP. Por simplificar, se la pongo también estática y la configuro como tarjeta de red. Esto también es importante, he visto muchos tutoriales que para hacer esto mismo usan una conexión serie, como si fuera un módem. En nuestro caso todo lo contrario, lo hacemos como si fuera una tarjeta ethernet.

A continuación, activar el interface bluetooth y escanear en busca de dispositivos. Deberá aparecer nuestro PC. Lo seleccionaremos y saldrán los servicios ofrecidos. Debería aparecer uno llamado "Network Access Point" o similar. Lo seleccionaremos y nos pedirá que introduzcamos un PIN, que es el que habremos configurado en el fichero /etc/bluetooth/hcid.conf

Y si todo va bien, se establecerá la conexión. En nuetro PC al ejecutar un ifconfig aparecerá el interface bnep0 y si hacemos ping a la IP de la PDA deberá responder. Parece complicado, pero después de hacerlo tres o cuatro veces es muy sencillo :-)

Más información:
http://bluez.sourceforge.net/contrib/HOWTO-PAN
http://quozl.netrek.org/bluetooth/
http://www.triptico.com/software/bluetooth.html

Primera entrada

Este blog es la continuación de Aberraciones Informáticas. El motivo del cambio es que quiero escribir sobre más cosas a parte de las anécdotas con usuarios más o menos lerdos, que era la idea de la que surgió el anterior. De hecho en el otro ya escribía sobre esos otros temas, pero la verdad es que el título del blog no les hacía justicia.

Así que, borrón y cuenta nueva. El blog anterior no lo voy a eliminar, lo dejo ahí como histórico y seguramente alguna vez haré referencia a alguna entrada ya publicada mediante un hipervínculo, o puede que incluso la copie descaradamente.

Algunas de las cosas que escriba serán autoapuntes pensados según el caótico esquema de mi celebro, así que si no se entienden muy bien, no sean muy crueles conmigo, probablemente no los entienda ni yo mismo cuando recurra a ellos. En ese caso, prometo editarlos para hacerlos más comprensibles.