LaTeX: Chuletario básico

— [ edit | raw ] migrated from node/791

Comandos habituales de LaTeX que nunca recuerdo cuando me hacen falta.

Instalar Debian GNU/Hurd bajo QEMU

— [ edit | raw ] migrated from node/734
El desarrollo de Hurd continúa avanzando... lentamente... aún así ya empieza a ser usable por intrépidos usuarios como nosotros que deseamos aprender más y más. Por eso me he decidido a intentar crear una serie de recetas sobre Hurd. La primera de ellas es ésta: probar hurd en una máquina virtual.

¿Qué es GNU/Hurd?

Desde sus inicios, el objetivo del proyecto GNU ha sido crear un sistema operativo completo y libre. En sus inicios el proyecto contaba con diversas herramientas de desarrollo, aplicaciones de sistema, etc. Pero carecían de un elemento bastante importante: un kernel que ejecutase todo eso. Decidieron crear uno: Hurd, pero lamentáblemente eso es un proceso lento y costoso; por ello decidieron adoptar temporalmente el conocido kernel linux. Actualmente HURD no es usable en entornos de producción pero se encuentra activamente en desarrollo.

Arquitectura Hurd

Como todos sabéis, linux es un núcleo monolítico, como lo era el MS-DOS. Esto significa que todos los componentes del sistema operativo funcionan como un gran programa, esta concepción está ya muy obsoleta (o así debería ser) y actualmente se opta por crear sistemas con sus componentes bien diferenciados e independientes colaborando unos con otros. Esto es hurd: una colección de servidores en la que cada uno implementa el sistema de archivos, la red, etc. Todos estos servidores no pueden ejecutarse ellos sólos, necesitan de un microkernel que gestione el paso de mensajes, la sincronización, etc. entre ellos; este programa es el GNU Mach. En nuestros sistemas GNU/Linux convencionales tenemos la máquina, sobre ella el linux y sobre éste las aplicaciones. Ahora, en un sistema GNU/Hurd (llamado símplemente: sistema GNU :D) tendremos la máquina, sobre ésta gnumach y hurd y las aplicaciones de usuario que realizaran las llamadas a los servidores de hurd. En parte, la lentitud del desarrollo de hurd se debe a que éste modelo de servidores es muy difícil de depurar.

Qué necesitamos

Pues instalado en el sistema: qemu (evidentemente).
A la hora de probar hurd me he encontrado con que al usar la aceleración de kqemu el sistema no arrancaba en la máquina virtual, por tanto no recomiendo instalarlo.
Aparte, necesitaremos una ISO (o el CD ya quemado) con una live que tenga grub, por ejemplo: molinux, gnesis, debian netinstall, etc. Finalmente necesitamos el CD de instalación de hurd, yo he usado: http://ftp.gnuab.org/pub/debian-cd/current/hurd-i386/debian-K14-hurd-i386-mini.iso No hace falta quemar la ISO, con bajarnos el archivo nos sobra ;).

Creando el sistema base

En primer lugar creamos un directorio donde guarrear:
$ mkdir hurdvm
$ cd hurdvm
$ wget http://ftp.gnuab.org/pub/debian-cd/current/hurd-i386/debian-K14-hurd-i386-mini.iso
Ahora crearemos nuestro disco duro falsete:
$ qemu-img create hd0.img 4G
Ya podemos arrancar nuestra máquina virtual, iniciando desde la ISO para ejecutar la instalación:
$ qemu -hda hd0.img -cdrom debian-K14-hurd-i386-mini.iso -boot d

Instalando el sistema

