8 de enero de 2010

Recompilar el Kernel al estilo Debian: La Píldora Roja


Compilar el Kernel de Linux no es tan terrible como suena y se puede hacer de una forma conservadora manteniendo el anterion kernel por si las moscas.
En debian hay un método de recompilación del kernel que genera un paquete .deb instalable y desinstalable con apt o aptitude.
Tambien es posible recompilar el kernel en una máquina diferente a la que va destinada, esto está especialmente indicado en ordenatas antiguos, pudiendo luego instalarlo en la máquina carca como un paquete debian sin más.
Este método lo vi por algún sitio denominado como: La Píldora Roja.

Y ahora paso por paso:

1) Descargamos el Kernel y Patches: en www.kernel.org
La última versión estable o la que queramos con sus patches si los tuviera.

-lo descargamos en la carpeta /usr/src/ y lo descomprimimos-


# cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.3.tar.bz2
# tar xvf linux-2.6.32.3.tar.bz2

- Hacer el enlace simbólico a la carpeta del nuevo kernel-
- Es recomendable borrar otros enlaces simbólicos de kernels anteriores que hubiera-

# ln -s linux-2.6.32.3 linux


2) Paquetes Debian necesarios:


# aptitude update
# aptitude install kernel-package build-essential libncurses5-dev fakeroot initramfs-tools zlib1g-dev

-aptitude se encargará de revisar los paquetes instalados, sus dependencia y si faltara algún otro paquete-

3) Configurando el Kernel:

Este es el paso clave. Aquí es donde se pueden hacer virguerias simplificando el kernel, quitando módulos que no sean necesarios y/o poniendo nuevos modulos necesarios para el hardware del equipo. Aqui es donde hacemos que no funcione ni a tiros o cuando el kernel se adapta angelicalmente a las especificaciones de nuestro hardware.
Para la gente normal hay dos opciones asumibles:
  • Usar la configuración por defecto del nuevo kernel.
  • Si ya hay un sistema linux funcionando en la máquina podemos usar la configuración de nuestro kernel actual, pero ojo puede que las mejoras del nuevo kernel no se configuren correctamente e incluso que no funcione si son versiones muy distantes.
Vamos con la configuración:
-limpiamos configuraciones de anteriores compilaciones del kernel-

# cd linux
# make clean && make mrproper


Hay varias formas de configurar el kernel:
  • make defconfig; configuración por defecto.
  • make oldconfig; toma el antiguo config y pregunta las cosas nuevas.
  • make xconfig; menus basados en X.
  • make gconfig; menus para gnome.
  • make localmodconfig; nuevo sistema de configuración en 2.6.32.
  • make menuconfig; menus basados en ncurses.

-Para usar la configuracion del kernel actual: Copiamos el fichero de configuración del kernel actual al directorio del nuevo kernel con el nombre .config-


# cp /boot/config-2.6.26-2-486 /usr/src/.config

-Creamos el menu de configuración-

# make menuconfig

... y aqui tenemos el sancta sanctorum del kernel, que podemos curiosear, revisar, cambiar y escojer la mejor configuración para nuestro hardware.

- Seleccionamos "Load alternate Configuration File"
- Y nos aparace en el siguiente menu el archivo que hemos copiado ".config"
- Aceptamos todo y salimos del menú de configuración.

4) Compilando el Kernel:

# make-kpkg clean
# fakeroot make-kpkg --initrd --append-to-version=-pp01 kernel_image

Se puede y/o compilar también las cabeceras del kernel añadiendo al final del comando anterior: kernel_headers

Y ahora ... paciencia, ya que esto lleva su tiempo, tiempo, y tiempo de compilación.
En pantalla iran apareciendo los módulos que se van compilando.

Comprobar que no aparecen errores de compilacion: en este caso hay que encomendarse a san google para ver si hay algún otro incauto le haya ocurrido lo mismo, intentar corregirlo y vuelta a empezar.

Finalmente obtendremos los paquetes debian:

kernel-linux-image.deb
kernel-linux-headers.deb (si hemos puesto la opción kernel_header)

