Posts in Category: Linux

Ancho de banda y codecs.

Me llego una pagina de servicios en la nube, el famoso cloud computing, probando las posibilidades que ofrece instale un par de servidores linux para verificar unas ideas que traigo, y en eso se me ocurrió verificar el ancho de banda que ofrecen estos servicios y hacer una observación gráfica de diferentes codecs de audio existentes en Asterisk y en un teléfono IP Aastra que cayo en mis manos.

Después de la instalación de Debian GNU/Linux y Asterisk, creamos un sencillo dialplan con el fin de crear un contador usando los dígitos existentes en el paquete de sonidos.

[default]
exten => 200,1,Goto(test,s,1) 
 
[test] 
exten => s,1,Answer() 
exten => s,n,Set(COUNT=${DB(test/count)}) 
exten => s,n,GotoIf($[${ISNULL(${COUNT})}]?:continue) 
exten => s,n,Set(DB(test/count)=1) 
exten => s,n,Goto(1) 
exten => s,n(continue),NoOp() 
exten => s,n,SayNumber(${COUNT}) 
exten => s,n,Set(COUNT=$[${COUNT} + 1]) 
exten => s,n,Set(DB(test/count)=${COUNT}) 
exten => s,n,Goto(1)

Aquí vemos la ejecución donde apreciamos que el contador ya se encuentra en el número 1760, para este caso la ejecución es en GSM sin embargo cada llamada fue realizada con el codec correspondiente y para evitar conversión de un codec a otro (transcoding) se instalaron los paquetes de sonidos de cada uno de ellos.

agua*CLI> 
  == Using SIP RTP CoS mark 5
    -- Executing [200@default:1] Goto("SIP/1000-00000013", "test,s,1") in new stack
    -- Goto (test,s,1)
    -- Executing [s@test:1] Answer("SIP/1000-00000013", "") in new stack
    -- Executing [s@test:2] Set("SIP/1000-00000013", "COUNT=1759") in new stack
    -- Executing [s@test:3] GotoIf("SIP/1000-00000013", "0?:continue") in new stack
    -- Goto (test,s,6)
    -- Executing [s@test:6] NoOp("SIP/1000-00000013", "") in new stack
    -- Executing [s@test:7] SayNumber("SIP/1000-00000013", "1759") in new stack
    -- <SIP/1000-00000013> Playing 'digits/1.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/thousand.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/7.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/hundred.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/50.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/9.gsm' (language 'en')
    -- Executing [s@test:8] Set("SIP/1000-00000013", "COUNT=1760") in new stack
    -- Executing [s@test:9] Set("SIP/1000-00000013", "DB(test/count)=1760") in new stack
    -- Executing [s@test:10] Goto("SIP/1000-00000013", "1") in new stack
    -- Goto (test,s,1)
    -- Executing [s@test:1] Answer("SIP/1000-00000013", "") in new stack
    -- Executing [s@test:2] Set("SIP/1000-00000013", "COUNT=1760") in new stack
    -- Executing [s@test:3] GotoIf("SIP/1000-00000013", "0?:continue") in new stack
    -- Goto (test,s,6)
    -- Executing [s@test:6] NoOp("SIP/1000-00000013", "") in new stack
    -- Executing [s@test:7] SayNumber("SIP/1000-00000013", "1760") in new stack
    -- <SIP/1000-00000013> Playing 'digits/1.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/thousand.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/7.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/hundred.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/60.gsm' (language 'en')

Cada imagen se obtuvo mediante el programa iftop (aptitude install iftop), para darnos una idea general del uso de ancho de banda de cada codec en un flujo constante de datos, las imágenes muestran una conexión mediante IAX2 y el ejemplo del dialplan esta en SIP sin embargo es igual para ambos caso de un modo general.

Codec ALAW

Codec ULAW

Codec GSM

Codec G722

Codec G729

El ejemplo del contador fue tomado del libro Asterisk: The Future of Telephony.

Creando maquinas virtuales con Red Hat.

Vamos a crear una máquina virtual con Red Hat, instalaremos como prueba una versión de AsteriskNow, subiremos la imagen ISO a nuestro servidor NFS para que sea visible desde nuestros Hypervisors, posteriormente desde nuestro manager realizaremos el procedimiento de asignación de recursos como son cuanta memoria RAM le asignaremos, cantidad de CPU, interfaces de red, espacio en disco y en que Hypervisor iniciara de manera predeterminada.

