Thursday, December 17, 2009

Limpiar archivos de log en linux

Una simple linea nos permite limpiar archivos de texto:

> /directorio/archivo.log

Con fuser podemos saber si el archivo esta siendo usado por algun proceso:

fuser /directorio/archivo.log

Particiones y labels en ext3, swap y reiserfs

Se pueden crear y montar particiones con "labels", y tiene la ventaja de que si el nombre del dispositivo cambia, no nos interesa porque el kernel sabe que label corresponde a cada particion. Esto es MUY util en servidores ya que de cambiar el nombre del dispositivo por cualquier motivo, evitamos quedarnos con un sistema sin bootear.
Supongamos claro que /dev/hda1 es una swap, /dev/hda2 es el root del sistema de archivos con ext3 y /dev/hdb1 es una particion reiser

tune2fs -L ROOT /dev/hda2
swapoff /dev/hda1
mkswap -L SWAP /dev/hda1
swapon /dev/hda1
umount /dev/hdb1
reiserfstune -l DATA /dev/hdb1

Luego en /etc/fstab tenemos las siguientes entradas

LABEL=ROOT / ext3 noatime,errors=remount-ro 0 1
LABEL=SWAP none swap sw 0 0
LABEL=DATA /www reiserfs defaults 0 0

Sunday, March 22, 2009

Deshabilitar completamente el Autorun y el Autoplay de Windows XP

Ya que vienen circulando 8000 virus a traves de los pendrives y como ya me infecte 3 veces por olvidarme de revisar pendrives a mano antes de abrirlos entonces busque bien como realmente desactivar el autorun de windows, y digo realmente porque si bien hay muchos metodos para desactivarlo, cuando uno hace click sobre alguna unidad que tiene el autorun.inf, el maldito se SIGUE ejecutando.

Entonces:

Inicio, ejecutar: gpedit.msc

Ir a Administrative Templates -> System -> Turn off Autoplay

Configurarlo en Enabled para todas las unidades.

Ademas de esto, abrir con el notepad y crear un archivo con cualquier nombre pero con la extension .reg (para crear un archivo de registro) y pegarle el siguiente texto:

REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\Autorun.inf]
@="@SYS:DoesNotExist"

Guardarlo y hacer doble click sobre el archivo. Cuando windows pregunte si desea agregar la informacion al registro darle que si.

Ahora si tenemos REALMENTE el autorun desactivado por completo. Aclaro que el gpedit.msc solo funciona en la version Professional de Windows XP.

Saludos !

Thursday, March 19, 2009

Crear y montar una particion basada en archivo

Supongamos que ya compramos un servidor con linux en algun datacenter y que por X motivo no lo podemos reparticionar o reinstalar y necesitamos tener otras particiones, quiza con otro sistema de archivo ...

1) dd if=/dev/zero of=/particion.part bs=1M count=1000
2) losetup /dev/loop0 /particion.part
3) mkfs -t reiserfs /dev/loop0
4) mount -t reiserfs /dev/loop0 /www
5) Ya tenemos disponible la particion /www para hacer lo que queramos
6) umount /www
7) losetup -d /dev/loop0

1) le decimos a dd que cree un archivo de 1 GB (bs = block size) 1M x 1000 = 1 GB
2) losetup asocia dispositivos de loop con archivos normales
3) formateamos con reiserfs (puede ser ext3, etc) el archivo /particion.part
4) montamos la particion
5) hacemos algo util
6) desmontamos la particion
7) desvinculamos el dispositivo de loop /dev/loop0 del archivo que creamos

Supongamos ahora que deseamos automontar esta "particion" al bootear, para ello editamos el archivo /etc/fstab y agregamos lo siguiente:

/particion.part /www reiserfs defaults,loop 0 0

Ahora los scripts de inicio se encargaran de montar la particion que hemos creado en un archivo sobre otro sistema de archivos.

Copiar via ssh un archivo o directorio comprimiendo al vuelo con bzip2

Este metodo es un poco distinto del anterior, ya que lo unico que se requiere es ssh, tar y bzip2 (no dependemos de rsync). Por supuesto, este metodo va comprimiendo cada archivo con bzip2, asi que es util para pasar backups de un server a otro sin gastar espacio para el backup

tar cjf - ./archivo | ssh "-oPort=1234" root@192.168.1.1 'cd /tmp && tar xjpvf -'

esto copia /archivo comprimiendo el envio via ssh a 192.168.1.1 en el directorio /tmp

o para copiar un directorio:

tar cjf - mydir/ | ssh "-oPort=1234" root@192.168.1.1 'cd /tmp && tar xjpvf -'

esto copia el directorio mydir comprimiendo el envio via ssh a 192.168.1.1 en el directorio /tmp

y ahora, quiza otra variante interesante sea comprimir un archivo o directorio y dejar el resultado comprimido en un tar en el host remoto:

tar cjf - ./archivo | ssh "-oPort=1234" root@192.168.1.1 'cd /tmp && cat - > ./archivo.tar.bz2'

o para un directorio:

tar cjf - directorio/ | ssh "-oPort=1234" root@192.168.1.1 'cd /tmp && cat - > ./directorio.tar.bz2'

