Archivos de Categoría: http://planet.igalia.com

Introducing the meta-webkit Yocto layer.

Disculpa, pero esta entrada está disponible sólo en English.

WebKitGTK+ Performance Bot!

Disculpa, pero esta entrada está disponible sólo en English.

Como activar correctamente TRIM para tu SSD en Linux: fstrim, lvm y dm-crypt

A diferencia de los discos duros (HDDs), las memoria flash de tipo NAND que componen los SSDs no pueden sobrescribir los datos existentes. Esto significa que primero se han de borrar los datos viejos antes de escribir los nuevos. Dicha memoria flash esta dividida en bloques, que a su vez están subdivididos en páginas. La unidad mínima de escritura es una página, pero la unidad mínima de borrado es un bloque.

¿Veis el problema? Esto significa que a medida que pasa el tiempo el disco SSD irá fragmentando internamente los bloques entre las diferentes páginas, de forma que, llegado un punto no quedará ninguna página vacía, y cuando el disco tenga que escribir un bloque en alguna de las páginas que están a medias, primero necesitará copiar los bloques actuales desde esa página a una memoria intermedia, borrar la página y a continuación volver a escribir los bloques viejos más los nuevos en dicha página. Esto significa que conforme pasa el tiempo, el rendimiento del disco SSD se degrada cada vez más y más, ya que para cada escritura se ha de pasar por un ciclo de lectura-borrado-modificación-escritura. Esto se conoce como “amplificación de escritura”.

En ausencia de TRIM, los discos desconocen cuales de los bloques están siendo usados por un fichero o cuales pertenecen a espacio libre. Esto es debido a que cuando se borra un fichero lo único que hace el sistema operativo es marcar los bloques que ocupaba dicho fichero como borrados dentro del índice del sistema de ficheros. Pero en ningún momento informa al disco duro de esta operación. Esto significa que, con el paso del tiempo el rendimiento de un disco SSD irá cada vez a peor, por mucho espacio libre que quede en el sistema de ficheros, debido a que el disco SSD desconoce esta información.

¿Que es TRIM? TRIM es la solución inventada para este problema. TRIM es el nombre de un comando que el sistema operativo puede enviar al disco SSD para informarle cuales de los bloques están libres en el sistema de ficheros. El disco SSD utiliza esta información para desfragmentar internamente los bloques y así mantener páginas libres disponibles para ser escritas de forma rápida y eficiente.

¿Como activo TRIM en Linux? Lo primero que debes saber es que TRIM debe ser activado en todas las capas de abstracción de entrada/salida. Esto significa que si tienes una partición Ext4 sobre un LVM, que a su vez esta sobre un volumen cifrado con LUKS/dm-crypt, debes activar el soporte para TRIM en esas 3 capas: El sistema de ficheros, el LVM y dm-crypt. De nada vale que lo actives a nivel de sistema de ficheros si luego no lo activas en el resto de las capas. El comando TRIM ha de pasar de una capa a otra, con la consecuente conversión de índices de bloque, hasta llegar al disco SSD.

  1. Activar el soporte TRIM en dm-crypt

  2. Simplemente hemos de añadir la opcion discard en nuestro crypttab

    • $ cat /etc/crypttab

      # <target name>    <source device>    <key file>       <options>
      sda2_crypt         /dev/sda2          none             luks,discard
      

    Nota: El uso de TRIM sobre un sistema dm-crypt puede conllevar ciertos problemas de seguridad como la revelación de que sectores del disco no están en uso.

  3. Activar el soporte TRIM en LVM

  4. Hemos de activar la opción issue_discards en la configuración del LVM

    • $ cat /etc/lvm/lvm.conf

      # [...]
      devices {
         # [...]
         issue_discards = 1
         # [...]
      }
      # [...]
      
  5. Activar el soporte en el sistema de ficheros

  6. Esta es la parte más interesante. La mayoría de la gente se limita a añadir la opción “discard” en las opciones de montaje en /etc/fstab. Sin embargo, esto significa que cada vez que borres un fichero vas a estar notificando al disco SSD en tiempo real de que los bloques que ocupaba ese fichero ya no están en uso, y entonces el disco SSD va a tener que realizar una desfragmentación y borrado interno de dichos bloques, lo cual le va a llevar un tiempo no despreciable.

    De cara a optimizar al máximo el rendimiento del disco SSD, yo os recomiendo encarecidamente que evitéis realizar la operación TRIM en tiempo real (cada vez que borráis un fichero) ya que estáis haciendo trabajar al disco SSD de forma innecesaria. Es decir: no activéis la opción discard en el fstab.

    En vez de esto, lo que os recomiendo es ejecutar un script de forma periódica que informe al SSD de los bloques que están libres mediante el comando fstrim. Con ejecutar esta operación una vez al día o a la semana es más que suficiente. De esta forma no perdemos rendimiento ninguno debido a la operación TRIM y mantenemos informado al disco SSD de los bloques libres de forma periódica.

    Otras ventajas de este método (fstrim) son:

    • En caso de que en alguna capa superior no hayas activado de forma adecuada el soporte TRIM, al ejecutar fstrim recibirás un mensaje de error. Si en vez de usar fstrim usaras la opción discard en el fstab no hubieras recibido ningún error y pensarías que todo está funcionando correctamente cuando no es así.
    • En caso de que borres un fichero por equivocación podrás recuperarlo antes de que anacron ejecute tu script fstrim. Con la otra opción de realizar TRIM en tiempo real es completamente imposible recuperar un fichero borrado ya que tan pronto lo borres, el SSD habrá destruido los bloques que ocupaba dicho fichero.

    Aquí os dejo de ejemplo un sencillo script para ejecutar fstrim en las particiones /, /boot y /home, que puede programarse para ser ejecutado de forma periódica mediante anacron:

    • $ cat /etc/cron.weekly/dofstrim

      #! /bin/sh
      for mount in / /boot /home; do
      	fstrim $mount
      done
      

    Cabe mencionar, que tanto fstrim como la opción de realizar TRIM en tiempo real solo funcionan sobre sistemas de ficheros que implementen el ioctl FITRIM. A día de hoy, dichos sistemas de ficheros son:

    ~/kernel/linux (v3.8) $ grep -lr FITRIM fs/ | cut -d/ -f2 | sort | uniq | xargs echo
    btrfs ext3 ext4 gfs2 jfs ocfs2 xfs
    

