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 Linux

Pelicula revolution OS…. bastante buena

Si ya te metiste en linux… te agradara esta pelicula.

Fuera creencias de antaño usa linux





Deseas aprender linux?

No hay nada como esto el libro de Esencialidades de slackware

Este libro lo lei en ingles hace mas de 10 años….. esta bastante bueno…. si comprendes slackware a la perfeccion entonces, comprendes todas las demas distros.

Los que usamos Mysql ya no somos tan hippies…. ?

Ahora resulta que soy experto en la base de datos open source de sun.. ?



Jamas pense que algo asi pudiece pasar con mysql….. a lo mejor tu si lo pensaste(con un porrito en mano..)….

Una platica sobre Mysql Cluster.

Antes de implementar un mysql cluster… le di un vistazo a este video…… bastante enriquecedor…

Si deseas ver el video con subtitulos… que tambien estan solo en ingles checa la siguiente url

Sintesis de esta platica segun yo :p :
* Se habla de las nuevas caracteristicas agregadas a el engine cluster de mysql 5 que ya existia en la version 4 de mysql.
* Se habla de que los indices de momento se siguen manejando en memoria… pero la intension de manejarlos en disco saldra en el siguiente release (recuerden que sun ahora tomo cartas en el asunto).
* La memoria puede ser spliteada, esto quiere decir que un monto de datos de 10gb entre dos maquinas corresponderia a 5 gb manejados por cada maquina. Y cada maquina tendria una copia completa de los datos.
* Permite respaldos en caliente (”sin parar la base de datos“). al estilo del engine myisam….. que a muchos no les gusta, ya que no tiene integridad referencial… pero recordemos que no requiere compactacion de datos… y eso es fabuloso.
* Mysql cluster ofrece alta disponibilidad… esto quiere decir… que se recupera ante cualquier falla.
* Se habla de que es posible tener un cluster de mysql con diskless
* Se recalca que no requerimos sistemas de almacenamientos caros para un cluster de mysql (si usas bastantes nodos….)(en lo personal te recomiendo que si tienes los medios uses host bus adapter)
* Se recomienda tener el nodo mysql sobre una red aparte con su propio hub para garantizar la buena comunicacion entre nodos del cluster
* Tus aplicaciones podran accesar al cluster de mysql con la misma libreria que accesan ahora al mysql que no esta en modo cluster.
* El cluster de mysql tambien puede ser replicado
* Los nodos del cluster mysql, podran ser agrupados en “grupos” y cada grupo tomar una seccion de la base de datos.
* Existen nodos de almacenamiento, nodos API y nodos de administracion (estos ultimos pueden distribuir la informacion del cluster entre ellos….y no tienen que ser equipos realmente poderosos)
* Para un cluster mysql un nodo… es solo un proceso…capichi!…. entre mas nodos… mas procesos trabajando y eficientando al cluster en general
* No es posible agregar nodos online al cluster mysql aun…… (tienes que parar todo si quieres sustituir un nodo con falla… esperemos que en nuevas realeases se pueda agregar nodos online.)
* Lo posito es que cuando una falla ocurre todos los nodos del cluster son avisados. Y entonces se toman medidas para procesar el trabajo de manera diferente. Si alguna aplicacion cliente estubiece realizando una transaccion durante un momento donde ocurriece una falla, esta transaccion no sera valida y se desbaratara, por lo que el cliente tendra que realizarla de nuevo. De esta manera se evitan los famosos DEADlock (saludos profesor carrete… del tecnologico de durango… ahi comprendi ese concepto.)
* Sobre un mysql cluster puedes hacer VISTAS, PROCEDIMIENTOS ALMACENADOS, TRIGGERS, que actuen sobre las tablas del cluster. Solo que estos deberan ser definidos en cada nodo del cluster.
* Existe en mysql cluster actual 2 o 3 veces mas rendimiento de lo que habia en la version de mysql cluster anterior.

Iniciando con Ruby sobre Rieles

Anexo el siguiente material para los que deseen iniciar con Ruby sobre rieles y esten usando las distribucion Ubuntu gutsy.

Leccion 1 de rails sobre ubuntu gutsy

Leccion 2 de rails sobre ubuntu gutsy

Aclaracion… no existe una leccion 3 o una 4… esto es todo…. no es la guia mas completa… pero te ayuda a iniciar rapido de manera practica.

Paravirtualizacion con Xen 3 sobre Centos 5 para x86_64

El mecanismo que permite a Xen tener más poder que el sistema operativo controlando los recursos a los cuales
este puede acceder, se llama “paravirtualización”. Aqui dejo una guia de como se implemento en centos 5.

Xen centos 64 paravirtualizacion

Recolector.py sobre python 1.52

Python script que recoge estadísticas de carga sobre un sistema linux 2.4 y 2.6, este script no es intrusivo. Y no requiere ser programado dentro de cron.

#!/usr/bin/python

import os, sys , commands, time , re

#Necesario en Python 1.5
import string

##################################
# Script: recolector.py          #
# Escrito por: Edwin Plauchu     #
# mailto: j4nusx@gmail.com       #
# 28 / feb / 2007                #
##################################

DATE = str(time.localtime(time.time())[0:6][0]) + "-" + str(time.localtime(time.time())[0:6][1]) + "-" + str(time.localtime(time.time())[0:6][2])
RECOLECTOR_LOG_FILE_PATH = "/var/log/recolector-"+ DATE + ".log"
INTERVAL_SEG = 3

def LoadAverage():
	file = open( '/proc/loadavg' )
        lines = file.readlines()
	for line in lines:
		return string.split( line , " ")[0:3]	

def UsedMemoryInMegaBytes():
	file = open( '/proc/meminfo' )
        lines = file.readlines()
	mem_total = 0
	mem_free = 0
	expression_for_mem_total = re.compile( r"MemTotal:" )
	expression_for_mem_free = re.compile( r"MemFree:" )
	for line in lines:
                if expression_for_mem_total.search( line ):
			mem_total = int(string.split(string.split( line , ":")[1],"kB")[0])
		if expression_for_mem_free.search( line ):
			mem_free = int(string.split(string.split( line , ":")[1],"kB")[0])
	return {'USED':( (mem_total - mem_free) / 1024 ) , 'FREE':(mem_free/1024) }

def CapturaEnLog( file_absolute_path = "/tmp/recolector.log" , string_to_add = None ):
        now = time.localtime(time.time())[0:6]
        fecha_formateda = str(now[3]) + ":" + str(now[4]) +  ":" +  str(now[5])
        fichero_log = open(file_absolute_path, 'a' )
        if string_to_add:
                fichero_log.write( fecha_formateda + "," + string_to_add + "\n")
        fichero_log.close()

def CpuStat():
	file = open( '/proc/stat' )
	lines = file.readlines()
	expression_for_cpu_sigma = re.compile( r"^cpu " )
	for line in lines:
		if expression_for_cpu_sigma.search(line):
			line = line[5:]
			line = string.split(line," ")
			return {'USER': int(line[0]), 'NICE': int(line[1]), 'SYSTEM':int(line[2]) , 'IDLE':int(line[3]), 'IOWAIT':int(line[4]), 'IRQ':int(line[5]), 'SOFTIRQ':int(line[6])}

def SigmaJiffies( diccionario = {}):
	total_jiffies = 0
	for key in diccionario.keys():
		total_jiffies = total_jiffies + diccionario[key]
	return total_jiffies

def DeltaTime(interval):
	x = CpuStat()
	time.sleep(interval)
	y = CpuStat()
	for key in x.keys():
		y[key] = x[key] - y[key]
	return y

def main():
	while "Hasta el final de los tiempos":

		dt = DeltaTime(INTERVAL_SEG)
                sum_jiffies = SigmaJiffies(dt)
                cpu_user_pct = (dt['USER'] * 100.00 / sum_jiffies)
                nice_user_pct = (dt['NICE'] * 100.00 / sum_jiffies)
                system_pct = (dt['SYSTEM'] * 100.00 / sum_jiffies)
                idle_pct = (dt['IDLE'] * 100.00 / sum_jiffies)
                iowait_pct = (dt['IOWAIT'] * 100.00 / sum_jiffies)
                irq_pct = (dt['IRQ'] * 100.00 / sum_jiffies)
                softirq_pct = (dt['SOFTIRQ'] * 100.00 / sum_jiffies)

		data = str('%.4f' %cpu_user_pct) + "," +str('%.4f' %nice_user_pct) + "," +str('%.4f' %system_pct) + "," +str('%.4f' %idle_pct) + "," +str('%.4f' %iowait_pct) + "," +str('%.4f' %irq_pct) + "," +str('%.4f' %softirq_pct) + "," + str(UsedMemoryInMegaBytes()['USED'])
		CapturaEnLog( RECOLECTOR_LOG_FILE_PATH , data )

if __name__ == "__main__":
    sys.exit( main() )

Tipo de Salida Generada

La forma de interpretar los datos mostrados a continuacion es la siguiente:
HORA,USER,NICE,SYSTEM,IDLE,IOWAIT,IRQ,SOFTIRQ,USEDMEMORY(MB),LOADAVERAGE

10:10:37,0.8306,-0.0000,0.4983,98.5050,0.1661,-0.0000,-0.0000,734,0.19
10:10:40,6.0403,-0.0000,0.5034,93.4564,-0.0000,-0.0000,-0.0000,734,0.17
10:10:43,5.3422,-0.0000,0.3339,94.3239,-0.0000,-0.0000,-0.0000,736,0.16
10:10:46,1.6667,-0.0000,0.3333,97.8333,-0.0000,0.1667,-0.0000,736,0.16
10:10:49,2.3372,-0.0000,0.5008,96.9950,-0.0000,0.1669,-0.0000,736,0.15
10:10:52,2.3609,-0.0000,0.6745,96.9646,-0.0000,-0.0000,-0.0000,736,0.15
10:10:55,0.1656,-0.0000,-0.0000,99.6689,-0.0000,0.1656,-0.0000,736,0.21
10:10:58,0.5008,-0.0000,0.1669,99.3322,-0.0000,-0.0000,-0.0000,736,0.20
10:11:1,0.4992,-0.0000,0.1664,99.3344,-0.0000,-0.0000,-0.0000,736,0.20
10:11:4,-0.0000,-0.0000,0.1669,99.8331,-0.0000,-0.0000,-0.0000,736,0.18
10:11:7,1.3333,-0.0000,-0.0000,98.6667,-0.0000,-0.0000,-0.0000,736,0.18
10:11:10,1.0050,-0.0000,0.1675,98.8275,-0.0000,-0.0000,-0.0000,736,0.17



Se genera un fichero log por dia sobre la carpeta /var/log/

Tal vez no comprendas los datos arrojados por este script… asi que anexo la siguiente liga que lo explica…..
http://www.linuxhowtos.org/System/procstat.htm

Llamadas al sistema desde python

Procesando Argumentos

    import sys

    # argv es una lista de cadenas que contiene parametros de la linea de comandos
    #   argv[0] sera siempre el nombre del comando invocado
    for arg in sys.argv:
        print arg
    argc = len(sys.argv)

fork –Creando procesos hijo

    import os

    # fork crea proceso hijo. Returna 0 en
    # caso de exito y -1 en caso de falla.

    if os.fork() == 0:
       print "in child"
    else:
       print "in parent"

La funcion exec

    import os

    # Lanza proceso translapados... pero hace que nuestro script finalice
    #   familia de  funciones exec:

    # Estas versiones requieren el path completo hacia el ejecutable
    #  execl(pathToProg, arg0, arg1, arg2, ...)
    #  execv(pathToProg, argList)

    # Estas dos buscaran el programa en el actual PATH
    #  execlp(prog, arg0, arg1, arg2, ...)
    #  execvp(prog, argList)

    os.execl("/bin/more", "more", "foo.txt")
    os.execvp(sys.argv[0], sys.argv)

sleep - esperando un poquito

    import time

    # sleep(n) pone el proceso a dormir por n segundos.
    time.sleep(10)

exit - Salir

    import sys

    sys.exit(0)

wait

    import os

    # waits (sleeps) for child to terminate, returns pid and status
    pid, status = wait()  # no arguments, returns a pair of values
    print "Returned status:", status/256

getpid

El identificador de proceso

    import os

    myId = os.getpid()

Tengo librerías no resueltas! ¿qué hago para resolverlas?

Después de leer la queja de un usuarios aun windowizado, y las respuestas un tanto agresivas. Creo que es necesario reconocer que debmos aceptarlo, es una pesadilla lidiar con “dependeincas y librerias”. Mejor informo de una técnica para solucionar este problema.

En linux se puede hacer todo, pero luego las herramientas “automágicas”, nos “nublan la visión y el fuente no es lo suficientemente explícito”. Así que si alguna vez han tenido broncas de librerías no resueltas, quizás ésto les pueda ayudar…

El uso de las librerías, te permite que, si tu programa necesita o quieres que maneje llaves de encriptación, simplemente “usas las funciones que te da el openssh”. Así no tienes que “programar” el openssh tú solito. Nada más lo usas y eso te da, reduccion de tiempo de desarrollo, una mayor calidad del software y menores costos. El problema radica en que el sistema “objetivo”, es decir nuestra maquina, no satisfaga esas dependencias, y entoces el baile y dolor de cabeza comienza. Así que aquí van un par de aspirinas para eso.

Debian, Red Hat, y sus derivados, no hacen la detección de las librerías, “automágicamente”. Linux provee un mecanismo con el cual uno puede saber que librerías requiere un programa, y si las tenemos o no.

