android-sdk-linux emulator: error=2

Hoy estaba haciendo unas mejoras en una de las APPs que tengo disponibles para Android y tras instalar todo el sistema Eclipse + Android SDK en mi nuevo equipo, creo una nueva máquina. En este caso, y para dar soporte a las mejoras que trae de pantalla, creé un dispositivo de tipo Nexus 5. Tras crearlo, decido iniciarlo para ver cómo se comporta la APP y obtengo el siguiente error,

Starting emulator for AVD 'Nexus_5'
Failed to start emulator: Cannot run program "/home/javier/Eclipse/android-sdk-linux/tools/emulator": error=2, No existe el archivo o el directorio
El error no tiene nada que ver con la versión de Android instalada ni de la API, sino con un fallo de librerías en sistemas de 64 bits. Tras investigar un poco, obtengo la solución,
shell> apt-get install libncurses5:i386 \
                       libstdc++6:i386 \
                       zlib1g:i386
Tras instalar los nuevos paquetes, las máquinas Android emuladas ya arrancan sin problemas.
Leer más

Arrancar ISO desde grub

Una de las muchas sorpresas que depara GNU/Linux es la versatilidad que este ofrece para hacer cosas. Hoy vamos a ver una que nos puede ayudar e incluso sacar de más de un apuro y que es cómo arrancar una ISO desde Grub.
Por norma general, cuando queremos arrancar una ISO, debemos de grabarla en un CD o en un pendrive para poder iniciar con ella el equipo y así verla y probarla. Pues bien, este tipo de acciones se pueden terminar con la posibilidad de arrancar una ISO desde el propio grub. Este método no servirá, lógicamente, para una reinstalación completa de tu sistema, pero sí te brindará la posibilidad de reiniciar tu equipo y probar una ISO de cualquier otra distribución o arrancar algún CD de utilidades. Vamos ya, por lo tanto, a preparar nuestro entorno.

Preparación del sistema

Vamos a ver aquí los pasos que debemos de hacer antes de nada. Lo primero será obtener la ISO que queramos tener en el arranque. Por ejemplo, una Ubuntu, una copia de BackTrack o el mismo Gparted. Para ello, debemos de ir a la web oficial y descargarla. Este paso no tiene nada que ver con lo que vamos a comentar, pero sí es necesario para luego.
Una vez que tengamos la ISO, deberemos de colocarla en una ruta específica. Puesto que estamos hablando de ISO de arranque, a mi me gusta colocarlas en /iso, por lo tanto,
shell> mkdir /iso
shell> mv gparted-live-0.20.0-2-i486.iso /iso
shell> mv ubuntu-14.04.1-desktop-amd64.iso /iso
A continuación, vamos a hacer que el grub se muestre cuando arranque, pues en las últimas versiones arranca con un retraso de 0 segundos, lo que hace que se complique la elección del sistema operativo a arrancar. Si no tienes este problema, ignora este paso, sino, edita el fichero /etc/default/grub y déjalo como sigue.
...
#GRUB_HIDDEN_TIMEOUT=0
...
Y ya para finalizar el apartado de cosas que debemos de saber, necesitamos averiguar sobre qué disco y que partición está nuestra nueva carpeta (/iso). Si tienes una instalación de las típicas, se supone que estará en el disco 0 (/dev/hda o /dev/sda) y la partición 1, por lo tanto (hd0, 1). Esto es importante tenerlo identificado. Para asegurarte, compruébalo con fdisk y con mount.
shell> fdisk -l
Dispositivo Inicio Comienzo    Fin    Bloques  Id  Sistema
/dev/sda1   *      2048   29296639   14647296  83  Linux
/dev/sda2      29296640   33202175    1952768  82  Linux swap
/dev/sda3      33202176  234440703  100619264  8e  Linux LVM
shell> mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro)
...

Edición del grub

La parte común ya está. Ahora nos queda añadir las entradas necesarias a nuestro grub. Se recomienda no añadirlas directamente en /boot/grub/grub.cfg, puesto que en cada actualización este fichero se regenera y por lo tanto los cambios se pierden. Lo mejor es usar el fichero /etc/grub.d/40_custom, que es precisamente para estos casos, añadir entradas manualmente.

Ubuntu 64

menuentry 'Ubuntu 14.04 Live (64 bits)' {
   set isofile="/iso/ubuntu-14.04.1-desktop-amd64.iso"
   loopback loop (hd0,5)$isofile
   linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
   initrd (loop)/casper/initrd.lz
}

Ubuntu 32