Nota: Lo más probable es que tengas que regenerar tu initramfs con update-initramfs -u (Debian y derivados) o dracut -f (Redhat y derivados) y reiniciar después de efectuar cambios los cambios en la configuración de LVM o dm-crypt

Actualización 25-Feb-2013: Parece ser que los usuarios de Fedora con un volumen dm-crypt estarán afectados por este problema: https://bugzilla.redhat.com/890533

Actualización 14-Ago-2014: El siguiente script puede ser usado para detectar automáticamente los sistemas de ficheros que tienen TRIM activado y hacer la operación de fstrim sobre los mismos:

  • #!/bin/sh
    #
    # To find which FS support trim, we check that DISC-MAX (discard max bytes)
    # is great than zero. Check discard_max_bytes documentation at
    # https://www.kernel.org/doc/Documentation/block/queue-sysfs.txt
    #
    for fs in $(lsblk -o MOUNTPOINT,DISC-MAX,FSTYPE | grep -E '^/.* [1-9]+.* ' | awk '{print $1}'); do
    	fstrim "$fs"
    done
    

Git: Copiar un fichero o directorio desde otro repositorio preservando la historia

¿Como copiar un único fichero o directorio desde otro repositorio GIT de forma que preserves su historia?

Internet está lleno de formulas mágicas cada cual más compleja.

Aqui os propongo una mucho más simple y rápida que consiste en hacer un git format-patch para toda la historia del fichero o subdirectorio en cuestión y luego importarla en el repositorio de destino.