Para hacer las cosas “optimas”, linux maneja un caché de librerías.
Este caché de librerías, es controlado por la aplicación “ldconfig”, y su archivo de configuración es ld.so.conf, el cual se encuentra en /etc.

Por lo tanto, tenemos:
Archivo de configuración de las librerías: /etc/ld.so.conf
Archivo que manipula el caché de las liberías: ldconfig

Con ésto, ya tenemos una primera idea de quien maneja la “disponibilidad” de las librerías. Ahora el problema es saber qué librerías usa un programa.

Simple, para eso está el comando ldd, el cual nos dice qué programa usa cual libreriá.
Ejemplo (andi pue’, ¡hasta con ejemplo!).
bash-2.05a$ which nslookup
/usr/bin/nslookup
bash-2.05a$ ldd /usr/bin/nslookup
libdns.so.5 => /usr/lib/libdns.so.5 (0×40021000)
libcrypto.so.0 => not found
libisc.so.4 => /usr/lib/libisc.so.4 (0×4010b000)
libnsl.so.1 => /lib/libnsl.so.1 (0×4013a000)
libc.so.6 => /lib/libc.so.6 (0×4014f000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0×40000000)

Primero uso el which para encontrar donde en mi sistema está la utilería “nslookup”.

Después uso ldd para saber las librerías que usa el programa de la cual sale mucha información.
La información esta estructurada en dos columnas.
La primera columna es la “librería” solicitada y la segunda columna es la ruta de la librería y el punto de entrada a la misma.

Si se fijan, tengo un problema de librerías. Me dice que:
libcrypto.so.0 => not found
No la encontró, así que tengo “dependencias no resueltas”.
¿Qué sigue? Buscar esa libreria en mi sistema.
find / -name “libcrypto.so.0″
lo cual me dice:
/usr/local/mylibs/libcrupto.so.0
Entonces sí tengo mi libreria, pero no me la “encuentra el sistema”, ¿entonces? ¿qué sucede? Simple, hay que “actualizar” mi sistema de caché:
Reviso mi /etc/ld.so.conf que contiene las rutas de búsqueda de las librerías, en mi caso particular:
bash-2.05a$ more /etc/ld.so.conf
/usr/local/lib
/usr/X11R6/lib
/usr/i386-slackware-linux/lib
/opt/kde/lib
/usr/lib/qt/lib
/usr/lib/qt/lib
Por lo tanto, edito mi /etc/ld.so.conf y agrego la ruta donde la librería se encuentra y mi /etc/ld.so.conf ahora dice:
bash-2.05a$ more /etc/ld.so.conf
/usr/local/lib
/usr/X11R6/lib
/usr/i386-slackware-linux/lib
/opt/kde/lib
/usr/lib/qt/lib
/usr/lib/qt/lib
/usr/local/mylibs

Ahora, actualizo mi “caché de librería” al ejecutar ldconfig
y vuelvo a probar el ldd sobre nslookup:
/usr/bin/nslookup
bash-2.05a$ ldd /usr/bin/nslookup
libdns.so.5 => /usr/lib/libdns.so.5 (0×40021000)
libcrypto.so.0 => /usr/local/mylibs/libcrypto.so.0 (0×400a1000)
libisc.so.4 => /usr/lib/libisc.so.4 (0×4010b000)
libnsl.so.1 => /lib/libnsl.so.1 (0×4013a000)
libc.so.6 => /lib/libc.so.6 (0×4014f000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0×40000000)

Listo. Dependendicas completadas.
Ahora, si el paso del “find” falla, pues eso significa que definitivamente no tengo esa libreria y hay que conseguirla. Google o Freshmeat, nos ayudan a esto.

El rpm y el apt-get, hacen prácticamente ésto. Así que si tú tienes un problema con un .tar.gz o algo así que te bajas “precompilado”, ya lo puedes resolver tú, que a diferencia de Windows, no puedes, a menos que utilices caras herramientas de desarrollo.

Ahora, cabe hacer mención, que no hay un procedimiento “perfecto”. Digamos que éste procedimiento es básico. Cuando éste falla se puede emplear strace o el gdb para “ver” que pasa.

Como recomendaciín, te suguero que uses Slackware o Gentoo, y manejes todo “a compilar”, dado que, para que compile algo, tienes que tener satisfechas todas las dependencias; asi garantizas que todo esté en donde debe de estar.

Espero que esta información le sirva a más de uno y sepan que hacer ante un:
bash-2.05a$ nslookup
nslookup: error while loading shared libraries: libcrypto.so.0: cannot open shared object file: No such file or directory

« Entradas anteriores · Entradas mas recientes »