5) Instalación del nuevo kernel:

# dpkg -i kernel-linux-image.deb

La instalación hace todos los cambios necesarios para el funcionamiento del nuevo kernel, incluso cambia el menu de arranque de grub /boot/grub/menu.lst poniendo como arranque por defecto el nuevo kernel, cosa que convien revisar ya que a veces no acierta.
Comprobar tambien que se ha creado la carpeta /lib/modules/linux-2.6.32.3 con los nuevos módulos correspondientes.

y solo queda...

# reboot

No es de extrañar que la cosa no funcione a la primera, don't panic ... lo podemos desinstalar y el sistema volverá, ó debe volver!, a su estado anterior :))

# dpkg -r kernel-linux-image.deb


webRef:

-Tutoriales-
Kernel_Compilation_From_Source
Compilar-kernel-estilo-debian

-Optimizar el kernel 2.6.32-
Nueva opción de configuración: # make localmodconfig
http://preguntas.barrapunto.com/preguntas/10/01/04/2254250.shtml

Debian 5.0 Lenny con el kernel 2.6.32


El kernel actual de Debian Lenny es el 2.6.26, y segun este Brief Updates on Debian Project hay una imagen con el kernel 2.6.32.
Uuummh... esto puede ser interesante para ver si arreglo los problemas de la wifi rt73 de micra:

http://kmuto.jp/debian/d-i/

i386
  • lenny-custom-1230.iso - kernel version 2.6.32 ... (more details)
    [ download from JP or FR (usually faster) ]
    MD5: d7c6faec22bac62e6ca0ec6bc29a462e Size: 256 MB (268632064 bytes)
    [ hd-media: boot.img.gz (512MB USB image), netboot.tar.gz (TFTP boot) ]

  • lenny-custom-0627.iso - kernel version 2.6.30 + linux-firmware + ext4 support ... (more details)
    [ download from JP or FR (usually faster) ]
    MD5: 41d2cf9a3f03b067c97b7576eef0d856 Size: 228 MB (239527936 bytes)
    [ hd-media: boot.img.gz (512MB USB image), netboot.tar.gz (TFTP boot) ]

  • lenny-custom-0302.iso - kernel version 2.6.28 + WPA support + Ubuntu linux-firmware ... (more details)
    [ download from JP or FR (usually faster) ]
    MD5: cf6ef8f345d4ef259de8f69002529026 Size: 217 MB (228560896 bytes)
    [ hd-media: boot.img.gz (512MB USB image), netboot.tar.gz (TFTP boot) ]

5 de enero de 2010

Copiar, borrar, mover archivos en Perl


Para manejar archivos en perl tenemos el módulo: File::Copy

#!/usr/bin/perl
use File::Copy;

Copiar un archivo:
copy ("$file1","$file2") or die "Copy failed: $!";

Borrar una archivo:
unlink ($file2);

Mover archivo:
move ("$file1","$file2");

3 de enero de 2010

Como terminar un proceso con Perl

Pues con kill.
kill ( 'SIGNAL' , PID );

Lista de señales:

Signal
Number
Description
SIGHUP
1
On hangup
SIGINT
2
On interrupt
SIGQUIT
3
On Quit key
SIGILL
4
Illegal instruction
SIGTRAP
5
Trap instruction
SIGABRT
6
Abort message
SIGIOT
6
Input/output transfer
SIGBUS
7
Bus error
SIGFPE
8
Floating-point error
SIGKILL
9
Kill signal from system
SIGUSR1
10
User defined
SIGSEGV
11
Segmentation violation
SIGUSR2
12
User defined
SIGPIPE
13
Pipe fault (broken pipe)
SIGALRM
14
Alarm
SIGTERM
15
Termination
SIGSTKFLT
16
Stack fault
SIGchLD
17
Signal from child
SIGCONT
18
Continuing a stopped process
SIGSTOP
19
Stopping a process
SIGTSTP
20
Stopping a process from terminal
SIGTTIN
21
Stopping a process reading from controlling terminal
SIGTTOU
22
Stopping a process writing to controlling terminal
SIGURG
23
Urgent condition
SIGXCPU
24
Excessive CPU limits reached
SIGXFSZ
25
Excessive file size limits reached
SIGVTALRM
26
Virtual interval timer expired
SIGPROF
27
Profiling interval timer expired
SIGWINch
28
Window size changed by background process
SIGIO
29
Asynchronous I/O
SIGPWR
30
Power failure
SIGUNUSED
31
Unused

