Crear VM FreeNAS en Virtualbox desde consola

Bien, hace tiempo que no publico nada pero ahora quiero documentar y de paso compartirles la forma en la cual he podido crear una maquina virtual que contiene FreeNAS pero haciendolo desde la consola y en un host sin interfaz grafica, por lo que se tendra que acceder de forma remota utilizando los paquetes de extension de Virtualbox, los cuales proveen esta funcionalidad.

Antes que nada les explico lo que es FreeNAS. Se trata de una distribucion Linux FreeBSD que contiene todo un administrador de servidores para compartir archivos(algo asi como tener tu propio Dropbox en local). FreeNAS tiene soporte para los principales sistemas de archivos propietarios:

  • Windows -> CIPS
  • Linux -> NFS
  • Mac -> AFP

Por lo que puedes montar un disco fisico, levantar los tres tipos de servicios y exponer todo el disco o carpetas hacia cualquier sistema.

En una entrada anterior explique como montar un servidor NFS, sin embargo los clientes de Windows y Mac para NFS son pesimos, se desconectan a cada rato, en cada inicio de sesion hay que volver a configurarlos, a veces tienen errores al escribir, etc, por lo que se me hace mejor y mas practico levantar sus servicos propietarios y apuntar todos a un mismo dispositivo.

Ahora que medio saben de que va la cosa, procedamos a instalarlo. Primero que nada necesitamos obviamente el iso de FreeNAS, este lo encuentars aqui.

Ahora, suponiendo que ya tienes isntalado el VirtualBox, abres una terminal y ejecutas el siguiente comando:

$ VBoxManage list extpacks

Si te indica que no existe ningun paquete de extensiones instalado, debes descargarlo de aqui. Simplemente busca la version que tienes instalada de Virtualbox y busca el archivo con extension .vbox-extpack. Por ejemplo:

http://download.virtualbox.org/virtualbox/4.3.8/Oracle_VM_VirtualBox_Extension_Pack-4.3.8-92456.vbox-extpack

Para instalarlo lo haces de la siguiente manera:

$ sudo VBoxManage extpack install /path/to/extpack-file.vbox-extpack

Ahora que ya lo tienes instalado, necesitas seguir la siguiente receta:

1.  Crea la maquina virtual y registrala para que VBoxManage la reconozca

$ VBoxManage createvm –name “FreeNAS” –register

2.  Especifica las configuraciones de harware con las cuales se va a crear la VM

$ VBoxManage modifyvm “FreeNAS” –memory 1024 –acpi on –ioapic on –boot1 dvd –nic1 bridged –bridgeadapter1 eth0 –nictype1 82540EM –ostype FreeBSD_x64

2.1  Si tienes dudas con las opciones del parametro –ostype ejecuta el siguiente comando para desplegar toda una lista de las opciones que se tienen. En esta lista el atributo que nos interesa es el ID.

$ VBoxManage list ostypes

3.  Ahora debes crear el archivo fisico que contendra la informacion del OS a instalar en la VM. En este caso lo creo de 15000MB, i.e. aprox 15GB.

$ VBoxManage createvdi –filename ~/vms/FreeNAS/FreeNAS.vdi –size 15000

4.  Para montar el disco que acabamos de crear, necesitamos una controladora IDE en la VM, para ello la podemos agregar de la siguiente manera.

$ VBoxManage storagectl “FreeNAS” –name “IDE Controller” –add ide

5.  Ahora montamos el disco que contendra la VM y el disco con la imagen iso de FreeNAS que descargamos anteriormente.

$ VBoxManage storageattach “FreeNAS” –storagectl “IDE Controller” –port 0 –device 0 –type hdd –medium ~/vms/FreeNAS/FreeNAS.vdi
$ VBoxManage storageattach “FreeNAS” –storagectl “IDE Controller” –port 1 –device 0 –type dvddrive –medium /path/to/FreeNAS-image.iso

6.  No queda otra cosa mas que arrancar la VM(recuerden que el host no tiene interfaz grafica)

$ VBoxHeadless –startvm “FreeNAS” &

7.  En la consola podras observar que se ha levantado un servidor VRDE en el puerto TCP por default 3389. Para conectarnos a dicho servidor puedes utilizar:

Y Listo!!!!!! Ya deberias poder acceder a tu maquina virtual sin interfaz grafica de manera remota.

Saludos y espero que les sirva. Cualquier duda o comentario favor de ponerlo aca abajo.

