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:





Ubuntu Jaunty Jackalope Party

8 05 2009

En los últimos días se ha estado organizando una pequeña reunión de tipo informal, esto en conmemoración del nuevo release de Ubuntu y a la vez por la formación de una manera más formal del grupo de usuarios de Ubuntu en Guatemala, ubuntu-gt y la migración de este a donde estan concetradas las listas de Ubuntu al rededor del mundo.

Esta actividad tiene como finalidad principal que todos se conozcan entre sí, ya que en la web, listas de correos y canales IRC en muchas ocasiones uno sólo sabe el nombre o el nick de la mara, sin embargo, son muy pocos a los que conocemos en persona. Pero eso no es impedimento para que quien tenga una duda sobre Ubuntu, quiera una copia del sistema, hacer un par de instalaciones o que simplemente quiera participar, no llegue. A esta actividad están todos cordialmente invitados. La misma se estará llevando a cabo en:

Plaza Fontabella, Sophos el día sábado 16 de mayo en horario de 1600 a 1900 hrs. (aproximadamente), este lugar esta ubicado en la 4ta.  Av. 12-59 zona 10

Ubuntu Jackalope Party

Ubuntu Jackalope Party

Todos los que esten en el rollo, los que no (quizá usan otra distro) y los que se quieran iniciar son bienvenidos.

Y para quienes gustan del beber… luego de esta reunión en un horario mas “decente”, nos estaremos trasladando a un lugar mas “decente” para el respectivo e infaltable post-evento.   😀  😀  😀

Mapa del lugar

Mapa del lugar

Para quienes no conocen Sophos, yo igual no conozco, pero el Dios programador bendiga a googleMaps.   😀





Nueva lista de información de Ubuntu-gt

5 05 2009

Hasta el día de hoy todos los usuarios de Ubuntu concentrados en Guatemala (así como también algunos extranjeros), hacen uso de uno de los tan utiles grupos de Google, sin embargo, con miras a ser reconocidos y obtener apoyo de parte de Canonical, se ha tomado la decisión de que deje de funcionar este grupo, para migrar hacia uno de los foros oficiales destinados para esto.

Es por eso que a partir del viernes 15 de mayo la lista de google groups de ubuntu-guatemala, será cerrada, esto por la confusión que se genera por el hecho de usar dos listas (la de google groups y esta nueva) y que no se tiene concentrada a todas las personas en un lugar en común.

Es por ello que de ahora en adelante la lista que se utilizará será https://lists.ubuntu.com/mailman/listinfo/ubuntu-gt ahí pueden suscribirse para ser parte de esta lista y a la vez acá pueden remitir a las nuevas almas que se quieran iniciar o unir a este team.





Ubuntu Release Party

5 05 2009

Así es como se conoce a la fiesta/reunión que se realiza (aunque no obligatoriamente) cada vez que sale una nueva versión de Ubuntu y acá en Guatemala se tiene en mente la realización de una de estas fiestas, aún no hay nada concreto, sin embargo, se espera que se pueda organizar y se esta coordinando para que se logre.

Esta es una reunión de caracter no tan formal, pues de lo que se trata es de intercambiar ideas o hacer comentarios sobre las nuevas caracteristicas y mejoras del nuevo release de este sistema operativo, así como también molestar un rato con los cuates.

Si quieren enterarse aún más sobre esta actividad, quieren participar, aportar ideas o simplemente curiosear, este martes 05 de mayo en horario de las 2100 hrs. se estará realizando una reunión para definir detalles para esta actividad. La reunión se llevará a cabo mediante IRC en el servidor irc.freenode.net en el canal #ubuntu-gt

Y a cualquier hora también son bienvenidos en el canal casi siempre hay alguien (gente que conoce bastante del tema) que les puede ayudar con alguna duda que tengan, solo que quiza si deben de tener un poco de paciencia, pues como bien lo profesa el lema del canal… “Bienvenidos a Ubuntu Guatemala – Haz tu pregunta con confianza”.

A continuacion les dejo el link del wiki para la realización del evento, para que le den una ojeada y tengan una idea de lo que se quiere y tiene pensado https://wiki.ubuntu.com/GuatemalanTeam/Re_UBR_01

También aca esta el wiki del team de Ubuntu Guatemala, acá hay información sobre eventos, un enlace directo al canal de IRC (mediante tu browser), entre otras cosas    https://wiki.ubuntu.com/GuatemalanTeam

Enlace directo al canal de ubuntu-gt  irc.freenode.net, #ubuntu-gt





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   😄





Ver cuando un contacto se conecta en Pidgin

3 01 2009

Pidgin

Pidgin

Pidgin es un cliente multiprotocolo de mensajeria instantanea que nos permite conectarnos a varias cuentas simultaneamente y nos la posibilidad de conectarnos a canales IRC (Internet Relay Chat), así por ejemplo, yo lo uso para conectarme a mis cuentas de msn, googleTalk, Yahoo y algunos canales IRC. Pidgin hasta hace poco tiempo era llamado Gaim, pero por cuestiones legales tuvo que cambiar su nombre a Pidgin y así agregó e implementó varias funcionalidades y características que lo hacen un buen cliente de mensajeria instántanea, entre estas características se encuentran que las conversaciones se pueden ordenar por pestañas, es multisesion, maneja varios de los protocolos mas conocidos, manejo estados distintos por cada cuenta y dentro de sus complementos existen un monton de opciones más. Otra de las cosas que cabe mencionar es que pidgin viene pre instalado por defecto en varias de las distribuciones Linux, es multiplataforma (aparte de Linux, también existe una versione para Windows, para PDA’s y Mac OsX, si embargo para estos dos ultimos son versiones un tanto mas especializadas). Pidgin actualmente va por la versión 2.5.3 que fue liberada el 20 de diciembre de 2008 y como un programa de software libre, es liberado bajo una licencia GPL.

Sin embargo platicando con compañeros y amigos que también lo usan hemos comentado un poco sobre el hecho de que una de sus debilidades es que, por defecto no muestra notificaciones cuando un contacto se conecta, cosa que si bien no es crucial, no le quita lo bueno a Pidgin, pero por alguna razón es bueno y necesario saber cuando un contacto se conecta. Y es por eso que el otro día me puse a investigar un poco sobre esto y encontre que como solución recomendaban instalar un complemento llamado gaim-guifications yo pense que serviría, pero al quererlo instalar (ya sea mediante consola o descarga y descompresion del paquete) busca que se tenga instalado el programa Gaim, sin embargo nosotros tenemos instalado Pidgin, entonces se me ocurrio probar instalar pidgin-guifications y… uala!!! funcionó (jajaja que guasa). Entonces para que poder instalar este complemento y ver cuando tus contactos se conectan (y varios avisos más) basta con abrir una consola de comandos (al menos ahorita estoy usando ubuntu) y tecleamos

apt-get install pidgin-guifications

por supuesto esto con poderes de superUsuario (sudo su).

Luego para acceder a las opciones de configuración que nos proporciona, reiniciamos Pidgin luego en la ventana de principal vamos al menú Herramientas => Complementos y en el cuadro de diálogo, buscamos el complemento guifications y mas abajo está un botón con el cual configuramos nuestras las preferencias a nuestro gusto.

Aviso de amigo conectado

Aviso de actividad de contacto

Pidgin

Pluggins para pidgin





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