Un "bonito" menú nos va a permitir realizar la instalación de una forma fácil y cómoda, empezamos eligiendo la configuración de teclado (opción 1). Después comenzamos con el particionado (opción 2), donde seleccionamos nuestro disco virtual (/dev/hda en nuestro caso). Como no tenemos ninguna tabla de particiones ahí nos preguntará lo siguiente:
No partition table or unknown signature on partition table
Do you wish to start with a zero table [y/N]?
...y le diremos que (es decir, y). Ahora nos aparecerá cfdisk y crearemos dos particiones: la swap y la del sistema. Para ello seleccionamos New, Primary, un tamaño de unos 200MB, Beginning, Type e introducimos un 82. Ya tenemos la swap creada, ahora la partición del sistema: Seleccionamos Free Space (cursor abajo), New, Primary y el tamaño por defecto (el máximo posible); ya tenemos la segunda partición. Ahora seleccionamos Write, le decimos que yes y finalmente seleccionamos Quit. Ahora inicializamos y activamos la partición swap (opción 3) y le decimos que yes a las dos preguntas. Hacemos lo mismo con la partición GNU/Hurd (opción 4). Después de terminar el proceso nos preguntará si queremos montar esa partición como Root Filesystem, a lo que también diremos que Yes. Ahora ya podemos instalar el sistema base (opción 6) y seleccionamos como origen CD-ROM drive. Nos preguntará el punto de montaje del mismo, que es el que aparece por defecto. Cuando finalice, reinciamos la máquina virtual (opción 7) y cuando vuelva a aparecer lilo cerraremos qemu para cambiar las opciones de la máquina virtual y no usar esa imagen de CD.

Instalando GRUB

Ahora nos encontramos con un problema: este proceso prepara una partición y copia unos ficheros, pero no instala grub, por tanto no podemos iniciar nuestro disco virtual con qemu. La forma en la que yo he instalado grub es la siguiente: vamos a arrancar el liveCD con qemu de la misma forma que arrancábamos la instalación de hurd y restauraremos GRUB (en el ejemplo he usado el CD de instalación de debian):
$ qemu -hda hd0.img -cdrom debian-testing-i386-netinst.iso -boot d
Para continuar con el ejemplo, abriríamos una shell, montaríamos /dev/hda2 en /mnt y ejecutaríamos lo siguiente:
# grub-install /dev/hda --root-directory /mnt
Y con ello ya tendríamos instalado el gestor de arranque. Aunque no lo he dicho antes, es indispensable el gestor grub, cualquier otro como lilo o yaboot no nos sirve para nada. Una vez instalado, apagamos la máquina virtual y cerramos qemu, vamos a inciar por primera vez hurd.

Configurando nuestro sistema

Ahora arrancamos qemu ya sin imágenes de cd-rom, directamente desde nuestro disco virtual:
$ qemu -hda hd0.img
Para conseguir una mayor estabilidad de hurd dentro de qemu yo utilizo las siguientes opciones:
$ qemu -hda hd0.img -std-vga -no-acpi -net none
Y ahora, para empezar a usar nuestro nuevo sistema, debemos configurarlo primero: se tienen que crear los nodos para los dispositivos, configurar los paquetes base, etc. Arrancaremos el sistema en modo single, esto lo podemos hacer con los siguientes comandos en la shell de grub (a la que accedemos pulsando c estando en el menú de arranque):
grub> kernel (hd0,1)/boot/gnumach.gz root=device:hd0s2 -s
grub> module (hd0,1)/hurd/ext2fs.static --multiboot-command-line=${kernel-command-line} --host-priv-port=${host-port} --device-master-port=${device-port} --exec-server-task=${exec-task} -T typed ${root} $(task-create) $(task-resume)
grub> module (hd0,1)/lib/ld.so.1 /hurd/exec $(exec-task=task-create)
grub> boot
En cuanto a la notación de unidades de grub es la siguiente:
(hdD,P)
Donde D es el disco duro, empezando por 0 como primario maestro y 3 como secundario esclavo; y P es la partición, comenzando desde 0 para la primera partición. La notación en hurd es del estilo BSD, es decir:
hdDsP
Donde D es igual que en grub y P también es la partición pero comenzando desde 1 (igual que en grub pero sumando 1).
¡Y ahí va! comienza el arranque de nuestro sistema GNU. Ahora sólo nos queda ejecutar el script de autoconfiguración:
sh-3.1# ./native-install
Esto creará los dispositivos iniciales y configurará algunos paquetes iniciales; cuando termine, reiniciamos otra vez el sistema, volvemos a arrancar en modo single (la misma secuencia de comandos en el grub que antes) y volvemos a ejecutar el script para terminar de configurar el sistema y los paquetes:
sh-3.1# ./native-install
Nos preguntará por nuestra zona geográfica, indicaremos Europe (código 8 ) y después nuestra zona horaria, teclearemos Madrid. Continuará configurando paquetes, cuando finalice podremos reiniciar la máquina virtual y ya tenemos nuestro sistema gnu listo para funcionar!.