Driver USB Ubuntu para dispositivos Android

Cuando desarrollamos aplicaciones para dispositivos con Android, una de las principales cosas que necesitamos es hacer pruebas, esto lo podemos hacer de dos maneras; utilizando una maquina virtual con alguna de las distintas versiones de Android ó haciendo debug directamente en un dispositivo movil conectado a tu PC a travez de USB. Ambas opciones tienen sus pros y sus contras, he escuchado de varios amigos que su opcion favorita es la virtualizacion bajo sistemas con CPU Intel de ultima generacion(core i[3,5,7]) e instalando los paquetes respectivos en Eclipse/IntelliJ Idea con el administrador de paquetes de Android, lo cual les funciona incluso mas rapido que debugeando directamente en el dispositivo movil.

En general todos los procesadores de ultima generacion cuentan con esta tecnologia, para validar si tu procesador cuenta o no con este soporte existe una lista en la pagina de Intel e incluso una aplicacion(Solo para Windows) que automaticamente te hace esta validacion, aqui esta el link.

En la imagen se observa el paquete necesario para poder realizar la virtualizacion utilizando las caracteristicas del procesador.

intel-vdx-emulador

La imagen tambien muestra que desafortunadamente para los desarrolladores de Android bajo Linux no hay soporte para este paquete, por lo que esta opcion esta descartada y no nos queda otra mas que utilizar directamente el dispositivo movil, el problema aqui es que la instalacion de los drivers no es tan sencillo como en Windows o Mac, sin embargo existe un paquete que nos ayuda con esto, para ello hay que instalarlo con el siguiente comando.

$ sudo apt-get install libusb-dev

La version que se encuentra actualmente en los repositorios esta muy desactualizada, por lo que hay que descargar el fuente, compilarlo e instalarlo. Para descargarlo lo haces desde esta pagina, de aqui recomiendo seleccionar la version mas reciente, una vez descargado el archivo lo descomprimes y ejecutas los siguientes comandos:

$ cd libmtp-version
$ ./configure –prefix=/usr
$ make
$ sudo make install

Con esto, la nueva version del paquete estara actualizada, ahora solo falta agregar los dispositivos para que el OS los reconozca. La distribucion de este paquete ya trae un archivo con una lista de todos los dispositivos soportados, el archivo se llama 69-libmtp.rules y debe ser copiado a la carpeta /etc/udev/rules.d. Una vez hecho esto se debe recargar la lista con el siguiente comando:

$ sudo udevadm control –reload-rules

Y listo, el sistema ya deberia poder reconocer el dispositivo.

Existe una herramienta para poder ver en una pc la pantalla de tu dispositivo Android, tiene varias funciones muy interesantes, aunque la que mas utilizo yo es la de captura de pantalla, esta es la pagina del proyecto, para arrancar el programa una vez descargado, ejecutas lo siguiente:

$ java -jar droidAtScreen-version.jar

Lo unico malo de esto es que es algo lento(tal vez demasiado), pero pues no es algo con lo cual no puedas trabajar.

Bueno, pues espero que esto les sirva de algo, si tienen alguna duda, comentario o sugerencia por favor no duden en hacerla.

Saludos a tod@s.

Mensaje del dia SSH (motd)

Hola, en esta entrada voy a mostrar como cambiar el mensaje de bienvenida que muestra un servidor ssh cuando se establece una conexion con ellos. Es muy comun en las empresas que manejan datos sencibles definir un mensaje de inicio en el servidor ssh indicando sus politicas de uso y las responsabilidades y normas que se deben considerar al tener acceso al servidor. Aunqe tambien existe gente como yo que les gusta tener un servidor “casero” para hacer pruebas y que le gusta customizar este tipo de cosas simplemente por el placer de.

Pues bien, OpenSSH maneja un archivo que se muestra al usuario recien ha sido firmado, este mensaje es definido en un archivo que se encuentra en la ruta /etc/motd, el cual puede o no existir, en caso de que no exista lo puedes crear y por default el servidor leera su contenido para ser mostrado al usuario.

En este achivo puedes poner scriptlets que se ejecutan cuando el archivo es leido, es decir, puedes poner comandos que se ejecutan y muestran informacion referente al servidor, el usuario con el cual se esta firmado, etc.

Existe tambien una herramienta llamada figlet, el cual recibe una cadena de texto y retorna un mensaje como el siguiente:

$ figlet sock-osg

Screenshot from 2014-05-18 23:24:52

