Páginas

martes, 31 de julio de 2012

Alinear particiones linux


Particiones alineadas

Después de ejecutar fdisk -l aparece un mensaje similar a este:

Disk /dev/sda: 640.1 GB, 640135028736 bytes
255 heads, 63 sectors/track, 77825 cylinders, total 1250263728 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 byes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e1f0

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          63       96388       48163+  83  Linux
Partition 1 does not start on physical sector boundary.
/dev/sda2           96389      594404      249007+  82  Linux Swap
Partition 2 does not start on physical sector boundary.
/dev/sda3          594405    40596254    20000925   83  Linux
Partition 3 does not start on physical sector boundary.
/dev/sda4        40596255  1250263727   604833736+  83  Linux
Partition 4 does not start on physical sector boundary
....

Todos los sectores donde empiezan las particiones deben ser múltiplo de 8. Caso contrario, está mal alieada la partición o particiones.

Fdisk en versiones anteriores de modo predeterminado gestiona los tamaños de las particiones sin alinear al tamaño del sector. Herramientas modernas de particionado utilizan libparted > 2.1 que de forma automática realizan alineamiento compatible 1Mb.

Las nuevas unidades de sectores 4096 bytes

Logical block size: 512 bytes
Physical block size: 4096 bytes

Alinear particiones pasa por reparticionar el disco duro y este proceso es posible realizarlo en Linux sin perder un solo dato. Utilizando un disco externo de 120Gb montado en /media/recuperacion copiar todos los datos de la partición de datos:

# cp -R /media/datos/* /media/recuperacion/

Características:
Disco duro 500 GB 9 particiones distribuidas de la manera siguiente. Las particiones sda8 de datos y sda9 tmp se crearán despues de recuperar el sistema:

$ ls -l /dev/disk/by-label

lrwxrwxrwx 1 root root 10 jul 31 10:12 datos -> ../../sda8
lrwxrwxrwx 1 root root 10 jul 31 10:12 gentoob -> ../../sda1
lrwxrwxrwx 1 root root 10 jul 31 08:10 gentooh -> ../../sda7
lrwxrwxrwx 1 root root 10 jul 31 08:10 gentoor -> ../../sda3
lrwxrwxrwx 1 root root 10 jul 31 08:10 gentoot -> ../../sda9
lrwxrwxrwx 1 root root 10 jul 31 10:12 ubuntuh -> ../../sda6
lrwxrwxrwx 1 root root 10 jul 31 10:12 ubuntur -> ../../sda2

Desde la instalación de gentoo se crean y montan los directorios ubuntur y ubuntuh:
# mkdir /media/ubuntur
# mkdir /media/ubuntuh
# mount -v -t ext3 /dev/sda2 /media/ubuntur
# mount -v -t ext3 /dev/sda6 /media/ubuntuh
# mkdir /media/recuperacion/ubuntu

Entrar en los directorios y realizar los backups:
# cd /media/ubuntur
# tar czvf /media/recuperacion/ubuntu/ubuntu-raiz.tar.gz *
# cd ..
# cd /media/ubuntuh
# tar czvf /media/recuperacion/ubuntu/ubuntu-home.tar.gz *
# cd ..

Al finalizar los backups desmontar las particiones
# umount /media/ubuntuh
# umount /media/ubuntur

Reiniciar y desde la instalación ubuntu realizar los mismos pasos:
Crear directorios y montarlos:
# mkdir /media/gentoob
# mkdir /media/gentoor
# mkdir /media/gentooh
# mount /dev/sda1 /media/gentoob
# mount /dev/sda3 /media/gentoor
# mount /dev/sda7 /media/gentooh
# mkdir /media/recuperacion/gentoo

Realizar los backup
# cd /media/gentoob
# tar czvf /media/recuperacion/gentoo/gentoo-boot.tar.gz *
# cd ..
# cd /media/gentoor
# tar czvf /media/recuperacion/gentoo/gentoo-raiz.tar.gz *
# cd ..
# cd /media/gentooh
# tar czvf /media/recuperacion/gentoo/gentoo-home.tar.gz *

Desmontar particiones
# umount /media/gentoob /media/gentoor /media/gentooh

Realizado el backup de las particiones abrir gparted y copiar el tamaño aproximado de las particiones:

sda1 ext2 97 Mb
sda2 ext3 25 GB
sda3 ext3 25 GB
sda4 extended 415 Gb
sda5 swap 2 GB
sda6 ext3 20 Gb
sda7 ext3 20 Gb
sda8 ext3 200 Gb
sda9 reiserfs 8 Gb
sin asignar 165 Gb

Reiniciar con un livecd, en este caso el livedvd gentoo linux 13.0
Después de la carga del sistema utilizando fdisk particionar el disco. La versión incluida en el mencionado livedvd inicia por defecto desde 2048 bytes. Versiones anteriores empiezan desde 63 bytes en cuyo caso no se acepta el valor por defecto y se sustituye por 64 bytes.

Crear, formatear particiones, hacer sda1 arrancable. Primero eliminar todas las particiones.
# fdisk /dev/sda
Crear las particiones utilizando fdisk
Crear los sistemas de ficheros
Crear e inicializar swap.
# mkswap /dev/sda5
# swapon /dev/sda5


Conmutar el indicador de iniciable.

Abrir un terminal y pasarse a root:
# sudo su

Restaurar particiones:
formatear partición, crear directorios y montarlos
# mkfs.ext2 /dev/sda1
# mkdir /media/{gentoob,gentoor,gentooh,ubuntur,ubuntuh}
# mount -t ext2 /dev/sda1 /media/gentoob
# cd /media/gentoob
# tar xzvf /media/recuperacion/gentoo/gentoo-boot.tar.gz
# mkfs.ext3 /dev/sda2
# mount /dev/sda2 /media/ubuntur
# cd /media/ubuntur
# tar xzvf /media/recuperacion/ubuntu/ubuntu-raiz.tar.gz
# mkfs.ext3 /dev/sda3
# mount /dev/sda3 /media/gentoor
# cd /media/gentoor
# tar xzvf /media/recuperacion/gentoo/gentoo-raiz.tar.gz
# cd ..
# mkfs.ext3 /dev/sda6
# mount /dev/sda6 /media/ubuntuh
# cd /media/ubuntuh
# tar xzvf /media/recuperacion/ubuntu/ubuntu-home.tar.gz
# cd ..
# mkfs.ext3 /dev/sda7
# mount /dev/sda7 /media/gentooh
# cd /media/gentooh
# tar xzvf /media/recuperacion/gentoo/gentoo-home.tar.gz
# cd ..

Desmontar particiones:
# umount /media/gentoob /media/gentooh /media/gentoor

Reinstalar grub y cambiar los uuid para ubuntu en los archivos /boot/grub/menu.lst y /etc/fstab.

# mount -v -t ext2 /dev/sda1 /media/gentoor/boot
# mount -v -t ext3 /dev/sda7 /media/gentoor/home

Montar el sistema de ficheros /proc para permitir a la instalación utilizar la información proporcionada por el kernel incluso dentro del chroot y montar de forma transparente el sistema de ficheros /dev.

# mount -t proc none /media/gentoor/proc
# mount -o bind /dev /media/gentoor/dev

Entrar en el nuevo entorno de instalación chrooting:
# chroot /media/gentoor /bin/bash
# env-update
>>> Regenerating /etc/ld.so.cache...
# source /etc/profile
# export PS1="(chroot) $PS1"

Actualizar /etc/mtab que contiene la información relativa a todos los ficheros montados:
# grep -v rootfs /proc/mounts > /etc/mtab

Instalar grub:
# grub-install --no-floppy /dev/sda

Salir del chroot y reiniciar
# exit
# umount /media/gentoor/boot /media/gentoor/home
# umount /media/gentoor/proc /media/gentoor/dev
# umount /media/gentoor
# reboot

Crear el sistema de ficheros reiserfs para la partición tmp se puede realizar una vez iniciado el sistema. En Gentoo con la utilidad reiserfsprogs. Comentar esta linea en /etc/fstab y descomentarla despues de crear el sistema de fichero:

# /dev/sda9 /tmp reiserfs notail,noatime,nodev,nosuid,noexec 0 0

Creo el sistema de ficheros reiserfs para particion tmp:
# emerge reiserfsprogs
# mkreiserfs -f --l "gentoot" /dev/sda9

Utilizar gparted para crear la particion de datos. Crear directorio /media/datos y agregar entrada al archivo /etc/fstab
# vi /etc/fstab
/dev/sda8 /media/datos ext3  users,defaults,nodev,nosuid 0 2