Supongamos que tenemos un disco de 20 GB y tenemos 19.5 GB ocupados. Logicamente hacer un backup dentro de ese disco es imposible, asi que con el metodo que menciono arriba se comprimen los datos al vuelo y se envian al host remoto sin utilizar espacio en la maquina local.

Espero que resulte util.

Copiar via ssh un archivo o directorio con rsync comprimiendo on-the-fly (al vuelo)

El ya de por si interesante programita rsync tiene un flag que permite comprimir lo que se esta enviando (gzip). Podemos combinar rsync + ssh para hacer un envio seguro de los datos de la siguiente forma:

rsync -azvhe "ssh -p 1234" /dir_local/archivo root@192.168.1.1:/dir_remoto

o sino para un directorio completo:

rsync -azvhe "ssh -p 1234" /dir_a_copiar/ root@192.168.1.1:/dir_remoto

cabe aclarar que la barra al final de dir_a_copiar es muy importante ya que si esta nos dice que copiemos el contenido de /dir_a_copiar dentro de /dir_remoto, si no la colocamos el comando copiara /dir_a_copiar/ DENTRO de /dir_remoto, por lo que la estructura quedaria /dir_remoto/dir_a_copiar (las idiosincracias de rsync ;-)

los flags hacen lo siguiente:

a: archiva
z: comprime (gzip)
v: verbose (dar detalles podria ser la traduccion)
h: human readable, mostrar los detalles de forma que un humano los pueda entender
e: especifica el shell remoto a utilizar, en nuestro caso ssh en el puerto 1234, obviamente hay q reemplazar por el puerto que corresponda (22 en un caso normal)

Tuesday, February 24, 2009

Usar un campo entero en MySQL para almacenar mas de un flag

Ante la necesidad de almacenar varios flags (banderas) en un solo campo entero, podemos implementar la siguiente solucion:

UNSIGNED TINYINT = 8 bits / 1 byte
UNSIGNED SMALLINT = 16 bits / 2 bytes
UNSIGNED MEDIUMINT = 24 bits / 3 bytes
UNSIGNED INT = 32 bits / 4 bytes

etc, etc ...

Por cada bit, tenemos una posicion, asi que si tomamos el ejemplo de un campo TINYINT, tendriamos disponibles 8 posiciones, u 8 flags para utilizar.

A cada posicion le asignamos un valor superior en base 2, de esta forma:

define("POS_1", 1);
define("POS_2", 2);
define("POS_3", 4);
define("POS_4", 8);
define("POS_5", 16);
define("POS_6", 32);
define("POS_7", 64);
define("POS_8", 128);

Ahora, supongamos que queremos activar los flags de las posiciones 3, 6 y 8, entonces realizamos un bitwise OR (operacion binaria):

$campo = (POS_3 | POS_6 | POS_8);

La operacion OR entre dos numeros dice que si el valor A o el valor B son 1, el resultado final es 1:

00000100 = 4
OR
00100000 = 32
OR
10000000 = 128
--------
10100100 = 164 = campo en la tabla MySQL

y a la variable campo la almacenamos en la base de datos.

Ahora, la "magia" la hacemos formulando la siguiente consulta, que de acuerdo a mis test, funciona bastante bien a pesar que el optimizador de MySQL no la optimiza.

SELECT * FROM `tabla` WHERE ((`campo` & 4) && (`campo` & 32) && (`campo` & 128));

En esta consulta se hace una operacion bitwise AND entre el valor de nuestro campo (164 = 10100100) en la base de datos y el valor decimal de cada posicion.

10100100 = 164
AND
00000100 = 4
--------
00000100 = 4

La operacion AND dice que si el valor en A y el valor en B son 1, entonces el resultado final es 1.

Ahora, en la consulta vemos que el WHERE hace AND's bitwise y logicos, y ahi esta el secreto, ya que si la operacion and en cada parentesis da un numero cero, la comprobacion logica falla y el registro no concuerda.

Por ejemplo, si buscamos para la POS_5, que es 16, entonces tenemos que:

10100100 = 164
AND
00010000 = 16
--------
00000000 = 0

Por ende, no se cumple y afecta al resto de la comprobacion logica (doble ampersand &&).

He probado esta consulta en una tabla con 88000 registros, de los cuales unos 4000 son distintos y obtuve un tiempo de 0.0024 seg de promedio, asi que podriamos decir que la consulta funciona bien, aunque el optimizador no este trabajando.
Esto incluyendo SQL_NO_CACHE para obtener un resultado fiel (no usar el cache, obviamente).


Saludos


PD: comentarios y sugerencias, totalmente aceptados ...

Friday, February 13, 2009

Inflación

"No es el dinero, como a veces se dice, sino la depreciación del dinero -la destrucción cruel y astuta del dinero- la que es la causa de muchos males.
La inflación destruye el ahorro individual y la autosuficiencia mientras gradualmente erosiona la riqueza personal. Pocas son las políticas más calculadas para destruir las bases existentes de una sociedad libre que la destrucción de su moneda."

Hans F. Sennholz

Followers

About me

Santa Fe, Argentina
Programador Web, PHP, MySQL, JQuery, Administrador Linux. LAMP, Lighttpd, Nginx.