mkdir /tmp/mergepatchs
cd ~/repo/org
export reposrc=myfile.c #or mydir
git format-patch -o /tmp/mergepatchs $(git log $reposrc|grep ^commit|tail -1|awk '{print $2}')^..HEAD $reposrc
cd ~/repo/dest
git am /tmp/mergepatchs/*.patch

Simple y rápido :)

IKEA Hackers: LackRack

Entre los cientos de hacks de la fantástica página IKEA Hackers hay uno que es especialmente interesante.

¿Como construir un rack con una mesa lack de IKEA que vale menos de 10 euros?
Pues con este manual:

Lo mejor del LackRack (después de su precio) es que su construcción es modular y se puede ampliar según tus necesidades:

5x LackRack

El LackRack es la solución definitiva, de bajo coste, para crear un centro de datos modular. Se comenta que los ingenieros de Google fueron los primeros en explorar la idea de usar mesas lack para los centros de datos. El LackRack es tan famoso que hasta tiene su propia página Web: http://lackrack.org/ 😀

Desbloqueando una partición raiz encriptada con LUKS de forma remota con SSH

Si estas pensando en enviar un nuevo servidor a un datacenter remoto para colocación o simplemente has contratado uno o varios servidores en la nube, posiblemente habrás pensado que te gustaría cifrar el disco duro del servidor.

El problema es que si cifras el disco duro entero (la partición raíz) vas a necesitar algún sistema del tipo KVM para teclear la contraseña de forma remota cada vez que el servidor se reinicie… seguro??? No!

Gracias a este ingenioso truco, podrás introducir la contraseña de forma remota durante el proceso de arranque. Este truco consiste en embeber en el initramfs un pequeño servidor ssh (dropbear) que permite introducir la contraseña de la partición root durante el arranque ::

Para aquellos que tengan la suerte de usar Debian el procedimiento es tan sencillo y fácil como ::

1) Instala tu servidor con la partición root cifrada.

2) Instala los paquetes necesarios:

apt-get install openssh-server dropbear busybox

3) Copia la clave SSH que ha sido generada de forma automática

scp root@my.server.ip.addr:/etc/initramfs-tools/root/.ssh/id_rsa ~/id_rsa.initramfs

4) Si tu servidor obtiene la IP de forma automática (DHCP) ignora este paso, si no tienes que indicarle la IP en la linea de arranque del Kernel. Para ello edita el fichero /etc/default/grub y define la linea:

GRUB_CMDLINE_LINUX="ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>"

Usando el formato especificado en el archivo Documentation/nfsroot.txt de la documentación del Kernel de Linux. Por ejemplo:

GRUB_CMDLINE_LINUX="ip=192.168.122.192::192.168.122.1:255.255.255.0::eth0:none"

Recarga la configuración de grub

update-grub

5) Reinicia

reboot

6) Y desbloquea de forma remota!

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
	-i "~/id_rsa.initramfs" root@my.server.ip.addr \
	"echo -ne \"MyS3cr3tK3y\" >/lib/cryptsetup/passfifo"

Y para aquellos que no tengan la suerte de usar Debian, así como para aquellos que si tengan esa suerte pero quieran conocer más detalles sobre este procedimiento, os pego el contenido del fichero cryptsetup/README.remote de Debian que seguro que encontrareis muy útil :)

$ zcat /usr/share/doc/cryptsetup/README.remote.gz

unlocking rootfs via ssh login in initramfs
-------------------------------------------

You can unlock your rootfs on bootup from remote, using ssh to log in to the
booting system while it's running with the initramfs mounted.


Setup
-----

For remote unlocking to work, the following packages have to be installed
before building the initramfs: dropbear busybox

The file /etc/initramfs-tools/initramfs.conf holds the configuration options
used when building the initramfs. It should contain BUSYBOX=y (this is set as
the default when the busybox package is installed) to have busybox installed
into the initramfs, and should not contain DROPBEAR=n, which would disable
installation of dropbear to initramfs. If set to DROPBEAR=y, dropbear will
be installed in any case; if DROPBEAR isn't set at all, then dropbear will only
be installed in case of an existing cryptroot setup.

The host keys used for the initramfs are dropbear_dss_host_key and
dropbear_rsa_host_key, both located in/etc/initramfs-tools/etc/dropbear/.
If they do not exist when the initramfs is compiled, they will be created
automatically. Following are the commands to create them manually:

# dropbearkey -t dss -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key
# dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key

As the initramfs will not be encrypted, publickey authentication is assumed.
The key(s) used for that will be taken from
/etc/initramfs-tools/root/.ssh/authorized_keys.
If this file doesn't exist when the initramfs is compiled, it will be created
and /etc/initramfs-tools/root/.ssh/id_rsa.pub will be added to it.
If the latter file doesn't exist either, it will be generated automatically -
you will find the matching private key which you will later need to log in to
the initramfs under /etc/initramfs-tools/root/.ssh/id_rsa (or id_rsa.dropbear
in case you need it in dropbear format). Following are the commands to do the
respective steps manually:

To create a key (in dropbear format):

# dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

To convert the key from dropbear format to openssh format:

# /usr/lib/dropbear/dropbearconvert dropbear openssh \
	/etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
	/etc/initramfs-tools/root/.ssh/id_rsa

To extract the public key:

# dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | \
	grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub

To add the public key to the authorized_keys file:

# cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys

In case you want some interface to get configured using dhcp, setting DEVICE= in
/etc/initramfs-tools/initramfs.conf should be sufficient.  The initramfs should
also honour the ip= kernel parameter.
In case you use grub, you probably might want to set it in /boot/grub/menu.lst,
either in the '# kopt=' line or appended to specific 'kernel' line(s).
The ip= kernel parameter is documented in Documentation/nfsroot.txt in the
kernel source tree.


Issues
------

Don't forget to run update-initramfs when you changed the config to make it
effective!

Collecting enough entropy for the ssh daemon sometimes seems to be an issue.
Startup of the ssh daemon might be delayed until enough entropy has been
retrieved. This is non-blocking for the startup process, so when you are at the
console you won't have to wait for the sshd to complete its startup.


Unlocking procedure
-------------------

To unlock from remote, you could do something like this:

# ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
	-i "~/id_rsa.initramfs" root@initramfshost.example.com \
	"echo -ne \"secret\" >/lib/cryptsetup/passfifo"

This example assumes that you have an extra known_hosts file 
"~/.ssh/known_hosts.initramfs" which holds the cryptroot system's host-key,
that you have a file "~/id_rsa.initramfs" which holds the authorized-key for
the cryptroot system, that the cryptroot system's name is
"initramfshost.example.com", and that the cryptroot passphrase is "secret"

-- <debian@x.ray.net>, Wed, 30 Sep 2009

OpenRISC: Creando una arquitectura 100% libre

OpenRISC es el proyecto estrella de la comunidad OpenCores. Este proyecto pretende desarrollar una serie de microprocesadores con arquitectura RISC utilizando licencias libres.

El OpenRISC 1200 (OR1200) es un microprocesador de código abierto que puede ser sintetizado en un amplio numero de FPGAs de distintos fabricantes, y que actualmente esta siendo usado en un amplio número de proyectos industriales. Este microprocesador es una implementación (LGPL) de la arquitectura OpenRISC 1000 RISC.

Recientemente el proyecto ha alcanzado un hito importante: han enviado los parches para ser revisados a la lista de correo del kernel de Linux y seguramente conseguirán que los acepten para incluirlos, de forma que Linux oficialmente soportará la arquitectura OpenRISC.

Sin duda, noticias excitantes!

Su tu tienes una placa FPGA puedes programarla con el código del microprocesador OpenRISC y ejecutar Linux en el (demo video).

Pero si tu no tienes una, entonces puedes probar el emulador de OpenRISC: es fácil y divertido.
Aquí tienes un enlace a un howto detallado, y aquí esta mi chuleta:

sudo apt-get install build-essential libmpc-dev lzop git-core
sudo apt-get build-dep gcc-4.4
mkdir ~/openrisc
cd ~/openrisc
git clone git://openrisc.net/jonas/or1ksim-svn
cd or1ksim-svn
./configure && make && sudo make install
cd ~/openrisc
git clone git://openrisc.net/jonas/toolchain
cd toolchain
git submodule update --init
# go for a coffee
export PATH=~/openrisc/toolchain/bin:$PATH
make PREFIX=~/openrisc/toolchain
cd linux
make ARCH=openrisc defconfig
make CROSS_COMPILE=or32-linux-
# go for a tea
sim -f arch/openrisc/or1ksim.cfg vmlinux

Y voila! Estas ejecutando un sistema 100% libre, desde el microprocesador hasta el Sistema Operativo, incluyendo el bus Wishbone :)

# cat /proc/cpuinfo
cpu                     : OpenRISC-18
revision                : 1
dcache size             : 8192 kB
dcache block size       : 16 bytes
icache size             : 8192 kB
icache block size       : 16 bytes
immu                    : 64 entries, 1 ways
dmmu                    : 64 entries, 1 ways
bogomips                : 40.00

Como ahora el OpenRISC 1000 es considerado estable, el proyecto OpenCores está intentado construir un chip ASIC de bajo coste con su diseño de forma que se pueda conseguir un mejor rendimiento. Han lanzado una campaña para conseguir donaciones en 2011 con el fin de producir el primer chip ASIC en el primer cuatrimestre de 2012.

Estoy deseando conseguir uno!

La metodología de código libre esta aquí para permanecer, simplemente echa un vistazo a las historias de existo detrás de Linux/Android y todos los grandes beneficios que el código libre ofrece. Ahora necesitamos dar el siguiente paso con el desarrollo de hardware de código libre, queriendo con esto decir, que queremos crear “verdaderos” semiconductores de código libre para permanecer competitivos y estar seguros de que las pequeñas compañías pueden competir con los grandes gigantes de los semiconductores. Así que por favor, únete a nosotros y ayúdanos a reescribir los libros de historia del desarrollo hardware…

(English) Don’t eject your USB storage: stop it!

Disculpa, pero esta entrada está disponible sólo en English.

(English) RFKill Applet for GNOME

Disculpa, pero esta entrada está disponible sólo en English.

(English) Auth External: the Swiss Army Knife of Apache Auth

Disculpa, pero esta entrada está disponible sólo en English.