menuentry 'Ubuntu 14.04 Live (32 bits)' {
   set isofile="/iso/ubuntu-14.04.1-desktop-i386.iso"
   loopback loop (hd0,5)$isofile
   linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
   initrd (loop)/casper/initrd.lz
}

Gparted

menuentry 'Gparted' {
   set isofile="/iso/gparted-live-0.20.0-2-i486.iso"
   set root=(hd0,5)
   loopback loop (hd0,5)$isofile
   linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt ip=frommedia toram=filesystem.squashfs findiso=$isofile
   initrd (loop)/live/initrd.img
}
Cómo veis, cada ISO a arrancar tiene unas opciones diferentes y estas debes de averiguarlas antes de poder iniciarla. Por norma general, está documentado el proceso en la web principal.
Lo único que nos queda ahora por realizar es una actualización del grub.
shell> update-grub2

Arrancando desde la ISO

Llegados a este punto, ya estamos listos para poder reiniciar nuestro sistema. Así que, cerramos la consola y todo lo que estemos haciendo y reiniciamos.
Os debería, tras el reinicio salir una pantalla similar a esta donde destaqué con letra más clara las dos ISOs que tendremos disponibles para iniciar.





Qué significa cada uno de los parámetros

  • menuentry
    Nombre que aparecerá como entrada del grub.
  • set isofile
    Define una variable, isofile, que contendrá la ruta absoluta de la imagen a iniciar.
  • set root
    Indica la partición raíz sobre la que está la imagen.
  • loopback
    Indica la ruta donde localizar la imagen en el disco. Es una composición de disco + variable isofile.
  • linux
    Kernel que se usará para arrancar y la localización del mismo. También se le pasan aquí las opciones de arranque.
  • initrd
    Indica la localización del fichero initrd, pero siempre dentro de la imagen.
Leer más

Bloquear múltiples IPs eficientemente

Fijo que a muchos nos ha pasado que tengamos que bloquear un listado de IPs o rangos de red que están intentando atacar un servidor. La forma más sencilla y habitual de hacerlo, no es otra que emplear IPTables para realizar el trabajo. Algo similar a lo que sigue, para cada una de las IPs a bloquear,
shell> iptables -A INPUT -s 192.168.0.16 -p TCP -j DROP
O si lo necesitas hacer para una red,
shell> iptables -A INPUT -s 192.168.0.0/24 -p TCP -j DROP
Esto funciona perfectamente, pero si hay que repetir este paso para unas 1000 IPs/redes, quizás la forma de hacerlo ya no sea tan sencilla de aplicar, y mucho menos, tan gustosa de hacer. Para solucionar esto, IP Sets simplifica este proceso.

Qué es IP Sets

IP Sets es una feature del kernel de Linux que permite definir múltiples y diferentes IPs, redes, direcciones MAC o puertos y cargarlas desde IPTables. La ventaja es que para almacenarlas y usarlas emplea estructuras bitmap/hash, lo que lo hace muy eficiente en acceso. Esta es la principal ventaja, la otra es que puedes meter en dicha tabla miles de direcciones y cargarlas todas con una única regla de IPTables.

Instalación

Lo primero que vamos a ver es cómo instalar este software.
shell> apt-get install ipset

Uso

Tras la instalación del mismo, únicamente nos queda por crear la tabla que después cargaremos. Para ello, emplearemos el siguiente comando,
shell> ipset create bannet hash:ip
El primer argumento (bannet) es el nombre de la tabla que vamos a crear. El segundo (hash:ip) es el tipo de tabla a crear. Este tipo puede ser diferente según nuestros propósitos y puedes ver aquí todos los métodos soportados. En este caso, nos interesa un tipo hash:ip, ya que vamos a almacenar en ella un listado de IPs aisladas.
Con la tabla creada, ya sólo nos queda meterle las IPs que deseamos. Para ello, y este proceso sí que debe ser manual,
shell> ipset add bannet 1.1.1.1
shell> ipset add bannet 1.1.2.2
shell> ipset add bannet 1.1.3.3
shell> ipset add bannet 1.1.4.4
Y para ver un listado de las IPs introducidas,
shell> ipset list
Name: bannet
Type: hash:ip
Header: family inet hashsize 1024 maxelem 65536 
Size in memory: 16568
References: 0
Members:
1.1.3.3
1.1.4.4
1.1.2.2
1.1.1.1
Llegados a este punto, sólo nos queda cargar este IPSet en IPTables. Para hacerlo emplearemos la opción "-m set --match-set", quedando la regla tal que así,
shell> iptables -I INPUT -m set --match-set bannet src -p TCP -j DROP
Cómo veis, una única regla para manejar todas aquellas IPs bloqueadas.