Hay dos formas de subir la imagen ISO a nuestro almacén NFS, una es mediante la herramienta ISO Uploader y la otra es colocar directamente la imagen en el servidor y posteriormente otorgarle los permisos necesarios para su ejecución.

Una vez que tenemos la imagen, ingresamos a la consola del manager para crear la máquina virtual.

Escogemos el protocolo Spice para manipular la máquina virtual, posteriormente se le activara como en todos los Linux el acceso por SSH para tener una conexión de manera remota.

Después de introducir los datos principales nos solicitara configurar interfaces de red y discos duros virtuales.

Especificamos el nombre de la interfaz, la red a la que se asignara y el tipo de controlador a usar en el dispositivo.

Especificamos el tamaño del disco duro, el storage en donde residirá este disco, el tipo de disco (sistema o datos), que tipo de disco duro sera así como el formato por ultimo especificamos si el sistema operativo iniciara desde este disco.

Realizado esto nos pregunta si requerimos agregar algún componente adicional.

El orden de arranque se coloca aquí, normalmente el primer dispositivo tiene que ser el disco duro, seguido de una unidad de CD con disco (imagen ISO) para poder iniciar la instalación de la imagen previamente colocada en nuestro almacén NFS.

Damos inicio a la carga de nuestra máquina virtual.

Cargando los componentes.

La instalación es igual a que si estuviéramos realizando la instalación en un equipo físico, el sistema operativo reconocera el disco duro asignado así como la interfaz de red.

Realizando las particiones del disco duro, en este caso dejamos las opciones por defecto.

Ajuste del huso horario.

Instalación del sistema con todos sus paquetes.

Finalización de la instalación y el obligatorio reinicio del sistema, en esta parte debemos extraer el CD de la máquina virtual mediante el menú contextual.

Sistema en linea.

Pagina de administración de AsteriskNow visible en la red local.

SAN EqualLogic

Hace pocos meses llego una SAN EqualLogic PS6000XV con 16 discos de 300 GB cada uno, el cual tiene como función principal interactuar con sistemas de virtualización como Red Hat Enterprise Virtualization y Citrix XenServer.

Estos equipos son increíbles dejando un lado el echo de que son muy complejos la interfaz para administrarlos es muy sencilla una vez que entiendes los conceptos de volúmenes, arreglos y la tecnología de iSCSI de manera general.

Aquí se muestra la SAN montada en el rack debajo de un servidor PowerEdge R610.

En su parte posterior se observan las controladoras del equipo con un total de ocho tarjetas de red, aunque realmente solo una es la controladora activa y la otra espera en caso de cualquier percance con la primera, cada controladora tiene conectados un par de sus cables de red (cat6) a un switch diferente considerando el factor de disponibilidad, también se aprecian las fuentes de poder conectadas cada una de ellas en circuitos independientes en caso de falla de corriente eléctrica en alguno de ellos.

La parte de la conectividad se compone de una par de switch PowerConnect 5424 que están dedicados al trafico iSCSI, como mencionamos anteriormente en la imagen anterior la mitad de las conexiones de la SAN se encuentran en un switch y la otra mitad en el otro, hacemos lo mismo para los servidores que accederán a los volúmenes creados posteriormente en la SAN mediante un bond de tarjetas de red, una interfaz se conecta a un switch y la otra de igual manera de esta manera aunque falle uno de los switch tendremos acceso a los recursos de la SAN.

Los cables azules conectan ambos switch (imaginemos el cascadeo tradicional entre estos dispositivos) en cada equipo se reservan cuatro puertos para realizar esta conexión. A cada puerto elegido se le modifican ciertos parámetros que los hacen diferentes a los otros principalmente la opción de Jumbo Frame y de que su función es solamente comunicarse con los puertos del otro switch.

Una visión general de la SAN en conjunto de los servidores que tienen la función de hypervisor con Xen y KVM.

La pantalla de administración de la SAN muestra una gráfica con la capacidad del grupo que se compone de: espacio libre, utilizado y el reservado para snapshots, así como una relación de los volúmenes existentes.

Trataremos de seguir escribiendo algo acerca de este equipo y otras experiencias con la virtualización.

Gnash en 64 bits.