ejemplo:
kill ('KILL' , $PID);

REF:
http://ods.com.ua/win/eng/program/Perl5Unleashed/ch14.phtml#Signals

2 de enero de 2010

txt2regex, el consejero para las expresiones regulares

txt2regex: este programilla en modo texto resulta muy útil para crear y verificar Expresioner Regulares.
Funciona como un wizard, con preguntas directas que ayudan a crear la expresión regular requerida.

Para instalar el paquete debian:
#apt-get install txt2regex

Tiene unos menús para ir diseñando la expresión regular:


Tiene muchas opciones ...


y para muchos lenguajes de programación.

Ejecutar Perl scripts en background

Existe unos módulos específicos para esto.
Proc::Daemon
Este es un módulo de control de procesos:
Proc::PID::File

Instalacion en Debian:
# apt-get install libproc-daemon-perl libproc-pid-file-perl

Ejemplo de script en perl demonizado:
#!/usr/bin/perl
#Crea un archivo con registros del localtime cada 2 segundos
#bypp2010
use Proc::Daemon;
use Proc::PID::File;
use File::Copy;
Proc::Daemon::Init;
$c = 0;
unlink("./perl_daemon.txt"); #borra el archivo anterior
while ( 1 == 1 ) {
my $c = $c + 1;
open (FILE, ">>./perl_daemon.txt");
print FILE localtime(time);
print FILE "\n";
close (FILE);
sleep(2);
}

Estos script demonizados se puedes ejecutar desde otros scripts de perl usando
system (ruta del perl daemon);

ref:
http://misnotaslinux.blogspot.com/2010/01/ejecuntando-comamdos-linux-desde-perl.html
http://www.perladvent.org/2004/9th/

1 de enero de 2010

Ejecuntando comamdos Linux desde Perl

system("comando");
No captura la salida ni la entrada estandar.
Perl espera hasta que termina el comando linux.

exec("comando");
El control nunca retorna al programa Perl.
Termina perl y se ejecuta el comando.
 
open(handle, comando);
Sirve para abrir ficheros pero también para ejecutar comados Linux y capturar en el handle la entrada y/o salida estandard.

my $variable = `comando`;
La salida estandar del comado se asigna a la variable.

PostgreSQL & Perl

Perl permite una conexión directa a las bases de datos PostgreSQL mediante el interface generico DBI, el de PostgreSQL es el DBD::Pg que se conecta a la BDD como cliente tomando las filas, columnas y datos para usarlos en el programa perl.


0) Instalar el módulo DBD::Pg en Debian:
#apt-get install libdbd-pg-perl

1) Comprobar que el modulo DBD::Pg está correctament instalado, accediendo a una bsas de datos psql:

#!/usr/bin/perl
use DBI;
my $VAR01 = DBI->connect("dbi:Pg:databasename",'user','password');
my $VAR02 = $VAR01->disconnect();

-Si sale algun error es que no esta correctamente instalado el módulo perl-

1) Conexion a una BDD psql desde perl:

use DBI; # módulos que vamos a usar

use DBD::Pg; # esto no haría falta

my $DBI = DBI->connect("dbi:Pg:dbname=nombredelabasededatos");
my $dbh = DBI->connect("dbi:Pg:dbname=template1", 'nombreusuario', 'clave');



2) Extraer tuplas con perl de una BDD psql:
Usando los ciclos de preparacion, ejecución y extracción de datos.

#!/usr/bin/perl
use DBI;
use strict;
my $dbh = DBI->connect("dbi:Pg:dbname=ipuniverse",'USER');
$dbh->{RaiseError} => 1; #ref