Guardado y restauración

Las tablas creadas van a necesitar un mantenimiento, e IPSet está preparado para ofrecerlo, incorporando opciones de borrado, restauración, testeo, destrucción y un largo etcétera. Se recomienda leer la página man de IPSet. De todas formas, quizás una de las tareas más importantes sea la de guardar las reglas de un tabla, por tener un backup, y volver a restaurarlas en caso de necesidad.
Para hacer un backup de un conjunto de reglas,
shell> ipset save bannet > /backup/bannet.list
Para destruir un conjunto de las mismas,
shell> ipset destroy bannet
Y para restaurarlas, en caso de necesidad,
shell> ipset restore < /backup/bannet.list

En la próxima entrada veremos cómo aprovechas las listas disponibles en la red para mejorar la seguridad de nuestra red. Pero por el momento, quizás con esta opción, muchas de las reglas que tenéis en IPTables puedan ser reducidas de forma muy eficiente.

Referencias

Leer más

Instalación de SonarQube en GNU/Linux

Hace unos días un compañero y amigo, +Celso Conde Pérez, me preguntó si conocía SonarQube.
Para los que no lo sepáis, SonarQube es una plataforma centralizada de evaluación de código. Es software libre, lo cual está genial, y permite la evaluación estática de código según patrones preestablecidos. El objetivo es garantizar la calidad del código escrito. En El Mundo en Bits hablamos hace tiempo de una herramienta similar, rats, y puedes leer el artículo aquí. Digo similar, ya que Sonar cubre muchos más aspectos.
Puesto que últimamente estoy enfrascado en algunas tareas de desarrollo de scripts y código, decidí probar esta herramienta, ya que trae soporte para multitud de lenguajes de programación (python, php, java, etc.). Así que lo primero fue levantar una máquina virtual para poder instalar el servidor web. Con la máquina levantada simplemente seguí las instrucciones de instalación paso a paso.
  1. Instalación de la base de datos
    Aunque Sonar trae por defecto una base de datos embebida, tengo más experiencia y me gusta manejar los datos desde un MySQL. En este caso empleé para la máquina un sistema CentOS, así que,
    shell> yum install mysql-server
    
    Finalizada la instalación arrancamos el servicio,
    shell> service mysqld start
    
    Y creamos la base de datos que vamos a emplear en sonar, así como un usuario con permisos,
    mysql> CREATE DATABASE sonar;
    mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
    mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
    
  2. Instalar el servidor SonarQube
    Lo primero que tenemos que hacer es descargar la última versión del servidor. Para ello, desde la página oficial, sección descarga lo tenemos (la versión actual la puedes descargar desde aquí).
    shell> cd /tmp
    shell> wget dist.sonar.codehaus.org/sonarqube-4.5.1.zip
    
    A continuación lo descomprimimos,
    shell> unzip sonarqube-4.5.1.zip
    
    Y lo movemos a /etc, como dice en la guía de instalación.
    shell> mv /tmp/sonarqube-4.5.1 /etc/sonarqube
    
    Con esto ya tenemos el sistema SonarQube instalado y listo para poder usarse, aunque antes, debemos de configurar el acceso a base de datos. Para ello, editamos el fichero de propiedades de sonar, /etc/sonarqube/conf/sonar.properties y establecemos los parámetros de acceso a base de datos. El resto de la configuración nos sirve por defecto.
    ...
    #sonar.embeddedDatabase.port=9092
    ...
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
    ...
    sonar.web.host=0.0.0.0
    sonar.web.port=9000
    ...
    
  3. Arrancar el sistema
    Con todo listo y configurado ya podemos arrancar el servidor Sonar.
    shell> /etc/sonarqube/bin/linux-x86-64/sonar.sh start
    
    La carpeta dentro de bin a la que tendréis que acceder depende directamente del sistema sobre el que esté montando. En mi caso, es un sistema de 64 bits, por lo tanto empleo el script de 64bits.
    Tener presente que en el primer arranque hace un despliegue completo de toda la base de datos y esto, según el ordenador, podrá llevar más o menos tiempo. En mi caso, llevó algo más de 2 minutos, por lo que ser pacientes. El progreso de arranque lo podéis observar en el fichero de log (/etc/sonarqube/logs/sonar.log).
SonarQube está escrito en java, lo que hace necesario, para que todo funcione, tener instalado java en el sistema. Si no lo tenéis ya, habrá que ir a la web de Oracle y descargar la versión que corresponda del jdk e instalarlo. Por ejemplo, para la máquina en cuestión, descargué el jdk-8u25-linux-x64.rpm y tras su instalación el sistema Sonar ya pudo arrancar perfectamente.