Arranque normal del sistema gnu

La secuencia de comandos de grub para arrancar el sistema de forma normal es:
grub> kernel (hd0,1)/boot/gnumach.gz root=device:hd0s2
grub> module (hd0,1)/hurd/ext2fs.static --multiboot-command-line=${kernel-command-line} --host-priv-port=${host-port} --device-master-port=${device-port} --exec-server-task=${exec-task} -T typed ${root} $(task-create) $(task-resume)
grub> module (hd0,1)/lib/ld.so.1 /hurd/exec $(exec-task=task-create)
grub> boot
Una vez arrancado nos aparecerá una shell que nos permite hacer login, podremos entrar como root:
login> login root
Y ya podemos empezar a guarrear con nuestro sistema gnu!! :)

Apéndice A: Menú de arranque para grub

Evidentemente es un rollo tener que escribir esos comandos tan largos en el grub para poder arrancar el sistema, éste es el menu que uso yo:
title GNU/Hurd
kernel (hd0,1)/boot/gnumach.gz root=device:hd0s2
module (hd0,1)/hurd/ext2fs.static --multiboot-command-line=${kernel-command-line} --host-priv-port=${host-port} --device-master-port=${device-port} --exec-server-task=${exec-task} -T typed ${root} $(task-create) $(task-resume)
module (hd0,1)/lib/ld.so.1 /hurd/exec $(exec-task=task-create)

title GNU/Hurd (single mode)
kernel (hd0,1)/boot/gnumach.gz root=device:hd0s2 -s
module (hd0,1)/hurd/ext2fs.static --multiboot-command-line=${kernel-command-line} --host-priv-port=${host-port} --device-master-port=${device-port} --exec-server-task=${exec-task} -T typed ${root} $(task-create) $(task-resume)
module (hd0,1)/lib/ld.so.1 /hurd/exec $(exec-task=task-create)
Pero he de decir que por alguna razón, puede ser que no arranque el sistema de esta forma (se queda congelado en el inicio), si sucede esto no hay más remedio que iniciar como se ha explicado antes: con los comandos en la shell de grub.

Apéndice B: Instalación nativa desde Debian

Si queremos ir más allá que ejecutar hurd en una máquina virtual, podemos instalarlo en nuestra propia máquina. Este proceso es aún más sencillo que el anterior, sólo necesitamos una partición de un par de gigas, por compatibilidad con todo lo anterior, supongamos que esa partición es /dev/hda2 en nuestro disco duro, primero la formateamos (debe ser de tipo 83 - linux):
# mke2fs -b 4096 -o hurd /dev/hda2
Ahora instalamos un paquetito muy chulo:
# apt-get install crosshurd
Este paquete nos permite realizar una instalación cross-system de diversos sistemas operativos. Montamos la partición formateada en algún sitio:
# mount /dev/hda2 /mnt/hurd -t ext2
...y ejecutamos la instalación:
# crosshurd
Esto nos pedirá el punto de montaje, introducimos /mnt/hurd o el que hayamos usado y seleccionamos el tipo de instalación, gnu en nuestro caso. Esto copiará todos los archivos necesarios en esa partición. Una vez terminado añadimos los items en el archivo /boot/grub/menu.lst del apéndice A y realizamos el proceso de configuración de la misma forma que lo hacíamos en la máquina virtual.
Es muy normal que hurd no arranque y se quede colgado en el inicio, esto se debe a que aún no está implementada la capacidad de cargar/descargar módulos del núcleo, por tanto se compilan todos de forma estática, esto provoca que en determinados hardwares se quede colgado, la única solución es recompilar hurd para la máquina específica... que esto puede ser motivo para una nueva receta :P

Enlaces