Este mensaje lo puedes utilizar en tu archivo motd, utiliza el siguiente comando para crear/sobreescribir el archivo.

# tu_mensaje | figlet > /etc/motd

Tengan mucho cuidado con este ultimo comando, ya que sobreescribe el archivo actual(si es que existe) borrando todos los cambios que éste contenía.

Eso es todo por ahora. Saludos a tod@s.

Instalar Servidor NFS en CentOS 6.5

En esta entrada mostrare como instalar un servidor NFS en un servidor CentOS 6.5.

Para los que no saben que es un servidor NFS(que lo dudo sino no habrian entrado aqui), en escencia se trata de una unidad de disco duro que vive en la nube o en tu intranet, el cual puedes agregar en cualquier OS siempre y cuando éste reconozca el protocolo.

La idea general es algo similar a una carpeta compartida en windows, a la cual accedes a traves de una ruta similar a \\IP_DEL_HOST\Carpeta, a esta carpeta solo puedes ingresar desde otros host Windows o Linux con Samba. La diferencia con NFS es que es un protocolo unico, al cual accedes desde diferentes OS que sepan interpretar el protocolo, ademas de que se reconoce como una unidad de disco duro.

Despues de este mini brevario procedamos con la instalacion, para ello consideremos las ip’s de los dos host involucrados:

  • Servidor (CentOS 6.5) : 192.168.0.100/24
  • Host (Ubuntu 12.04) : 192.168.0.50/24

Instalacion del Servidor

Primero debes firmarte como usuario root en caso de que tu usuario actual no tenga permisos de sudo, una vez firmado como root es tan simple como ejecutar lo siguiente:

# yum install nfs-utils nfs-utils-lib

Una vez instalado se configura a nfs como servicio para que arranque cuando se enciende el equipo

# chkconfig nfs on

Y se arrancan los servicios de nfs y rpcbind

# service nfs start
# service rpcbind start

Ahora toca la configuracion de las carpetas que van a exponerse. Para poder realizar esto es necesario editar el archivo /etc/exports y agregar la siguiente linea

/media/nfs 192.168.0.0/24(rw,sync,no_root_squash,no_subtree_check)

Esta linea expone la carpeta /media/nfs para que pueda ser accedida desde cualquier direccion de la subred 192.168.0.0. Una vez guardados los cambios ejecuta el siguiente comando para exponer la carpeta.

# exportfs -a

Instalacion del Cliente en (Ubuntu 12.04)

Para efectuar esta tarea se deben instalar los siguientes paquetes:

# apt-get install nfs-common portmap

Posteriormente podemos probar las carpetas disponibles en un servidor ejecutando el siguiente comando:

# showmount -e 192.168.0.100

Esto te debe arrojar una salida parecida a lo siguiente:

Export list for 192.168.0.100:
/media/nas 192.168.0.0/24

Aqui es posible que te encuentres con el siguiente error:

clnt_create: RPC: Port mapper failure – Unable to receive: errno 113 (No route to host)

Aqui hay de dos sopas, o el server no se ha inicializado bien o el firewall del servidor esta bloqueando la conexion. Para identificar el problema existe un comando que muestra el estatus de nfs y la conectividad hacia el:

## Desde el cliente
$ rpcinfo -p 192.168.0.100

La salida es algo parecido a esto:

program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 892 mountd
100005 1 tcp 892 mountd
100005 2 udp 892 mountd
100005 2 tcp 892 mountd
100005 3 udp 892 mountd
100005 3 tcp 892 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049
100227 3 tcp 2049
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049
100227 3 udp 2049
100021 1 udp 58155 nlockmgr
100021 3 udp 58155 nlockmgr
100021 4 udp 58155 nlockmgr
100021 1 tcp 59801 nlockmgr
100021 3 tcp 59801 nlockmgr
100021 4 tcp 59801 nlockmgr

Lo cual indica que nfs esta corriendo. Ahora bien, para validar que es tema de bloqueo de puertos por el firewall se procede a detener el servicio con el siguiente comando y volver a ejecutar el comando showmount

## en server CentOS
# service iptables stop

Si con esto el server responde como la salida mostrada anteriromente que lsita las carpetas configuradas en el servidor, entonces hay dos opciones: dejar deshabilitado permanentemente el firewall o agregar las excepciones al firewall con los puertos para los procesos nfs(2049), portmapper(111) y mountd(892) en el servidor, para ello hay que editar el archivo /etc/sysconfig/iptables agregando las siguientes entradas:

