viernes, 12 de octubre de 2012

Montar una particion desde Live CD

Como montar desde el Live CD de Ubuntu mi partición con el Ubuntu instalado. 
He de decir que si tienes una Live CD como Knoppix que te monta automáticamente todas las particiones que tienes en el disco duro no te va a servir porque te las monta en modo lectura. Asi que aqui van los pasos para montar tu partición con tu Ubuntu instalado. Esto te puede servir desde para recuperar datos como para instalar el GRUB que suele ser un problema.


Adivinar cual es la partición.
Lo más difícil de esto es adivinar cuál es tu partición en la que tenias el Ubuntu instalado, si la conoces el resto es una tontería. Lo más fácil es cogerte el Live CD de Knoppix y desde ahí con todas las particiones montadas ver cuál es la tuya, en mi caso era la sda8 porque tengo muchas particiones pero lo típico suele ser la hda3 o hda2. Si no tienes ese Live CD puedes ver las particiones con la orden:
fdisk -l /dev/particion
En mi caso, fdisk -l /dev/sda
Lo más normal suele ser hda o sda si sólo tienes un disco duro.
Con esta orden podrás ver todas las particiones y así sabrás cuales son las particiones con Linux.


Montar la partición en modo escritura.

Desmontar la partición

Si eres de lo que tu Live CD te ha montado las particiones yo te aconsejaría que la desmontaras desde ya, porque suelen estar montadas como sólo lectura y si lo que quieres es escribir datos lo llevas claro.
umount /mnt/
En mi caso, umount /mnt/sda8

Crear directorio donde montar tu partición

Por ejemplo, sudo mkdir /mnt/miUbuntu

Montar la particion con tu sistema de fichero y las opciones de lectura/escritura

mount -tsistema_ficheros -oopciones /dev/particion/mnt/lugar
En mi caso sería, mount -t ext3 -o rw /dev/sda8 /mnt/miUbuntu
Con esto ya puedes acceder a tu Ubuntu que tenias instalado y restaurar los archivos que necesites.

Cambiar el directorio raíz

Este es un paso opcional y te sirve para, como ya he mencionado, cambiar el directorio raíz y así tener la raíz en tu partición.
chroot /mnt/miUbuntu
A partir de ahora, ya no tendrás problemas si te cargas el inicio en tu Linux porque siempre podrás montarlo desde un Live CD.

Ejemplo en mi caso:
>> sudo mkdir /media/miUbuntu
>> sudo mount /dev/sda3 /media/miUbuntu/
>> sudo nautilus
>> sudo cp -R /media/miUbuntu/home /media/Datos/


viernes, 25 de mayo de 2012

Usar Macros en C/C++?


Imaginemos que queremos hacer una macro que nos devuelva el cuadrado de un número. En un primer intento escribiremos:
#define cuadrado(x) x*x

Pero sin darnos cuenta hemos caído en una trampa terrible. En un primer intento nos damos cuenta que 2/cuadrado(10) no funciona porque se expande a 2/10*10. Para intentar solucionarlo cambiamos la macro a:

#define cuadrado(x) (x*x)

Acto seguido vemos como no funciona al intentar hacer cuadrado(1+1) porque se expande a (1+1*1+1). Así que intentamos volver a arreglar la macro:

#define cuadrado(x) ((x)*(x))

Pero así y todo nos sigue sin funcionar de forma correcta al hacer:
int x = 2;
cuadrado(x++)
Porque se expande a ((x++)*(x++)). Finalmente intentamos usar otra solución:
int temp_var;
#define cuadrado(x) (temp_var=(x); temp_var*temp_var)

Pero sólo nos funciona con números enteros así que nunca más podrás hacer cuadrado(3.5). Para conseguir una versión de la macro que nos funcione de forma correcta deberemos tirar de extensiones del lenguaje no estándar:

#define cuadrado(x) ({typedef xtype = x; xtype xval = x; xval * xval; })

Una simple macro que en un principio parecía que no sería gran cosa nos ha obligado a usar extensiones del lenguaje que no nos ofrecen ninguna garantía de continuidad ya que no son parte del estándar. Pero es que el sistema de macros de C no acaba aquí, programar una macro que haga algo tan simple como:

strswitch(exp) {
case “hola”: llamar_hola(); break;
case “adios”; llamar_adios(); break;
default: llamar_pordefecto(); break;
}
Es literalmente imposible de llevar a cabo en C.