Módulo cargable en Linux

27 10 2009

Como parte de uno de los cursos que estoy llevando este semestre tuvimos que realizar un módulo cargable “en tiempo de ejecución” en Linux. Este aparte de mostrar mensajes de carga y descarga mediante dmesg, tenía que crear un archivo en el directorio /proc. A continuación la solución.

Primeramente hay que crear el archivo con el código fuente del módulo y agregar el código para el mismo. Abrimos una terminal de comandos y creamos una carpeta para tener un mejor orden y ahí dentro creamos el archivo.

mkdir modulo

cd modulo

nano primerModulo.c

A continuación el código fuente para el módulo.

/* El nombre del archivo es primerModulo */
#include <linux/module.h>          //para los detalles del modulo (Author, License…)
#include <linux/kernel.h>          //para usar la macro printk, KERN_INFO y KERN_ALERT
#include <linux/sched.h>           //para usar la estructura “task_struct”
#include <linux/proc_fs.h>    //para poder hacer la escritura en el archivo que estara en /proc

struct proc_dir_entry *structDirEntrada= NULL;
#define procfs_name “miprimermodulo”    //Nombre del archivo que se creara en /proc
char buff[500];        //buffer para escribir al archivo /proc/miprimermodulo

/*A continuacion viene la funcion de escritura en el archivo en /proc*/
int procfile_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int *eof, void *data){
int len;
static int count=1;
static char bufo[500];
if(offset>0)
return 0;
len=sprintf(bufo, “%s”, buff);
count++;
*buffer_location=bufo;
return len;
}

static int cargar(void){
//create_proc_entry lleva parametros nombre, modo, y padre de la estructura a la que se hace la asignacion.
structDirEntrada = create_proc_entry(procfs_name, 0644, NULL);

if (structDirEntrada == NULL) {
remove_proc_entry(buff, structDirEntrada);
printk(KERN_ALERT “Error: Could not initialize /proc/%s\n”, procfs_name);
return -ENOMEM;
}

//Ingresa el texto que se guardara en el archivo al buffer “buff”
sprintf(buff, “\n*** Hola soy el primer modulo de G10 – 200413044 ***\n\n”);

//A continuacion se setean varios de los parametros a los elementos de la estructura proc_dir_entry
structDirEntrada->read_proc = procfile_read;
structDirEntrada->owner = THIS_MODULE;
structDirEntrada->mode = S_IFREG | S_IRUGO;
structDirEntrada->uid = 0;
structDirEntrada->gid = 0;
structDirEntrada->size = 100000; //Se establece el tamaño del archivo en /proc (bytes)

//Lo siguiente tiene que ir hasta aca porque el estandar ISO C90 prohíbe las declaraciones mezcladas y código
printk(KERN_INFO “********************************************************\n”);
printk(KERN_INFO “* Hola, ahora se inicia la carga del modulo…\n”);
printk(KERN_INFO “* El user space del proceso es ‘%s’\n”, current->comm);
printk(KERN_INFO “* El PID del programa que lo inserto… %i\n”, current->pid);
printk(KERN_INFO “********************************************************\n”);
printk(KERN_INFO “——————————————————–\n”);
printk(KERN_INFO “——————————————————–\n”);
return 0;    //Se retorna 0 para indicar que todo salio bien, de lo contrario retorna != 0
}

