Mostrando entradas con la etiqueta linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta linux. Mostrar todas las entradas

sábado, 7 de abril de 2012

Actualizando el microcódigo de la CPU (microcode.ctl)

[Explicación]
Los procesadores tienen un firmware, también llamado microcódigo. El firmware está situado entre el hardware y el lenguaje ensamblador. Mas o menos la cosa iría así:

hardware -> firmware (microcódigo) -> ensamblador -> kernel -> S.O. y aplicaciones

Es un bloque de instrucciones máquina que establece la lógica a más bajo nivel y que está fuertemente ligado a la electrónica subyacente. Pero así mismo, es un cacho de código. O sea, software.

Cuando compras una CPU en una tiena, o te compras un portátil estás adquiriendo un modelo concreto, que viene con una revisión (versión) de firmware concreta. Pero ¿Qué passa si Intel saca una nueva versión de firmware con mejoras, optimizaciones, uso de algoritmos mas eficientes y con menor consumo de energía, corrección de bugs, etc? Pues que no los puedes disfrutar, a menos que instales el firmware nuevo. Y...¿Cómo se consigue actualizar el microcódigo? Pues normalmente no te queda otra que actualizar la BIOS de tu máquina actualizando así el microcódigo de tu procesador.

Pero ya sabes que actualizar la BIOS no siempre es buena idea. Si mientras la estás actualizando se vá la corriente, puedes tirar el procesador directamente, que es irrecuperable. Es algo peligroso. Se puede hacer, pero no es algo que quieras hacer muy amenudo. Enserio.

Cagonlaputa. Entonces, ¿no hay alternativa posible? Si. Si la hay. Almenos en Linux si.

[Conociendo la herramienta]
Hay un hermoso paquete llamado microcode.ctl que hace éste trabajo por nosotros y que se encarga de cargar el microcódigo de manera dinámica en nuestro procesador. Esto significa que no flashea el procesador (no hace los cambios permanentes) sinó que actualiza el firmware del procesador al vuelo y en tiempo de ejecución cada vez que se inicia el S.O. Esto tiene varias ventajas:
  1. Lista numeradaNada de actualizar la BIOS del modo tradicional, por lo que nos evitamos un procedimiento peligroso (y tedioso).
  2. Se descarga automáticamente las nuevas versiones sacadas por Intel y las aplica en el próximo reinicio.
  3. En caso de que se descargue una versión que por lo que sea falla y nos dá problemas, solo debemos desactivar el daemon que se encarga de actualizar el microcódigo del procesador cada vez que se inicia el sistema, y santas pascuas.
[Instalación]
Pff.... ¿enserio que tengo que hacer esta sección? Si las secciones de "instalación" siempre son iguales en Linux :/
$ sudo aptitude install microcode.ctl

...y a correr. En la instalación te pedirá si te quieres descargar también el paquete propietario intel-microcode que contiene las últimas versiones de los microcódigos. Obviamente la resuesta es SI, QUIERO. Y punto. Si vas a ver el fichero /var/log/syslog puede que te encuentres con estas bonitas líneas (pero dependen de la versión de firmware que tengas, claro):

microcode: CPU0 sig=0x20655, pf=0x10, revision=0x2
microcode: CPU1 sig=0x20655, pf=0x10, revision=0x2
microcode: CPU2 sig=0x20655, pf=0x10, revision=0x2
microcode: CPU3 sig=0x20655, pf=0x10, revision=0x2
microcode: Microcode Update Driver: v2.00 , Peter Oruba
microcode: CPU0 updated to revision 0x3, date = 2011-09-01
microcode: CPU1 updated to revision 0x3, date = 2011-09-01
microcode: CPU2 updated to revision 0x3, date = 2011-09-01
microcode: CPU3 updated to revision 0x3, date = 2011-09-01

Un saludo!


viernes, 17 de febrero de 2012

TCP Sockets: TIME_WAIT y los puertos efímeros son poco amigos

Hoy vamos a explicar un poco qué es TIME_WAIT y cómo puede darte por culo un rato largo.

[INTRODUCCIÓN]
Todos sabemos que las conexiones TCP ( capa 4 en modelo OSI, también llamada capa de transmisió de datos ) tienen estados. Umm... bueno, igual no todos lo sabemos. Refresquemos un poco qué son esto de los estados TCP antes de empezar.

TCP establece la conexión a tres vías[1]. Cuando se intenta establecer la conexión del host A al host B, el host A manda un paquete tipo SYN al host B. La conexión pasa a estar en un estado SYN_SENT. Cuando el host B le contesta con un paquete ACK-SYN, la conexión para a un estado llamado SYN_RECV. Cuando la conexión por fin se establece pasa a estado ESTABLISHED. También hay el estado LISTEN, que es el estado que tienen servicios tales como apache, memcached o sshd, esperando nuevas conexiones. Total, con todo esto nos tenemos que quedar con la copla de que una conexión TCP pasa por diferentes estados desde que se establece hasta que se cierra.

La lista completa de estados se puede ver fácilmente haciendo un man netstat, y buscando el apartado State.

Bien, entonces tenemos que los dos estados mas comunes son: ESTABLISHED conexiones establecidas y LISTEN, en el caso de que estemos en un servidor con varios servicios activos. Para ver una lista de las conexiones abiertas en nuestra máquina podemos hacer un:

$ sudo netstat -pan --tcp | less


[SUPOSICIÓN]
Si ejecuto un script muy simple que haga peticiones HTTP contra mi servidor web local SUPONGO que no habrá ningún problema (jeje, los cojones). Tengo un servidor Apache escuchando en el puero 80 en localhost. Problemos a ejecutar el siguiente comando en 5 consolas diferentes.

$ while true; do curl localhost; done

El comando "curl" abre una conexión TCP, hace una petición HTTP, se le devuelve un resultado (que no nos importa lo mas mínimo, ahora mismo) y CIERRA LA CONEXIÓN TCP. O esto es lo que nosotros esperamos, vamos. Entiendo que tener 5 instancias del script haría que normalmente tuviese 5 conexiones en estado ESTABLISHED, pero esto, nunca debería ocasionar un problema a nivel de sistema.

Hagamos la prueba. Ejecutamos cinco veces el script en consolas separadas, y en otra terminal ejecutamos:

$ sudo watch -n 0.5 'netstat -pan --tcp | grep ESTABLISHED | wc -l'


Pues efectivamente, nunca pasamos de 5 conexiones al mismo tiempo en estado ESTABLISHED pero... Umm.... pero al cabo de un minuto de estar ejecutando los scripts, el comando "curl" empieza a dar un error:

curl: (7) Failed to connect to 127.0.0.1: Cannot assign requested address


[PROBLEMA]
WTF. A ver, tenemos tan solo 5 conexiones abiertas. El error del curl parece decirnos que no puede obtener un puerto de origen para establecer la conexión. Veamos porqué:
Ejecutemos los scripts anteriores y pongamos un filtro diferente en el netstat:

$ sudo netstat -pan --tcp | grep TIME_WAIT | wc -l
5329
$ sudo netstat -pan --tcp | grep TIME_WAIT | wc -l
13440
$ sudo netstat -pan --tcp | grep TIME_WAIT | wc -l
19348
$ sudo netstat -pan --tcp | grep TIME_WAIT | wc -l
21526
$ sudo netstat -pan --tcp | grep TIME_WAIT | wc -l
28214


COJONES! Por algún motivo estan quedando chorrocientos sockets abiertos en estado TIME_WAIT!

[QUÉ ES TIME WAIT]
Ahora que nos hemos puesto un poco en matéria vamos a ver para que se usa el estado TIME_WAIT, y como puede llegar a ser un problema. De la definición del man de nestat sacamos que:

TIME_WAIT: The socket is waiting after close to handle packets still in the network.

Umm... según esto parece que la conexión no se cierra hasta que pase un tiempo para poder capturar los paquetes que se habían "perdido" por la red debido a posibles problemas de enrutamiento. Jummm... explicación algo escueta. Sobre todo porque no dice cuanto vamos a tener que esperar. Vamos a investigar un poquito más sobre el tema...

El RFC 1122 en el apartado "Transport layer, TCP" [2] dice algo así como:
When a connection is closed actively, it MUST linger in TIME-WAIT state for a time 2xMSL (Maximum Segment Lifetime).

Vaaaale. Ahora ya tenemos un poco mas de información. Resulta que tenemos que esperarnos 2xMSL antes de que una conexión pase de TIME_WAIT a CLOSED ( y se libere la conexión ). Genial. Y ahora... ¿Dónde coño puedo consultar el tamaño del Maximum Segment Lifetime? Pues ejecutando este comando:

$ cat /proc/sys/net/ipv4/tcp_fin_timeout
30

Que en mi máquina Debian me da un resultado de 30 segundos. En máquinas con Ubuntu el valor acostumbra a ser 60, en máquinas Solaris acostumbra a ser 120. Entonces parece ser que, en mi máquina, tardaré 2*MSL, o sea 2*30=60 segundos en liberar una conexión. El problema que hemos experimentado antes es que hay muchos sockets (conexiones) abiertas en estado TIME_WAIT. Cuando llegamos al límite de conexiones efímeras del sistema, el kernel nos dá un error diciendo "umm... me sabe mal, pero no me quedan puertos efímeros". Esto se traduce en el error que nos saca el "curl". O sea, no es problema del comando "curl" que vaya dejando conexiones abiertas, ya que si no tendríamos muchas conexiones en estado ESTABLISHED, y no es el caso. Tampoco es problema del kernel, ya que éste implementa el RFC 1122 como dios manda.

[PUERTOS EFÍMEROS]
"Ei. Ei, espera. Cuando has empezado a hablar de puertos efímeros y toda esta mierda me he perdido. A ver si te explicas un poquito más, macho."
Veamos. Cuando establecemos una conexión TCP con nuestro navegador a un servidor Web, necesitamos un puerto de origen [3]. Estos puertos, se conocen como puertos efímeros. El protocolo TCP necesita definir un puerto origen y un puerto destino. En nuestro ejemplo, el puerto destino será el 80 (servidor web), y el puerto origen será un puerto efímero. El Kernel nos asigna un puerto efímero automáticamente cuando establecemos una conexión nueva. Para ver el rango de puertos efímeros que tenemos definido podemos ejecutar:

$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000

Si hacemos 61000-32768 nos dá 28232. Si os fijais, es un número muy parecido al número de sockets en estado TIME_WAIT que teníamos cuando ha empezado a petar todo. Esto es debido a que un socket en estado TIME_WAIT todavía es un socket activo. Es lo mismo como si estuviese en estado ESTABLISHED, por lo que está ocupando un puerto efímero. Si acumulamos muchos sockets en estado TIME_WAIT, vamos agotando los puertos efímeros. Cuando llegamos al límite y tenemos reservados *todos* los puertos efímeros, al kernel no le queda otra que devolver error cada vez que se quiere crear un socket nuevo. Bonito, verdad?