Como sabemos el soporte de Adobe para flash en Linux 64 bits esta mas que muerto: http://labs.adobe.com/technologies/flashplayer10/64bit.html

Hoy en día una pagina que no requiera el plugin de flash para desplegar su contenido es algo difícil de ver cotidianamente.
Gnash es un muy buen proyecto que si bien logra reproducir mucho del contenido flash de cualquier pagina web, la pagina mas famosa que requiere este plugin estaba negada para el.

Sin embargo parece ser que los chicos de Arch Linux, se han puesto las pilas y nos han regalado una actualización con la cual ya es posible visualizar desde youtube cualquier vídeo, para muestra la siguiente imagen.

http://www.gnu.org/software/gnash/
http://www.archlinux.org/

Protocolo SPICE para escritorios virtuales en Linux.

Aprovechando que seguimos en pruebas con RHEV, pasaremos a checar un punto especifico de esta solución que son los escritorios virtuales, segun nos quieren vender la idea de que con solo una PC ligerita en cuanto a recursos y un navegador web podemos tener acceso a ‘n’ escritorios remotos usando el protocolo Spice que a simple vista tiene cosas bastante interesentas en cuanto a desempeño, facilidad de uso al interactuar con el escritorio virtual y poco costo con respecto al uso de ancho de banda.

Si bien esta aplicación no tiene ningún problema para instalarse en IE mediante un ActiveX, la cosa cambia con respecto a Firefox en Linux.

Aquí existen dos caminos si contamos con una suscripción de RedHat obviamente tenemos acceso a actualizar nuestro sistema y todo el contenido que sigue a continuación en teoria (no cuento con una suscripción) se reduciría al siguiente comando: yum install spice-xpi

En CentOS existe el paquete sin embargo los paquetes de los cuales depende no, al menos no los encuentras en los repositorios predeterminados, pero con un tiempo de busqueda enrpm.pbone.net es facil hallarlos a todos.

El paquete en cuestión se llama spice-xpi, el cual depende de qspice-client y este a su vez depende de unos paquetes mas, como podemos ver en las dependencias faltantes que se muestran a continuación al tratar de instalar estos paquetes.

1
2
3
4
5
6
[root@localhost gabriel]# rpm -ivh spice-xpi-2.2-1.el5_5.i386.rpm
warning: spice-xpi-2.2-1.el5_5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
error: Failed dependencies:
        liblog4cpp.so.4 is needed by spice-xpi-2.2-1.el5_5.i386
        log4cpp is needed by spice-xpi-2.2-1.el5_5.i386
        qspice-client is needed by spice-xpi-2.2-1.el5_5.i386
7
8
9
10
11
12
13
14
15
16
[root@localhost gabriel]# rpm -ivh qspice-client-0.3.0-2.el5_5.i386.rpm
warning: qspice-client-0.3.0-2.el5_5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
error: Failed dependencies:
        libboost_program_options.so.2 is needed by qspice-client-0.3.0-2.el5_5.i386
        libboost_thread.so.2 is needed by qspice-client-0.3.0-2.el5_5.i386
        libcelt051.so.0 is needed by qspice-client-0.3.0-2.el5_5.i386
        liblog4cpp.so.4 is needed by qspice-client-0.3.0-2.el5_5.i386
        libqavcodec.so.51 is needed by qspice-client-0.3.0-2.el5_5.i386
        libqavutil.so.49 is needed by qspice-client-0.3.0-2.el5_5.i386
        libqcairo.so.2 is needed by qspice-client-0.3.0-2.el5_5.i386

Por lo tanto los paquetes necesarios son los siguientes:

1
2
3
4
5
6
7
boost-1.33.1-10.el5.i386.rpm
celt051-0.5.1.3-0.el5.i386.rpm
log4cpp-1.0-9.el5.i386.rpm
qcairo-1.8.7.1-3.el5.i386.rpm
qpixman-0.13.3-4.el5.i386.rpm
qspice-client-0.3.0-2.el5_5.i386.rpm
spice-xpi-2.2-1.el5_5.i386.rpm

Después de instalarlos volvemos a ejecutar nuestro paquete para agregar el plugin a Firefox.

1
2
3
4
[root@localhost gabriel]# rpm -ivh spice-xpi-2.2-1.el5_5.i386.rpm
warning: spice-xpi-2.2-1.el5_5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing...                ########################################### [100%]
   1:spice-xpi              ########################################### [100%]