my $sth = $dbh->prepare("SELECT * FROM scann2 WHERE scann2.px='O' AND scann2.yy='0' LIMIT 1");
$sth->execute;
my @row;
@row = $sth->;fetchrow_array or die "No match for query";

my $var1 = $row[0];
my $var2 = $row[1];
my $var3 = $row[2];
my $var4 = $row[3];

print "$row[0] $row[1] $row[2] $row[3]\n";
print "$var1 $var2 $var3 $var4\n";

$sth->finish;
$dbh->disconnect;
exit;

Con este script hemos extraido los registros de una tupla de una BDD de PostgreSQL y los hemos asignado a las varables en perl.

INSERTando segistros en PostgreSQL desde Perl:
Se recomienda usar el método secuencial de preparación y ejecución por motivos de rendimento especialmente si hay busquedas en la bdd.
También esta el método directo, prepare+execute todo en uno.
Un ejemplo de ambos métodos:

#!/usr/bin/perl
use DBI;
use strict;
#conectamos con la BD
my $dbh = DBI->connect("dbi:Pg:dbname=ipuniverse",'USER');
$dbh->{RaiseError} => 1;

#metodo directo
$dbh->do("INSERT INTO table VALUES ('valores','$variables')");

#método secuencial
my $sth = $dbh->prepare("UPDATE table SET campo1='valor o variable' WHERE campo2='valor o variable'");
$sth->execute;
$sth->finish;

$dbh->disconnect;

REF:

http://www.arsys.info/programacion/bases-de-datos/perl-y-dbi/
http://flanagan.ugr.es/dbi/manual.htm
http://geneura.ugr.es/~jmerelo/tutoriales/bd-sql/
Ejemplos de instrucciones perl-postgresql:
http://linuxbloggers.org/create-insert-select-update-perl-script-and-postgresql-database-examples/
Tutorial PSQL desde Perl:
http://www.felixgers.de/teaching/perl/perl_DBI.html


La fecha en Perl: time() y localtime()

time()
Este número representa la cantidad de segundos que han transcurrido desde una fecha en específico, en la mayoría de los sistemas esta fecha es el 1º de Enero de 1970 a las 0 horas GMT, una excepción de estos sistemas es la Mac, que cuenta los segundos desde el 1º de Enero de 1904 en la zona horaria del sistema:
1262363355 

localtime(time)
Toma este número y lo transforma en un número formado por:

#   0,    1,   2,   3,    4,    5,   6,    7,     8
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
 
$sec(segundos), $min(minutos), y $hour(horas), representan la hora de la fecha especificada por time.
$mday es el día del mes y $mon es un número del 0 al 11 que representa el mes, donde 0 es Enero y 11 es Diciembre.
$year es la cantidad de años desde 1900 a la fecha. Así que para 2007 este elemento tendrá un valor de 107.
$wday es el día de la semana, representado con un número del 0 al 6, donde 0 es Domingo y 6 es Sábado.
$yday es el número del día del año, este número está en el rango del 0 al 364 y hasta 365 en años bisiestos.
Finalmente $isdst es verdadero en el caso de que la fecha esté dentro del horario de verano, también conocido como Daylight Saving Time, será falso de lo contrario.

Script para la fecha en perl:
#!/usr/bin/perl
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon++;
print "$mday/$mon/$year $hour:$min:$sec\n";

Script para el formato: yyyymmddhhmmss:

#!/usr/bin/perl
#bypp2010

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = $year + 1900;
$mon++;
if ($sec < 10) { $sec = "0$sec"; }
if ($min < 10) { $min = "0$min"; }
if ($hour < 10) { $hour = "0$hour"; }
if ($mday < 10) { $mday = "0$mday"; }
if ($mon < 10) { $mon = "0$mon"; }

print "$year\n";
print "$mon\n";
print "$mday\n";
print "$hour\n";
print "$sec\n";

my $FECHA = $year . $mon . $mday . $hour . $min . $sec;

Tutorial PostgreSQL y PSQL desde Perl

Un tutorial resumido y al grano para PostgreSQL:
http://geneura.ugr.es/~jmerelo/tutoriales/bd-sql/