# mount -a

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sda1   *        2048      200703       99328   83  Linux
/dev/sda2          200704    52629503    26214400   83  Linux
/dev/sda3        52629504   105058303    26214400   83  Linux
/dev/sda4       105058304   976773167   435857432    5  Extendida
/dev/sda5       105060352   109254655     2097152   83  Linux
/dev/sda6       109256704   151199743    20971520   83  Linux
/dev/sda7       151201792   193144831    20971520   83  Linux
/dev/sda8       193146880   617873407   212363264   83  Linux
/dev/sda9       617875456   634652671     8388608   83  Linux



Linux es genial!.

miércoles, 25 de julio de 2012

Udev


Como configura Linux el hardware

Fuente: Oliver Frommel, Rene Rebe, Klaus Knopper

Linux heredó de UNIX la maxima "todo es un fichero". Esta abstracción permite a los programas utilizar nodos de dispositivos para acceder al hardware del ordenador como si se tratara de un fichero ordinario.

La tabla de texto pci.ids se encuentra en
/usr/share/misc/pci.ids
Puede comprobar que es un fichero con más de 20,000 líneas:
# wc -l /usr/share/misc/pci.ids
20460 /usr/share/misc/pci.ids

La mayoría de los componentes hardware PCI contienen unas id's de fabricante y producto. Estas id's se expresan como dos números hexadecimales.

# lspci -n

# lspci -v

En la actualidad la tabla legible se mantiene fuera del kernel y las id's de fabricante y producto se leen desde el bus del sistema.

Para detectar el hardware se necesita un mapeo entre las id's del PCI y el nombre del módulo del kernel a cargar a través de modprobe. Busca en la tabla pci.ids los nombres de los módulos a partir de las id's del PCI y carga los módulos listados allí.

Udev es el moderno demonio de detección hardware en Linux. Utiliza una funcionalidad compilada en el kernel. Udev escanea el sistema y revisa la lista de módulos, y con la id PCI de fabricante y producto carga el módulo para esa tarjeta.

# modinfo iwl3945
Muestra los parámetros del módulo, licencia, autor, alias pci, dependencias, firmware, etc.

# modprobe iwl3945

# lsmod | grep iwl3945


Linux es genial!.

viernes, 13 de julio de 2012

Instalar flash x86_64

Fuente: http://forums.gentoo.org/viewtopic-t-195629.html

Si al intentar instalar adobe-flash en Gentoo este aparece como masked se debe a que primero debe aceptarse la licencia (software propietario), al archivo /etc/portage/package.license:

>=www-plugins/adobe-flash-11.2.202.236 AdobeFlash-10.3

Esto es posible hacerlo de la manera tradicional, agregando la línea anterior al archivo package.license o utilizando --auntoumask-write
# emerge -av adobe-flash --autounmask-write

Mantenimiento del fichero world.
Algunos paquetes no se agregan al fichero world, por razones diferentes. La función de la utilidad regenworld tiene es regenerar el fichero world a partir de los paquetes instalados:

# regenworld
add to world: app-emulation/emul-linux-x86-baselibs
add to world: media-sound/alsa-utils
add to world: app-portage/ufed
add to world: app-text/mupdf
add to world: www-plugins/adobe-flash

Please review differences between old and new files, and replace
the old file if desired.

  old: /var/lib/portage/world  new: /var/lib/portage/world.whfb96.tmp
# cp /var/lib/portage/world.whfb96.tmp /var/lib/portage/world.

Sacando información al sistema
$ emerge --info
Utilidades eix
El website de los usuarios linux de Monovár (Alicante)
Fuente: http://www.monovarlinux.org nos describe como podemos desinstalar gnome o kde con la ayuda de eix:.
# emerge eix

Analizando portage

# eix-update

Listar todos los paquetes pertenecientes a la categoría gnome-base 

# eix -C gnome-base -–only-names –-installed


Eliminar todos los paquetes de gnome-base y gnome-extra utilizando emerge y eix:

emerge -C `eix -C gnome-base –only-names –installed`
emerge -C `eix -C gnome-extra –only-names –installed`
revdep-rebuild

El mismo concepto es aplicable a otros entornos gráficos como kde:

emerge -C `eix -C kde-base –only-names –installed`
emerge -C `eix -C kde-misc –only-names –installed`
revdep-rebuild

Linux es genial!.

Acelerar optimizar sistema

Fuentes:
http://wiki.sabayon.org/index.php?title=How_to_optimize_and_accelerate_your_system
http://www.linuxeando.org/foros/index.php?topic=729.0

Optimizar y acelerar sistema gentoo.

Muchas por no decir todas estas reglas serán aplicables (seguramente), a casi todas las distribuciones Linux, aunque tengo que decir que la mayoría no las necesitará porque los programadores y mantenedores de esas distros (las basadas en Red Hat y Debian, por ejemplo), las incorporan por defecto. Ubuntu, Debian, Centos, etc. Desde el portátil que escribo (Dell Inspiron con Ubuntu 8.04 preinstalado en sda2 y gentoo en sda3)  he podido comprobar que esta optimización no es necesaria en ubuntu.

$ ls -l /dev/disk/by-label

total 0
lrwxrwxrwx 1 root root 10 jul 13 07:41 boot -> ../../sda1
lrwxrwxrwx 1 root root 10 jul 13 07:40 datos -> ../../sda9
lrwxrwxrwx 1 root root 10 jul 13 08:09 gentoo_h -> ../../sda7
lrwxrwxrwx 1 root root 10 jul 13 08:09 gentoo_r -> ../../sda3
lrwxrwxrwx 1 root root 10 jul 13 07:40 ubuntu_h -> ../../sda6
lrwxrwxrwx 1 root root 10 jul 13 07:40 ubuntu_r -> ../../sda2

He instalado (en otro disco duro pero en esta misma máquina), la distribución Centos 6.2 incluida en Linux Magazine del mes de March 2012 que me enviaron de regalo después de pasar el examen LPIC-1 y la verdad viene optimizada al máximo y con mucho software pre-instalado. Centos es una maravilla de distro para usuario final y extremadamente potente y segura en Servidores, con mucha documentación en diferentes idiomas.

El mérito de este artículo es de los chicos de Saboyan (derivada de Gentoo). Vease la url en la parte superior.

Detales de mi máquina:

$ uname -a
Linux zeus 3.3.8-gentoo #1 SMP Thu Jul 12 04:19:51 CEST 2012 x86_64 Intel(R) Core(TM)2 Duo CPU T5750 @ 2.00GHz GenuineIntel GNU/Linux.

$ cat /proc/meminfo|grep -i memtotal
MemTotal:        4045372 kB

Disco duro, Sata II 500 Gb 5400 RPM. 5MB memoria interna (un disco normalito).

Arrancar servicios Openrc en paralelo

Cambiar
# vi /etc/rc.conf

rc_parallel="YES"
rc_logger="NO"

Los servicios necesarios del sistema no deben desactivarse pero otros si. Puede conocerlos con la utilidad
# rc-update show
Rendimiento del disco duro:
# vi /etc/conf.d/hdparm
hda_args="-a16 -c1 -k1 -u1 -S0"
cdrom0_args="-c1 -k1 -u1

Agrego hdparm al arranque del sistema:
# rc-update add hdparm boot

preload es un demonio readhead adaptado que supervisa los programas más utilizados. Parte de esos programas los almacena en cache y aumentar la velocidad de carga:

# emerge -av preload
# rc-update add preload default

Los archivos temporales se borran durante el apagado, se puede colocar sus lugares de almacenamiento en la memoria RAM. Esto reduce el número de operaciones de disco , haciendo más rápido programas que utilizan carpetas temporales.

# vi /etc/fstab

 tmp     /tmp      tmpfs rw,mode=1777 0 0
 vartmp  /var/tmp  tmpfs rw,mode=1777 0 0


Retraso de la repetición del teclado, sin recompilar X11:
# vi /etc/X11/xorg.conf

Por defecto el tiempo de repetición de 500 milisegundos, y el tiempo de respuesta por defecto de 30 milisegundos. Esto cambia a 530 y 0, respectivamente.
....
Section "InputDevice"
Identifier "logitech"
Driver "kbd"
  Option "AutoRepeat" "530 0"
EndSection

En este sistema específico no implementé el resto de optimizaciones. Por si fuera útil incluyo los archivos /etc/sysctl.conf y /root/rules.sh (firewall) y como arrancarlo al iniciar el sistema.
Archivo /etc/sysctl.conf.