Verificamos que el plugin se haya instalado correctamente en Firefox.

Debemos desactivar SELinux o ponerlo en modo permisivo de lo contrario no dejara ejecutar Spice, obteniendo en mensaje como este:

1
2
3
Jul 19 16:47:40 localhost setroubleshoot: SELinux is preventing spicec
from loading /usr/lib/libqavcodec.so.51.71.0 which requires text relocation.
For complete SELinux messages. run sealert -l 1b920bdf-119e-46fb-b812-894ca58fc943

Volvemos a ejecutar nuestra aplicación para acceder con nuestro respectivo usuario.

De esta manera ya podremos visualizar y trabajar con nuestro escritorio virtual que en este caso es un Windows XP.

Esto funciona para distribuciones Linux basadas en RPMS (Red Hat 5.5, Fedora 12, CentOS 5.4), es asignatura pendiente instalar este plugin de Firefox para Debian o Arch, que son las distribuciones que actualmente uso de manera predeterminada.

Mas información:

http://www.redhat.com/about/news/prarchive/2009/spice-os.html
http://www.spice-space.org/
http://www.redhat.com/virtualization/rhev/desktop/

Probando Red Hat Enterprise Virtualization

Pues siguiendo con la virtualización aquí mostramos una pantalla del manager de Red Hat para su hypervisor, de su producto Red Hat Enterprise Virtualization.

El manager para el control de las maquinas virtuales.

Un maquina virtual con Windows 7.

Server 2003 en una maquina virtual.

Tiene algunos detalles pero sin duda es una buena alternativa (en la parte económica) contra otros productos como VMware o Citrix.

Virtualización con KVM

KVM es una solución para implementar virtualización completa con Linux sobre hardware x86.
Así que aprovechando los recursos con los que cuenta el área de sistemas haremos uso de un servidor ocioso.

El equipo donde realizaremos las pruebas necesarias es un PowerEdge T110 con la distribución Debian Lenny instalada a partir de su versión net-install, por lo cual contaremos con un sistema básico pero mas que suficiente para nuestro cometido. A medida que necesitemos paquetes los instalaremos según se requiera, cabe resaltar que el modulo KVM ya se encuentra incluido en nuestro kernel instalado con nuestra distribución.

Antes que nada debemos verificar que el procesador del equipo soporte la virtualización.

$ egrep '^flags.*(vmx|svm)' /proc/cpuinfo

http://www.linux-kvm.org/page/FAQ#How_can_I_tell_if_I_have_Intel_VT_or_AMD-V.3F

Si el comando anterior nos arroja algún resultado nuestro procesador es idóneo para la virtualización en caso contrario no podremos hacer uso de KVM.

instalamos los paquetes necesarios.

# aptitude install kvm kvm-source

En la medida que se configuran los paquetes de manera automática en debian, si recibimos las siguientes lineas es por que no habilitamos en el BIOS de nuestro equipo la opción de virtualización.

Setting up kvm (72+dfsg-5~lenny5) ...
FATAL: Error inserting kvm_intel (/lib/modules/2.6.26-2-686/kernel/arch/x86/kvm/kvm-intel.ko)
: Operation not supported
Module kvm_intel failed to load failed!
invoke-rc.d: initscript kvm, action "start" failed.

http://www.linux-kvm.org/page/FAQ#.22KVM:_disabled_by_BIOS.22_error

kvm disabled by bios

En el equipo con el que estoy realizando esto entramos a la configuración del BIOS, en el menú de “Processor Settings” encontraremos la opción llamada “Virtualization Technology” la cual deberemos habilitar para poder trabajar con la virtualización por hardware.

Instalamos qemu para crear nuestros discos virtuales (y muchas cosas mas).

# aptitude install qemu

Si pretendemos que nuestras maquinas virtuales sean a nivel de red como un dispositivo físico mas debemos instalar el siguiente paquete y configurar ciertos parámetros en nuestro sistema anfitrión para poner su red en modo “bridge”.

# aptitude install bridge-utils

Debemos realizar unos cambios en nuestro archivo de configuración de red para modificar las interfaces, el contenido de mi archivo “interfaces” (/etc/network/interfaces) es el siguiente:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
 
# The loopback network interface
auto lo
iface lo inet loopback
 
# The primary network interface
allow-hotplug eth0
auto eth0
iface eth0 inet manual
 
auto br0
iface br0 inet static
        address 192.168.1.161
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.254
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

Reiniciamos los servicios de red.

# /etc/init.d/networking restart

Hecho esto al asignarle una dirección IP a nuestra maquina virtual esta sera como cualquier otro dispositivo en la red.

Realizaremos una instalación para ver que tal luce la nueva beta de Red Hat en su versión 6, la cual podemos descargar desde el siguiente enlace: ftp://ftp.redhat.com/pub/redhat/rhel/beta/6/i386/iso/RHEL6.0-20100414.0-AP-i386-DVD1.iso

Creamos un disco duro de unos 30 GB.

$ qemu-img create disk.RHEL -f qcow2 30G
Formatting 'disk.RHEL', fmt=qcow2, size=31457280 kB

Iniciamos la maquina virtual indicando que inicie desde cdrom a partir de una imagen ISO para instalar el sistema, asignamos 1256 MB de memoria RAM, le indicamos modelo y parámetros de tarjeta de red, teclado en español e iniciar un servicio VNC para visualizar la maquina virtual.

# kvm -hda disk.RHEL -cdrom ../RHEL6.0-20100414.0-AP-i386-DVD1.iso -boot d -m 1256 -k es -net nic,vlan=0,model=rtl8139 -net tap,vlan=0 -vnc :0

Terminada la instalación ahora iniciamos desde la imagen del disco duro.

# kvm -hda disk.RHEL -m 1256 -k es -net nic,vlan=0,model=rtl8139 -net tap,vlan=0 -vnc :0

Sistema RHEL instalado y navegando en Internet.

Un SUSE en plena instalación.

Dominio y alias en OpenSIPS

Siguiendo el propósito original de estos escritos, continuamos con las configuraciones del proxy OpenSIPS. El post anterior trataba de autenticar los usuarios haciendo uso de MySQL, ahora agregaremos la función de manejar dominios y alias, por lo tanto deberemos realizar modificaciones a nuestro archivo de configuración el cual simbólicamente denominaremos opensips.cfg.3, el cual mostramos a continuación.

Tambien vamos a cambiar una linea en el archivo opensipsctlrc y modificaremos el primer parámetro definiendo el dominio que vamos a utilizar de manera predeterminada al agregar nuevos usuarios: “SIP_DOMAIN=trantor.demerzel.org”

####### Global Parameters #########
debug=3
log_stderror=no
log_facility=LOG_LOCAL0
 
fork=yes
children=4
 
port=5060
 
/* uncomment and configure the following line if you want opensips to bind on a specific interface/port/proto (default bind on all available) */
#listen=udp:192.9.200.161:5060
 
####### Modules Section ########
 
#set module path
mpath="/usr/local/lib/opensips/modules/"
 
/* uncomment next line for MySQL DB support */
loadmodule "db_mysql.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "alias_db.so"
loadmodule "domain.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri.so"
loadmodule "xlog.so"
loadmodule "acc.so"
 
# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("rr", "enable_full_lr", 1)
modparam("rr", "append_fromtag", 0)
 
# ----- usrloc params -----
modparam("usrloc", "db_mode",   0)
 
modparam("usrloc", "db_mode",   2)
modparam("usrloc", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
 
 
# ----- uri params -----
modparam("uri", "use_uri_table", 0)
# ----- acc params -----
/* what sepcial events should be accounted ? */
modparam("acc", "early_media", 1)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "detect_direction", 0)
modparam("acc", "failed_transaction_flag", 3)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 2)
 
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("auth_db", "load_credentials", "")
 
modparam("alias_db", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
 
modparam("domain", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("domain", "db_mode", 1)
 
route{
 
	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483","Too Many Hops");
		exit;
	}
 
	if (has_totag()) {
		if (loose_route()) {
			if (is_method("BYE")) {
				setflag(1); # do accounting ...
				setflag(3); # ... even if the transaction fails
			} else if (is_method("INVITE")) {
				record_route();
			}
			route(1);
		} else {
			/* uncomment the following lines if you want to enable presence */
			if ( is_method("ACK") ) {
				if ( t_check_trans() ) {
					t_relay();
					exit;
				} else {
					exit;
				}
			}
			sl_send_reply("404","Not here");
		}
		exit;
	}
 
	if (is_method("CANCEL"))
	{
		if (t_check_trans())
			t_relay();
		exit;
	}
 
	t_check_trans();
 
	if (!(method=="REGISTER") && is_from_local())  /*multidomain version*/
        {
              if (!proxy_authorize("", "subscriber")) {
                      proxy_challenge("", "0");
                      exit;
              }
              if (!db_check_from()) {
                      sl_send_reply("403","Forbidden auth ID");
                      exit;
              }
 
              consume_credentials();
              # caller authenticated
        }
 
 
	if (loose_route()) {
		xlog("L_ERR",
		"Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
		if (!is_method("ACK"))
			sl_send_reply("403","Preload Route denied");
		exit;
	}
 
	# record routing
	if (!is_method("REGISTER|MESSAGE"))
		record_route();
 
	# account only INVITEs
	if (is_method("INVITE")) {
		setflag(1); # do accounting
	}
 
	if (!is_uri_host_local())
	{
        	if(is_from_local()) {
			route(1);
	        } else {
			sl_send_reply("403","Not here");
        	}
	}
 
	if (is_method("PUBLISH"))
	{
		sl_send_reply("503", "Service Unavailable");
		exit;
	}
 
	if (is_method("REGISTER"))
	{
                if (!www_authorize("", "subscriber"))
                {
                      www_challenge("", "0");
                      exit;
                }
 
                if (!db_check_to())
                {
                      sl_send_reply("403","Forbidden auth ID");
                      exit;
                }
 
		if (!save("location"))
			sl_reply_error();
 
		exit;
	}
 
	if ($rU==NULL) {
		# request with no Username in RURI
		sl_send_reply("484","Address Incomplete");
		exit;
	}
 
        # apply DB based aliases (uncomment to enable)
        alias_db_lookup("dbaliases");
 
	# do lookup with method filtering
	if (!lookup("location","m")) {
		switch ($retcode) {
			case -1:
			case -3:
				t_newtran();
				t_reply("404", "Not Found");
				exit;
			case -2:
				sl_send_reply("405", "Method Not Allowed");
				exit;
		}
	}
	# when routing via usrloc, log the missed calls also
	setflag(2);
	route(1);
}
 
route[1] {
	# for INVITEs enable some additional helper routes
	if (is_method("INVITE")) {
		t_on_branch("2");
		t_on_reply("2");
		t_on_failure("1");
	}
 
	if (!t_relay()) {
		sl_reply_error();
	};
	exit;
}
 
branch_route[2] {
	xlog("new branch at $run");
}
 
 
onreply_route[2] {
	xlog("incoming replyn");
}
 
 
failure_route[1] {
	if (t_was_cancelled()) {
		exit;
	}
}

Cambiar contraseña de root en un disco con LVM

Si se ha olvidado o se ignora la contraseña de root de algún equipo, en teoría es sencillo cambiar la contraseña para poder recuperar nuestro equipo, en este caso en especifico el disco esta particionado y usa LVM (Logical Volume Manager), por lo tanto el procedimiento tiene unos cuantos pasos mas a diferencia de si tuviéramos un sistema de partición tradicional. Para esto nos ayudaremos del live cd mas famoso últimamente, Ubuntu 9.10

Necesitamos instalar las herramientas necesarias para manejar los volúmenes lógicos.

ubuntu@ubuntu:~$ sudo aptitude install lvm2
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Se instalarán los siguiente paquetes NUEVOS:
  lvm2 watershed{a}
0 paquetes actualizados, 2 nuevos instalados, 0 para eliminar y 246 sin actualizar.
Necesito descargar 387kB de ficheros. Después de desempaquetar se usarán 1114kB.
¿Quiere continuar? [Y/n/?] Y

Determinamos que grupo contiene nuestra partición física.

ubuntu@ubuntu:~$ sudo pvs
  PV         VG         Fmt  Attr PSize  PFree
  /dev/sda2  VolGroup00 lvm2 a-   74,41G 32,00M

Ahora podemos visualizar los volúmenes lógicos existente en VolGroup00

ubuntu@ubuntu:~$ sudo lvdisplay /dev/VolGroup00
  --- Logical volume ---
  LV Name                /dev/VolGroup00/LogVol00
  VG Name                VolGroup00
  LV UUID                FjQd7F-xxXz-Q2yd-OID7-eusj-y69S-ewCguZ
  LV Write Access        read/write
  LV Status              NOT available
  LV Size                73,50 GB
  Current LE             2352
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
 
  --- Logical volume ---
  LV Name                /dev/VolGroup00/LogVol01
  VG Name                VolGroup00
  LV UUID                tGFOHq-LzOP-ppnP-d5FX-yNYj-Lu6y-fPso1L
  LV Write Access        read/write
  LV Status              NOT available
  LV Size                896,00 MB
  Current LE             28
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto

Activamos el grupo, de otra manera no podremos montar el volumen como si de una partición tradicional se tratara.

ubuntu@ubuntu:~$ sudo vgchange -a y
  2 logical volume(s) in volume group "VolGroup00" now active

Creamos el directorio donde montaremos el volumen logico.

ubuntu@ubuntu:~$ sudo mkdir /tmp/aguas/ (por Aguascalientes, de donde vino el servidor)

Montamos ahora si como si de una partición se tratara.

ubuntu@ubuntu:~$ sudo mount /dev/VolGroup00/LogVol00 /tmp/aguas/

Cambiamos el directorio raíz de / a /tmp/aguas para que los cambios que hagamos se reflejen en la partición montada.

ubuntu@ubuntu:/tmp/aguas$ sudo chroot /tmp/aguas/

Verificamos los directorios con los que cuenta el sistema montado.

bash-3.00# ls
bin	    home	misc	    proc	srv	    var
boot	    lib		mnt	    root	sys
dev	    lost+found	net	    sbin	tmp
etc	    media	opt	    selinux	usr
bash-3.00# ls home/
bash			      libpcap-0.9.4-4.fc5.i386.rpm
iftop-0.17-1.fc4.rf.i386.rpm  sistemas
iftop-0.17-1.fc5.rf.i386.rpm

Ahora si cambiamos la contraseña del superusuario.

bash-3.00# passwd root
Changing password for user root.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
bash-3.00# exit

Reiniciamos el equipo y debemos poder entrar al sistema satisfactoriamente con la contraseña que cambiamos.

Mas información en el siguiente enlace: http://www.brandonhutchinson.com/Mounting_a_Linux_LVM_volume.html

Dividiendo la consola con Screen.

screen2

En Linux existen múltiples herramientas para todo tipo de escenarios, una de ellas es “Screen”, la cual nos permite dividir la consola por decirlo de alguna manera.

Monitoreo unos cuantos servidores Asterisk, no es que me la pase todo el día viéndolos, pero cuando necesito ver algún comportamiento en especifico que involucre a mas de dos servidores, es bastante útil ver su operación en la misma pantalla y en la misma consola, de esta manera no tengo terminales regadas por mis cuatro escritorios.

Instalar Screen es muy fácil, en Debian lo hacemos de la siguiente manera: # aptitude install screen

Para iniciarlo basta con que abramos una terminal, y ejecutemos el comando screen, al parecer no hay un cambio sustancial, tal vez un parpadeo o algún mensaje de bienvenida, pero una vez echo esto las opciones cambian bastante.

Aclaración pertinente las teclas encerradas en corchetes funcionan como la primera parte de una combinación de teclas, es decir primero aprieto Ctrl luego a, y al final la tecla especifica de la función deseada.

De manera rápida, para dividir horizontalmente tenemos que usar la siguiente combinación de teclas:
[Ctrl-a]+S
Para dividir verticalmente es la siguiente en donde el carácter final es el conocido “pipe”.
[Ctrl-a]+|
Esta nos serviría para movernos a través de las secciones.
[Ctrl-a]+TAB
Para activar la sección de la consola.
[Ctrl-a]+c
Para cerrar una sección.
[Ctrl-a]+X

Por lo que de manera rápida, un procedimiento general seria de la siguiente manera:

  1. Ejecuto screen
  2. Divido la pantalla horizontalmente [Ctrl-a]+S
  3. Me muevo a la sección creada [Ctrl-a]+TAB
  4. Activo la sección [Ctrl-a]+c
  5. Divido verticalmente esta sección [Ctrl-a]+|
  6. Me muevo a la sección creada [Ctrl-a]+TAB
  7. Activo la sección [Ctrl-a]+c
  8. Regreso a la primera sección [Ctrl-a]+TAB

De esta manera obtendremos tres secciones, similar a una T.

Para mas información consulta el siguiente enlace: http://www.ivlabs.org/home/?p=902