El SysAdmin del 3er Mundo

todo lo que expliqué mientras nadie prestaba atención

xen y virt-manager

| Comments

La miseria, es lo único que; aun repartida a muchos, toca en abundancia.

La superioridad tecnológica de XenServer es indiscutible: seguro (esquema de pacheo de XOA), versátil (la XAPI), robusto (CentOS) y sencillo (Xen Orchestra Appliance) y enterprise (next, next, next, install, boot, ready!) PERO:

"el xenfu panda, el logo de Xen, olvidado o desconocido por los usuarios de Citrix XenServer"

Cuando los megas de RAM se cuentan con los dedos de una mano, el peso de la XAPI y la necesidad de tener otra máquina corriendo para el XenOrchestra, DUELEN. Tomemos por ejemplo, una máquina con 2 gigas de RAM. En mi caso tengo Xen Orchestra en la laptop, pero desplegar node+servidor en una máquina virtual más; no es una opción en este escenario. Que se jodan XOA, XenServer y los capitalistas de la Citrix ¡Hora de ser completamente libre!

Yo hubiera matado la jugada con LXC pero el cliente insiste en usar los 3 sistemas; tal como está en mi esquema del calixto. Lo cierto es que 3 contenedores no inspiran mucha confianza. Tampoco KVM es una buena opción, sobre todo cuado no hay un super microprocesador.

Rercordemos que: Xen, mejor con CPU, peor peor IO. Mientras que: KVM, mejor IO, pero CPU más penalizado.

El menú:

Dos interfaces de red, un disco de 500G, 2G de ram, y un CPU que por suerte soporta virtualización. Un switch de 24 puertos a 100 megas, otro a gigabit. Un friki que oye reguetton, su mujer, la mía, 5 pesos de café en un vaso plástico y YO.

Las VM y su RAM:

  • debian como servidor de correo (postfix y dovecot, sin webmail) - 1G
  • alpine como ruter (dns, dhcp y firewall) - 512M
  • FreeBSD como proxy (squid) - 1G

La brujería:

Con suerte No se matarán por los 2 Gigas de RAM. El squid con usuarios PAM como autenticación y casi nada en las ACL, además en BSD no come mucha ram. Alpine es un chiste en lo que a RAM se refiere y el de correo no tendrá un webmail así que plin.

Los 3 servidores tendrán unos cortafuegos super estrictos. Descartarán todo tipo de ICMP para evitar cuellos de botella. La LAN funciona a 100 megas y el servidor está conectado al ÚNICO switch a gigabit. Osea, el server, un switch y un cable al netgear viejo que está a 100 megas. Con eso, la difusión “uno a varios” será mayor y no habrá congestiones, mientras que la peticiones entrantes (individual) no excederán el 10% el ancho de vianda del servidor. La ley del embudo.

Entrando en materia:

Volvemos a la génesis de xen pero usaremos virt-manager para manejar el hypervisor.

Primero que todo, llevamos a cabo una instalación típica de Xen en un debian 8. Nada que contar; el clásico Dom0.

“xen-linux-system”
1
2
3
 aptitude update
 aptitude install xen-linux-system
 dpkg-divert --divert /etc/grub.d/08_linux_xen --rename /etc/grub.d/20_linux_xen

Esta PC tiene dos interfaz de red. Una de cara al router, con una ip/29 “públicas” y otra interfaz, de cara a la LAN. Por tanto crearemos 3 puentes:

  • br0 de eth0 hacia el router
  • br1 de eth1 hacia la LAN
  • br2 para comunicación interna (costumbre, nunca está de más)

Así me quedó el /etc/network/interfaces

