Solemos tener dispositivos montados que en un momento especifico debemos desmontarlo y alguien lo ocupa o esta usando alguno de los archivos dentro de estos.

algunos ejemplos seria con

#kill -9 PID
#showmount -a
#umount /dispositivo /puntodemontaje

existen numerosos metodos para desmontar  los dispositivos, en todo caso, cuando hay un dispositivo ocupado y que no puede desmontase, nos podemos preguntar.

Quien controla el dispositivo?
Que dispositivo es y que esta haciendo?
Desde donde esta accesdiendo el dispositivo?

UNIX no informa acerca de los dispositivos en uso por un usuario. Para identificar el proceso o el usuario que mantiene ocupado a un dispositivo tenemos mayormente que ejecutar una seride de comandos, comenzando con una busqueda local y despues exendiendola por toda una red, si aplica como en mi caso.

Intente con el comando umount desmontar el dispositivo /dev/sdc1 pero el STDOUT me dice “Resource Busy”

Busque si el dispositivo estaba ocupado po un proceso local y eliminarlo con kill

#ps -ef
root     10413     2  0 17:34 ?        00:00:00 [flush-8:16]
telecom  10428     1  0 17:34 ?        00:00:00 evince /media/DISPOSITIVO1/63243252-inecuaciones.pdf
telecom  10433     1  0 17:34 ?        00:00:00 /usr/lib/evince/evinced
root     10441  8466  0 17:35 pts/0    00:00:00 ps -ef

kill -9 10428

si esto no funciona y el numero de usuarios es reducido debemos buscar por cada usuario

#w | awk ‘{print $1}’ | finger -s
Login     Name              Tty      Idle  Login Time   Office     Office Phone
telecom   telecom venetur  *tty7     3:59  Mar 14 13:48 (:0)

esta linea de comando regoje informacion del comando w, exhibe las identificaciones de los usuaios
mediante el comando awk y ofrece un breve finger de cada una, Informa quien esta en el sistemam de manera
que se puede contactar al usuario y podra contactarlo directamente antes de tomar una accion.

en distribuciones basadas en debian debes instalar finger, este se encuentre en los respositoios, solo basta con un aptitude install finger y listo!

una vez conociendo los usuario podemos conectarnos por ssh preferiblemente o por telnet a ellos ver los dispositivos que tienen montados y tratar de desmontarlo en caso de que lo esten usando por la red y ejecutar un comando df -k

df -k
S.ficheros         Bloques de 1K   Usado    Dispon Uso% Montado en
/dev/sda3             78955032  60309912  14634268  81% /
tmpfs                     5120         0      5120   0% /lib/init/rw
udev                    959204         0    959204   0% /dev
tmpfs                   385444         0    385444   0% /var/run/shm
tmpfs                   192724       948    191776   1% /var/run
/dev/sr0                682094    682094         0 100% /media/Custom Live CD
/dev/sdc1              7806784   6455216   1351568  83% /media/DISPOSITIVO1

y seguimos buscando informacion util recorriendo los arboles de UNIX en busca de enlaces blandos

# ls -al /usr/ | grep ^l

otros comando que podemos usar en sistemas como Solaris o FreeBSD son dfmounts [-F nfs ] o showmount -a

en estos caso podemos usar el comodin unmount “lease bien” es distinto al umount de Linux pero con una sintaxis similar
y esto es algo asi como un “¡Te Despontare a como de Lugar!”

unmount -k nomb_sistema_archivos

Los dispositivos de almacenamiento se distinguen por provocar caidas de sistemas cuando su capacidad esta a punto de agotarse,
Si la unidad de vuelve “ruidosa” o envia mensajes de error de I/O a la consola, conviene respaldar lo mas pronto posible y desmontarla
para excluirla del sistema hasta reemplazarla.

Tengo ya unos días tratando de recordar y averiguar cuando fue que empecé a usar Twitter y solo consigo paginas que no me inspiran mucha confianza, que se ofrecen para darte esta información.

Revisando la documentación de la API de esta red social, conseguí como hacerlo aunque no esta explícitamente documentado. Esta información del usuario se envía cada vez que uno hace una petición por su timeline usando grep, awk, tr y curl fácilmente se puede ver cuando se creó la cuenta.

cuando fue creada una cuenta en twitter

Este script muestra cuando fue creada la cuenta además de cuantas personas sigue, cuantos lo siguen y cuantos twits ha publicado:

#!/bin/bash
curl -s "https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=$1&count=0" | tr ',' '\n' | grep  \"created_at\" | tail -n 1
curl -s "https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=$1&count=0" | tr ',' '\n' | grep -m2 -E 'friends_count|statuses_count|followers_count'