# cat /etc/sysctl.conf |grep ^[^#] | colorlog.pl
kernel.printk = 4 4 1 7
fs.inotify.max_ ser_watches = 524288
vm.mmap_min_add  = 65536
fs.file-max = 1 384
kernel.threads- ax = 2048
net.ipv4.conf.e h0.arp_ignore = 1
net.ipv4.conf.e h0.arp_announce = 2
net.ipv4.conf.a l.arp_ignore = 1
net.ipv4.conf.d fault.rp_filter = 1
net.ipv4.ip_for ard = 0
net.ipv4.icmp_e ho_ignore_broadcasts = 1
net.ipv4.conf.a l.rp_filter = 1
net.ipv4.conf.a l.send_redirects = 0
net.ipv4.conf.a l.accept_redirects = 0
net.ipv4.conf.a l.accept_source_route = 0
net.ipv4.conf.a l.arp_announce = 1
vm.swappiness = 5
Un firewall básico para un host con iptables.
# ls -l /root/rules.sh 
-rwx------ 1 root root 1229 jul 12 07:08 /root/rules.sh
# cat /root/rules.sh 

IPT=/sbin/iptables

# Flush old rules, old custom tables
echo " * flushing old rules"
$IPT --flush
$IPT --delete-chain

# Set default policies for all three default chains
echo " * setting default policies"
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# Enable free use of loopback interfaces
echo " * allowing loopback devices"
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# All TCP sessions should begin with SYN
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

# Allow established and related packets
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Open the following ports
echo " * allowing ssh on port 22"
$IPT -A INPUT -p tcp --dport 22  -m state --state NEW -j ACCEPT

echo " * allowing dns on port 53"
$IPT -A INPUT -p udp -m udp --dport 53 -j ACCEPT

echo " * allowing http on port 80"
$IPT -A INPUT -p tcp --dport 80  -m state --state NEW -j ACCEPT

echo " * allowing https on port 443"
$IPT -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

echo " * allowing ping responses"
$IPT -A INPUT -p ICMP --icmp-type 8 -j ACCEPT

# DROP everything else and Log it
$IPT -A INPUT -j LOG
$IPT -A INPUT -j DROP
#
# Save settings
#
echo " * saving settings"

Ejecutar script:

# /root/rules.sh
 * flushing old rules
 * setting default policies
 * allowing loopback devices
 * allowing ssh on port 22
 * allowing dns on port 53
 * allowing http on port 80
 * allowing https on port 443
 * allowing ping responses
 * saving settings

Guardar la configuración actual:
# /etc/init.d/iptables save
iptables      | * Saving iptables state ...                                 [ ok ]

Iniciar iptables con el sistema:
# rc-update add iptables default
 * service iptables added to runlevel default

Linux es genial!.

jueves, 5 de julio de 2012

Colorear logs

En la página de Christian Schneider, (programador alemán  Linux, Perl, Html, Css y PHP - guru , originario de la preciosa ciudad de Regensburg http://www.strcat.de/ ), encontré un script para colorear la salida por terminal, de los logs, mensajes del kernel (dmesg), etc de manera que resulte más facil su lectura.

Es un script en Perl de nombre colorlog.pl Utilizando un editor de texto lo guardamos en, por ejemplo, /usr/bin con permisos de ejecución.
#!/usr/bin/perl
 
$black    = "\033[30m";
$red      = "\033[31m";
$green    = "\033[32m";
$yellow   = "\033[33m";
$blue     = "\033[34m";
$magenta  = "\033[35m";
$purple   = "\033[35m";
$cyan     = "\033[36m";
$white    = "\033[37m";
$darkgray = "\033[30m";
@word_good=("starting\n", "Freeing", "Detected", "starting.", "accepted.\n", "authenticated.\n", "Ready", "active", "reloading", "saved;", "restarting", "ONLINE\n");
@word_warn=("dangling", "closed.\n", "Assuming", "root", "root\n", "exiting\n", "missing", "Ignored", "adminalert:", "deleting", "OFFLINE\n");
@word_bad=("bad");
@word_note=("LOGIN", "DHCP_OFFER", "optimized", "reset:", "unloaded", "disconnected", "connect", "Successful", "registered\n");
@line_good=("up", "DHCP_ACK", "Cleaned", "Initializing", "Starting", "success", "successfully", "alive", "found", "ONLINE\n");
@line_warn=("warning:", "WARNING:", "invalid", "obsolete", "bad", "Password", "detected", "timeout", "timeout:", "attackalert:", "wrong", "Lame", "FAILED", "failing", "unknown", "obsolete", "stopped.\n", "terminating.", "disabled\n", "disabled", "Lost");
@line_bad=("DENY", "lost", "shutting", "dead", "DHCP_NAK", "failure;", "Unable", "inactive", "terminating", "refused", "rejected", "down", "OFFLINE\n", "error\n", "ERROR\n", "ERROR:", "error", "ERROR", "error:", "failed:");
@daemons=("named");
$col_good = $green;
$col_warn = $yellow;
$col_bad = $red;
$col_note = $purple;
$col_norm =  "\033[00m";
$col_background = "\033[07m";
$col_brighten =  "\033[01m";
$col_underline =  "\033[04m";
$col_blink =   "\033[05m";
$col_default = "$col_norm$white";
print "$col_norm$cyan";
$datespace=0;
mainloop: while (<>)
{
 $thisline = $_;
 $timestamp = substr($_,0,15);
 s/................//;
 @rec = split (/ /, $_);
 $output="$col_brighten$cyan$timestamp"; 
 $output.=" $col_brighten$blue$rec[0]"; 
 if ($rec[1] eq "last")
 {
  $output.="$col_norm$green last message repeated ";
  $output.="$col_brighten$rec[4]$col_norm$green times\n";
  print "$output$col_default";
  next mainloop;
 }
 if ($rec[1] =~ /\[(\d+)\]\:/)
 {
  my($pid) = $1;
  $rec[1]=~s/\[$1\]\:// ;
  $output .= "$col_norm$green $rec[1]" .
             "$col_brighten$green\[";
  $output .= "$col_brighten$white$pid" .
             "$col_brighten$green\]: ";
 }
 else {
  $output .= "$col_norm$green $rec[1] ";
 }
 $restcolor="$col_norm$cyan";
 $restoftheline="";
 for ($therest=(2); $therest<=$#rec; $therest++)
 { $highlight=0;
  for ($i=0; $i<=$#word_good; $i++)
  { if ($word_good[$i] eq $rec[$therest])
   { $restoftheline.="$col_brighten$col_good"; $highlight=1; }
  }
  for ($i=0; $i<=$#word_warn; $i++)
  { if ($word_warn[$i] eq $rec[$therest])
   { $restoftheline.="$col_brighten$col_warn"; $highlight=1; } 
  }
  for ($i=0; $i<=$#word_bad; $i++)
  { if ($word_bad[$i] eq $rec[$therest])
   { $restoftheline.="$col_brighten$col_bad"; $highlight=1; } 
  }
  for ($i=0; $i<=$#word_note; $i++) 
  { if ($word_note[$i] eq $rec[$therest])
   { $restoftheline.="$col_brighten$col_note"; $highlight=1; } 
  }
  for ($i=0; $i<=$#line_good; $i++)
  { if ($line_good[$i] eq $rec[$therest])
   { $restcolor="$col_norm$col_good";
     $restoftheline.="$col_brighten$col_good"; $highlight=1; }
  }
  for ($i=0; $i<=$#line_warn; $i++)
  { if ($line_warn[$i] eq $rec[$therest])
   { $restcolor="$col_norm$col_warn";
     $restoftheline.="$col_brighten$col_warn"; $highlight=1; }
  }
  for ($i=0; $i<=$#line_bad; $i++)
  { if ($line_bad[$i] eq $rec[$therest])
   { $restcolor="$col_norm$col_bad";
     $restoftheline.="$col_brighten$col_bad"; $highlight=1; }
  }
  $restoftheline.="$rec[$therest] ";
  if ($highlight == 1)
  { $restoftheline.=$restcolor; }
 }
 $output.="$restcolor$restoftheline";
 print "$output$col_default\033[1G";
}
exit(0);


Ejemplos de utilización:
cat /var/log/dmesg | colorlog.pl | less


tail -n 20 /var/log/messages | colorlog.pl


tail -n 20 /var/log/dmesg | colorlog.pl


Linux es genial!.