“/etc/network/interfaces”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 # arriba todo el mundo
 auto lo eth0 eth1 br0 br1 br2

 # el lo
 iface lo inet loopback

 # levanta las dos interfacess
 # pa cuando el bridge se levante
 iface eth0 inet manual
 iface eth1 inet manual

 # puente de la interfaz onboard (WAN)
 iface br0 inet static
    bridge_ports eth0
    address 10.1.1.236
    netmask 255.255.255.0
    bridge_stp off
    bridge_waitport 0
    bridge_fd 0

 # puente de la interfaz PCI (LAN)
 iface br1 inet manual
    bridge_ports eth1
    bridge_stp off
    bridge_waitport 0
    bridge_fd 0

 # una interfaz de red local de las VM
 iface br2 inet static
    bridge_ports eth0
    address 169.254.0.1
    netmask 255.255.255.0
    bridge_ports none
    bridge_stp off
    bridge_waitport 0
    bridge_fd 0

Ahora vienen los toques mágicos. Libvirt!

“libvirtd”
1
 apt-get install libvirt-bin

De más está que te diga, que este debian fue instalado sobre LVM. Crea el directorio /etc/libvirt/storage/ y dentro, le pondremos un fichero llamado xenvg.xml o comotedelagana.xml. Al instalar con el particionado guiado; el grupo llama hostname-vg, en este caso xen-vg. Note como la cláusula path, apunta hacia el mapper del grupo de volumen group y que tanto nombre del fichero como del pool; no deben contener espacios ni “-”.

“/etc/libvirt/storage/xenvg.xml”
1
2
3
4
5
6
<pool type='logical'>
  <name>xenvg</name>
  <target>
    <path>/dev/xen-vg</path>
  </target>
</pool>

Ahora inicializaremos el pool de libvirt:

“virsh”
1
2
3
 virsh pool-define /etc/libvirt/storage/xenvg.xml
 virsh pool-start xenvg
 virsh pool-autostart xenvg

Corre virsh pool-info xenvg para ver si todo pinchó. Llegado a este punto te recomiendo reiniciar…

De regreso a la máquina del informático…

Arrancamos el virt-manager:

"iniciando virt-manager desde gnome-shell"

De más está que te diga, que las operaciones de libvirt se hacen por ssh, así que debes tener ssh en la máquina remota; preferiblemente con autenticación por llaves y no por password.

“ssh”
1
2
 ssh-keygen
 ssh-copy-id root@192.168.99.10

Vamos a File y Add connection, agregaremos una conexión del tipo Xen.

"conectando al libvirtd del servidor xen"

De aquí en adelante, es la misma mecánica básica de virt-manager. Solo quiero hacer un apartado para crear un pool más y me refrito a un pool donde pondremos los ficheros “.iso”.

Creamos el directorio donde meteremos los ISO y copiamos el iso que querramos para allá. Como ya me conocen, soy el enemigo de las plantillas. Confío más en lo que yo mismo hago que en lo que hacen otros.