Con la instalación del servidor Sonar, únicamente tenemos la parte centralizada de evaluación y análisis de código, pero tenemos pendiente todavía la configuración de los plugins de soporte de diversos lenguajes y también el cliente (sonar-runner), que analizará y enviará el código al servidor. Estas partes ocuparan las próximas entradas.
Leer más

Vagrant: Instalación y primeros pasos

Esta entrada la tenía pendiente desde que el otro día hablé con +Susana López Barreras sobre el tema. Así que por fin me decidí terminarla y publicarla. Servirá para ella y para más gente, espero.

¿Qué es Vagrant?

Vagrant es una herramienta pensada para facilitar la creación y configuración automática de entornos de desarrollo virtualizados. Aunque en sus orígines únicamente se podía usar con VirtualBox, actualmente ya es capaz de desplegar máquinas en sistemas como VMware, Amazon EC2, etc. La gran ventaja es que trabaja de la mano directamente con herramientas de centralización de configuraciones, tales como Puppet o SaltStack, de las que hablamos aquí en más de una ocasión. Es gracias a esta perfecta combinación donde reside el verdadero poder de Vagrant.

Instalación

Vagrant está disponible en los repositorios de la mayoría de distribuciones, pero yo personalmente recomiendo bajar el paquete desde la web oficial, Vagrantup.com, para disponer así de la última versión. Compensa tener la versión de la web oficial, ya que tiene importantes mejoras. Así que nos dirigimos a la parte de descargas y seleccionamos el sistema operativo que tengamos y lo descargamos. Yo personalmente me bajo la de Debian 64 ;-)
shell> wget https://dl.bintray.com/.../vagrant_1.6.5
Una vez la tenemos, simplemente instalamos el nuevo paquete,
shell> dpkg -i vagrant_1.6.5_x86_64.deb
Y desde este momento ya disponemos de Vagrant instalado en el sistema. Crear una nueva instancia de una máquina virtual a partir de ahora será muy sencillo y trivial.

Uso de Vagrant

Efectivamente, Vagrant, si no se emplea con SaltStack o Puppet, no es más que una forma diferente de crear máquinas virtuales en VirtualBox, por decirlo de forma sencilla. Aun así, es una forma muy cómoda, pues no necesitas realizar ningún tipo de instalación. Esta es la primero ventaja que tiene Vagrant. Si necesitas una máquina con un determinado sistema operativos, ya no es necesario descargar la ISO e instalarla, desde Vagrant es más sencillo.

Crear nueva máquina

shell> vagrant init
 A `Vagrantfile` has been placed in this directory. You are now
 ready to `vagrant up` your first virtual environment! Please read
 the comments in the Vagrantfile as well as documentation on
 `vagrantup.com` for more information on using Vagrant.
A continuación editamos dicho fichero (/tmp/Vagrantfile),
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   config.vm.box = "ubuntu/precise64"
end
Dejándolo tal y como se muestra anteriormente. A continuación, simplemente,
shell> vagrant up
 Bringing machine 'default' up with 'virtualbox' provider...
  ==> default: Importing base box 'ubuntu/precise64'...
  ==> default: Matching MAC address for NAT networking...
  ...
Este comando hará todo lo necesario. Es decir, se descargará la pre-imagen de la máquina precise64 si fuese necesario, creará una nueva instancia de la máquina en VirtualBox (por defecto) y la arrancará. Para acceder a ella,
shell> vagrant ssh

Welcome to Ubuntu 12.04.5 LTS (GNU/Linux 3.2.0-72-virtual)
...

vagrant@vagrant-ubuntu-precise-64:~$
Si necesitas otra máquina, cual sea, simplemente editas el fichero y la creas. Sin complicaciones. Existen multitud de máquinas libres para descarga en vagrantcloud.

Destruir máquina

La ventaja de Vagrant y que veremos en próximas entradas es el poder de la auto-creación, pero por el momento, si tras levantar tu máquina virtual y trabajar con ella varios días, finalizaste el trabajo y ya no quieres que te ocupe espacio, simplemente,
shell> vagrant destroy
 Are you sure you want to destroy the 'default' VM? [y/N] y
  ==> default: Forcing shutdown of VM...
  ==> default: Destroying VM and associated drives...

Más

Como era de esperar, puedes apagarla, volver a levantarla, suspenderla y un largo etcétera de funcionalidades, según lo que aporte el sistema de virtualización que emplees.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios