Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Archive for November, 2007

Usando lsof

lsof (ls Open Files) o listado de archivos abiertos, es una gran aplicación pero bastante desconocida y que nos puede sacar de muchas dudas o apuros. lsof es una herramienta muy completa, por lo que en éste articulo solo se muestra la información que más vamos a necesitar.

NOTA: Si se quiere saber más sobre el uso de lsof ejecutad “man lsof “.

Utilidad de lsof.

Como he dicho antes, lsof muestra los archivos y procesos abiertos en el moment o del chequeo, por lo que nos será de utilidad para llevar un seguimiento de seguridad o de procesos bloqueados.

Desmontando un CD rebelde.

# umount /cdrom
umount: /cdrom: device is busy

Vaya, ¡¿por qué no se desmonta y me dice que el dispositivo está ocupado?! No se ha desmontado porque algun proceso esta haciendo uso del CDROM y hasta que no lo libere no podremos desmontarlo, el problema es que desconocemos que aplicacion se encuentra usando dicho CDROM, mediante lsof podremos conocerlo.

# lsof +D /cdrom
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
konqueror 621 zx80 cwd DIR 3,64 2048 57344 /cdrom

lsof nos dice que el proceso konqueror está usando el directorio /cdrom con el usuario zx80. La solución es sencilla entoces, basta con cerrar konqueror y problema resuelto. Para los que usamos mucho la consola y llegamos a tener unas cuantas sesiones abiertas pasa que en vez de konqueror puede salir bash. Esto es debido a que alguna de las consolas está dentro del directorio activo del cd-rom, por lo que bastaría salirse del directorio de trabajo del CD o cerrar ese bash.

# kill 621

Ya podemos desmontar.

Quien está detrás de una conexión ?

Esta vez usamos la herramienta netstat. Para quien no conozca esta herramienta decir que es un monitor de red. Nos dirá qué conexiones activas tenemos y mucha inform ación sobre ellas. Vamos a ver qué conexiones tenemos activas:

# netstat - n
Active Internet connections (only servers)
Proto Recv- Q Send - Q Local          Address       Foreign Address
tcp      0    0 *:printer                          *:*            LISTEN
tcp      0    0 localhost:www                 *:*            LISTEN
tcp      0    0 *:6000                            *:*             LISTEN
tcp      0    0 *:smtp                           *:*             LISTEN

Nos muestra información sobre algunos puertos en espera (Listen) pero desconocemos qué aplicación está detrás. Me llama la atención el puerto TCP 6000, así que voy a ver quien está detrás:

# lsoft - i :6000
COMMAND           PID USER    FD     TYPE     DEVICE        SIZE   NODE NAME
    X                 279 root    3u     Ipv4     349                  TCP     *:3000 (LISTEN)

Vemos que la aplicacion X es la culpable de que el puerto 6000 esté abierto y a la espera.

Qué procesos están usando un directorio.

Una de las utilidades que más se usan es averiguar qué aplicaciones están trabajando en un directorio concreto. Se usa esta opción sobre todo para vigilar el uso de troyanos o espias. SI quisiera saber qué procesos están usando mi directorio pondría lo siguiente:

pianodaemon@pianodaemon-laptop:~$ lsof +D /home/pianodaemon/
COMMAND    PID        USER   FD   TYPE DEVICE    SIZE    NODE NAME
x-session 5962 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
compiz    6013 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
gnome-pan 6015 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
nautilus  6017 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
emerald   6127 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
compiz.re 6128 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
................ ...

Otros usos.

Estos son otros usos de la herramienta lsof, que aunque son algo menos usados nos pueden sacar de algun apuro o duda.
# lsof - g n: Donde n es un ID de grupo.

Esto muestra los archivos abiertos por un grupo que queramos. Si quisieramos ver los archivos de varios grupos a la vez, los separariamos por comas:

# lsof - g wheel,users

# lsof - u n: Donde n es un ID de usuario, lo que nos mostrará los archivos abiertos por ese usuario. Al igual que con los grupos, se pueden especificar varios usuarios de una vez.

# lsof - l: Para no convertir el ID a nombre de usuario, útil en casos de logeos corruptos o sistemas lentos.

# lsof - N: Nos muestra los archivos NFS abiertos.

Marcas de Tiempo en Archivos Unix

Introducción

Como muchos ya saben, muchas cosas se manejan en Unix, y en consecuencia en Linux, como si fueran archivos, se abren, se cierran, se escribe en ellos, etc. Este pequeño artículo hace referencia a las marcas de tiempo que ponen los Unix en dichos archivos. Al menos los que estan basados en inodes.

Viendo las marcas de tiempos

Para el principiante el comando ls es su primera opción pero si entra en problemas, como yo lo hice, puede que se frustre con dicho comando. Ejemplo:

root@pianodaemon-laptop:/home/pianodaemon# ls -l proto.sh
-rw-r--r-- 1 pianodaemon pianodaemon 4878 2007-11-09 12:44 proto.sh

¿ En este caso qué marca de tiempo estamos viendo ?

Las tres marcas

Unix pone tres marcas de tiempo a un archivo:

  • Access
  • Modify
  • Change

stat el comando

stat es parte del paquete coreutils de GNU. Por favor, instalatelo si esta disponible para tu plataforma, hasta donde se, Linux, AIX, Solaris, y otros sabores de Unix, Esto te va a ahorrar muchos dolores de cabeza.

Cuando se crea por primera vez un archivo, por ejemplo con el comando touch, las tres marcas tienen el mismo valor. Miremos ahora la salida de stat del mismo archivo ejemplo:

root@pianodaemon-laptop:/home/pianodaemon# stat proto.sh
  File: `proto.sh'
  Size: 4878            Blocks: 16         IO Block: 4096   archivo regular
Device: 801h/2049d      Inode: 6685006     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/pianodaemon)   Gid: ( 1000/pianodaemon)
Access: 2007-11-09 17:27:44.000000000 -0600
Modify: 2007-11-09 17:27:44.000000000 -0600
Change: 2007-11-09 17:27:44.000000000 -0600

¡Esto si es información completa ! Vemos reportado, el nombre, el tamaño, los bloques, el tipo de archivo (regular), información física de donde se encuentra (dispositivo/inode), los permisos estandar, los dueños del archivo y las tres marcas de tiempo Unix.

Opciones interesantes de formato de salida del comando stat:

  • %X Time of last access as seconds since Unix Epoch
  • %x Time of last access
  • %Y Time of last modification as seconds since Unix Epoch
  • %y Time of last modification
  • %Z Time of last change as seconds since Unix Epoch
  • %z Time of last change

Las opciones en mayúscula nos imprimen la marca de tiempo transcurrido desde la Epoca Unix, y las opciones en minúscula imprimen la marca de tiempo legible para el humano.

Ejemplo:

root@pianodaemon-laptop:/home/pianodaemon# stat --format=%X proto.sh
1194650864
root@pianodaemon-laptop:/home/pianodaemon# stat --format=%x proto.sh
2007-11-09 17:27:44.000000000 -0600

Ambos “números” son equivalentes m¡s el primero es un número absoluto, el segundo es interpretado ya que muestra la configuración de la zona horaria (-0600). Mi configuración de hora/fecha es zona America/Mexico y uso UTC.

Marca de Tiempo

Las marcas de tiempo se almacenan en el inode del archivo correspondiente con, hasta donde he confirmado, 32 bits de codificacion. Estos enteros son con signo, los negativos representan fechas en el pasado de la época Unix, y los positivos, fechas futuras desde la época Unix. La época Unix es la hora/fecha 00:00:00 UTC del 1ero de Enero de 1970.

Algunos datos para desarrolladores Python

En lo personal prefiero el desarrollar scripts sobre el interprete Python a bash. Asi que uso stat sobre el mismo:

import os, glob

from stat import *

for folder in glob.glob( base_path ):
	for file in glob.glob( folder + '/*.mp3' ):
		print file
		# retrieves the stats for the current file
		# return the last-modified-date
		last_mod_date = os.stat( file )[ST_MTIME]
		print last_mod_date

vmstat para sysadmins

Para una comprensión más concisa del rendimiento de tu sistemita linux, podemos ayudarnos con vmstat. Con vmstat, es posible obtener una vista general de los procesos, memoria, swap, E/S, sistema y actividad de CPU en una línea de números:

pianodaemon@pianodaemon-laptop:~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 211544  72096 299720    0    0    50    10  270  598  3  1 96  1

La primera línea divide los campos en seis categorías, incluyendo procesos, memoria, swap, E/S, sistema y estadísticas relacionadas al
CPU. La segunda línea identifica aún más los contenidos de cada campo, haciendo más fácil escanear datos para ver estadísticas específicas.

Los campos relacionados a procesos son:

  • r — El número de procesos ejecutables esperando para acceder al CPU
  • b — El número de procesos en un estado dormido contínuo
    Los campos relacionados a la memoria son:

  • swpd — La cantidad de memoria utilizadaz
  • free — La cantidad de memoria libre
  • buff — La cantidad de memoria utilizada por las memorias intermedias
  • cache — La cantidad de memoria utilizada como caché de páginas

Los campos relacionados a swap son:

  • si — La cantidad de memoria intercambiada desde el disco
  • so — La cantidad de memoria intercambiada hacia el disco

Los campos relacionados con E/S son:

  • bi — Los bloques enviados a un dispositivo de bloques
  • bo — Los bloques recibidos desde un dispositivo de bloques

Los campos relacionados al sistema son:

  • in — El número de interrupciones por segundo
  • cs — El número de cambios de contexto por segundo

Los campos relacionados al CPU son:

  • us — El porcentaje de tiempo que el CPU ejecutó código de nivel del usuario
  • sy — El porcentaje de tiempo que el CPU ejecutó código de nivel del sistema
  • id — El porcentaje de tiempo que el CPU estaba desocupado
  • wa — Esperas de E/S

Cuando se ejecuta vmstat sin opciones, solamente se muestra una línea. Esta línea contiene promedios, calculados desde la última vez que se arrancó el sistema.

Sin embargo, la mayoría de los administradores de sistemas no confían en los datos en esta línea, pues los tiempos en que fueron recopilados varían. En su lugar, la mayoría de los administradores tomas ventaja de la habilidad de vmstat de mostrar repetidamente datos de la utilización de recursos en intervalos establecidos. Por ejemplo, el comando vmstat 1 muestra una nueva línea de utilización de datos cada segundo, mientras que el comando vmstat 1 10, muestra una nueva línea por segundo, pero sólo por los próximos 10 segundos.

En manos de un administrador experimentado, vmstat puede ser usado para determinar rápidamente la utilización de recursos y problemas de rendimiento. Pero para obtener mayor conocimiento en estos problemas, se requiere un tipo de herramienta diferente — una herramienta capaz recolectar y analizar datos en mas detalles.

Instalar un servidor de CVS en Ubuntu

Entre mis nuevas tareas tengo la de administrar un servidor CVS, hacia años que no lo administraba, asi que he vuelto a recordar unas pequeñas nociones de control de versiones. Aqui hablare de como instalar CVS en Ubuntu Gutsy. Es un articulo meramente tecnico, enfocado a desarrolladores.

El significado de CVS como comenta la wikipedia, es el siguiente:
El Concurrent Versions System (CVS), también conocido como Concurrent Version System o Concurrent Versioning System, es una aplicación informática que implementa un sistema de control de versiones: mantiene el registro de todo el trabajo y los cambios en los archivos (código fuente principalmente) que forman un proyecto (de programa) y permite que distintos desarrolladores (potencialmente situados a gran distancia) colaboren. CVS se ha hecho popular en el mundo del software libre. Sus desarrolladores difunden el sistema bajo la licencia GPL.

Basicamente se utiliza en el desarrollo de un proyecto informatico para llevar un control de los archivos del codigo y evitar por ejemplo que el codigo que escribe un usuario sea “machacado” con el codigo de otro usuario. Ademas con un sistema de control de versiones, el programador siempre puede disponer de la ultima version del codigo lo que ayuda a continuar con el desarrollo del proyecto.

Te pondre un ejemplo de para que sirve todo esto.

Imagina dos programadores que estan trabajando en el mismo proyecto, y casualmente ambos estan modificando el mismo archivo de codigo. Cuando uno de ellos actualice ese archivo en el repositorio se queda marcado, de tal manera que cuando el otro intente subir al repositorio de codigo ya ve, que ese archivo ha sufrido una modificacion desde la ultima vez que el se actualizo, lo que le obliga, a traerse de nuevo ese archivo (con los cambios que haya realizado el primer programador), añadir los suyos y volver a subir el archivo. Sin un mecanismo de control de versiones, ese cambio se perderia, el primer desarrollador subiria el archivo y el segundo subiria su version. Esto para un archivo es controlable, pero cuando tienes miles de archivos y miles de lineas de codigo significa un desastre total. Por eso el control de versiones es necesario.

Para instalar el servidor y el cliente cvs ejecutamos:

$ sudo apt-get install cvs cvsd

En un momento determinado nos pedira la ruta para el repositorio, pon por ejemplo /cvsrepo. Este es el directorio a partir del cual se ira colgando todos aquellos modulos/proyectos que administremos con el CVS.
Este directorio lo vamos a definir a partir de /var/lib/cvsd, asi que realmente el path completo seria:
/var/lib/cvsd/cvsrepo

Ejecutamos las siguientes secuencias de comandos:

$ sudo cvsd-buildroot /var/lib/cvsd

Si la carpeta cvsrepo no existe, la creamos

$ cd /var/lib/cvsd
$ sudo mkdir cvsrepo

Le damos permisos sobre la carpeta al usuario cvsd

$ sudo chown -R cvsd:cvsd cvsrepo

Inicializamos el repositorio

$ sudo cvs -d /var/lib/cvsd/cvsrepo init

creamos un usuario cvs y le damos una password.

$ sudo cvsd-passwd /var/lib/cvsd/cvsrepo username 

por ejemplo:

sudo cvsd-passwd /var/lib/cvsd/cvsrepo j4nusx

Ahora editamos el archivo:

sudo emacs /var/lib/cvsd/cvsrepo/CVSROOT/config

Cambiamos “#SystemAuto=no” a “SystemAuto=no”

Ya tenemos todo funcionando. Para comprobar que accedemos:

cvs -d :pserver:username@localhost:/cvsrepo login
cvs -d :pserver:username@localhost:/cvsrepo checkout .

Por ejemplo:

cvs -d :pserver:j4nusx@localhost:/cvsrepo login

Seria adecuado exportar la variable CVSROOT del siguiente modo:

export CVSROOT=:pserver:jose@localhost:/cvsrepo

o el valor que fuera, de esta manera ya no necesitariamos especificarla cada vez que fueramos a usar un comando “cvs”.

Ahora podriamos logarnos con:

cvs login

y por ejemplo colocarnos en la carpeta (dentro) de un proyecto que quisieramos subir al CVS y ejecutar:

cvs import -m "archivos iniciales" MiProyecto HEAD MAIN

Si te sale el error:

/cvsroot: no such repository

es que has especificado mal la ruta del repositorio. deberia ser /cvsrepo o la que pongas, pero asegurate de que no te haya fallado
alguna letra. En caso de que lo hayas definido mal, No lo elimines con apt-get remove cvsd. Pues a la hora de volver a instalarlo
mantendria la configuracion anterior. tendrias que ejecutar:

apt-get remove --purge cvsd

e instalarlo de nuevo
o mejor aun,

dpkg-reconfigure cvsd

que nos permite reconfigurar de nuevo cvs server (cvsd) e indicar ahora si la ruta adecuada para el repositorio (/cvsrepo, /cvsroot, /repo, o el que quieras usar).

Como clientes de CVS yo o utilizo “cvs” desde la linea de comandos, o Eclipse.

Visualizando conexiones, rutas y puertos abiertos en Ubuntu

Hace unos dias (los pocos dias que llevo en telefonica mexico, aqui en el DF), un nuevo conocido y reciente usuario de linux, me hizo la siguiente pregunta…
Como puedo visualizar mis rutas, conecciones y puertos abiertos tcp/ip ?

Esto no es nada absolutamene del otro mundo, y muchos de ustedes creo que ya lo saben, aun asi, considero que es bueno contestar a este tipo de preguntas que son mas cotidianas de lo que uno piensa entre los usuarios newbies.

Le comente que le escribiria la respuesta en el blog de gulsin.. (creo que de esta manera… todos aquellos que se realizacen la misma pregunta en google sin duda obtendran el mismo beneficio que el..)

La orden netstat.
Esta orden se utiliza para visualizar el estado de diversas estructuras de datos del sistema de red, desde las tablas de enrutado hasta el estado de todas las conexiones del host donde se ejecuta.

Conexiones y puertos abiertos….

root@pianodaemon-laptop:/home/pianodaemon# netstat -at
Conexiones activas de Internet (servidores y establecidos)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:ipp           *:*                     ESCUCHAR
tcp        0      0 pianodaemon-lapto:38621 fg-in-f191.google.c:www ESTABLECIDO
tcp        0      0 pianodaemon-lapto:34637 bu-in-f189.google.c:www ESTABLECIDO
tcp        0      0 pianodaemon-lapto:38622 fg-in-f191.google.c:www ESTABLECIDO
tcp        0      0 pianodaemon-lapto:38821 bu-in-f83.google.co:www ESTABLECIDO
tcp6       0      0 *:8009                  *:*                     ESCUCHAR
tcp6       0      0 *:8180                  *:*                     ESCUCHAR


Visualizando Rutas

root@pianodaemon-laptop:/home/pianodaemon# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.225.181.128  0.0.0.0         255.255.255.128 U         0 0          0 eth0
172.16.142.0    0.0.0.0         255.255.255.0   U         0 0          0 vmnet1
192.168.10.0    0.0.0.0         255.255.255.0   U         0 0          0 vmnet8
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         10.225.181.131  0.0.0.0         UG        0 0          0 eth0

Eso es todo, pasenla chido……….