“mkdir”
1
2
 ssh root@192.168.99.10 mkdir /opt/isos/
 scp ~/Downloads/ISO/*.iso root@192.168.99.19:/opt/isos/

Selecciona la conexión al Xen, y haz click en el botón de crear nueva máquina.

"creando el repositorio con las iso"

El asistente nos llevará al gestor de almacenamiento. Seleccionamos “Local install media” y click en siguiente. Luego “Use ISO image”.

"Local Install Media" "Use ISO image"

Aquí haces click en Browse y te conduce al lugar donde crearemos los ISO. Inmediatamente te verás en la pantalla donde te pedirá que selecciones los storage volume. En la imagen se puede apreciar que ya existe uno llamado “iso”, pero de igual, para el ejemplo mostraremos como se creará.

Odio las interfaz visual, como hacen pasar trabajo! Pero virsh no es cosa jamón para mi cliente que no es del todo un hacha en linux.

Bueno… has click en el signo de más color azul y te mostrará un dialogo que muestra “Create Storage Pool”. Lo nombramos “iso” y le decimos que será del tipo “dir”. O sea un directorio común en el sistema de archivos.

"creando el storage pool de los ISO"

Como segundo argumento, nos pedirá la ruta. Le daremos la que creamos en el servidor, en este caso /opt/isos.

"la ruta del SR"

Sí todo salió bien, verás los .iso que tiene el directorio.

"los .iso del directorio"

Al hacer click en el iso seleccionado, vuelve el asistente y muestra que se usará dicho iso.

"selecciona el iso"

Lo demás es pa mongo, la RAM el disco que creamos en el SR “default”, etc…

"custumise configeichon befor instal"

Marcamos el check que dice “Customize configuration before install” y caeremos en la pantalla que muestra todos los detalles de la máquina.

"modificando el hardware"

Esta pantalla es importante; no permite configurar de manera más exquisita el hardware. Por ejemplo, las interfaces de redes, yo quiero que tenga como primera interfaz, la que apunta a br0 y como segunda, la que apunta a br2. Además, algunas veces la máquinas traen una wacom tablet como interfaz (mariconerías del virt-manager).

En fin, así me quedó la mía.

"arrancando"

Si este artículo te resultó interesante, considere donar 0.07 BTC: 1Kg4gu3e7u8HUw8bj5NbBciRg6Y56kuFCU

jugar teeworlds en LAN

| Comments

Un otorrino me ha dejado sorprendido cuando me pidió que le instalara ArchLinux en su laptop (las todos tenemos de los médicos). La primera vez le instalé fedora, pero lo quitó y volvió pidiéndome que le instalara arch. El doctor Bershard, me cuenta las epopeyas de los usuarios de linux en la red de la habana.

Durante el proceso de “que te instalo” me mencionó “el tiwol” como un juego muy importante. No me imaginé que sería tan fascinante. Similar al minimilitia de android. Me di cuenta que crear un server, es lanzar un comando y dejarlo funcionando. La gente se conecta y desconecta del servidor cuando quiera. Se pueden jugar partidas de equipo, pero la más caliente es el “death match”. Entra mata un rato y sale cuando te aburras.

En el calixto el jueguito causó furor (está para windows y se conecta perfectamente). A cada rato entro y me encuentro 3 o 4 con nombres cada vez más creativos matándose a tiros y dando brincos.

Según la documentación, al correr teeworlds_srv -f fichero.cfg cargará ese fichero. Muy útil para crear múltiples modos de juego. Al lanzar el comando teeworlds_srv noté que dice:

1
2
3
4
5
[58db3577][storage]: using standard paths
[58db3577][storage]: added path '$USERDIR' ('/home/lazaro/.teeworlds')
[58db3577][storage]: added path '$DATADIR' ('/usr/share/teeworlds/data')
[58db3577][storage]: added path '$CURRENTDIR' ('/home/lazaro/.teeworlds')
[58db3577][console]: failed to open 'autoexec.cfg'

Así que al crear el fichero /home/lazaro/.teeworlds/autoexec.cfg resultó que se cargaba solo. Pero… ¿qué metemos ahí?

“autoexec.cfg”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#
# teeworld_srv -f este_fichero.cfg
#

# Los mapas y la secuencia de mapas
#
# ls /usr/share/teeworlds/data/maps/
sv_map dm7
sv_maprotation dm7 dm6 dm2 dm9 md8 dm1

# como se ve el servidor
sv_name Masacre en el Calixto
sv_motd "las teclas son «a», «d» y Espacio"

# que tipo de juego jugamos
sv_gametype dm
sv_scorelimit 30
sv_timelimit 0

# configuración del servidor
bindaddr 0.0.0.0
sv_register to 0

# permite usar la consola remota
sv_rcon_password secretisimo

Dice: Jugaremos una ronda de 30 puntos, sin límite de tiempo, que empieza por el mapa “dm7”.

El comando sv_maprotation recibe como argumento la lista de mapas. Cada vez que termine una ronda, se cambiará el mapa.

Más información en el sitio de teeworlds www.teeworlds.com

Si este artículo te resultó interesante, considere donar 0.07 BTC: 1Kg4gu3e7u8HUw8bj5NbBciRg6Y56kuFCU

nueva VM siempre es PV

| Comments

Cuando usamos XenOrchestra, aveces sucede que teniendo un XenServer con “muchas” máquinas virtuales, al crear una nueva; se crea como Paravirtualizada (PV) y no como Virutalización por Hardware (HVM). Nos damos cuenta porque arrancar la máquina buteando de una unidad óptica es casi imposible.

Algunos creen que es porque XenServer impone un límite. Esto no es cierto, ya que XenServer es completamente gratuito hoy en día. Simplemente, asume que el servidor está muy cargado y que una PV es más ligera. En mi experiencia creo que XenOrchestra es el que hace eso; no xenserver como tal. También influye la plantilla que utilices para crear una nueva VM.

Cuando esto pase, simplemente tomas la máquina y le dices que se pase a HVM. Lo haremos seteando un parámetros que involucre HVM.

“xe”
1
 xe vm-param-set uuid=uuid-de-la-maquina HVM-boot-policy="BIOS order"

Al setearle que el orden de buteo será el que diga el bios y listo. La máquina pasa a ser HVM.

Si este artículo te resultó interesante, considere donar 0.03 BTC: 1Kg4gu3e7u8HUw8bj5NbBciRg6Y56kuFCU

rainloop en debian

| Comments

Aún recuerdo que algunos clientes me preguntaban con mucho asombro: “-y porque no roundcube”; cuando hablábamos de webmail. Pero finalmente rainloop se ha puesto de moda en cuba.

Un método bastante perezoso de instalar una LAMP en Debian, es instalar el paquete phpmyadmin. Esto instala y configura el servidor SQL; además de hacer jugar a apache2 con php y mysql, todo de un solo teclazo. Pero aveces, por ejemplo, al instalar RainLoop, no queremos que phpmyadmin quede instalado. Una buena variante es desinstalarlo después; pero nos quedan algunos paquetes innecesarios instalados.

Para lograr la armonía que buscamos, instalaremos la LAMP por partes. Primero apache SOLO.

1
 aptitude install apache2

Ahora instalamos mysql, a través de los metapaquetes, para que se instale el adecuado de manera automática.

1
 aptitude install mysql-server mysql-client

Llegado a este punto, debian y su magia te ayudarán a configurar el mysql, pidiéndote la contraseña del root. Ahora instalamos la piedra angular. El soporte de php+mysql de apache.

“soporte de mysql”
1
 aptitude install php5 libmysqlclient-dev php5-mysql

Instalamos el resto de la paquetería necesaria para rainloop.

“paquetería de rainloop”
1
 aptitude install curl libcurl3 libcurl3-dev php5-curl php5-json

Ahora reinicia tanto apache como mysql.

1
2
 systemctl restart mysql
 systemctl restart apache2

Crearemos un par de bases de datos necesarias para rainloop. Puedes o no crear un usuario para rainloop, pero si vamos a tener un servidor sql con dos bases de datos para una aplicación; la cual además, será la única cosa sql en el servidor; no vale la pena crear otro usuario. Lo dejo a tu elección.

“creando las bases”
1
2
3
4
create database rainloop;
create database contactos;
commit;
exit;

Si de todas maneras quieres crear el usuario.

“un usuario pa rainloop”
1
2
3
4
create user rainloop@localhost identified by "rainloop";
grant all privileges on rainloop.* to rainloop@localhost;
flush privileges;
exit;

Y vamos a instalar rainloop! La manera clásica de hacerlo es usando el paquete “.zip” del sitio. Si quieres llégate allá y bájatelo. Descomprimes en un directorio y sigue las instrucciones; sin embargo hay otra manera.

“alando rainloop del repositorio”
1
2
3
mkdir -p /var/www/rainloop
cd /var/www/rainloop
curl -s http://repository.rainloop.net/installer.php | php

Si tienes acceso a internet de verdad. Pinchará. Si estás detrás de un proxy, te jodiste, hazlo a la manera ortodoxa.

Rainloop es fulísima con los permisos. Si no los tienes claros, dará unos palos horribles que no tienen nada que ver con permisos aparentemente. Por ejemplo, si el fichero que dice la versión, no pertenece al usuario que corre el servidor web, te dirá que no puede encontrar el directorio “data”. Espectacular! Para evitar eso, solo los directorios tendrán el ejecutable. Además, todo pertenecerá al usuario www-data; que en debian es el usuario que usa el apache para correr.

“estableciendo permisos”
1
2
3
chown -R www-data:www-data .
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

No te pondré como hacer el virtualhost porque eso no tengo que explicártelo (no te hace falta verdad?). Te recomiendo que uses SSL.

No olvides entrar al admin panel (o al fichero de configuración) de rainloop y pasarle la mano. Para abrir el admin panel, usa la url /?admin. Ahí configura las bases de datos. Muy importante habilitar el soporte de contactos y especificarle la base de datos, que creo, no debe ser la misma que rainloop; aunque una gente me dijo que tiene ambas cosas en la misma base de datos; yo no le he probado.

El usuario por defecto es admin y la contraseña es 12345. De más está que te diga: CÁMBIALO!

Si estás de cara a internet, recuerda que rainloop viene con yahoo y gmail configurado como servidores por defecto. No sé si está habilitados pero chequéalo. Juraría que hay versiones en que venía habilitado. De todas formas, te interesará que tus usuarios tengan gmail/yahoo más cerca, especialmente si un usuario tiene múltiples identidades. Recuérdales que deben habilitar el acceso pop en su cuenta de gmail.

Si este artículo te resultó interesante, considere donar 0.03 BTC: 1Kg4gu3e7u8HUw8bj5NbBciRg6Y56kuFCU

nginx y websocket

| Comments

Resulta que los websocket no pasan tan fácilmente por el proxy inverso. Llevan su burumba.

Aquí por ejemplo, haremos un proxy inverso con SSL para una aplicación que escucha por el puerto 8888.

“nginx”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
   listen 80 default_server;
   return 301 https://$host$request_uri;
}


server {
  listen 443 ssl default_server;
   ssl_certificate /etc/nginx/nginx.crt;
   ssl_certificate_key /etc/nginx/nginx.key;
   location / {
      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_pass http://127.0.0.1:8888/;
      proxy_http_version 1.1;
      proxy_set_header Connection "upgrade";
      proxy_set_header Upgrade $http_upgrade;
      proxy_redirect default;
      proxy_read_timeout 1800;
      client_max_body_size 128G;
   }
}

Note como los encabezados Upgrade son seteados. Ese es el truco…

Si este artículo te resultó interesante, considere donar 0.05 BTC: 1Kg4gu3e7u8HUw8bj5NbBciRg6Y56kuFCU

pkg tras un proxy

| Comments

En el 5to infierno de infomed con la vida detrás del proxy que ya he mencionado incontables veces; todo se vuelve difícil.

Por suerte freebsd ha mejorado en materia de soporte de proxy. Si bien en csh, basta con usar:

“setenv”
1
2
setenv http_proxy http://proxy.sld.cu:3128
setenv https_proxy $http_proxy

Operaciones de rutinas como pkg audit -F suelen fallar al ser ejecutadas por el cron. Setear el proxy de manera global es una opción; pero nunca ha sido de mi agrado. Por suerte, el nuevo gestor de paquetes de freebsd soporta proxy en su configuración.

El fichero de configuración está en una ubicación bien extravagante. Nada menos que en /usr/local/etc/pkg.conf. Los comentarios hablan por si solos, vale la pena mirarlos; no necesitarás leer manual ni buscar en google para darte cuenta que:

“/usr/local/etc/pkg.conf”
1
2
3
PKG_ENV : {
   http_proxy: "http://proxy.sld.cu:3128",
}

¡Establece el proxy!

Con eso pkg audit corrido desde el cron funcionará perfectamente. Además de las demás operaciones que requieran bajar contenido de internet; claro está.

OJO! Nota que al final de la declaración del proxy, lo que hay es una coma, NO un punto y coma. La configuración parece ser un json.

Si este artículo te resultó interesante, considere donar 0.05 BTC: 1Kg4gu3e7u8HUw8bj5NbBciRg6Y56kuFCU