Gracias a nuestro amigo Arturo, si no queremos instalar ni configurar nada, sólamente queremos probar hurd sobre qemu podemos usar la imagen de este blog: Zaborowski. Hay muchos más enlaces... todos los podéis encontrar a partir del enlace en Debian. Espero que os sea útil o por lo menos tan entretenido como a mi! ;)

Máquinas PPC

Cuando uclmwifi y euroroam soporten pump y se hiele el infierno }:).

SAI "MGE Pulsar Ellipse 600" en Debian con NUT

— [ edit | raw ] migrated from node/733

Esta receta explica cómo instalar y configurar dicho SAI en un sistema Debian GNU/Linux o derivado para sacarle el máximo partido. Te recomiendo que leas al menos la introducción de Configuración y disfrute de un SAI para que tengas una idea de lo que se puede hacer y lo que necesitas, ya que no lo voy a repetir aquí.

Los titulados españoles son los que menos cobran de Europa

— [ edit | raw ] migrated from node/731
Pues sí, esas son las conclusiones a las que llega el informe "El Profesional Flexible en la Sociedad del Conocimiento: Nuevas Exigencias en la Educación Superior en Europa".

Tcpstat, estadísticas de la red

— [ edit | raw ] migrated from node/730

Tcpstat es un programa que nos da distintas estadísticas sobre la red. Estas estadísticas las puede obtener monitorizando una interfaz de red, o leyéndolas de una captura previa desde un fichero.

Introducción

Tcpstat hace uso de la librería pcap, utilizada para capturar paquetes, al igual que otros programas como tcpdump, wireshark, dsniff o snort. Por lo tanto con Tcpstat podremos analizar ficheros de captura creados con cualquier otro programa compatible con el formato pcap.

Instalación

En Debian tan sencillo como:

# apt-get install tcpstat

Ejecución

Pcap accede directamente al interfaz de red para poder hacer las mediciones oportunas (capturando los paquetes que pasen por esa interfaz). Por este motivo, tiene que ejecutarse como root si vamos a capturar paquetes de la interfaz de red. No es necesario si los paquetes los lees desde un fichero pcap.

Un pequeño ejemplo puedes ejecutarlo tecleando:

# tcpstat -i eth0

Con esto obtendrás las estadísticas cada 5 segundos, incluyendo la tasa de bps, la media de bytes por paquete y la desviación típica de bytes por paquete.

Opciones