-A INPUT -m state –state NEW -m tcp -p tcp –dport 892 -j ACCEPT
-A INPUT -m state –state NEW -m udp -p udp –dport 892 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 111 -j ACCEPT
-A INPUT -m state –state NEW -m udp -p udp –dport 111 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 2049 -j ACCEPT
-A INPUT -m state –state NEW -m udp -p udp –dport 2049 -j ACCEPT

Una vez hecho esto es necesario arrancar el firewall:

## En el server
# service iptables start

Con esto ya deberias poder agregar las unidades NFS a tu Cliente, para ello se deben agregar las siguientes entradas al archivo /etc/fstab:

192.168.0.100:/media/nas /mnt/nas nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0

y para finalizar recargas las unidades con el comando

# mount -a

Instalacion del Cliente en Windows 7

>>>>> En construccion.

y eso es todo. Saludos a tod@s.

Carga de direcciones de SEPOMEX

Muchas veces en los desarrollos a los cuales estamos asignados o en proyectos personales nos surge la necesidad de tener todo el catalogo de direcciones(Calle -> colonia -> Del. ó Mu. -> Ciudad ó Edo.) de la Republica Mexicana, para ello la propia SEPOMEX nos proporciona un catálogo horrible con mucha informacion que no nos sirve en formatos XLS, TXT y XML. Una vez que descargamos el archivo en el formato de tu preferencia es necesaio hacer un Script en algun lenguaje para que lea fila por fila el archivo y almacene los datos en una DB propia para el sistema en el cual estamos trabajando.

En esta ocasión les he ahorrado la chamba y he escrito un Script de Python para hacer precisamente lo expuesto arriba, el modelo de la DB es el siguiente:

DB-address

El Script unicamete funciona con la version TXT del archivo de SEPOMEX, esta bastante sencillo y se debe modificar en las siguientes partes:

db = MySQLdb.connect(
host = “localhost o IP”,
user=”root”,
passwd=”root”,
db=”nombrebasededatos”,
charset=’utf8′
)

Otra linea importante a modificar es la siguiente:

with open(“../../CPdescarga.txt”) as inFile:

la cual indica la ruta relativa(en este caso, aunque tambien puede ser absoluta) en la cual se encuentra el archivo TXT de SEPOMEX.

El codigo lo hice lo mas claro posible para que se puede modificar a las necesidades de cada quien, aunque considero que el modelo de Direciones propuesto se presta para la mayoria de los casos. El script SQL para la creacion de las tablas tambien se encuentra en el repositorio de GitHub, el cual es para MySQL, Para bajarse todo el proyecto simplemente deben hacer un clone:

Saludos y hasta la proxima.

Instalar llaves SSH

La necesidad de acceso remoto seguro a travez de una conexion SSH hacia un servidor es una tarea muy comun hoy en dia, practicamente todos los servidores Linux traen previamente instalado el servidor SSH, en especifico OpenSSH, teniendo un cliente visual o de consola es muy facil conectarnos hacia el server ingresando usario, host y contraseña, pero cuando necesitamos realizar algun proceso automatizado ésta estrategia no nos funciona debido a que es necesario ingresar una contraseña al momento de conectarnos al server.

Afortunadamente se pueden utilizar llaves ssh para hacer que el server nos reconozca cuando intentamos acceder. Aqui la estrategia es que el cliente genere una llave publica de autenticacion y ésta sea compartida al server que se desea acceder para que éste lo agregue a la lista de llaves permitidas y le permita el acceso, la imagen de abajo ilustra el proceso.

ssh-install

El proceso de creacion de llaves y compartirlas con el server es muy sencillo, para ello ejecuta los siguientes comandos en el cliente:

$ ssh-keygen -t dsa

éste comando crea las llaves privadas y publicas con medio de enciptacion dsa(Digital Signature Algorithm). El prompt te pedira varias entradas pero puedes dejarlas todas en blanco para hacer pruebas, posteriormente recomiendo que hagan pruebas introduciendo los datos que se piden(nombre del archivo de llave y una contraseña de encriptacion, ojo, no es la contraseña del server). Las llaves generadas se localizan en la carpeta ~/.ssh, por default los archivos creados son los siguientes:

  • id_dsa : llave privada.
  • id_dsa.pub : llave publica, ésta es la que se va a compartir con el server.

Ahora hay que enviar la llave publica al server, para ello se ejecuta el siguiente comando:

$ ssh-copy-id usuario@remotehost

Y eso es todo, ahora ya puedes conectarte directamente al server sin introducir la contraseña, por ejemplo:

$ ssh username@remotehost

En caso de que te aparezca el siguiente error

ssh-copy-id: ERROR: No identities found

Indica que el comando no puede encontrar la llave publica que deseas compartir, por lo que hay que expicarle con manzanas la llave deseada, esto lo haces con el siguiente comando:

$ ssh-copy-id -i /home/user/.ssh/id_rsa.pub remotehost

y listo, si deseas conectarte desde el server al cliente, se debe proceder exactamente de la misma manera.

Bueno, pues eso es todo por ahora, saludos a tod@s.

Instalar JDK en Ubuntu

Cada vez que a la gente de Canonical se le ocurre sacar una nueva version de Ubuntu tengo que realizar la instalacion de todo mi ambiente de desarrollo, comenzando por la JDK de Java, sin embargo, la manera en como tengo distribuidas las particiones en mi disco duro me ayudan a acelerar este proceso.

La distribucion en el disco duro esta mas o menos asi:

disk

La carpeta opt contiene todas las aplicaciones y herramientas que necesito; jdk 5, jdk 6, jdk 7, maven, ant, gradle, clientes de bases de datos, etc. Al hacer esto, cuando realizo la instalacion de una nueva distribucion, sea la que sea, unicamente debo indicarle en donde se encuentra la carpeta de opt para que al terminar la instalacion ya todo este listo para configurar.

Esto fue un pequeño brevario, ahora continuo con el tema. Es muy comun que se liberen varias versiones de la jdk, por lo que yo recomiento instalarla fisicamente en la carpeta opt y hacer enlaces simbolicos hacia la carpeta /usr/lib/jvm, esto con el fin de que si actualizas la jdk, unicamente rediriges la nueva carpeta en el enlace simbolico y todas las configuraciones se mantienen igual. Despues se debe definir la variable de entorno JAVA_HOME apuntando hacia el enlace y posteriormente agregar las alternativas. Lo explico por pasos:

Descarga e instalacion de la JDK

Primeramente se va a la pagina de descarga de oracle y bajas la version mas reciente y la descomprimes, una vez que se ha descomprimido mueve la carpeta al folder opt:

$ tar -vxf jdk-<version>-linux-x64.tar.gz
$ sudo mv jdk<version>

Ahora se debe crear el enlace simbolico en la carpeta /usr/lib/jvm, si no existe la carpeta jvm deberas crearla.

$ sudo mkdir /usr/lib/jvm
$ cd /usr/lib/jvm
$ sudo ln -s /opt/jdk<version> java-<version>-oracle

despues deberas agregar la variable de entorno JAVA_HOME editando el archivo bash.bashrc en la carpeta /etc, hasta el final del archivo deberas agregar las siguientes lineas:

export JAVA_HOME=/usr/lib/jvm/java-<version>-oracle

export PATH=$PATH:$JAVA_HOME/bin

Guardas los cambios y vuelves a ejecutar el bash desde la consola para que tome las nuevas configuraciones

$ bash

Lo que se hizo es editar un archivo que se ejecuta cada vez que el sistema operativo arranca, por lo que cada que enciendes tu maquina se setean estas variables y perduran durante toda la sesion. Aqui puedes definir otras variables tales como CATALINA_HOME, M2_HOME, GRADLE_HOME, etc.

Despues de definir estas variables y ejecutar el bash, ya puedes verificar la instalacion de java ejecutando el siguiente comando:

$ java -version
java version “1.6.0_31”
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

Esta es la salida en mi caso, lo que indica que ya esta definido el JAVA_HOME en mi PATH. Ahora solo faltaria instalar y configurar las alternativas para java y javac para que los programas desarrollados en java puedan ser ejecutados sin problemas.

$ sudo update-alternatives –install “/usr/bin/java” “java” “/usr/lib/jvm/java-<version>-oracle/bin/java” 1
$ sudo update-alternatives –set java /usr/lib/jvm/java-<version>-oracle/bin/java

$ sudo update-alternatives –install “/usr/bin/javac” “javac” “/usr/lib/jvm/java-<version>-oracle/bin/javac” 1
$ sudo update-alternatives –set javac /usr/lib/jvm/java-<version>-oracle/bin/javac

Y eso es todo, ya tienes configurado JAVA_HOME y las alternativas de java.