[POSIBLES SOLUCIONES]
Bueno, una de ellas pasa por aumentar el número de puertos efímeros del sistema. Esto se puede conseguir simplemente ejecutando:
$ sudo su - root
$ echo "1025 61000" > /proc/sys/net/ipv4/ip_local_port_range

Hecho esto, ahora disponemos de 60K puertos efímeros y no solo 30K. En realidad esto no es una solución de nada. Simplemente tendremos que esperar 2 minutos y no 1 para que los procesos "curl" agoten el número de sockets. Estamos haciendo que el sistema aguante un poquito mas, pero ya está.


Otra solución parece que puede venir modificando el parámetro 2*MSL. Si disminuimos este valor del MSL, los sockets en estado TIME_WAIT deberían estar en este estado durante menos tiempo. El parámetro es ajustable mediante el comando comentado anteriormente:
$ sudo su -c 'echo 5 > /proc/sys/net/ipv4/tcp_fin_timeout'

Si probais de aplicar este cambio vereis que en realidad las conexiones en estado TIME_WAIT no se cierran a los 10 segundos como sería lo esperado (2*MSL; 2*5=10), sino que se siguien cerrando a los 60 segundos. Por qué ocurre esto? Simple. El valor "60 segundos" está hardcoded en el kernel de linux. Así de bonito. Si miramos el fichero /include/net/tcp.h línea 105 del kernel de línux veremos algo tal que así:

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT state, about 60 seconds */

A partir de línea 202 del fichero /net/ipv4/tcp_minisocks.c vereis que hace uso intensivo de la variable TCP_TIMEWAIT_LEN, justo en la sección donde define el estado TCP_TIME_WAIT al socket TCP. Por lo que modificar a través de las sysctls el parámetro "tcp_fin_timeout" no va a servir de un carajo. Ni 2*MSL ni pollas. Harcoded en el código. (Esto vulnera el RFC 1122 y la regla 2MSL? Si alguien lo sabe que por favor comente! Gracias )


La última solución, que dista mucho de ser algo perfecto pasa por activar el tcp_tw_recycle y tcp_tw_reuse. Ambas directivas son bastante peligrosas, y vulneran explícitamente el RFC 1122. No deberían usarse en entornos de producción o sin saber muy bien qué se está haciendo. La documentación que he encontrado al respecto es [4] y [5].

TCP_TW_RECYCLE: It enables fast recycling of TIME_WAIT sockets. The default value is 0 (disabled). The sysctl documentation incorrectly states the default as enabled. It can be changed to 1 (enabled) in many cases. Known to cause some issues with hoststated (load balancing and fail over) if enabled, should be used with caution.
$ echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

TCP_TW_REUSE: This allows reusing sockets in TIME_WAIT state for new connections when it is safe from protocol viewpoint. Default value is 0 (disabled). It is generally a safer alternative to tcp_tw_recycle
Note: The tcp_tw_reuse setting is particularly useful in environments where numerous short connections are open and left in TIME_WAIT state, such as web servers. Reusing the sockets can be very effective in reducing server load.
$ echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

O sea, usadlos, pero con mucho cuidado.


La solución definitiva viene en forma de pregunta: ¿Qué coño haceis creando 30K conexiones TCP en menos de un minuto, criaturas del Señor?
Si habeis llegado aquí porque os habeis encontrado con el problema del TIME_WAIT en un servidor de producción cuando recibía bastante tráfico os tengo que decir algo que no os va gustar: algo estáis haciendo mal. En este caso no es suficiente con cerrar las conexiones a la BBDD, caches, o lo que sea cada, vez que se hace una consulta. La solución pasa por hacer pooling de conexiones y demás. REAPROVECHAR conexiones. Pero bueno, esto es otra guerra que se sale del alcance de este post. Aún así para dudas, ruegos y preguntas teneis los comentarios. Intentaré ayudar hasta donde pueda/sepa.


[ÚLTIMAS NOTAS]
Nótese que este problema es provocado por la conjunción de crear muchas conexiones por parte de un CLIENTE (importante este punto) durante un periodo muy corto de tiempo. Esto hace que se acumulen muchos sockets abiertos (bueno, o no-cerrados, para ser mas exactos) en estado TIME_WAIT. Cuando se llega al punto que la suma de todos los sockets en dicho estado es igual al número de puertos efímeros de la máquina, el kernel no es capaz de crear sockets nuevos hasta que no se liberan recursos, devolviendo un error a cualquier proceso que intente crear una conexión nueva (nótese que las conexiones ya establecidas seguirán funcionando normalmente).

Espero que les haya gustado el post. La zona de comentarios está disponible para hacer preguntas, o proponer soluciones alternativas al problema.

Un saludo, Jan.

[1] http://danred.wordpress.com/2009/09/28/establecimiento-de-conexion-tcp-de-3-vias/
[2] http://www.rfc-editor.org/rfc/rfc1122.txt página 87
[3] Recordemos que un socket está formado por un IP Origen - Puerto Origen - IP Destino - Puerto Destino.
[4] http://www.speedguide.net/articles/linux-tweaking-121
[5] http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

domingo, 20 de noviembre de 2011

Clase de buceo

En el post anterior[1] comentaba cómo configurar las PAM para desactivar el tiempo de espera en caso de haberte equivocado escribiendo un password. Este post explica el proceso que seguí para saber que no es posible establecer un tiempo de espera personalizado. Siempre te tienes que esperar dos segundos en caso de haberte equivocado de password, o puedes desactivar el tiempo de espera. Lo que no puedes hacer es decir, "espérate 5 segundos en caso de que me haya equivocado de password antes de volver a preguntarme".. También se puede ver lo bonito que es el OpenSource, y la de que el código fuente sea público.

[Preámbulo]

Resulta que en el fichero /etc/pam.d/login hay una opción que pone: "auth optional pam_faildelay.so delay=3000000". Un comentario al lado explica claramente lo que hace esto:

"Enforce a minimal delay in case of failure (in microseconds)". O lo que es lo mismo: Fuerza una pequeña espera en caso de fallo en la autenticación. 3 segundos, para ser mas exactos.

Pues parece obvio pensar que si cambio 3000000 a 1000000, el tiempo de espera cuado haga login fallido se reducirá a 1 segundo.

Probemos antes de hacer el cambio:
$ sudo echo 1 # Comando chorra, pero lo importante es que nos pida el password
[sudo] password for inedit: badpassword
--- pasan unos dos segundos, aproximadamente ---

Hacemos el cambio en el fichero, poniendo el parámetro "delay=1000000". Probamos de nuevo:
$ sudo echo 1
[sudo] password for inedit: badpassword
--- pasan unos dos segundos, aproximadamente. Lo mismo que antes... ---


mmmm... mierda, no funciona. Probemos lo propuesto en el post anterior, o sea, poner el parámetro nodelay en el fichero /etc/pam.d/common-auth:
auth [success=2 default=ignore] pam_unix.so nullok_secure nodelay

Probamos de nuevo:

$ sudo echo 1
[sudo] password for inedit: badpassword
--- inmediatamente despues nos dice que la contraseña es incorrecta y que lo intentemos de nuevo. Tiempo de espera: cero segunos ---

Genial. Parece que el parámetro "nodelay" funciona. Pero ¿Por qué no funciona el "delay=3000000"?


[Siguiendo pasos lógicos]
Vale, resulta que el parámetro "nodelay" se lo ponemos como parámetro a un fichero llamado "pam_unix.so". Ni idea de qué coño hace este fichero, pero busquemos a ver si existe ene el sistema:

$ locate pam_unix.so
/lib/x86_64-linux-gnu/security/pam_unix.so

Touché, existe. mmmm..... vale. ¿Ahora qué hacemos con el? Ni idea de que hace realmente el fichero. Lo he abierto y es un binario....mmmm.... Vale, ya lo tengo. Descubramos qué paquete ha creado este fichero:

$ dpkg-query -S /lib/x86_64-linux-gnu/security/pam_unix.so
libpam-modules: /lib/x86_64-linux-gnu/security/pam_unix.so


Con que libpam-modules, eh? Vaaaale, pues mira, estamos siguiendo la pista y no nos va mal. Ahora ¿cuál puede ser el siguiente paso? Pues descargar el código fuente y que hace realmente el código:
$ mkdir ~/killme
$ cd ~/killme
$ apt-get source libpam-modules

Esto nos habrá creado un par de ficheros en el directorio "killme" [2].

[Buceando en el código]
Vale, ahora tenemos el código de la "libpam". ¿Qué hacemos? Lo obvio, aquí sería buscar alguna referéncia a "pam_unix.so". Pero como los ficheros ".so" son compilados y nosotros nos hemos descargado el código fuente, vamos a probar lo siguiente:
$ find -name "pam_unix*"

Oh! Genial, tenemos resultados! Parece que existe una carpeta interesante: "./pam-1.1.3/modules/pam_unix"

Vale, ahora deberíamos buscar algo de utilidad dentro de esta carpeta. Juguemos con "grep", a ver si hay suerte:
$ cd ./pam-1.1.3/modules/pam_unix2
$ grep nodelay -i # -i es para hace "ignore-case". O sea, que no distinga entre mayúsculas y minúsculas.
pam_unix.8:\fBnodelay\fR
pam_unix.8.xml:
README:nodelay
support.c: if (off(UNIX_NODELAY, ctrl)) {
support.h:#define UNIX_NODELAY 16 /* admin does not want a fail-delay */
support.h:/* UNIX_NODELAY */ {"nodelay", _ALL_ON_, 0100000},



Tenemos resultados! Parecen interesantes los ficheros "support.c" y "support.h". Revisado el fichero "support.h" parece que solo hay la declaración del parámetro UNIX_NODELAY.
Veamos el fichero "support.c", a ver que contiene:

[...]
#ifdef HAVE_PAM_FAIL_DELAY
if (off(UNIX_NODELAY, ctrl)) {
D(("setting delay"));
(void) pam_fail_delay(pamh, 2000000); /* 2 sec delay for on failure */
}
#endif
[...]


Eureka! Lo hemos encontrado! Vale, yo no tengo ni idea de C. Nunca he programado nada serio en C, ni mucho menos una librería de sistema para Linux. Pero si hemos llegado hasta este fichero buscando cosas lógicas, ahora no nos va a detener un poco de código en C. Parece que es el código fuente de "pam_unix.so".

Vamos a intentar leer lo que pone este pedacito de código. La condición "if" parece que comprueba lo siguiente:
SI (el parámetretro UNIX_NODELAY és igual a falso) ENTONCES {
Espérate 2 segundos
}


Pues ya lo tenemos, señores. Resulta que no se puede definir un tiempo de espera, ya que el tiempo de espera está puesto de modo estático en el código. En ningún momento el código va a leer la variable "delay=3000000", por lo que si ponemos "delay=5000000" es normal que lo ignore.

[conclusión]
¿Cómo hemos podido sacar todo esto? Pues la respuesta es muy simple: porque es Software Libre y se puede conseguir el código fuente muy facilmente a través de Internet. Inspeccionando el código vemos claramente lo que hace ( y mejor todavía, lo que no hace ). En este punto, y si tuviese los conocimientos de C necesarios, podría reescribir el código fuente para que aceptara un parámetro "delay" y que pudiese ser definido des de la pam.d/login. Una vez hechos los cambios, podría mandarlos al mantenedor del paquete y en caso de gustarle dichos cambios, los incorporaría en el código de la libpam. Y el mundo sería un lugar mejor y lloverían gominolas del cielo :)