Como ven el script acepta un parámetro que para que funcione correctamente debe de ser el handle que en mi caso es orvtech, para ver mi información pueden ejecutar:

./twitter-creado.sh orvtech "created_at":"Thu Apr 12 21:35:06 +0000 2007" "friends_count":236 "statuses_count":5065 "followers_count":251

Estoy seguro que se puede optimizar incluso remplazar esas dos peticiones web por una sola y remplazar el tr, grep y el tail con una sola instrucción de awk pero solo quería demostrar como hacerlo. Si quieren aprender mas del API de twitter pueden visitar https://dev.twitter.com/docs.

Hoy resolvi como enviar procesos al fondo dentro de un loop en BASH, tal vez exista una forma mas limpia de hacerlo pero esta me funciono. Este será un tip mas para esa serie de post cortos pero que vale la pena agregar a los bookmarks.

Enviar procesos al fondo desde un loop en bash

El tip como tal realmente simple, solo tienes que incluir lo que quieras enviar al fondo dentro de llaves {}. Lo que quieras enviar al fondo debe lucir muy parecido a esto:

{ ping orvtech.com & }

Veamos este otro ejemplo.

for i in `echo $correos`
  do echo "trabajando en usuario $i"
  { crawler.sh -H $i run "grep $1 crawler.tmp" | awk -F\" '{print $2}' | awk -F\, '{print $1}' > usuarios.txt & }
done
jobs

Con el commando jobs puedes monitorear los procesos que se han enviado al fondo.

creando esta semana algunas politicas de los servidores en esta oportunidad tanto proxy, dhcp como firewall me vi en la necesidad de hacer un inventario de las mac address de cada una de las redes existente en el edificio.. escribir este pequeño bash que haciendo ping a cada ip dentro de un rango, hace tambien una consulta arp para captura la mac y las almacena en un archivo de texto plano en el directorio donde se ejecuta.

#!/bin/bash

for i in `seq 1 30`; do ping -c 1 10.0.10.$i; arp -n 10.0.10.$i | grep -v Address | grep -v incomplete | awk ‘{print $1, $3}’ >> ip-mac.txt; done

lo guardo el bash bajo un nombre.sh en mi caso lo llame iparpmac.sh

le damos privilegios de ejecucion con chmod +x iparpmac.sh y lo corremos

./iparpmac.sh

El resultado segun el programa _seq_ que defino en la primera linea y la unica`seq 1 30` me dice quede átoda la red me capturará 30 direcciones ip, esto lo pueden adaptar segun las necesidad o la netmask de la red en donde de implemente.

El propocito inicial en mi caso fue para crear las ACL para el DNS y mayormente para proxy en  squid haciendo filtrado por MAC address mediante ACL’s.

tengo script q tambien crea las ACL para el squid.. pronto estaré actualizando el post..

Mi presentación ante el Grupo de Usuarios de Linux de South MIami Dade

A finales del 2006 fue la ultima vez que asistí a una reunión del grupo de usuarios de Linux (LUG por su siglas en ingles) de Miami hasta este pasado fin de semana. El grupo es un poco mas pequeño de lo que recuerdo pero las intenciones y la motivación siguen siendo las mismas.

Mi participación este pasado 11 de Junio no se limito a ser oyente, por el contrario, di una corta charla que consistió en un recuento del FUDcon de Panamá, Un servidor casero económico y diagnosticar problemas usando strace.

El tema que mas genero preguntas fue el del "Un servidor casero económico" especialmente sobre un NSLU2 que lleve para que lo vieran, algunos de los participantes no podían creer que esa cosa tan pequeña con un costo menor de $30 pudiese convertirse en un servidor web. Parte de mi charla consistió en demostrar lo que es capaz de hacer este mini NAS hackeado a mini server, así que les mostré el blog http://www.linuxevolution.org que esta corriendo sobre mi NSLU2 y además les hice una demostración de transmisión de imágenes en vivo con fotos del evento.

La charla cerro con el tema de 'Diagnosticar problemas con strace' fue la siguiente y aunque cubrí todo lo básico, me hubiese gustado haber hecho una practica sobre este tema.

Aquí les dejo un video de parte de mi presentación donde le explico a un miembro del LUG sobre el NSLU2. Me despido muy agradecido con Jonathan Respeto del southdadelug.org por su invitación a este evento y pueden descargar aqui mi presentación en formato PDF.

Si te pareció interesante este articulo, tal vez este otro también te interese: Reunión de septiembre en el LUG de Miami

El modo de single user (usuario individual) un modo en el cual un sistema operativo multi-usuarios es iniciado en modo de super usuario. Por lo general se usa para mantenimientos. En Linux es muy popular iniciar en este modo para cambiar el password del usuario.

Aquí les dejo los pasos para arrancar Fedora (y la mayoría de las distribuciones de linux) en modo single user.

  1. Al momento de arrancar presiona 'TAB' y seleccionamos el kernel desde el cual queremos arrancar en caso de que tengamos varios. deberías de ver una pantalla como esta: Seleccionamos la primera opción de arranque de Fedora Linux y presionamos la tecla e para editarla

  2. Presiona la tecla E para editar esta entrada en el menú de grub y selecciona la segunda linea, la que comienza con la palabra kernel.

    Es esta segunda linea que vamos a editar

  3. Presiona E para que puedas editar esa linea y agregar la palabra single al final de la linea.

    Asi se ve el inicio de la linea que vamos a editar en la configuración de grub

    Aquí vamos a editar los parámetros que se le pasa al kernel, podemos borrar quiet y rhgb

    Aquí vamos a editar los parámetros que se le pasa al kernel, podemos borrar quiet y rhgb

    Le pasamos el parámetro single al kernel en el grub

    Le pasamos el parámetro single al kernel en el grub

  4. Presiona ENTER para finalizar la edición de parámetros del kernel. Seguidamente presiona la tecla B para arrancar esa entrada del grub en modo single user. Como ven, ejecutando el comando who -r muestra en que nivel estamos, en este caso estamos en single.

    who -r nos muestra que estamos en single user mode

Una vez que iniciamos bajo modo single user, podemos iniciar el servicio de red ejecutando /etc/init.d/network start. Suficiente para usar fpaste y irssi y consultar cualquier duda que tengamos en el canal #fedora del servidor irc.freenode.net.

Supongamos que necesitamos soporte por que nuestra laptop no termina de iniciar. Algo que podemos hacer es iniciar en mode single user, arrancar el servicio de red y ejecutar cat /var/log/messages | fpaste luego ejecutamos irssi -c irc.freenode.net y nos unimos al canal de Fedora LATAM con el comando /j #fedora-latam, allí podemos compartir la URL que nos dio como resultado el comando fpaste.

Existe aun un nivel mas bajo que single user mode donde no se montan particiones en modo escritura. Es un nivel mucho mas básico. Para entrar en este nivel es necesario pasarle al kernel el parámetro init=/bin/bash en vez de pasarle single. Le pasamos el parámetro init con el valor /bin/bash al kernel en el grub

Un nivel mas bajo que single. Bajo init=/bin/bash el comando who no reporta en que nivel estamos. Un nivel mas bajo que single. Bajo /bin/bash el comando who no reporta en que nivel estamos

Hoy quiero retomar el tema del NSLU2, el tema de un servidor casero, silencioso y económico. El NSLU2 es un dispositivo que Linksys saco al mercado como un simple NAS sin muchas funciones que se diga pero gracias a esfuerzos de la comunidad se ha podido convertir en un servidor completo. Para Nosotros, los que nos gusta meterle Linux a cualquier cosa que consuma electricidad y tenga conectividad a internet le llamamos de cariño "Slug".

El Slug es una solución completa, barata para jugar con Linux embebido y lo mejor de todo es que el firmware original de Linksys usas el Kernel de Linux por lo tanto liberan el código fuente. Hoy en día aunque ya no tienen tanta actividad Unslung y OpenSlug siguen siendo las principales comunidades orientadas al NSLU2.

Debido a que ya esta descontinuado el NSLU2 no se puede comprar directo en las tiendas si en las que se puede lo cobran excesivamente caro. La solución es comprarlo por vías alternas como eBay, craigslist, etc.

Mi experiencia con el NSLU2 en cuanto a sistemas operativos se limita a Gentoo y Debian, particularmente prefiero Gentoo para este dispositivo ahora que Fedora esta empezando a desarrollar para ARM seria interesante intentar compilarlo para el NSLU2.

El NSLU2 viene limitado a correr a 133MHz pero su procesador en realidad es de 266MHz, para liberarlo es necesario eliminar un transistor. Así que sin miedo desconecten el cable de poder, abran la carcasa y eliminen este transistor:

Como servidor web con sus 266MHz (liberado desde 133MHz) y tan solo 32MB de RAM no es exactamente el tipo de servidores que usaríamos en para hostear el landing page de fedoraproyect.org o el wiki de Fedora pero si podemos tener nuestro blog personal corriendo en conjunto con otros servicios.



El NSLU2 no es la única opción en el mercado, pero es la mejor si tomamos en consideración el costo, al cabo de un anho de estar prendido 24/7 y los beneficios que obtenemos a cambio. Entre las alternativas que les puedo comentar están el DSM-G600 de D-LINK que cuesta alrededor de $50 y la primera versión del Apple TV por $110.


El DSM-G600 es rápido, tiene un procesador de 266MHZ al igual que el NSLU2 pero tiene 64MB de RAM y el almacenamiento es vía IDE en vez de USB 2.0. Lo malo de este dispositivo es que requiere de un ventilador para mantenerlo fresco y sacar el calor que genera el CPU y el disco duro en la carcasa.

La primera versión del AppleTV debería de ser mas rápida aun con su procesador de 1 GHz Intel "Crofton" Pentium M, 256 MB a 400 MHz DDR2 de memoria RAM y almacenamiento mas rápido que el NSLU2. No tengo mas que comentarles respecto a este candidato para servidor porque lo tengo corriendo con XBMC y lo tengo como media center hasta que le consiga remplazo (un google tv?).

Se le puede montar wordpress, joomla o algo así? No, créanme intente correr wordpress con 3 plugins distintos para la DB, intente usar sqlite3 y otros plugins para minimizar la carga de la DB pero no logre correr el blog que soportara mas de 3 conexiones simultaneas.

La buena noticia es que existen alternativas, en mi caso termine por usar Nanoblogger. Nanoblogger es un manejador de contenido que genera contenido estático esto reduce bastante la carga en el NSLU2.

CGI en BASH? No es tan halado de los cabellos como muchos piensan. Yo lo uso para cosas puntuales como una interfaz web para agregar artículos a Nanoblogger o mantener una URL (por ejemplo orvtech.com/ultima.bash siempre apuntando a la ultima URL que ya publicamos).

El limite de lo que puedes hacer con el NSLU2 es como el de Linux, te lo pones tu. Para mi no tiene limites, siempre hay una alternativa a lo que se puede hacer con maquinas potentes, para muestra aquí les dejo una lista de cosas interesantes que he hecho con el NSLU2:

  • Transmisión en vivo de imágenes: Con una demora de tres a cinco minutos un conjunto de scripts corriendo en el NSLU2 puede ser usado para cubrir eventos como el FLISOL, FUDcon, Google IO, eventos deportivos y convenciones en genera. La cobertura puede ser hecha por cualquiera con un dispositivo capaz de tomar fotos y enviarlas por email. Estos scripts manipulan estas imágenes insertando información relevante al evento, por ejemplo mis scripts para cubrir carreras de carros generan imágenes como esta:

    Como ven, en la parte superior tengo la fecha, hora, temperatura y presión atmosférica así como el logo en la parte inferior derecha. Puedes leer mas de este tema pinchando aquí.

  • Un puente de last.fm a gNewBook: Con un script hecho en BASH el NSLU2 puede actualizar nuestro estado en gNewBook.org con la ultima canción escuchada en nuestro perfil de last.fm. Si quieres ver el script, pincha aqui.

  • Comparte archivos vía torrents con tu propio tracker en el NSLU2: Usando bittornado podemos configurar el NSLU2 para que sea un torrent tracker. Para leer mas del tema puedes leer este articulo.

  • Un reproductor de música inalámbrico: Este articulo es una traducción de una mini-guia publicada por "POTUS Camacho", basicamente te explica como usar el NSLU2 y una tarjeta USB de bluetooh para convertir el NSLU2 en un MP3 player inalámbrico. La traducción de este articulo puede ser leída aqui.

Exportar tu shell script a HTML, con sintaxis resaltada en colores es posible con la ayuda de Vim y este comando:

vim -f +"syn on" +"run! syntax/2html.vim" +"wq" +"q" hola.sh

Esta linea convierte hola.sh a hola.sh.html, el parámetro -f forza a Vim a permanecer en el primer plano, cosa que es útil si Vim va a ser utilizado por otro programa como un cliente de correos o en nuestro caso este script.

Activar el coloreado de sintaxis y ejecutar el plugin 2html.vim seria la segunda parte de este script. Aquí pasa algo peculiar, plugin 2html.vim divide la pantalla de Vim donde la parte superior es el código HTML y la inferior es el documento original. Seguidamente se le envía wq para salvar y salir de la primera ventana y se le envía q para que termine con la ventana restante.

La salida de esta linea seria hola.sh.html y luce así:

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>/tmp/hola.sh.html</title>
<meta name="Generator" content="Vim/7.4">
<meta name="plugin-version" content="vim7.4_v1">
<meta name="syntax" content="bash">
<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,prevent_copy=">
<meta name="colorscheme" content="none">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #ffffff; }
body { font-family: monospace; color: #000000; background-color: #ffffff; }
* { font-size: 1em; }
.Comment { color: #0000c0; }
.Constant { color: #c00000; }
.Statement { color: #af5f00; }
-->
</style>

<script type='text/javascript'>
<!--

-->
</script>
</head>
<body>
<pre id='vimCodeElement'>
<span class="Comment">#!/bin/bash</span>
<span class="Comment"># orvtech.com</span>
<span class="Statement">echo</span><span class="Constant"> </span><span class="Statement">&quot;</span><span class="Constant">Este script sera convertido</span><span class="Statement">&quot;</span>
<span class="Statement">echo</span><span class="Constant"> </span><span class="Statement">&quot;</span><span class="Constant">a HTML usando Vim</span><span class="Statement">&quot;</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->
#!/bin/bash
# orvtech.com
echo "Este script sera convertido"
echo "a HTML usando Vim"

Incorporar este script en un bucle para que convierta todos los shell scripts a HTML es fácil, con un bucle for, lo podemos hacer, quedaría así:

for ARCHIVO in `ls *.sh`
  do echo -e "Convirtiendo $ARCHIVO a HTML"  vim -f +"syn on" +"run! syntax/2html.vim" +"wq" +"q" $ARCHIVO
done

A todos nos ha pasado, estamos trabajando, por error le damos en el teclado a la flecha de arriba y pasa lo peor:

rm -f /home/m1n1m3/descargas/descargdor.sh

Cualquier entra en pánico al darnos cuenta que no teníamos respaldo de este script, pero en estos momentos es cuando mas calma se debe de tener. Analicemos la situación, aun hay procesos usando este archivo, en mi caso aun sigo descargando y compartiendo archivos vía torrents gracias a este script que acabo de eliminar. Lo primero es encontrar el PID para lo cual podemos ejecutar ps y hacer un grep por el nombre del archivo, el resultado tendrá en la primera columna el PID como lo podemos ver aquí:

ps -p | grep -i descargador.sh
30560 pts/3    Ss+    0:00 /bin/bash /home/m1n1m3/descargas/descargdor.sh

El sistema de ficheros /proc mantiene vínculos a los archivos abiertos por procesos dentro de el sub-directorio fd/ (File Descriptor) que a su vez esa anidado dentro de una carpeta con el nombre del PID del proceso y como acabamos de comprobar nuestro script aun se esta ejecutando.

Teniendo en cuenta el PID que obtuvimos anteriormente y ya que sabemos que la estructura de directorios es /proc/<pid>/fd/ podemos determinar que el archivo que acabamos de eliminar esta dentro de /proc/30560/fd/. Para determinar cual de todos es podemos hacer un ls -la y hacerle un grep por el nombre del archivo a la salida del ls -la. Todo esto se debería de ver así:

ls -la /proc/30562/fd/* | grep descargador.sh
/proc/30560/fd/51 -> /home/m1n1m3/descargas/descargador.sh (deleted)

Para recuperar el archivo eliminado solo debemos copiar el archivo dentro de fd/ a donde queramos, en mi caso, lo quiero restaurar, así que ejecutare:

cp /proc/30560/fd/51 /home/m1n1m3/descargas/descargador.sh

Listo, archivo restaurado.

Nota: Esto funciona también en Android

Esta semana me pidieron algo curioso. El departamento de móviles me pidió borrar el contenido de todos los archivos de un directorio sin eliminar los archivos cada hora. Mi primera reacción fue usar uno de los scripts que he publicado anteriormente, ese script que usaba find para listar los 10 archivos mas grandes de un directorio y pensé que simplemente debía de modificar el ls por un echo > es decir modificar:

find /servicios/wap/ -type f -exec ls -ls {} \;

Para que quedara así:

find /servicios/wap/ -type f -exec echo >{ } \;

El detalle es que find considera que el '>' forma parte de el y me termina creando un archivo de nombre {} en el directorio sin blanquearme los archivos. La alternativa que termine usando fue dd y quedo así al final:

find /servicios/wap/ -type f -exec dd if=/dev/null of={} \;

Con su respectiva entrada en el crontab para que se ejecute cada hora. La entrada luce algo como esto:

* */1 * * * wireless /op/wap/scripts/wap_cleaner.sh

No hice algo mas elaborado por que esto es una solución temporal mientras se implementan otras aplicaciones.