A continuación explico las opciones más importantes:

  • -F Hace un flush a la salida estándar, útil cuando se utiliza con tuberías o se redirige su salida a algún fichero.
  • -f “filtro” Aplica un filtro a las estadísticas. Este filtro tiene la misma sintaxis que un filtro de pcap (ver manual de tcpdump)
  • -o “cadena” Cadena de formato de salida. En el siguiente apartado veremos en qué consiste.
  • -s segundos Se ejecuta sólo durante el número de segundos especificado, y luego sale. Por defecto se ejecuta hasta que se pulse Control-C.
  • -p No pone el interfaz en modo promiscuo (por defecto lo pone en modo promiscuo)
  • -r fichero.pcap Lee del fichero pcap indicado en lugar de una interfaz de red.
  • -e Elimina los intervalos sin estadísticas.
  • -l Incluye la capa de enlace en el cálculo del tamaño de paquete.
  • También puedes especificar un intervalo de actualización, tras el cual se actualicen las estadísticas. Para especificar un intervalo de actualización de 1 segundo, ejecutarías:


    # tcpstat -i eth0 1
    <span class="gp">#</span><span class="w"> </span>tcpstat <span class="nt">-i</span> eth0 1

  • Cadena de formato

    Puedes especificar qué estadísticas queremos ver impresas.

    1. %A numero de paquetes ARP
    2. %a tamaño de paquete medio
    3. %B numero de bytes por segundo
    4. %b numero de bits por segundo
    5. %C numero de paquetes ICMP y ICMPv6
    6. %d desviación estándar del tamaño de cada paquete
    7. %I numero de paquetes IPv4
    8. %l carga de la red en el último minuto, similar a uptime
    9. %M tamaño máximo de paquete
    10. %m tamaño mínimo de paquete
    11. %N número de bytes
    12. %n número de paquetes
    13. %p número de paquetes por segundo
    14. %R Lo mismo que %S, pero relativo al primer paquete visto
    15. %r Lo mismo que %s, pero relativo al primer paquete visto
    16. %S El timestamp para el intervalo en segundos después de la “época UNIX
    17. %s El timestamp para el intervalo en segundos.microsegundos después de la “época UNIX
    18. %T número de paquetes TCP
    19. %U número de paquetes UDP
    20. %V número de paquetes IPv6

    Si no especificas ninguna, la cadena de formato por defecto es:

    Time:%S\tn=%n\tavg=%a\tstddev=%d\tbps=%b\n

    Utilizando esta cadena de formato obtendrás como salida algo similar a lo siguiente:


    Time:1182967131 n=285 avg=643.86 stddev=664.55 bps=293598.40
    Time:1182967136 n=347 avg=553.59 stddev=648.45 bps=307352.00
    Time:1182967141 n=375 avg=489.45 stddev=628.97 bps=293668.80
    Time:1182967146 n=392 avg=530.18 stddev=643.44 bps=332528.00
    Time:1182967151 n=345 avg=596.07 stddev=658.98 bps=329032.00
    Time:1182967156 n=300 avg=650.89 stddev=664.36 bps=312427.20
    Time:1182967161 n=300 avg=660.77 stddev=666.50 bps=317171.20
    Time:1182967166 n=132 avg=636.59 stddev=650.23 bps=134448.00

    En cambio, si utilizamos la cadena de formato “bps:%b\n” obtendrás como salida algo similar a lo siguiente:

    bps:257598.40
    bps:246494.40
    bps:248875.20
    bps:247489.60
    bps:249275.20
    bps:247528.00
    bps:245633.60

    Ejemplos:

    A continuación pongo algunos ejemplos sencillos que te pueden resultar útiles.

    Para medir estadísticas de transferencia HTTP

    # tcpstat -f "tcp port http" -i eth0 1

    Para medir el bitrate de un stream RTP que nos llega al puerto 1234

    # tcpstat -f "udp port 1234" -i eth0 -o "bps=%b\n" 1

    Para ver el uso de un servidor FTP en modo activo (puerto 21 control y 20 datos)

    # tcpstat -f "port 20 or port 21" -i eth0 1

    Para ver la tasa de transferencia y carga de la red de un servidor gnump3d

    # tcpstat -f "port 8888" -i eth0 -o "Tasa de transferencia:%b\tCarga de la red:%l\n" 1

    Para leer las estadísticas de un fichero capturado previamente con Wireshark

    $ tcpstat -r captura.pcap 0.5

    Con imaginación puedes darle muchos más usos, según lo que necesites monitorizar. Para mayor información sobre los filtros, consulta el manual de tcpdump.

    Conclusión

    Tcpstat puede ser una buena herramienta para administradores de redes y de servidores para obtener diversa información sobre el uso de la red.

    Referencias

    • man tcpstat
    • man tcpdump
    • man wireshark

Patrón Singleton en Python como metaclase

— [ edit | raw ] migrated from node/1017

Esta receta incluye la implementación «comentada» del patrón de diseño «Singleton» usando una metaclase Python.

Metaclase para invocación automática del "constructor" de la superclase

— [ edit | raw ]
migrated from node/1018

Esta receta incluye la implementación “comentada” de una metaclase Python para conseguir que el constructor de la superclase se invoque automáticamente.

Ahí va la virgen! Metaclases! (con Python)

— [ edit | raw ] migrated from node/600

Esta receta es una pequeña introducción a la meta-programación, concretamente voy a contar algunas cosillas sobre uno de los mecanismos más populares y potentes: las metaclases.

Solución al fallo de GLX en tarjetas Nvidia antiguas (legacy)

— [ edit | raw ] migrated from node/729
Publico esta mini receta aquí por si a alguien mas está pasando por lo mismo. El problema lo he detectado en Ubuntu, pero creo que el resto de distribuciones mas o menos modernas no están exentas.

GNU Emacs: puesta a punto

— [ edit | raw ] migrated from node/728

Configuración básica