[1] Recomiendo que te lo leas, sinó este pot no tiene mucho sentido.
[2] Me gusta bastante crear directorios con el nombre "kill" o "killme" para usos temporales, ya que es un modo de saber si puedo borrar el directorio sin ni tan solo preocuparme de ver que contiene. En cambio, un directorio que llamado "temp" o "temporal".... bueno, si, son datos temporales. Pero hasta cuando? Servirá lo que hay dentro? Es algo lioso. Usando "killme" el tema está claro, puedes borrar la carpeta cuando quieras sin ningun problema, ya que el contenido de la misma no es importante ;)

jueves, 8 de septiembre de 2011

Saber a qué paquete pertenece un fichero

Algunas veces hay ficheros con nombres curiosos, y uno se pregunta qué paquete debe haber instalado este fichero. Por ejemplo el fichero:

/usr/bin/pico

Yo me pregunto, ¿quién lo habrá puesto ahí?

Pues fácil:
$ sudo aptitude install dlocate -y
$ dlocate /usr/bin/pico
> perl: /usr/bin/piconv

Pues mira, ha sido el paquete "perl".

Esto también sirve para ficheros de configuración, así como carpetas del sistema. Todo lo que esté "trackeado" por dpkg, es suceptible de ser encontrado por dlocate.

Un saludo, Jan.

UPDATE: El comando "dpkg-query -S /usr/bin/see" también hace lo mismo.

martes, 26 de julio de 2011

Unetbootin

Un programita muy simple, pero que hace su trabajo.

[Pa que sirve?]
Cuando te descargas una ISO de un nuevo SO ( debian/arch/back track....) y la quieres instalar en un ordenador tienes varias opciones. La mas común es tostarla en un CD y instalar des de ahí. Pero hay un problema en los notebooks y servidores y es que pueden no tener unidad de cederoms.

Unetbootin te soluciona la papeleta y te pone la ISO en un pendrive.

[Cómo utilizarlo]
En mi caso me he encontrado con algún problemilla, utilizando el programa. Para ello sigo los siguientes pasos:
  1. Meto el pendrive en el PC
  2. Con gparted formateo el pendrive enterito, y le creo una partición fat16 de 4GB
  3. Abro el programa unetbootin
  4. Selecciono la ISO que quiero cargar en el pendrive ( el mismo programa te ofrece descargar la ISO vía web ).
  5. Monto el pendrive
  6. Le doy a OK
Te esperas 5 minutos a que copie los ficheritos de una lado pa otro y ya lo tienes. Al reiniciar, inicias des del pendrive y es lo mismo como si estuvieses haciendo el boot des de un CD.

Facil simple y para toda la familia. Y ya sabes, para instalar simplemente lo tienes que buscar en los repositorios de tu distribución favorita.

Un saludo, Jan.

P.D: Ahora mismo estoy tostando ArchLinux de mientras escribo este post, a ver si lo puedo instalar O_0

domingo, 16 de mayo de 2010

Virtual Hosts en Apache2, para dummies

[Problema]
Visitante: "Escucha inEdit00!"
inEdit00: "Si, dime!"
Visitante: "Si, mira, que seguí tu manualillo sobre como poner arriba un servidor Apache y he estado haciendo mis cosillas. Ahora ya se HTML y CSS y he empezado a programar en PHP"
inEdit00: "Muy bien. Y cual es el problema?"
Visitante: "Pues mira, te cuento: ahora tengo dos páginas www.mipaginapersonal.com y www.lawebdemicurro.com, y, así como tu me enseñastes en el otro manual, he creado dos entradas en el fichero '/etc/hosts' así:"
127.0.0.1 www.lawebdemicurro.com
127.0.0.1 www.mipaginapersonal.com
Visitante: "Pero claro... estas dos URL's, apuntan hacia el directorio principal del servidor ( /var/www ) y puedo cargar un dominio, o el otro, pero no las dos a la vez!!"
inEdit00: "Bien, este problema que tienes se resuelve con lo que se llaman VirtualHosts. Te explico:"

[Explicación]
Cuando tu entras en una página web con tu navegador, haces una petición al servidor por REST ( órdenes del protocolo HTTP ), por ejemplo, si accedes a la URL: "http://localhost/index.html" realmente estás haciendo una petición al servidor tal que así:

GET /index.html
Host: localhost

Esto puedes verlo con programas como Wireshark, que se encargan de analizar los paquetes que viajan por la red, a bajo nivel. Bien, que significa esto?
Pues que del host "localhost" quieres el fichero "/index.html", así de simple.

Si haces una petición a la web "http://www.mipaginapersonal.com", haces una petición que sería así:

GET /
Host: www.mipaginapersonal.com

"GET" singnifica "dame", la barra ("/") significa el directorio principal ( que sería lo mismo que "/index.html" ) y el "Host" es la página que quieres cargar. En este caso, si tienes configurado el fichero "/etc/hosts" como tu me has dicho, te debería dar el contenido del fichero de "/var/www/index.html".

Otro ejemplo: Si vamos a la página web "http://www.lawebdemicurro.com" pasa lo mismo:

GET /
Host: www.lawebdemicurro.com

Dame el fichero "/" ( que Apache entiende como "/index.html" ) del Host "www.lawebdemicurro.com", y esto devuelve el fichero de "/var/www/index.html". Que es el mismo de antes!

Claro, así no puedes conseguir lo que te propones. Ya que los dos nombres de HOST distintos, apuntan al mismo sitio ( "/var/www" ).

Vale, ahora vamos a crear dos carpetas en el servidor, algo así:

$ sudo mkdir /var/www/mipaginapersonal.com
$ sudo mkdir /var/www/lawebdemicurro.com

Si te fijas, no he puesto las www. Es solo una preferencia personal. Pero son nombres de carpetas, les puedes poner los nombres que quieras. Bien, y ahora lo que haremos será crear un VirtualHost. Que me propongo? Algo así:
Cuando abramos www.mipaginapersonal.com abra la ruta /var/www/mipaginapersonal.com
Cuando abaramos www.laewebdemicurro.com abra la ruta /var/www/lawebdemicurro.com

inEdit00: "Te parece?"
Visitante: "Si, esto es jutsto lo que yo quiero!! Como se hace?"
inEdit00: "Bien, antes hagamos lo siguiente:"

$ sudo gedit /var/www/mipaginapersonal.com
Y añadimos aqui el siguiente texto "Bienvenido a mi página personal!!!". Guardamos y salimos.
$ sudo gedit /var/www/lawebdemicurro.com
Y añadimos aqui el siguiente texto "Bienvenido a la web de mi curro!!!". Guardamos y salimos.


[Virtual Hosts]
Bien, al lío, a por los virtual Hosts. Vamos a crear el siguiente fichero:
$ sudo gedit /etc/apache2/sites-aviable/lawebdemicurro.com

Y en este fichero añadiremos algo tal que así:


<VirtualHost *:80>
ServerName www.lawebdemicurro.com
ServerAlias www.lawebdemicurro.com
DocumentRoot /var/www/lawebdemicurro.com

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

</VirtualHost>



Visitante: "Vale, que significa cada línea?"
inEdit00: Bueno, con esto "" decimos que estamos creando un virtual host que "escuchará" cualquier IP de origen "*" y escucha en el puerto 80.
"ServerName" y "ServerAlias" sirven para especificar el nombre del Host. Este debe ser exactamente el que tu quieras. Y el mismo que hayas puesto en el fichero /etc/hosts, ok?
Y aquí viene la importante "DocumentRoot /var/www/lawebdemicurro.com". Te imaginas lo que es, verdad? Aqui le decimos en que carpeta tiene que buscar cuando intren en el nombre de dominio seleccionado. Capito?
Visitante: "Si, ya veo!"
inEdit00: "Lo demás es un tema de permisos y no me he mirado con profundiad y no acabo de entender bien, la verdad. Tu dejalo igual y debería funcionar perfecto".
Visitante: "Bien, voy a probar!"
inEdit00 Piensa que tienes que hacer lo mismo con tu dominio "www.mipaginapersonal.com", eh?"
Visitante: "Haber, pone como sería la configuración..."
inEdit00: "Justo así"

$ sudo gedit /etc/apache2/sites-aviable/mipaginapersonal.com

<VirtualHost *:80>
ServerName www.mipaginapersonal.com
ServerAlias www.mipaginapersonal.com
DocumentRoot /var/www/mipaginapersonal.com

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

</VirtualHost>



[Puesta apunto]
Visitante: "Bien, he reiniciado el apache como me dijistes ( primero con reload y después con restart ) y no funciona!"
inEdit00: "Yaaaa, prisas! Tate un momento, todavía falta algo. Ejecuta lo siguiente:"
$ cd /etc/apache2/sites-aviable
$ sudo a2ensite mipaginapersonal.com
$ sudo a2ensite lawebdemicurro.com
$ sudo service apache2 reload"

[Final]
inEdit00: "Y ya debería funcionar! Ahora si entras en 'www.lawebdemicurro.com' debería salirte el mensaje:
Bienvenido a la web de mi curro!!!
inEdit00: "Y si entras en 'www.mipaginapersonal.com' te debería mostrar:
Bienvenido a mi página personal!!!

inEdit00: "Bueno, ahora solo hace falta que te copies tus paginas con todos sus directorios dentros de las carpetas correspondientes de '/var/www' y ya está."
Visitante: "Gracias! Es justo lo que quería!"

inEdit00: "Un último detalle! Es muy importante que tengas una entrada en el fichero /etc/hosts para cada domino, de otro modo, si intentas entrar en: 'http://www.mipaginapersonal.com' y no está en el fichero hosts, no se encontrará, y la irá a buscar por DNS a ver si está en Internet (que no está, y si está no es la tuya seguro), ok?"
inEdit00: Fíjate en esto, Si accedes a :"
http://localhost/index.html estás pidiendo /var/www
http://www.lawebdemicurro.com/index.html estás pidiendo /var/www/lawebdemicurro.com/index.html
http://index.html/lawebdemicurro/index.html estás pidiendo /var/www/lawebdemicurro.com/index.html

inEdit00: "Lo entiendes?"
Visitante: "Si, si, claro. Como localhost es el directorio raíz y dentro hay carpetas, yo puedo acceder desde las dos rutas! Pero si quiero acceder desde un ordenador remoto deberé poner la URL completa y no localhost, porque sinó no funcionaría, verdad"
inEdit00: "Exactamente! Ala , hasta la próxima!"



Nota: Recuerta, TÚ eres el visitante, si tienes dudas o necesitas ayuda, no dudes en dejar comentarios!

Instalando Apache2, para dummies [I]

[Disclaimer]
Hace nade que dije que dejaba el blog, porque no tenía cosas interesantes que contar y falta de tiempo. Dije que escribiría esporádicamente. Pues este fin de semana he tenido algo de tiempo libre y ha salido algo así:

[Introducción]
Esto quiere ser un pequeño manualillo, sobre la instalación Apache. Me gusta empezar con lo básico y después ir subiendo el nivel. (si tengo tiempo)
Bueno, como introducción diremos que Apache es un servidor web que se encarga de servir contenido web, ya sea estático o dinámico. Hay muchos servidores web, pero Apache es uno de los más usados en el mundo, ya sea para webs modestas o para webs con mucho tráfico. Al final el manualillo debes ser capaz de empezar a aprender HTML, PHP, JavaScript o CSS ( o todos a la vez! ).

[Instalación]

Para empezar tenemos que instalar Apache ( y PHP, ya que estamos ):

$ sudo aptitude install apache2 php5 libapache2-mod-php5

Para ver si la instalación ha ido bien abrimos nuestro navegador por defecto y entramos en:
http://localhost

Debería salir una de mis frases preferidas en informática: "It works"

[Configuración y gestión]

Bien, con apache instalado vamos a aprender unas comandas básicas para gestionarlo, antes de ponernos a jugar con el.
Si queremos [apagar/encender/reiniciar] el servicio Apache 2 podemos hacer:
$ sudo service apache2 stop
$ sudo service apache2 start
$ sudo service apache2 restart

Cuando iniciamos el servidor apache, éste carga todas las configuraciones a memória, lo que significa que si hacemos un cambio en los ficheros de configuración ( que se encuentran en /etc/apache2 ), los cambios no tendrán efecto hasta el próximo reinicio de Apache. Es importante acordarse de reiniciar el servicio después de cada modificación! Para no tener que hacer un restart ( que realmente hace un "stop" y para luego hacer un "start" ) tenemos el comando siguiente:
$ sudo service apache2 reload

Este nos cargará los nuevos ficheros de configuración a memória si todo ha ido bien.

Es bastante típico encontrarse con un error tal que así: Editamos el fichero "/etc/apache2/apache2.conf" ( podría ser cualquier otro ) y ponemos una línea nuevo con "ErrorrrLevel debug", que está mal escrito a propósito. Si ahora reiniciamos apache nos da un mensajito, nada amistoso a mi parecer, que reza algo así:

inedit@wally:/etc/apache2$ sudo service apache2 reload
Syntax error on line 110 of /etc/apache2/apache2.conf:
Invalid command 'ErrorrLevel', perhaps misspelled or defined by a module not included in the server configuration
...fail!

Bueno, realmente el servicio sigue corriendo con la configuración antigua, no se ha roto nada. Para comprobar si todos los ficheros de configuración són correctos podemos ejecutar el comando:
$ apache2ctl configtest
El error sería exactamente el mismo que hemos visto antes haciendo un "reload":

inedit@wally:/etc/apache2$ apache2ctl configtest
Syntax error on line 110 of /etc/apache2/apache2.conf:
Invalid command 'ErrorrLevel', perhaps misspelled or defined by a module not included in the server configuration

Es una buena práctica ejecutar este comando para ver si todo se ha configurado correctamente.

Que pasa si hacemos un "sudo service apache2 restart" en un servidor que está en producción? Osea, en un servidor que puede estar teniendo conexiones en el mismo momento que reiniciamos? Pues facil, que los clientes van a recibir un precioso error en su navegador. Y claro, no queremos que esto ocurra. Para ello usa siempre que puedas (es la manera educada de decir que lo uses SIEMPRE) "reload". Pero aún así hay un comando que nos garantiza que no van a perderse las conexiones activas con el servidor. Este comando es:
$ sudo apache2ctl graceful

[Creación de contenido y URL's]
Visitante: "Si, pero yo he entrado en esta página esperando hacer cosas chulas con Apache, y tu solo me hablas de configuracioneees".
inEdit00: "Ya lo seee, impacienteee! Vamos a hacer un brake:"

En la carpeta "/var/www" es donde se almacena el contenido de tu página web. Esto significa que si haces un:
http://localhost/index.html estás accediendo a /var/www/index.html
del mismo modo que si pones:
http://localhost/foo.html estás accediendo a /var/www/foo.html
o que si pones:
http://127.0.0.1/imagenes/foo.jpg estás accediendo a /var/www/imagenes/foo.jpg

Pillas la idea? Es evidente que estos ejemplos no van a funcionar si no tienes los ficheros "index.html", "foo.html" o la carpeta "imágenes" con una foto dentro!

Visitante: "Por que has puesto "localhost" y después '127.0.0.1'? Me confunde."
inEdit00: "127.0.0.1" designa tu ordenador, esto se llama loopback ( prueba a hacer "ifconfig lo" ). Osea, es una IP que "apunta" al mismo equipo. Todos los equipos tienen esta configuración. Como tu tienes instalado el servidor web de Apache en tu equipo, necesitas conectarte a el. Si tienes Apache instalado en un PC fijo y quieres acceder al servidor desde un portátil de tu misma red puedes hacer algo tal que así: deberás buscar tu dirección IP ( ejecuta "ifconfig" para saber que IP local tienes ) que será algo así: 192.168.1.96 ( por ejemplo ). Entonces desde el portátil tienes que poner en el navegador "http://192.168.1.96" y deberías ver "IT WORKS", o lo que contenga el fichero "/var/www/index.html" . Capito?

Visitante: "...o sea, que si en mi portátil pongo la IP del PC fijo puedo ver lo que sirve Apache... interesante"
inEdit00: "Claro, siempre que Apache esté funcionando! A partir de ahora se va a ejecutar como demonio ( en segundo plano ) cada vez que inicies el PC fijo"
Visitante: "Ei! Esto no funciona! He hecho un 'http://localhost' en el portátil y no tira!"
inEdit00: "Claro, alma de cántaro. 'localhost' designa el mismo ordenador. Si pones esto en el portátil, él intenta conectarse a si mismo, y como no tienes ningún servidor web instalado, no funciona! Usa la IP del PC fijo, que para esto están"
Visitante: "..ah, si... tiene sentido."
Visitante: "entiendo. Entonces localhost es parecido a '127.0.0.1'?"
inEdit00: "Acertaste! De hecho quiero que veas esto. Ejecuta el siguiente comando:"
$ cat /etc/hosts
inedit@wally:~/hola$ cat /etc/hosts
127.0.0.1 localhost
127.0.0.1 linuxjan.ib
127.0.0.1 js.com
192.168.1.36 ofelia

Bueno, a ti te deberían salir menos entradas que a mi. Qué es esto? Pues es una relación clave-valor (IP-nombre). A la izquierda se encuentran las IP's y a la derecha los nombres de dominio. Osea, si te fijas tengo asignados diferentes nombres para "127.0.0.1": "localhost, linuxjan.ib, js.com". Lo que significa que si pongo "linuxjan.ib" en mi navegador, se dirige a '127.0.0.1' igual que si pongo 'localhost'. Esto sirve para no tener que recordar IP's, sino nombres de dominio. Puedes ver que el último elemento de la lista es diferente del resto. Lo que yo hago aqui es decirle que la dirección IP "192.168.1.36" se llama "ofelia", para no tener que acordarme de su IP.

inEdit: "Que te parece?"
Visitante: "osea que si modifico localhost..."
inEdit: "yo no haría esto! Mucho programas usan localhost como referencia a la misma máquina, mejor deja la entrada donde está"
Visitante: "pero puedo añadir elementos a la lista? Como por ejemplo: '127.0.0.1 www.paginapersonaldeprueba.com' ?"
inEdit: "claro. Pruebalo. Cuando accedas a la URL que hayas elegido, deberías ver lo de 'It works!'"
Visitante: "y también puedo añadir '127.0.0.1 www.google.com'?"
inEdit: 'si pero...
Visitante: "Pues voy a probarlo! Mola. Pero... ostia! El google ha dejado de funcionar!!!!"
inEdit: "... pero si pones un nombre de dominio que ya exista, este se resolverá primero con las entradas de tu fichero "/etc/hosts" y si allí no se encuentra, se intentará resolver por DNS. Puedes arreglarlo quitando la línea del fichero."
Visitante: "No, la dejo! Y ahora voy a putear a mi hermana quitándole el google"
inEdit: ".... ¬¬"
(dos minutos después)
Visitante: "No lo entiendo, a mi no me funciona pero a ella si!"
inEdit: "claro, macho! Porque el fichero /etc/hosts está en tu PC, y no en el suyo. Esto solo son cambios locales, si tu pones una entrada así: '127.0.0.1 srv.com' esto solo funcionará en tu PC. Ok?"
Visitante: "Vale, lo entiendo. Los cambios solo son locales."
inEdit. "Exacto. Sigamos:"

A partir de ahora ya puedes empezar a crear tus páginas creando ficheros dentro de "/var/www". También puedes ( debes! ) crear carpetas para distinguir las imágenes de las hojas de estilos ( CSS ) del JavaScript! Si haces esto:
$ sudo mkdir /var/www/sub-folder
Y después creas el fichero "index.html" dentro así:
$ sudo gedit /var/www/sub-folder/index.html
Y pones como contenido algo así:
<>
<>
<>Estamos en sub folder!< /p>
< /body>
< /html>

Nota: he puesto dos espacios antes de cada "tag" para que blogger no lo interprete. Se debe escribir sin doble espaciado.
Para acceder a este contenido puedes hacerlo así ( en tu navegador ):
http://localhost/sub-folder
http://localhost/sub-folder/index.html

Apache se encarga de cargar el fichero "index.html" ( si existe! ) si como nombre de la ruta se le especifica una carpeta.

[Despedida]
Bueno, y esto es todo por hoy. Ahora puedes buscar por internet cualquier manual sobre:
  • HTML: para contenido estático.
  • CSS: para estilo ( colores, formatos, dimensiones, efectos, etc... )
  • JavaScript: para validaciones, para hacer peticiones asíncronas al servidor, modificación/creación de objetos del DOM en tiempo real..etc ( muy recomendado usar MooTools )
  • PHP: lenguaje de programación muy asequible para empezar ( por dificultad ) y muy fácil coger malas costumbres. Las birrias funcionan, aún siendo birrias. Pero bueno, por algo se tiene que empezar.

domingo, 25 de abril de 2010

Dandole caña a VIM

Venga va, una de VIM. Como todo el mundo conocerá, VIM es uno de los grades editores de texto modo consola que existen. En todas las máquina UNIX viene instalado VI por defecto, que es su versión little ( de hecho VIM es la versión ampliada ). Bien, hay un montón de manuales sobre VIM en internet, muchísimos. Pero una buena herramienta para aprender a usar el vim es el vimtutor. Es un comando que ejecutas en la consola y se te va a abrir un manual/tutorial para que vayas siguiendo. Muy útil.
Instalar el VIM:
$ sudo aptitude install vim

Bien, este post es una recopilación de comandos que uso en Normal mode, que me ayudan a trabajar mucho mas rápido. Es de nivel medio-avanzado. Si nunca has usado VIM, ejecuta "vimtutor" en un terminal y peléate con el durante un par de días, mejor.

Para empezar vamos a ver los típicos de borrar:
dd = Borra la línea actual
d = Borra desde donde estás hasta el fin de la línea
d3 Borra la línea actual más las tres líneas inferiores a la actual

Estos mismos comandos se pueden hacer con solo copia, y no borrado:
yy = Copia la línea actual.
Y = Lo mismo que "yy"
y = Copia hasta el final
y3 = Copia la línea actual más las tres de arriba.

Pero para hacer el copiado de una manera mas humana tenemos el modo VISUAL. Este se activa pulsando la tecla "v". Con el modo VISUAL activado podemos, desde nuestra posición actual, mover las flechas de dirección y ir seleccionando un texto deseado. Veamos un ejemplo:
vy = Esto nos pone vim en modo VISUAL, seleccionamos hasta el final de la línea y vamos marcando las tres líneas de abajo para ser copiadas. Finalizamos con "y" para copiar. Si pulsásemos "d" en vez de "y", borraríamos el texto seleccionado.
Y si queremos copiar todo un párrafo? Pues muy simple. Para movernos al inicio del párrafo, en normal mode ( Pulsar Esc ) pulsamos "{". De este modo estaremos situados al inicio del párrafo. Ahora, para seleccionarlo debemos ponernos en modo visual y pulsar la tecla "}". Y el comando "y". Quedaría algo como lo siguiente:
{v}y
Esto se puede simplificar y ahorrarnos ponernos en modo visual, haciendo uso de "y" primero. Seria algo así:
{y} = Nos situamos al inicio del párrafo, le damos a copiar y le decimos hasta donde. Con "}" estamos diciendo que queremos copiar hasta el final de párrafo actual. La misma manera de hacer una cosa, pero de dos modos distintos.

Si queremos copiar desde un sitio, digamos A, hasta un sitio B, tenemos un par de comandos muy buenos.
Para empezar nos situamos en A, y lo "marcamos" con el siguiente comando:
ma
ahora, para nos movemos hasta B y pulsamos, para copiar o para borrar los comandos:
d'a = borrar
y'a = copiar
Osea, marcamos el inicio y después borramos o copiamos desde el final.

Otra cosa que puede parecer una tontería pero que va bastante bien es lo siguiente. En Normal mode pulsar
:10 = Esto nos mueve la línea número 10
:+15 = Esto nos mueve 15 lineas adelante de la línea actual.

Mas comandos interesantes. Para moverte por un texto, si el cursor se encuentra en la parte de arriba y tu quieres bajar tiene que "recorrerte" toda la pantalla ya visible con el cursor para "empujar" la pantalla por la parte de abajo, esto se soluciona con los siguientes comandos:
Control + e = Para bajar
Control + y = Para subir

Y ahora los mas simples, pero que se usan mucho.
o: inserta una línea nueva justo por debajo de la línea actual
O: inserta una línea nueva justo por encima de la línea actual
p: pega justo por debajo de la línea actual
P: pega por encima de la línea actual

Para salir y guardar del documento actual se tiene que pulsar ":wq". Un modo mas simple para hacer esto mismo es pulsando ZZ. Hace lo mismo. Para guardar, cada vez tenemos que pulsar:
:w
para ahorrarnos esto, podemos hacer uso del comando nmap:
:nmap ññ :w
"" se tiene que escribir también. Ahora, cuando pulsemos ññ en el teclado, se va a ejecutar el comando ":w". Bonito, verdad? Si queremos hacer que esta opción esté siempre disponible al inicio del vim, tenemos que ediar el fichero ~/.vimrc y añadir la linea mencionada anteriormente.

Me tomo la libertad de darte un consejo: No intentes memorizar un comando. Apúntate en un papelito un par de comandos que encuentres útiles y tenlo cerca de modo que cuando quieras usarlo sepas que lo tienes ahí. En una semana te sabrás todos los comandos que te resultan más útiles de memoria, los otros seguramente no merezca la pena aprendérselos, ya que los usas mucho menos. Y cada semana, busca algún comando nuevo. Y practica mucho, mucho!

Y ahora te pregunto: cuales son tus atajos/trucos que usas? Deja tu comentario. Saludos!

sábado, 17 de abril de 2010

OpenBox: Gestor de ventanas rápido y ligero

Bueno, hoy os quiero hablar un poquito de algo que estoy probando. Un nuevo gestor de ventanas: Open Box. Ya sabéis lo que es un gestor de ventanas: los típicos ejemplos pueden ser GNOME y KDE.

Por que cambiar a algo nuevo y diferente? Bueno, el cambio es bueno. En el curro hay un compañero que lo usa y me ha picado la curiosidad. Aviso: no es algo que te instales y esté todo funcionando y perfecto. No. Se tiene que personalizar de modo que tu crees una interface entre el PC y tu de modo que te sientas cómodo para trabajar. Pero se puede personalizar hasta limites insospechados. Por ejemplo, puedes configurar hasta que cuando hagas una combinación de teclas determinada ( keybindings ) te abra tus 4 programas preferidos ( firefox, thunderbird, rythmbox y givm ) en un escritorio virtual determinado, con una resolución que tu especifiques y una disposición a tu gusto.

El estilo es muy austero, se deja de cosas visuales bonitas, pero por otra parte es muy muy rápido. Se nota mucho el cambio de GNOME a OpenBox, desde luego. El cambio de escritorio o cambiar de aplicación mediante Alt+Tab van volados. Al ser altamente personalizable, puedes ir puliendo tu escritorio de modo que cada vez te mueves más rápido en el.

Bueno, cuando instalas OpenBox, de buenas a primeras, lo único que tienes es un fondo de pantalla. Nada mas. Ni un menú, ni icono, ni barras, ni nada. Tu puntero de ratón y un fondo de pantalla. Punto. La única acción obvia que acabas probando es haciendo clic en algún espacio vació de la pantalla ( literalmente: le puedes dar en cualquier sitio ) con el botón derecho y ahí si sale un menú con un par de opciones. La verdad que a la gente que le guste experimentar ( y que tenga tiempo libre para dedicarle ) le recomiendo que lo pruebe. Que le de una oportunidad. La instalación es extremadamente simple y lo mejor es que uno no tiene que desinstalar GNOME o KDE, sino que puedes elegir el gestor de ventanas que quieres utilizar cuando haces login en tu sistema. Que te cansas o que no sabes hacer alguna cosa con OpenBox? Sales de la sesión y cargas tu gestor de ventanas habitual. Así de fácil.

Bueno, les voy a recomendar que si quieren probar OpenBox y no frustrarse al principio, le hechen una leída al siguiente manual, que es muy muy bueno ( y en inglés ):
Urukrama OpenBox Guide

Para configurar OpenBox lo único que se tiene que hacer es modificar ficheros .XML de un modo muy simple y claro. También hay algunas aplicaciones con GUI que se encargan de reducir las modificaciones de ficheros de texto, aunque la verdadera potencia de todo esto es que tu puedes modificar y adaptar los ficheros XML a tu gusto.

Links de interés:
[1]: Debian OpenBox
[2]: Urukrama OpenBox Keybindings

viernes, 9 de abril de 2010

CUDA [II] Instalación de toolkit y SDK para CUDA

Buenooo. Ahora nos dejamos ya de palabras y empezamos haciendo algo interesante. Pero antes quiero hacer un par de notitas:
  1. Vamos a instalar drivers nuevos. Lo más fácil es que los drivers nuevos no funcionarán a la primera o vete a saber tu qué. Entiendase que se puede liar la cosa.
  2. Hay gente que ha conseguido instalar todo el SDK y todo en Ubuntu 9.10. Yo no puede/supe. Lo he probado en Ubuntu 9.04 y ha funcionado perfectamente. El soporte de nVidia llega hasta 9.04.
  3. AVISO. El material que voy a poner aqui, en su mayoría van a ser cópido de otras páginas. Como podeis imaginar hay mucha gente que ha hablado hasta ahora del proceso de instalación, lo que la información está un poco "separada". Yo os pondré lo que me ha funcionado a mi, a modo de recopilación/traducción. No dejen de visitar las fuentes originales.
  4. Comprueben que sus tarjetas sean compatibles con CUDA.
Dados estos avisos, empezemos.

[INSTALANDO 9.04]
Tuve muchos problemas en Ubuntu 9.10. Como nVidia da soporte a Ubuntu 9.04 me dije, pues instalalo. Y esto hice. He creado una partición en mi disco y he instalado 9.04. Os recomiendo que hagais igual, si os quereis ahorrar problemas. Además, así podeis hacer las pruebas que querais sin miedo a perder datos ni nada. La instalación tiene que ser nativa! No virtualizeis!

[INSTALANDO DRIVERS][1]
Una vez tenemos nuestro 9.04 funcionando y operativo, debemos instalar los últimos drivers de nVidia, los 195. Para ello seguiremos estos pasos:
$ sudo su
$ echo DRIVERS NVIDIA 195 >> /etc/apt/sources.list
$ echo deb http://ppa.launchpad.net/nvidia-vdpau/ppa/ubuntu jaunty main >> /etc/apt/sources.list
$ echo deb-src http://ppa.launchpad.net/nvidia-vdpau/ppa/ubuntu jaunty main >> /etc/apt/sources.list
$ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CEC06767
$ aptitude update
$ aptitude install nvidia-195-modaliases nvidia-glx-195

[DESCARGANDO PAQUETES]
Tenemos que ir a la pagina web de CUDA, a descargas. Los paquetes que necesitamos son:
  • CUDA Toolkit for Ubuntu Linux 9.04
  • GPU Computing SDK code samples and more
La versión 32bits o 64 bits. Como corresponda. Los descargamos en el escritorio.

[INSTALANDO TOOLKIT] [2]
Para ello damos permisos de ejecución con el comando:
$ chmod +x ~/Escritorio/cudatoolkit_3.0_linux_32_ubuntu9.04.run

Y ahora lo instalaremos. Pero resulta que al instalarlo, si tenemos GDM iniciado, da un error. Para esto utilizaremos una consola tty1. Apunta los pasos ya que cerraremos GDM y te vas a quedar sin gestor de ventanas. Será solo un momento.
  • Pulsamos Control+Alt+F1
  • Entramos con un usuarios que tenga privilegios administrativos
  • $ sudo service gdm stop
  • $ cd /home/nombre_del_usuario/Escritorio
  • $ sudo ./cudatoolkit_3.0_linux_32_ubuntu9.04.run
  • $ sudo service gdm start
  • Pulsamos Control+Alt+F7, iniciamos sesion normalmente y seguimos el proceso
Ahora tenemos que añadir los directorios de nvidia a PATH. Abrimos un terminal:
  • $ sudo vim /etc/bash.bash.rc #Si no sabes usar vim, pon "gedit" en lugar de "vim"
  • Al final del fichero incluiremos dos líneas:
export PATH=${PATH}:/usr/local/cuda/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64

Si tenemos un sistema de 32 bits, cambiamos "lib64" por "lib". Guardamos el fichero y Toolkit instalado.

[INSTALANDO EL SDK][2]
Hacemos el fichero ejecutable con:
$ chmod +x ~/Escritorio/gpucomputingsdk_3.0_linux.run
No hace falta que se instale con privilegios de ROOT. Instalar con el usuario que va a usar el SDK.
$ ./gpucomputingsdk_3.0_linux.run
Las preguntas que nos hace las contestamos con un "enter". El default ya nos sirve. Una vez instalado entramos en la carpeta del SDK:
$ cd ~/NVIDIA_GPU_Computing_SDK/C
Instalamos dependencias:
$ sudo aptitude install freeglut3 freeglut3-dev libx11-dev mesa-common-dev libxmu6 libxi-dev libxmu-dev
Y compilamos los codigos:
$ make

[EJECUTANDO EJEMPLOS][2]
Si todo ha funcionado correctamente, ahora podremos ejecutar los siguientes comandos:
$ cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/released
$ ./deviceQuery
$ ./fluidsGL
$ ./smokeParticles
$ ./particles

[POSIBLES PROBLEMAS]
  • El compilador gcc tiene que ser verión 4.3 ( en mi caso 4.3.3 ). El compilador 4.4 no funciona directamente. Diríganse a [2] para ver como se puede "arreglar" el problema.
  • Es muy importante tener instalado ( y funcionando ) los últimos drivers de nVidia. El SDK funciona solo con los drivers más nuevos.
  • Links dónde encontré respuestas que ayudaron a aclararme: [3] [4]
  • De dependencias. Pero siguiendo los pasos anteriores deberían quedar todas cubiertas.

[1] Via: dame-linux. Un post simple, fácil y para toda la familia. No dejen de hecharle un vistazo.
[2] Vía stealthcopter Fué el mejor post que encontré. Lo instalan en 9.10, pero a mi no me llegó a funcionar. Yo lo he traducido y adaptado a 9.04, pero es una copia de este post.
[3] Foro de nVidia. Problemas a la ejecución de algunas demos.
[4] Foro de nVidia. Error con ficheros gl.h glu.h

jueves, 18 de marzo de 2010

Sobre la facilidad de criticar el trabajo de otros O como tu opinión no le importa a nadie....

[molesto]
Vía Ubuntizando el Planeta, en su post "Esto no es una democracia" me entero que Mark Suttleworth ha dado una respuesta contundente a la pregunta si Canonical es, o no, una democracia. Y la respuesta ha sido que no.



Faltaría mas. A mi modo de ver las cosas CREO que la gente que se queja ahora por una nimidad como la posición de unos botones y que por otra parte casi seguro que no ha hecho "nada" [1] para mejorar Ubuntu, son unos desagradecidos.

Osea, estas usando una distribución que mejora cada día. Cada 6 meses tienes una versión nueva. Los chicos de Canonical están haciendo un trabajo extraordinario [2]. Y las decisiones que toman ( como muy bien explica Mark ) las toman por algo, jefes de proyecto y decisiones que se toman conjuntamente con los equipos de trabajo que solo se dedican a esto, a tomar decisiones y a implementarlas. Y nosotros, evidentemente, podemos OPINAR. Y nada mas!

Hay quien piensa que todo el mundo tiene derecho a opinión y a voto. Esto es falso[3]. Y me explico:

Opinión siempre la puedes tener sobre un tema determinado. Faltaría mas! Pero no quiere decir que el hecho de que tú tengas opinión, vaya a interesarle a nadie. Yo soy de los que creo que las opiniones son validas, o no, dependiendo de la persona que las divulga. Si yo mismo empiezo a dar opinión sobre le mundillo de la física [ que no tengo absolutamente ni idea ] por un artículo que he leído o por algo que he visto en la televisión entiendo que mi opinión no tenga ninguna validez para un físico con 20 años de experiencia. Del mismo modo que no tiene validez para mi la opinión que pueda tener mi abuelo sobre el Software Libre por UN artículo que ha leído en el periódico esta mañana. Esto es así, señores. Opinar ( y querer ser tomado en serio ) es muy fácil, pero uno se tiene que ganar el derecho a ello.

Derecho a voto? Si. Si te preguntan. Si Canonical hace una encuestra. Si en Ubuntu sale un popup pidendo tu opinión/voto sobre algo. Adelante. Contesta. Ayuda. Te están pidiendo tu opinión. Ahora es tu oportunidad. Pero esto no significa que tu, cuando te apetezca y sobre el tema que te apetezca, puedas ir "reclamando" a Canonical el porqué lo han hecho así, y porque no lo cambian a tu gusto. Una gran mayoría de los usuarios consideran que el [polemico] alineamiento de los botones puede ser un problema muy grande a la hora de usar Ubuntul, algo crucial para el desarrollo del SO.... se puede cambiar. Un comando en la consola. UNO!! Y aún así nos seguimos quejando. Por favoooooor! Es normal ( si, si, he dicho normal ) que Canonical no nos tome enserio. Que un tema sin tan poca imprtáncia haya generado tanta polémica. Esto si, sobre la última versión del kernel no he leído ninguna queja, la verdad. Significa que esté bien al 100%? Pues seguramente no, lo que pasa es que el publico en general:
1) No está interesado en saber que maldita mejora se ha hecho en el kernel
2) Solo quieren que funcione
3) Las mejoras no parecen nada evidente, que resalte a la vista y por tanto la gente no se pude general una "opinión" de manera facil, sencilla y que no le cueste esfuerzo
4) No está interesado en estudiar y aprender la programación necesaria para poder efectuar juicios sobre el tema. Que por eso ya tenemos a los chicos de Canonical que ya saben, no?
5) Se están quejando de los botoncitos

Un post duro. Si.
Estoy de acuerdo con Mark? Completamente.
Me gusta el cambio de los botones? Pues todavía no los he probado. A primera vista suponen un cambio de lo "habitual" y el cambio me genera rechazo. Les daré una oportunidad de varias semanas. Sino yo se que con UN COMANDO lo dejo como antes. No problemo. Al menos no para mi.
Porque he escrito esto? Pues porque lo que me molesta es la hipocresía de la gente, que hace un par de semanas parece que todo el mundo quiere opinar/votar/cambiar una decisión tomada por otros, y que seguramente esta gente no se preocupa lo mas mínimo por temas mas importantes y menos populares ( a mi parecer, claro ) como podrían ser el rendimiento, la seguridad o la estabilidad del sistema. No he visto a NADIE que proponga poner un botón en Sistema>Preferencias>Apariencia para elegir la posición de los botones. A NADIE. Es una pena.
[/molesto]

Esta, Señores mios, es mi humilde opinión.

[1] Me refiero nada importante como desarrollar una apliación para Ubuntu, o hacer de betatester, o simplemente empezar a picar códio de algun proyecto. Lo digo porque es muy facil criticar desde fuera. Si realmente viesen el esfuerzo que se ha hecho y que se está haciendo, creo que se tomarían las cosas con mas calma. Por otra parte es muy posible que hayan hecho reportes de errores y consideren que esto es una colaboración muy importante ( que lo es). Pero esto es dar a siguiente>siguiente>explicación>finalizar. No son meses de trabajo, vaya.
[2] Tienen como competencia a empresas de la talla Microsoft o Apple.
[3] En el entorno del que estamos hablando, claro. Nuestro país es un país democrático y el derecho al voto y a la libertad de expresión son derechos fundamentales.

domingo, 7 de marzo de 2010

unreadahead-other main process terminated with status 2 [SOLUCIONADO]

En el visor del sistemas se estaban consumiendo entre 40-60% de CPU sin hacer nada. He ido al registro del sistema y en "daemon.log" me he encontrado que cada segundo añadía unas 10 líneas con el texto del título del post. Esto se soluciona tan fácil como:
  • Abrir /etc/fstab con privilegios de superusuario
  • Borrar las entradas que se han añadido manualmente
  • Reiniciar le equipo
Y problema resuleto.

martes, 23 de febrero de 2010

OpenSSH, hash / digest [II]

Explicación
Hoy vamos a explicar lo que es un hash o un "digest" de un mensaje. Cuando nosotros tenemos unos datos determinados, ya sean ficheros de texto o binarios, podemos hacer un resumen de estos datos. Que significa hacer un resumen? Pues muy fácil. Tenemos una fotografía, y queremos sacar su "hash" ( también llamado resumen o digest, ok? ). Pues lo que hará el programa encargado de hacer el hash es lo siguiente:
  • Va a comprimir la foto lo más que pueda
  • Va a partir la foto en trozos de un tamaño determinado
  • Aplicará una función a cada uno de los trocitos.
  • Esta función siempre devuelve un nº de bits determinados.
  • El resultado se combina siempre con el resultado anterior.
Lo que nos promete el algorítmo es que si cambia un solo bit del fichero original, la función de hash va a ser completamente diferente que el resultado de la función del fichero original. De este modo podemos saber si un fichero se ha modificado. Esto se puede hacer con todo tipo de archivos.
Y una propiedad que puede ser obvia pero que debe comentarse, es que de un "hash" no se puede volver a la información original. Es una operación de un solo sentido. Podemos hacer el hash de "hola". Pero del hash resultante no lo podemos volver a su estado original (en nuestro caso a la palabra "hola" ). Es imposible.

Para que se usa algo así?
Bueno, en seguridad tiene mucha utilidades, pero un ejemplo muy fácil de entender es el siguiente: Imagina que quieres mandarle una pelicula a tu amigo. Para saber si le ha llegado bien, lo que se hará será lo siguiente: calcular el hash en mi PC y que el amigo calcule su función de hash en su PC. Si son iguales, sabemos que el fichero se ha mandado bien.
También sirve para guardar passwords de modo seguro, etc...

Tipos de algorítmos de hash?
Bueno, pues ya los listé en el post anterior. Los algorítmos soportados por OpenSSL son los siguientes:
md2, md5, mdc2, rmd160, sha, sha1, sha224, sha256, sha384, sha512

Es posible que dos resumenes de dos ficheros diferentes nos den el mismo resultado?
Teoricamente si. Pero la la probabilidad de que esto ocurra es MUY baja. Tal que así:
  • Si utilizamos un algorítmo como md5 que hace un resumen de 128 bits existe la probabilidad de 1/(2^128) que es lo mismo que 1 / 340282366920938463463374607431768211456
  • Si utilizamos sha256 la probabilidad de 1 / (2^256)
Recordemos que 256 bits no es el doble de posibilidades que 128 bits! El doble de 128 bits es 129 bits!!


Vale, la teoría está explicada. Pero mejor acabarlo de pulir con un par de ejemplos:

Creamos un fichero de texto con el siguiente comando:
$ echo "TEXTO TEXTO TEXTO" > ar1.txt
Y ahora procedemos a calcular su función de hash:
$ openssl dgst -md5 ar1.txt
MD5(ar1.txt)= c89977bcf69702e21a82575b187459d4

Bien, que significa el resultado? Pues bien, que aplicando el hash MD5 del fichero "ar1.txt" tenemos un resultado tal y como se ve aquí arriba.

Vale, vamos a hacer un cambio tonto en el fichero:
$ echo "TEXTO TEXTo TEXTO" > ar2.txt
Y ahora procedemos a calcular su función de hash:
$ openssl dgst -md5 ar1.txt ar2.txt
MD5(ar1.txt)= c89977bcf69702e21a82575b187459d4
MD5(ar2.txt)= 31b68c308e9299482ef2b2754df853be

Ahora, como podeis ver he hecho el hash de los dos ficheros "ar1.txt" y "ar2.txt". Como se puede apreciar claramente, los hashes son completamente distintos uno del otro, lo que significa que los ficheros no son esctrictamente iguales. Es de vital importancia entender que un cambio, por insignificante que sea, nos devuelve un hash completamente diferente del original.

Si queremos utilizar programas más simples de usar que openssl podemos utilizar:
  • md5sum
  • sha1sum
  • sha256sum
La sintaxis es mas sencilla. Aqui un ejemplo aplicable a todos los algorítmos:
$ md5sum ar1.txt
c89977bcf69702e21a82575b187459d4 ar1.txt
Y el resultado, como podeis apreciar, es muy similar ( y el hash idéntico, evidentemente ).

Espero que lo hayan entendido.

Saludos!

sábado, 20 de febrero de 2010

Cifrando ficheros mediante OpenSSL

Otra de seguridad informatica.

Si queremos cifrar datos con un sistema seguro en GNU/Linux, disponemos de la herramienta que viene con todas las instalaciones; OPENSSL. Vamos allà:

Definición
OpenSSL es un implementación criptografica muy pontente que implementa, entre otras cosas, Secure Sockets Layer (SSL) y Transport Layer Security (TLS v1). Estos dos protocols son lo que nos permiten navegar de manera segura y mantener nuetros datos de manera privada. Para ello, OpenSSL dispone los mejores algoritmos de encriptación simétrica y asimétrica.

Usos
Se puede usar para:
  • Creación de claves DSA y RSA
  • Creación de certificados x.509
  • Calcular "hash" de ficheros
  • Cifrado y descifrado de datos
  • Pruebas SSL/TLS tanto Cliente como Servidor
  • Sabe manejar signaturas S/MIME y correos cifrados con esta misma tecnología
Algoritmos de hash
  • md2, md5, mdc2, rmd160, sha, sha1, sha224, sha256, sha384, sha512
Algoritmos de cifrado
  • Base 64, Blowfish, CAST5, DES, Triple-DES, IDEA, RC2, RC4, RC5, AES
Ejemplos de cifrado simetrico
Bien, como pequeña practica os mostraré como cifrar un documento de manera segura.
El comando es:
$ openssl
Vamos a usar la opción "enc", que sirve para cifrar los datos que queramos. Para ver los algoritmos soportados podemos hacer un:
$ openssl enc --help
Elegimos uno de los algoritmos de cifrado (recomendado AES, Blowfish, o TripleDes), como por ejemplo -aes256. El comando nos quedará algo así:
$ openssl enc -aes256
Ahora tenemos que poner la acción que vamos a realizar. Podemos cifrar ("-c") o descifrar ("-d"). En nuestro caso queremos cifrar el fichero "ar1.txt", entonces esto nos quedará algo así:
$ openssl enc -aes256 -e
Per claro, no hemos especificado que archivo va a ser cifrado. Para ello utilizaremos "-in" y "-out". Queremos cifrar "ar1.txt" y nos va a quedar como "ar1.cy". Escribiremos lo siguiente:
$ openssl enc -aes256 -e -in ar1.txt -out ar1.cy
Ponemos el password que queramos recordando que debe tener una complejidad acorde con la seguridad que queramos dar a los datos. Bien. Ya tenemos nuestro fichero cifrado. Ahora para descifrarlo podemos usar el comando:
$ openssl enc -d -aes256 -d -in ar1.cy -out ar1_deciphered.txt
Y ya tenemos de nuevo nuestro fichero en cleartext!

Nota: como buena praxis, si queremos cifrar cualquier tipo de datos, es muy recomendado borrar de manera segura los datos en "cleartext" y no borrandolos de manera "normal".

Si quieres cifrar toda una carpeta es mucho mas practico comprimirla toda para luego cifrarla.

Saludos!

[Siguiente post: OpenSSH, hash / digest [II] ]

viernes, 12 de febrero de 2010

Respaldando datos con rsync

Hoy veremos el comando RSYNC. Que siempre viene bien tener a mano un programa que hace backups. Yo lo uso para hacer un backup de mi pendrive, así guardo todo lo que hago en clase cada día. También me sirve para tener mi carpeta de “documentación” actualizada siempre en el pendrive. Vamos al lio:

Descripción del comando:
Rsync se define a si mismo como rapida, versatil, remota ( y local ) herramienta de copiado de ficheros.

Instalación:
Mediante synaptic, claro:
$ sudo aptitude install rsync

Sintaxis:
rsync [opciones] origen destino

Parametros y configuraciones:
Bien, me voy a dejar opciones seguro. Si hacen un “man rsync” encontrarán unas 2800 paginas de ayuda. Yo les quiero comentar las opciones más interesantes y de manera resumidilla:

-a: Archiva. Es una buena configuración. Es sinonimo que especificar “-DGgloprt”
-b: Hace una copia de los ficheros, aún estando en el destino. Normalmente no es útil utilizar esta opción, a no ser que se quiera tener copia de cada una de las versiones del fichero.
-g: Preserva el grupo de los ficheros que van a ser replicados. Importante para los backups.
-H: Preserva los “hard-links”. Esta opción relentiza el copiado, pero es muy recomendable.
-l: Copia los “symlinks” como “symlinks”. Sin esta opción marcada, un link simbólico sería respaldado como un fichero.
-n: Dry run ( Ejecución Seca ): Lista los ficheros que van a ser transferidos, pero no hace el respaldo.
-o: Preserva el usuario posesor de los ficheros que van a ser replicados. Importante.
-p: Preserva los permisos de los ficheros. Importante.
-r: Activa la recursividad. Para incluir todos los subdirectorios de una carpeta.
--rsh='ssh': Utiliza SSH par la transmisión de datos. Es recomendable ya que sinó usa el protocolo inseguro rsh. Se usa cuando el servidor remoto tiene instalado SSH, evidentemente.
-t: Preserva las fechas de modificación de cada fichero.
-v: Hace una de los ficheros que son transferidos.
-vv: Igual que -v, pero además muestra los ficheros que no van a ser copiados.
-vvv: Igual que -vv, pero también imprime información de debug de rsync
-z: Activa la compresión. Importante si hacemos respaldos a través de Internet.


Y ahora veamos un ejemplo:
#!/bin/bash
if [ -d "/media/FLASHDRIVE/" ]
then
rsync -altgv /media/FLASHDRIVE/TEMPORAL/ /home/inedit/Documentos/Backup/
else
echo "Debe colocar el dispositivo USB"
fi

Comprobamos si existe el directorio “flashdriver”. O sea, miramos si tenemos conectado o no el pendrive. En caso de que así sea, realizamos el respaldo viendo los datos que están siendo copiados.

Dejandolo todo en su sitio:
Ejecutaremos el comando:
$ chmod +x ./respaldo
$ cp ./respaldo /usr/bin/respaldo

Donde “respaldo” es el nombre de nuestro comando. Lo copiamos en /usr/bin porque así, cada vez que queramos ejecutar el respaldo de datos bastará con escribir en una consola:
$ respaldo

Saludos!

martes, 9 de febrero de 2010

Second round con Debian

Pos hoy escribo con gusto de boca amargo. Cuando cargaba el sistema se me ha calado en la maquina virtual... bueno, reinicia y va bien. Pero a la segunda. Me sale el cartelido de ayer "Kernel Faliure"... quiere mandar los datos para reparar el error? "Si a todo siempre"... ale, por colaborar que no sea

Bien. Lo primero, instalar SSH. Algo que siempre debe estar ahí.
# sudo aptitude install openssh-server ( porque me acuerdo de memoria, de veces que lo he instalado )
Todo OK. Instalación rapida. Voy a instalar el Firefox, que no viene por defecto:
# sudo aptitude install firefox..... espero. no sale nada. no propone ningńu paquete...

pruebo:
# sudo aptitude install firefox
Paquete no encontrado. Mecachis!

Bueeeeno, esto es que no estoy escribiendo bien el nombre. Ves a Synaptic, que siempre ayuda. Le doy a buscar: "firefox".
Resultados... pos que no sale nada parecido al navegador Firefox... algunos complementos pero nos se ve el navegador. Me mosqueo. Voy a los repositorios y cambio la fuente. Refresh. Error en 4 sources. Mierda. Busco el firefox de nuevo. Ahora ya ningún resultado, ni los complementos. Nada. Intento volver a los repositorios anteriores perooo.... aaamigo, donde antes habían dos elementos en la lista, ahora solo hay uno. Fuck.

