miércoles, 31 de agosto de 2011

Usando tmpfs

Bien, entrada corta si las hay!!! Esto va a ser una PEQUEÑA demostración del uso de tmpfs. Qué es tmpfs??? Wiki knows (http://es.wikipedia.org/wiki/Tmpfs#Linux). Es una suerte de sistema de archivos en memoria volátil (RAM y swap si es necesario, ojo!!!).

Ventajas:
-Las operaciones de lectura y escritura son MUCHO mas rápidas que en otros medios de IO como los discos rígidos (IDEAL para montar directorios de CACHEs).
-Es sencillo de utilizar.
 Desventajas:
-Es volátil!!! no se mantiene luego de un reinicio del equipo por ejemplo.
-Su espacio está limitado por la cantidad de memoria RAM disponible y la swap del sistema.

Demostración simple de uso y rendimiento en escritura:

Creamos un directorio llamado prueba_tmpfs

root@moon:~# mkdir prueba_tmpfs

Antes de montar veamos cómo se el consumo de memoria con free -m.

root@moon:~# free -m
                     total       used       free     shared    buffers     cached
Mem:          1975       1167        807          0         25        538
-/+ buffers/cache:        603       1371
Swap:         5789          0       5789

Montamos un sistema de archivos tipo tmpfs (-t tmpfs) de 1GigaByte en el directorio que acabamos de crear.

root@moon:~# mount -t tmpfs -o size=1G tmpfs prueba_tmpfs/
Vemos los puntos de montaje existentes y nos encontramos con nuestro tmpfs recien montado.

root@moon:~# mount 
...
 tmpfs on /root/prueba_tmpfs type tmpfs (rw,size=1G)


Pegamos una mirada con free para ver qué pasó y vemos que si bien el directorio se montó, no se ocupó memoria del sistema aún.

root@moon:~# free -m
                     total       used       free     shared    buffers     cached
Mem:          1975       1167        807          0         25        538
-/+ buffers/cache:        603       1371
Swap:         5789          0       5789

Veamos qué beneficios nos trae tmpfs, escribamos algo!!! Para probar utilizamos un simple dd.

root@moon:~# dd if=/dev/zero of=prueba_tmpfs/prueba bs=1M count=768
768+0 registros de entrada
768+0 registros de salida
805306368 bytes (805 MB) copiados, 1,58104 s, 509 MB/s

Nos encontramos con una velocidad de escritura de 509 Mbytes por segundo!!! (509MBytes*8 = 4072Mbits por seg aprox 4Gbits por segundo!!! lo cual es consistente con el ancho de banda teórico de las memorias DDR2 de 667 Mhz que tiene mi laptop :D). Una velocidad MAS que interesante.

Podemos ver un cambio significativo en free -m. Pasamos de 807 a 37 Mbytes libres, es decir consumimos 807-37=770 (consistente con los 768 que escribimos con el dd).

root@moon:~# free -m
                     total       used       free     shared    buffers     cached
Mem:          1975       1937         37          0         25       1306
-/+ buffers/cache:        605       1369
Swap:         5789          0       5789

mmm ahora le toca al sata de la laptop hacer su mejor esfuerzo xD (competencia un tanto injusta jajaja). Escribimos de la misma manera que antes, pero a un archivo fuera del directorio donde montamos el tmpfs, en este caso el archivo se llama simplemente prueba.

root@moon:~# dd if=/dev/zero of=prueba bs=1M count=768
768+0 registros de entrada
768+0 registros de salida
805306368 bytes (805 MB) copiados, 12,3028 s, 65,5 MB/s

La velocidad fue de 65,5 Mbytes por segundo (65,5Mbytes * 8 = 524 Mbits por segundo, bastante por debajo del máximo teórico de los SATA II, por debajo inclusive del SATA I). Con esto queda claro que la diferencia es IMPORTANTE, la escritura sobre tmpfs fue casi 8 veces mas rápida (509/65,5=7,7).

Demostración simple de uso y rendimiento en lectura:

Todo muy lindo en la escritura, pero en la lectura qué será? :O.

Primero leemos del tmpfs y vemos una velocidad bastante mayor a la que obtuvimos en escritura. Pasando los 7Gbits por segundo!!!, esto seguramente se debe a algún manejo extraño de caches por parte del kernel, porque esta velocidad excede el límite teórico de las memorias de la laptop.

root@moon:~# dd if=prueba_tmpfs/prueba of=/dev/null bs=1M
768+0 registros de entrada
768+0 registros de salida
805306368 bytes (805 MB) copiados, 0,873211 s, 922 MB/s

Con respecto a la lectura en disco... Obtuve una velocidad muy similar a la de escritura, lo cual NO es muy común en este tipo de dispositivos.

root@moon:~# dd if=prueba of=/dev/null bs=1M
768+0 registros de entrada
768+0 registros de salida
805306368 bytes (805 MB) copiados, 13,5713 s, 59,3 MB/s

Por lo general los discos rígidos leen a mayor velocidad de la que escriben, por lo tanto podríamos suponer que la velocidad de escritura obtenida anteriormente es producto de algún manejo eficiente de cache o una suerte de inteligencia en la escritura de datos repetidos (solamente ceros, obtenidos de /dev/zero).

Qué pasa si...?:

Intentamos escribir mas bytes de los que tiene asignado nuestro directorio en tmpfs:

root@moon:~# dd if=/dev/zero of=prueba_tmpfs/prueba bs=1M count=1024
dd: escribiendo «prueba_tmpfs/prueba»: No hay espacio libre en el dispositivo
1022+0 registros de entrada
1021+0 registros de salida
1071640576 bytes (1,1 GB) copiados, 2,47776 s, 433 MB/s
root@moon:~#

Como era de esperarse no pudimos escribir mas de lo que definimos como tamaño del tmpfs :D.

Creamos un tmpfs mayor que nuestra RAM (mi laptop tiene 2Gbytes de RAM):

Es absolutamente posible hacerlo, PERO...

root@moon:~# mount -t tmpfs -o size=3G tmpfs prueba_tmpfs
root@moon:~# mount | grep prueba_tmpfs
tmpfs on /root/prueba_tmpfs type tmpfs (rw,size=3G)
a medida que comencemos a ocupar el espacio del tmpfs, nos comeremos (si, casi literalmente) la memoria ram del equipo, este comenzará a intercambiar páginas con poco uso a la memoria de intercambio (swap) y eventualmente el sistema podría quedar inutilizable. Moraleja? no es recomendable hacerlo (cosas que pasan xD).


Conclusión:

Definitivamente es una opción muy interesante principalmente para utilizar como directorio para caches.

En mi caso en particular utilicé tmpfs para el directorio donde munin crea/actualiza los archivos rrd, en un servidor que monitorea mas de 100 servidores, y el cambio fue notable. Antes de esto los gráficos se cortaban porque el proceso de graficar no terminaba antes de que llegaran las nuevas mediciones.

jueves, 25 de agosto de 2011

Como quitar Windows 7, instalar CentOS 6 desde un pendrive y todo esto sin que se muera Ubuntu 9.10 oO


Windows en las particiones sda3 y sda4, CRAP!!! ¿sda2 es booteable? qué pasa si la borro?

root@moon:/home/juan# fdisk -lu /dev/sda

Disco /dev/sda: 250.1 GB, 250059350016 bytes
255 cabezas, 63 sectores/pista, 30401 cilindros, 488397168 sectores en total
Unidades = sectores de 1 * 512 = 512 bytes
Identificador de disco: 0xbab21f87

Dispositivo Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sda1              63   454623434   227311686   83  Linux
/dev/sda2   *   454625280   454830079      102400    7  HPFS/NTFS
/dev/sda3       454830080   476534783    10852352    7  HPFS/NTFS
/dev/sda4       476536095   488392064     5927985    5  Extendida
/dev/sda5       476536158   488392064     5927953+  82  Linux swap / Solaris


Para ver en qué consiste mi grub actualmente ejecuté

root@moon:/home/juan# grub-mkconfig -o grub.conf.bak
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.31-22-generic
Found initrd image: /boot/initrd.img-2.6.31-22-generic
Found linux image: /boot/vmlinuz-2.6.31-21-generic
Found initrd image: /boot/initrd.img-2.6.31-21-generic
Found linux image: /boot/vmlinuz-2.6.31-20-generic
Found initrd image: /boot/initrd.img-2.6.31-20-generic
Found linux image: /boot/vmlinuz-2.6.31-19-generic
Found initrd image: /boot/initrd.img-2.6.31-19-generic
Found linux image: /boot/vmlinuz-2.6.31-17-generic
Found initrd image: /boot/initrd.img-2.6.31-17-generic
Found linux image: /boot/vmlinuz-2.6.31-16-generic
Found initrd image: /boot/initrd.img-2.6.31-16-generic
Found linux image: /boot/vmlinuz-2.6.31-15-generic
Found initrd image: /boot/initrd.img-2.6.31-15-generic
Found linux image: /boot/vmlinuz-2.6.31-14-generic
Found initrd image: /boot/initrd.img-2.6.31-14-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Windows 7 (loader) on /dev/sda2
done

De esta manera me hice con una copia de la configuración actual, por si las moscas!!!
mmmm... viendo un poco la configuración actual de grub encontré la parte donde se define el arranque del win7

menuentry "Windows 7 (loader) (on /dev/sda2)" {
        insmod ntfs
        set root=(hd0,2)
        search --no-floppy --fs-uuid --set 2860188560185c3e
        chainloader +1
}


Entonces decidí actuar! :P
Eliminé ambas particiones de windows!

root@moon:/etc/grub.d# fdisk -lu /dev/sda

Disco /dev/sda: 250.1 GB, 250059350016 bytes
255 cabezas, 63 sectores/pista, 30401 cilindros, 488397168 sectores en total
Unidades = sectores de 1 * 512 = 512 bytes
Identificador de disco: 0xbab21f87

Dispositivo Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sda1              63   454623434   227311686   83  Linux
/dev/sda4       476536095   488392064     5927985    5  Extendida
/dev/sda5       476536158   488392064     5927953+  82  Linux swap / Solaris
Por lo tanto me quedó un gran vacío xD, unos 11Gb perdidos entre sda1 y sda4, ese vacío debería ser llenado por CentOS :D.
Volví a lanzar grub-mkconfig -o grub.conf.bak.2, y esta vez ya no aparecieron las líneas del arranque de windows 7 :D.

root@moon:/etc/grub.d# grub-mkconfig -o grub.conf.bak.2
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.31-22-generic
Found initrd image: /boot/initrd.img-2.6.31-22-generic
Found linux image: /boot/vmlinuz-2.6.31-21-generic
Found initrd image: /boot/initrd.img-2.6.31-21-generic
Found linux image: /boot/vmlinuz-2.6.31-20-generic
Found initrd image: /boot/initrd.img-2.6.31-20-generic
Found linux image: /boot/vmlinuz-2.6.31-19-generic
Found initrd image: /boot/initrd.img-2.6.31-19-generic
Found linux image: /boot/vmlinuz-2.6.31-17-generic
Found initrd image: /boot/initrd.img-2.6.31-17-generic
Found linux image: /boot/vmlinuz-2.6.31-16-generic
Found initrd image: /boot/initrd.img-2.6.31-16-generic
Found linux image: /boot/vmlinuz-2.6.31-15-generic
Found initrd image: /boot/initrd.img-2.6.31-15-generic
Found linux image: /boot/vmlinuz-2.6.31-14-generic
Found initrd image: /boot/initrd.img-2.6.31-14-generic
Found memtest86+ image: /boot/memtest86+.bin
done


Por último una actualizada del grub para que los cambios se reflejen en el archivo de configuración real:

root@moon:/etc/grub.d# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.31-22-generic
Found initrd image: /boot/initrd.img-2.6.31-22-generic
Found linux image: /boot/vmlinuz-2.6.31-21-generic
Found initrd image: /boot/initrd.img-2.6.31-21-generic
Found linux image: /boot/vmlinuz-2.6.31-20-generic
Found initrd image: /boot/initrd.img-2.6.31-20-generic
Found linux image: /boot/vmlinuz-2.6.31-19-generic
Found initrd image: /boot/initrd.img-2.6.31-19-generic
Found linux image: /boot/vmlinuz-2.6.31-17-generic
Found initrd image: /boot/initrd.img-2.6.31-17-generic
Found linux image: /boot/vmlinuz-2.6.31-16-generic
Found initrd image: /boot/initrd.img-2.6.31-16-generic
Found linux image: /boot/vmlinuz-2.6.31-15-generic
Found initrd image: /boot/initrd.img-2.6.31-15-generic
Found linux image: /boot/vmlinuz-2.6.31-14-generic
Found initrd image: /boot/initrd.img-2.6.31-14-generic
Found memtest86+ image: /boot/memtest86+.bin
done


Y ahora le pegamos un reboot a ver qué pasa!!! (no hacer bungee jumping con los cordones!!!, por las dudas tengan un live-cd de alguna distro para arreglar grub :P, yo tengo en un pendrive un ubuntu 9.04 por si las moscas).

NOTA: luego de reiniciar noté que ya no me aparecía la lista de entradas para elegir, sino que directamente me cargó la primer entrada sin decir nada. Me queda averiguar porque...

Bien ahora, a preparar el pendrive desde donde bootear para instalar CentOS, claramente no pienso quemar un CD para usarlo una sola vez ajajaja. Rata? no!, económico! Lo mas complicado de todo esto fue encontrar el pendrive xD, los hacen tan pequeñosss.

NOTA: Backup del pendrive!!!!

Para hacer booteable nuestro pendrive con una iso de CentOS , primero descargamos la iso (wget http://centos-mirror.hostdime.com.br/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-minimal.iso) :P, y luego instalamos "UNetbootin" (a buscar los paquetes gente, aptitude search unetbootin y ver :P).
Elegimos la iso y la partición del pendrive que correspondan, aceptamos y esperamos un raaaato.



Ahora reiniciamos y vemos qué pasa!

Una vez booteado del pendrive elegimos la primer opción que dice con video básico y cargará el instalador de CentOS.

NOTA1: no encontraba el archivo /images/install.img, cuando aparece la opción para ingresar el path del archivo hay que poner ./images/install.img y elegir el dispositivo que corresponda al pendrive!

NOTA2: también es necesario copiar la iso del CD dentro del pendrive!

Durante la instalación en ningún momento hay que dejar que particione el disco ni que instale un bootloade!!!! sino no va a salir caro :P

Terminada la instalación, inicié ubuntu y corrí nuevamente un grub-mkconfig pero la configuración ni se enteró de la instalación de CentOS...

A meterle mano a Grub: la versión de grub que tengo ¿1.97? oO, se configura a partir de unas plantillas que se encuentran en el directorio /etc/grub.d y también el archivo /etc/default/grub.

Primero modificamos /etc/default/grub para que vuelva a aparecer el menu de sistemas operativos durante el booteo de grub, esto se logra comentando la línea que dice GRUB_HIDDEN_TIMEOUT=0.

Ahora agregamos las lineas necesarias para el arranque de CentOS en el archivo /etc/grub.d/40_custom (en este archivo deberiamos incluir todas las entradas que pongamos manualmente):

menuentry "CentOS 6" {
    set root=(hd0,2)
    linux /boot/vmlinuz-2.6.32-71.el6.x86_64 ro root=/dev/sda2 rhgb quiet
    initrd /boot/initramfs-2.6.32-71.el6.x86_64.img
}


NOTA: estas líneas deben ser agregadas al final del archivo y sin modificar el resto de las lineas anteriores.

Vemos que las lineas indican la partición de root, la imagen del kernel y el initrd.
Ahora debemos actualizar grub para que aplique estos cambios a la configuración actual (update-grub) y vemos que la entrada fue agregada correctamente al final del archivo de configuración:

root@moon:/home/juan# tail /boot/grub/grub.cfg
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry "CentOS 6" {
    set root=(hd0,2)
    linux /boot/vmlinuz-2.6.32-71.el6.x86_64 ro root=/dev/sda2 rhgb quiet
    initrd /boot/initramfs-2.6.32-71.el6.x86_64.img
}

### END /etc/grub.d/40_custom ###


Reiniciamos y.... :D un lujo, probado y re contra probado, levantó CentOS sin ningún inconveniente.