static void descargar(void){
printk(KERN_INFO “#######################################\n”);
printk(KERN_INFO “# Se inicia la descarga del modulo… #\n”);
printk(KERN_INFO “#######################################\n”);
remove_proc_entry(buff, structDirEntrada);
}

module_init(cargar);    // Lo que se debe llamar al cargar un modulo
module_exit(descargar);    // Lo que se debe llamar al remover un modulo

MODULE_AUTHOR(“G10 – 200413044”);
MODULE_LICENSE(“Dual MIT/GPL”);
MODULE_DESCRIPTION(“Este es un modulo para la practica 3 de Sistemas Operativos 2.”);
MODULE_VERSION(“1:1.0-Beta1”);
//Existen mas licencias en module.h, y es quiza uno de los paramatros mas importantes.

Cuando terminanos de agregar el código, guardamos y cerramos el archivo. A continuación debemos crear el archivo make para la construcción del modulo. Esto se hace con los comandos siguientes.

nano Makefile


#Codigo del Makefile para la compilacion del modulo…
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
.PHONY: build clean
build:
#— Importante la linea siguiente debe ir tabulada —
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
#— Importante la linea siguiente debe ir tabulada —
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
else
$(info Building with KERNELRELEASE = ${KERNELRELEASE})
obj-m :=    primerModulo.o
endif

Guardamos y cerramos el archivo, a continuación para construirlo, en la terminal de comandos tecleamos el comando. Esto nos crea varios archivos, entre ellos uno con extensión .ko, el cual es módulo a cargar en sí.

make

Podemos ver las propiedades del modulo con el comando

modinfo primerModulo.ko

A continuación montamos/insertamos el módulo en el sistema, esto se hace con el comando

sudo insmod primerModulo.ko

Podemos ver los mensajes de bitacora del módulo con el comando

dmesg

Con el modulo ya cargado podemos ver que en /proc se creó el archivo que tiene como objetivo el módulo, este lo podemos abrir con programas como nano, cat o less. Cabe mencionar que este archivo es accesible unicamente mientras el módulo este cargado, cuando se descarga aparece, pero no es accesible.

cat /proc/miprimermodulo

Ahora tenemos que descargar el módulo, esto se hace con el comando.

sudo rmmod primerModulo

Para ver todos los mensajes de bitácora del módulo, podemos teclear el comando siguiente.

tail /var/log/messages

Este es un módulo bastante básico, sin embargo, bastante interesante para iniciarse en la programación de los mismo o simplemente para saber como funcionan los mismos.

Referencias:





Instalar Windows después de Linux

15 03 2009

Más de alguno talvez piensa que es dificil o que no es dificil la cuestion de la recuperada del grub, que Windows hecha a perder cuando se instala, gracias a que este sistema operativo (SO) no respeta el espacio y el libre albedrio de los demas sistemas que no sean sus hermanos (digase cualquier otra “distribución de Windows”, como dijo un cuate).

Total tenía instalado únicamente GNU/Linux en mi máquina y por gajes del oficio (o de la carrera, cosa que no me enoja en absoluto) tuve que instalar el otro SO, fue entonces cuando estuve pensando y pensando que hacia si instalaba Win en todo mi disco y luego reinstalar Linux o arriesgarme a posiblemente perder mis datos (en Linux) y ver como instalaba Windows manteniendo mis configuración de Linux, lo que no sabia es que sí se puede hacer una instalación limpia (y es por eso que hoy escibo esta entrada).

Como esta carrera es mucho de prueba y error, entonces hice un pequeño backup con unicamente los datos mas importantes (arriesgue hasta los varios capitulos de Futurama que ya habia bajado, los deje en disco duro) y me puse a hechar punta.

Primero hay que crear una partición NTFS. Si alguien ha intentado crear una particion con gParted, QtParted o desde la consola (como yo lo intente), cuando su sistema esta corriendo ya se habrán dado cuenta que no les dejará. Esto se debe a que las particiones deben estar desmontadas, por eso se debe hacer con un liveCD (lCD), así por ejemplo yo tengo un linuxMint. Entonces hay que insertar el lCD y reiniciar el ordenador, cuando el sistema del lCD este cargado, hay que elegir la opción <nombreDeMujer> -> Administración -> Partition Editor, ahí nos mostrará una ventanita con las particiones de nuestro disco, le damos click derecho a la partición que queremos redimensionar (generalmente será la de mayor espacio) y elegimos la opción Resize/Move y creamos la partición, esto nos creará un espacio no asignado, el cual luego de terminar la redimensión hay que formatear con sistema de archivos NTFS (clickDerecho -> Format to). Luego pues instalamos Windows en la particion creada (en la instalación elegir la partición del tamaño que creamos).

Cuando se termine la instalación de Windows y se reinicie… sorpresa!!!, hizo mierda el grub, todo porque como ya dije no respeta la libre existencia de la demas mara (SO’s) en el mismo disco. Bueno, cuando yo ya estaba, en este punto tenía hueva de usar superGrub, así que me dispuse a experimentar algo nuevo y que me pasaba por la cabeza. Fue entonces cuando se me ocurrio ver la tabla de particiones, redefinir la partición de “buteo”  y modificar el archivo menu.lst, de esa partición. Asi que volvi a meter el lCD, cuando el sistema cargo, abrí una una terminal (<nombreDeMujer> -> Accesorios -> Terminal) y escribí el comando para listar la tabla de particiones.

sudo fdisk -l #Te mostrará algo como lo que sigue, el orden en que lo muestre no importa, lo que si importa es notar los números enteros X, Y, Z, W.

Device        Boot      Start         End      Blocks               Id     System
/dev/sdaX       *           1               3824    30716248+   7      HPFS/NTFS
/dev/sdaY                 3825       14242    83682585      83     Linux
/dev/sdaZ                 14243       14593     2819407+   5       Extended
/dev/sdaW                14243       14593     2819376      82     Linux swap / Solaris

Donde X, Y, Z, W son números enteros. Lo que hay que hacer acá es redefinir la partición del boot (la del asterisco), para esto tecleamos

sudo fdisk /dev/sda #accedemos al gestor de particionamiento desde consola sobre el disco seleccionado.

a #Pulsamos a y luego enter, nos pedira un numero de partición ingresamos X, para quitarle el asterisco.

a #Pulsamos a de nuevo y luego enter, nos pedirá un numero de partición ingresamos Y, para asignar la nueva partición de “buteo”.

w #Pulsamos w y luego enter, con esto guardamos los cambios y salimos del programa de particionamiento.

sudo mount -t ext3 /dev/sdaY    /home/mint #montamos la partición que contiene nuestro sistema Linux.

sudo nano /home/mint/boot/grub/menu.lst #con el programa nano vamos a modificar el archivo menu.lst

#al final del archivo agregamos lo siguiente, para que en el menu del grub, poder elegir el otro SO

title                    <algunTituloParaWind>
rootnoverify    (hd0,X-1)
makeactive
chainloader     +1

#mas arribita en el archivo donde encontremos la linea    root  (hd0,n) (donde n es un numero entero) la debemos cambiar por    root    (hd0,Y-1)

#Pulsamos    Ctrl-X, luego   Y y luego   enter, con esto habremos guardado y salido del programa nano.

Cerramos la ventana de la terminal y reiniciamos el sistema (<nombreDeMujer> -> Salir -> Restart). Y… uuuaaala! todo ha regresado a la normalidad.

Bueno ojala y alguien le sirva esto. Si, mas de alguien dirá “que vergueo, mejor usa superGrub”, pero mi huevo… que de ahuevo es saber como funcionan las chivas a fondo, por lo menos ahora ya se como funciona superGrub y los programas de particionamiento y porque lo que tienen que hacer lo hacen cuando se reinicia el sistema.

Un saludo a todos los lectores.





Sabados de Software Libre (4)

5 03 2009

SSL4

SSL4

La invitación es para todos, los interesados y creo que en especial para los debianitas.





Ejecutar netBeans en Linux Mint

23 02 2009

Recientemente por varias cuestiones de la universidad me vi en la necesidad de instalar netBeans. La primera vez lo instale con un paquete de script en shell (.sh), y el proceso de instalación normal, al final aparecia el icono de netBeans en el menu aplicaciones, pero… sorpresa!, no se ejecutaba. La segunda vez lo instale desde la aplicación de manejo de paquetes en linea de comandos (que grueso se oye eso, pero no fue nada mas que un apt-get install netbeans  =D ) y sucedió lo mismo que la primera vez, el ícono no ejecuta el programa. Para la tercera ocasión mejor baje el instalador desde la pagina de java.sun.com la versión 6.5, y sucedio lo mismo, durante la instalación todo bien y creaba el icono en el menu aplicaciones, pero no se ejecutaba… rayos! Así que la necesidad me llevo a buscar una solución, googleando encontre… nada. Entonces me puse a pensar logicamente… porque no se ejecuta un programa cuando lo invocas desde uno de sus accesos directos?, posiblemente malas referencias, no lo se, lo cierto es que encontre dos soluciones:

  • Jalar el ícono del menú hacia el escritorio, es decir, crear un acceso directo (sí, parece mulada, pero funciona).
  • Abrir una terminal y teclear sh /usr/local/netbeans-6.5/bin/netbeans

Ojala y le sirva alguien y no se pase un rato quebrandose la cabeza como a mi me paso.

netBeans

netBeans

Me despido con algo gracioso (jajaja), un cuate dice: “Linux Mint, es un Ubuntu con nombre de mujer…”. Posiblemente   XD





La mejor distribución Linux

12 12 2008

Quién no se ha hecho esta pregunta… Cuál es la mejor distribución Linux???, pues eso mismo me pregunté yo el otro día y pues como tenía un poco de tiempo me puse a investigar y luego de mucho buscar, no encontre una respuesta concreta y no podria decir a ciencia cierta cual es, pues como lo leí en todos los sitios en los cuales busqué, esta es una respuesta que esta condicionada por un DEPENDE. Porque la verdad, distribuciones Linux existen un montón y cada una tiene sus propias variantes como por ejemplo los distintos sabores que nos dan los entornos de escritorio o si necesitamos una versión desktop o servidor (para alguna tarea o trabajo). Así mismo puedo decir que según lo que leí la distribución por excelencia para quienes se inician en el mundo Linux y/o no les gusta complicarse la vida, es al parecer Ubuntu, segun lo que pude leer. Sin embargo luego de mucho buscar encontré varios relatos de personas experimentadas (al parecer) que hablaban sobre su paso por varias distribuciones y que al final luego de haber llegado a ser Slackware users, mejor se quedaban con Gentoo (y no porque Slackware sea malo, sino que en ocasiones les daba problema con el tema de los drivers) y por lo que entiendo para usuarios intermedios/avanzados o que simplemente tienen algo de conocimiento, pero quieren probar algo nuevo y de las escencias de Linux, Gentoo es la distro que recomiendan.

Luego de eso me han dado ganas de probarlo, aunque por experiencia de otros cuates que ya han logrado instalarlo, cuentan que es una gran logro el solo hecho de llegar a ver el prompt “palpitando” en tu pantalla, luego de hacer un gran vergueo, jajaja, a ver que día empiezo a documentarme y a empezar a pedir soporte jajaja 😀 😀 😀

Mientras tanto, navegando encontre una aplicacioncita, la cual te dice cual es la mejor distribución Linux que se adapta a tus necesidades y conocimientos, claro, luego de hacerte un pequeño test para conocer tus conocimientos de informática, si te gustan las cosas faciles o no, si sabes sobre entornos de escritorio, etc., a continuacion se las dejo.

testLinux

Sites:

Gentoo

Slackware

Ubuntu





Tux en día de brujas

31 10 2008

En este día de brujas, tux no se quizo quedar atras, así que “se puso creativo” y diseñó su propio antifaz. Y andando de casa en casa, en lugar de preguntar dulce o travesura??? pregunta “Linux o Windows???” (respectivamente). Así que, si llega a tu casa, cuidado con dar una respuesta equivocada…

antifazDeTux

antifazDeTux

Y vos que contestarias???





Lo que paso en UbuconGuatemala

7 09 2008

Hoy se realizó acá en la ciudad de Guatemala el primer Ubucon, un evento en el cual, el tema central fué el software libre, un poco de su evolución, su importancia y lo más relevante la manera en que el mismo ha ido ganando espacio en el medio Guatemalteco.
El evento estuvo lleno de gente que le apasiona todo lo relacionado con linux, lo pude sentir en el ambiente, un ambiente (me atrevo a decir) geek, un ambiente en el que uno sentía que compartía el mismo sentimiento… el amor al software libre, el amor a la ideologia Linux.
Las conferencias estuvieron (como dice alguien por ahi) de nivel y como bien lo dice B3@, lo que mas me llego fué, que a pesar de que eran temas importantes y de relevancia, no fue nada tan formal como lo que estamos acostumbrados a ver, que viene el expositor expone (valga la redundancia) su tema y las preguntas se hacen al final. En Ubucon no fue así durante la conferencia de los diferentes temas quien tenia una duda la formulaba de una vez y no necesariamente contestaba el expositor, sino quien supiera la respuesta, como si estuvieras hablando con un grupo de cuates, en confianza. Esto fue de lo que mas me llego.
Por otro lado no hubo ni tiempo para ir a comer, pero y que???, si durante la exposición de efectos de escritorio (compiz) repartieron pizza, pero y a quién le molesto eso???, me atrevo a decir que a nadie, pues, que informático no es feliz viendo/escuchando temas que le gustan y comiendo pizza??? al menos yo sí.
Entre otras cosas, pude observar que se hicieron nuevas alianzas y propuestas de colaboración mutua, entre varios de los asistentes, cosa que es buena, pues solo juntos podemos salir adelante y ser más grandes.
Otra de las cosas que se mencionaron en el evento fue de que CONCYT organiza una reunion tecnológica-científica en la que las ciencias de la computación estan de lado, cosa lamentable la verdad, así que hay que hacer gestiones para que tengamos participación en ese sentido. Otra cosa fue el anuncio de la realización de la Convencion Guatemalteca de Software Libre, CGSOL 2008, a realizarse en Xela el 3 y 4 de octubre, para quienes se apunten, a mi en lo personal me gustaría poder ir.
Bueno hay mucho que decir, pero… yo creo que ya fue suficiente, a continuación les dejo una cuantas fotografias que tomamos con los cuates.
ORALE!!!