Bueeeeeno. A saber porque falla. Pero soy un tio de recursos. Paaaagina oficial de firefox. Descarga un .tar.gz descomprime y busca un fichero INSTALL que no está. Afortunadamente veo un "run.firefox", le doy y funciona. Estupendo! Ya tengo el Firefox andando. Claro que toodos sus ficheros y dependencias se encuentran en una carpeta del sistema y no en sus respectivas carpetas del sistema. Pero almenos navego con el navegador que me gusta. Bien.

Pruebo el flash de youtube. Ya me lo esperaba: no funciona. Noooproblemo. A instalar el flash. Lo busco en repositorios y debian casi se rie de mi. Normal. Voy a la pagina oficial. "DESCARGAR" y tengo que elegir entre:
> flash_ubuntu.deb
> flash.apt
> flash.tar.gz
Hombreeeee.... el primero es .DEB... y estoy usando Debian. Igual funciona..... mmmm.... EPIC FAIL. No tira. Bueeeno. Probamos el segundo link. No carga. Jodeeeeer. A por el .tar.gz. Lo descargo, lo descomprimo y que hay dentro? un fichero .SO! Como se come esto? Es la primera vez que veo uno. Me aburro. Vago un poco por el sistema. La estetica es austera. Me gusta.

Que sabía yo de DEBIAN. Que era dificil. Que no te da nada masticadito. Hasta hace poco tenías que montarte tu los USB que pusieras ( no he conectado ninguno todavía )... y que me he encontrado? Exactamente esto. Pero es estable, robusto y seguro....

Tenía dos candidatos: Debian, por ser el "padre" de Ubuntu, y porque suponía que me sentiría familiarizado con el SO. Y Fedora, porque es la versión light de Red Hat, y a mi me gustaría presentarme algún dia al examen del RHCE (Red Hat Certified Enginieer). Mañana le hecharé otro vistazo a Debian, haber quetal... seguiré haciendo algunas pruebas, que igual hoy he tenido mala suerte y no he ha ido bien la cosa... nosé.

Si alguien usa este SO a diario, me encantaría oir la opinión que tiene sobre Debian. =)

Saludos!

EDIT: OppenOffice 2.4?!!! OMG! Creo que ya es mas que evidente que tengo algún problema de configuración en los repositorios. Ahora ya estamos a la 3.1 y estan por sacar ( si no han sacado ya ) la vesión 3.2!! Mañana investigo al respecto, sin duda se trata de algo que hago muuy mal.

lunes, 8 de febrero de 2010

Primera impresión Debian

Primero vía linuxzone y después ampliado en ubuntizando el planeta he visto la opinión de Debian sobre Ubuntu. Me ha parecido todo muy correcto, como debería ser siempre. Reconociendo tanto lo bueno como lo malo.

Y me ha apetecido probar Debian. He probado hasta ahora Mandrake, SUSE y Fedora... virtualizados y durante cortos periodos de tiempo. Nada de instalarlo nativamente y usarlo como herramienta de trabajo habitual.

La instalación muy simple. Lo dejé descargando paquetes durante la noche e instalandose y hoy por la mañana me lo he encontrado todo heho. Virtualizado con VirtualBox, version 32 bits con 1GB de RAM, trabaja más rapido que el Ubuntu nativo.

Primera impresión buena. Solo un pequeño mensajito que se queja de "Kernel Faliure"... que parece algo gordo, pero la verdad que todo funciona bien :P. Y también me ha sorprendido que no venga con Firefox, pero esto es un tema de personalización de cada uno.

Como me va con este "nuevo" SO, y si me decido por cambiar... porque ya sabeis, dicen que en la variedad está el gusto.

P.D.: Sigo con mi ajetreo diario. Mañanas ocupadas, dos horitas al mediodia y tooda la tarde en clase. Hasta las 21:30 que llego a casa, cansado ya. Proyectos finales, examenes... seguiré publicando a medida que tenga cosas interesantes que contar.

Saludos!

miércoles, 13 de enero de 2010

Comando script en Linux

Si quieres guardar una serie de ordenes, con sus respectivos resultados ejecutadas en un terminal, dispones del comando "script". Como se describe en su man: "hace una transcripción de una sesión de terminal".
Es un comando muy simple. Cuando queramos guardar una serie de órdenes, debemos escribir:

$ script
Script iniciado; el fichero es typescript
$ echo "pruebas con el comando script"
pruebas con el comando script
$ exit
Script terminado; el fichero es typescript


El exit final, no es para salir de la consola, sino para salir del comando script. Ejecutando estas ordenes, nos aparecerá un fichero llamado typescript en nustro directorio activo, donde tendremos exactamente lo mismo que hemos ejecutado.

El única opción que permite el comando script es:
-a : Añade la salida al final del fichero, o lo que es lo mismo, no reescribe un fichero ya existente.

Saludos.

domingo, 13 de diciembre de 2009

Microsoft vs Linux

Igual pueda parecer un post un poco contradictorio con la tónica general del blog, pero quiero analizar un poquito la situación de Microsoft Windows Vs Ubuntu ( o GNU/Linux en general ).

Por una parte tenemos que el OS de Microsoft es utilizado en un 97% de los ordenadores personales. Y todos sabemos porque: compras un portátil y ya te viene con Windows instalado. A parte, a la gente no le gusta el cambio ( porque es así, no podemos negarlo ) y prefieren lo malo conocido que lo bueno por conocer.

Linux ( juntando todas las distribuciones ) ocupan una cuota de mercado de un 1%. Esto es realmente poco, pero yo no lo veo como un inconveniente, sino más bien una ventaja. Ubuntu tiene 5 años, y todavía está creciendo. Yo, personalmente, considero que todavía está verde, le falta seguir avanzando. El usuario común no lo sabe usar si no es con alguien que le guíe, hay muchos conceptos nuevos y mucha cosa que el usuario medio no quiere saber.

Pero como puede ser que teniendo una cuota de mercado tan baja, esto beneficie a Linux? Pues porque Linux tiene una comunidad muy fuerte, actualmente. Gente que tiene ganas de sacar las cosas adelante. Crear aplicaciones de lo más variopintas, libres y OpenSource. Esta comunidad no existe en Windows. Otra ventaja de tener una cuota de mercado tan baja, es que la mayoría de virus y ataques son pensados para tener una máxima difusión. Con linux esto es complicado, ya que las distribuciones funcionan diferente, no tienen los mismos procesos, etc... en cambio Windows es un entorno conocido, y altamente explotable. Ventaja para Linux, ya que así de momento nos dejan en paz y no estamos en el punto de mira.

Linux todavía és complicado para el usuario medio ya que (aunque cada vez menos) se tenga que utilizar la consola para arreglar determinados problemas o instalar algunas aplicaciones. Aparte, claro del hecho que es un OS muy diferente de lo que los usuarios conocen hasta ahora. Ésto vuelve a ser una ventaja, ya que ahora mismo dentro del mundillo de Linux sólo hay gente con ganas de aprender y de ver cosas nuevas. Gente que está realmente interesada en aprender lo que Linux puede ofrecerle. Yo lo encuentro muy positivo.

Linux me recuerda un poco a la salida del Firefox. Justo cuando salió, era una pasada. Iba mucho más rápido de IE, no tenía vulnerabilidades, podías añadir Add-On's. Pero se hizo popular. Cada vez pesaba más, iba más lento y salian más vulnerabilidades. Ahora sigue siendo un buen navegador, pero no destaca tanto como antes. Yo lo atribuyo a su alta popularidad: como más famoso, más interesados en joderlo o en encontrar vulnerabilidades. Creo que si Linux, de golpe, es usado por mucha gente, le podría pasar algo similar.

Dónde quiero llegar con todo esto? Bien, imaginemos por un momento que el 97% de la cuota de mercado fuese de Ubuntu, y Windows un 1%. Estoy seguro que empezarían a aparecer virus para Linux a diario. Synaptic se empezaría a llenar de aplicaciones inútiles o infectadas. Para encontrar documentación de calidad sobre temas "avanzados" sería una odisea, ya que la mayoría de posts o manuales estarían enfocados al usuario medio... y la verdad, no quiero que Ubuntu ( o linux en general ) se convierta en algo así.

Pues entonces, qué? Bueno, seguir avanzando. Seguir mejorando las distribuciones Linux, seguir aportando a la comunidad linuxera lo que se pueda. Ayudar a los que se inicien en linux y que realmente quieren aprender. Todo esto favorece a los usuarios de GNU/Linux.

Y yo tengo plena confianza que algún día se dará el cambio. Algún dia, Ubuntu, o cualquier distribución por el estilo estará preparada para ser usada por el usuario medio y habrá alcanzado un grado de madurez suficiente para que la mayoría de gente que utiliza Windows, se tire a Linux. La gente, cansada de los problemas de siempre, buscará soluciones y encontrará un Linux fácil de manejar y mucho más humano. Esperemos que, cuando llegue este dia, Linux esté preparado. Si queremos ver las cosas de manera positiva, podemos dar las gracias a Microsoft de estar "reteniendo" a los usuarios malos, desinteresados o sin ganas de aprender nada, y dejando que los realmente buenos se pasen al software libre. Algún día esto cambiará y todo el mundo podrá disfrutar de un OS libre y OpenSource, recordando de lejos los pantallazos azules a los que nos tienen tan acostumbrados.

Saludos!

domingo, 6 de diciembre de 2009

Configuración de POSTFIX con DOVECOT + TLS

Hace unos dias ya que me he estado pelenado con lo que era una de mis espinitas: el servidor de correo en linux. Pues bueno, no voy a hacer una explicación de cómo se instala todo un servidor de correo mediante postfix, dovecot y añadiendo seguridad con TLS... en Internet hay muchísimos manuales. Lo que sí que voy a hacer es un listado de las webs que he visitado para conseguir poner online todo el tinglado ( y funciona!! ):

Primero vamos con la instalación básica de Postfix, que mejor que la documentación de Ubuntu:
https://help.ubuntu.com/8.04/serverguide/C/postfix.html

Segundo, instalación básica de Dovecot:
https://help.ubuntu.com/8.04/serverguide/C/dovecot-server.html

Una vez que teneis esto funcionando, es hora de "securizar" el tema.... para ello podeis seguir con los apartados de SSL y "SMTP authentification" de la misma ayuda de Ubuntu o seguir esta guias para postfix:
http://www.marblestation.com/?p=549

También, para los más valientes, aquí hay recopilada las documentación de la web oficial de postfix:
TLS Support
SASL Support

Este post ha quedado un poquito frío, pero es lo que hay. Para quien esté siguiendo los pasos de algún manualillo y esté atascado, me ofrezco para ayudar en lo que pueda ;)
Saludos!