Equipo con dos tarjetas gráficas en gentoo. Optimus Machine.

¿Que es un pc optimus machine?

Un PC Optimus Machine son aquellos equipos portatiles que tienen 2 tarjetas gráficas. Una de ellas de baja calidad de procesamiento y la otra bastante mayor. La que se encarga de procesar los gráficos es la tarjeta de mayores prestaciónes y una vez procesados, los envia a la tarjeta más pequeña para que los muestre por pantalla. La tarjeta superior no tiene conectada a ella una pantalla, simplemente se usa para el procesamiento gŕafico.

Dicho esto, os facilito los pasos necesarios para hacer funcionar una máquina optimus machine en Gentoo. Empezamos:

En el kernel, seleccionar la opción de modesetting para el modulo de intel:

——————————————————————————————————————

DeviceDrivers --->
Graphics Support --->
Direct Rendering Manager --->
Direct Rendering Manager (Xfree86 4.1.0 and higher DRI support) --->
<*> Intel 8xx/9xx/G3x/G4x/Hd Graphics
[*] Enable modesetting on intel by default

——————————————————————————————————————

Añadir el modulo del kernel ‘nouveau’ y ‘nvidia’ a la lista de blacklist para que systemd o openrc evite cargarlo al inicio:

# Para sytemd:
——————————————————————————————————————

echo "blacklist nouveau" >> /etc/modules-load.d/blacklist.conf
echo "blacklist nouveaufb" >> /etc/modules-load.d/blacklist.conf
echo "blacklist rivafb" >> /etc/modules-load.d/blacklist.conf
echo "blacklist nvidiafb" >> /etc/modules-load.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modules-load.d/blacklist.conf

——————————————————————————————————————

# Para Openrc:
——————————————————————————————————————

echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nouveaufb" >> /etc/modprobe.d/blacklist.conf
echo "blacklist rivafb" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf

——————————————————————————————————————

Habilitamos la versión testing para los paquetes que se encargan de los gráficos:

——————————————————————————————————————

echo "x11-apps/xrandr ~amd64" >> /etc/portage/package.keywords
echo "x11-base/xorg-server ~amd64" >> /etc/portage/package.keywords
echo "x11-proto/inputproto ~amd64" >> /etc/portage/package.keywords
echo "x11-drivers/nvidia-drivers ~amd64" >> /etc/portage/package.keywords
echo "x11-drivers/xf86-input-evdev ~amd64" >> /etc/portage/package.keywords
echo "x11-drivers/xf86-input-synaptics ~amd64" >> /etc/portage/package.keywords
echo "x11-drivers/xf86-video-modesetting ~amd64" >> /etc/portage/package.keywords

——————————————————————————————————————

Hacemos emerge de todos esos paquetes

——————————————————————————————————————

emerge x11-apps/xrandr && emerge -1 xf86-video-modesetting && emerge -1 $(qlist -IC x11-drivers)

——————————————————————————————————————

Colocar, el siguiente contenido en /etc/gdm/Init/Default:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Seleccionamos con eselect opengl la opción de nvidia:


eselect opengl list:

——————————————————————————————————————
Available OpenGL implementations:
[1] nvidia
[2] xorg-x11 *
——————————————————————————————————————

eselect opengl set 1

Switching to nvidia OpenGL interface… done

En /etc/X11/xorg.conf insertamos todo esto:
——————————————————————————————————————

Section "ServerLayout"
Identifier "layout"
Screen 0 "nvidia"
Inactive "intel"
EndSection

Section "Device"
Identifier "nvidia"
Driver "nvidia"
BusID ""
EndSection

Section "Screen"
Identifier "nvidia"
Device "nvidia"
# Uncomment this line if your computer has no display devices connected to
# the NVIDIA GPU. Leave it commented if you have display devices
# connected to the NVIDIA GPU that you would like to use.

EndSection

Section "Device"
Identifier "intel"
Driver "modesetting"
BusID ""
EndSection

Section "Screen"
Identifier "intel"
Device "intel"
EndSection


——————————————————————————————————————

Sustituimos BUS_ID_INTEL_CARD por el ID de la tarjeta gráfica INTEL. Para averiguar el PCI ID podemos hacerlo con:


lspci | grep VGA

El comando en mi caso, devuelve:
——————————————————————————————————————
00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b)
——————————————————————————————————————

Quedaria:
———————-
Section “Device”
Identifier “intel”
Driver “modesetting”
BusID “PCI:0:2:0”
EndSection
———————-

Y para la tarjeta gráfica NVIDIA, podemos ver cual es el PCI ID, con:

lspci | grep NVIDIA

Devolveria:
——————————————————————————————————————
04:00.0 3D controller: NVIDIA Corporation GF117M [GeForce 610M/710M/820M / GT 620M/625M/630M/720M] (rev a1)
——————————————————————————————————————

Quedaria en el xorg.conf:
——————————————————————————————————————

Section "Device"
Identifier "nvidia"
Driver "nvidia"
BusID "PCI:4:0:0"
EndSection

——————————————————————————————————————

Una vez realizado todo lo anterior, solamente quedaria instalar el software que realizará el proceso de intercambio de gráficos entre las 2 tarjetas, se llama ‘bumblebee’.

Lo instalamos con:


emerge bumblebee

Añadimos nuestro usuario al grupo bumblebee:


usermod -a -G bumblebee

Arrancamos el servicio ‘bumblebeed’ al inicio:

# Para SystemD
systemctl enable bumblebeed


# Para openRC
rc-update add bumblebeed default

Una vez realizados estos pasos, para ejecutar software y que bumblebeed ponga a trabajar las 2 tarjetas se hace con:

optirun aplicacion

Por ejemplo:

optirun glxgears

Llegados a este punto ya tendriamos nuestra máquina funcionando con las dos tarjetas gráficas.

Share

Cambiar fecha de creación y modificación un fichero

Mediante el comando touch de nuestro linux, podemos cambiar la fecha de creación y/o fecha de modificación de un fichero.

Es muy sencillo:


touch -t 201510021330.13 fichero

En este caso, el fichero nos quedaría con la fecha de modificación y creación:

El día 02 del mes 10 del año 2015 a las 13:30 horas y 13 segundos

Podemos ser más precisos, añadiendo algún que otro parametro:


-a: Modificamos solo la fecha del ultimo acceso al fichero
-m: Modificamos solo la fecha de modificación del fichero

Share

Renombrar interfaz de red en UDEV

Como sabeis desde hace algún tiempo udev ha cambiado la forma de nombrar a las interfaces de red.
Antes las mostraba como ‘eth0,eth1,eth2…’ para las tarjetas de red cableadas y ‘wlan0,wlan1,wlan2‘ para las tarjetas de red inalámbricas.

Ahora las nombra con ‘enp6s0,enp6s1…’ para las cableadas y ‘wlps0,wlps1..’ para las inalambricas. Esto en servidores que llevan años funcionando es un problema, ya que,despues de una actualización del sistema global podemos encontrarnos en la situación de que nuestros scripts propios no arrancan porque no encuentran los nombres de red que teniamos anteriormente.

Lo que vamos a hacer esta vez es asignarle nombres propios a cada interfaz, así, udev no tocará nada. ¡vamos allá!

Lo único que tenemos que hacer es, crear un fichero con nombre ’10-local.rules’ en el directorio ‘/etc/udev/rules.d’. La ruta completa seria /etc/udev/rules.d/10-local.rules .
Tendria el siguiente contenido:


SUBSYSTEM=="net", ATTR{address}=="DIRECCIÓN_MAC_TARJETA", NAME="lan0"
SUBSYSTEM=="net", ATTR{address}=="DIRECCIÓN_MAC_TARJETA", NAME="wifi0"

Solamente tendriamos que sustituir DIRECCIÓN_MAC_TARJETA por la dirección MAC de nuestra interfaz.

Hay que recordar que para averiguar la dirección mac de nuestra tarjeta basta con ejecutar un:


ifconfig interfaz | grep ether

Una vez creado el fichero con el contenido anterior y reiniciada la máquina, ya tendriamos la tarjeta de red cableada con el nombre ‘lan0’ y la inalámbrica con el nombre ‘wifi0’.

Espero que esta pequeña receta os sirva de ayuda.

Share

Clonar paquetes hacia otra máquina con iptables

Con la extensión ‘TEE’ de iptables podemos clonar un paquete dirigido hacia otra máquina a la nuestra.

Si quisieramos clonar el trafico de entrada del host 192.168.1.5 y mandarlo a nuestra maquina (192.168.1.100):


iptables -t mangle -A PREROUTING -d 192.168.1.15 -j TEE --gateway 192.168.1.100

Si buscamos hacer lo mismo con el trafico de salida del host 192.168.1.5 y mandarlo a nuestra maquina (192.168.1.100):


iptables -t mangle -A PREROUTING -s 192.168.1.15 -j TEE --gateway 192.168.1.100

Fuentes:

http://ipset.netfilter.org/iptables-extensions.man.html

http://superuser.com/questions/853077/iptables-duplicate-traffic-to-another-ip

Share

Creación de ficheros en blanco en GNOME 3

Por defecto no nos aparece la opción Nuevo -> Documento de texto, tenemos que activarla.

Es muy sencillo, accedemos con el terminal a la carpeta “Templates” o “Plantillas” en español:

En español:

cd /home/USUARIO/Plantillas

En ingles:


cd /home/USUARIO/Templates

Creamos un nuevo fichero con ‘touch’:


touch Documento\ de\ texto

Ya podemos crear ficheros de texto con el click derecho -> Nuevo.

Share

Iconos en el escritorio con GNOME 3

En GNOME 3 por defecto no tenemos la posibilidad de utilizar iconos en nuestro escritorio. Pero GNOME es muy personalizable y con unos pequeños cambios podemos activar dicha función.

Abrimos un terminal y ejecutamos (con usuario normal, no root):


dconf-editor

Dentro de dconf-edir, nos dirigmos a:


- org
- gnome
- desktop
- background

Marcamos la opción:


(*) show-desktop-icons

Guardamos los cambios y ya tendriamos nuestro escritorio 100% operativo.

Share

Tormenta broadcast NETGEAR ONO

Hola de nuevo a todo el mundo!

Despues de mucho tiempo offline volvemos a mostrarnos al mundo. Esta vez vengo a plasmar una experiencia personal con los famosos router netgear que entrega ONO.

Por cuestiones tecnicas del escenario que nos encontrábamos, el router de ONO debía estar configurado en modo NAT, es decir, en el mismo router, una ip publica y otra privada para nuestra LAN.

La máquina con Gentoo conectada a un puerto ethernet del router NETGEAR, seria algo así:


ROUTER ONO -----> 84.128.X.X. -- PUBLICA
192.168.1.1 -- PRIVADA


MAQUINA GENTOO -------> IP WAN 192.168.1.2
-------> IP LAN 192.168.10.1

Una vez realizado lo anterior. ¡Nos pusimos a probar nuestra instalación!
Todo funcionaba de maravilla hasta pasar 15 o 20 minutos. Poco a poco la velocidad a Internet caía, casi no podia abrir simples paginas web..

Con lo que, despues de horas y horas de pruebas y no encontrar una solución, puse a funcionar ‘tcpdump’ en la tarjeta de red donde estaba conectado el router NETGEAR.

Y esto fué lo que me encontré (lineas y lineas de lo que pego a continuación):


ARP Who has 192.168.1.2 Tell 192.168.1.1
ARP Who has 192.168.1.3 Tell 192.168.1.1
ARP Who has 192.168.1.4 Tell 192.168.1.1
ARP Who has 192.168.1.5 Tell 192.168.1.1
ARP Who has 192.168.1.6 Tell 192.168.1.1
ARP Who has 192.168.1.7 Tell 192.168.1.1
ARP Who has 192.168.1.8 Tell 192.168.1.1
ARP Who has 192.168.1.9 Tell 192.168.1.1
ARP Who has 192.168.1.10 Tell 192.168.1.1
ARP Who has 192.168.1.11 Tell 192.168.1.1
ARP Who has 192.168.1.12 Tell 192.168.1.1
ARP Who has 192.168.1.13 Tell 192.168.1.1
ARP Who has 192.168.1.14 Tell 192.168.1.1
ARP Who has 192.168.1.15 Tell 192.168.1.1
ARP Who has 192.168.1.16 Tell 192.168.1.1
ARP Who has 192.168.1.17 Tell 192.168.1.1
ARP Who has 192.168.1.18 Tell 192.168.1.1
ARP Who has 192.168.1.19 Tell 192.168.1.1
ARP Who has 192.168.1.20 Tell 192.168.1.1
ARP Who has 192.168.1.21 Tell 192.168.1.1
ARP Who has 192.168.1.22 Tell 192.168.1.1
.........

Esto, lo emitia el router de ONO cada 2 o 3 segundos. Estaba provocando una tormenta broadcast impresionante. Parecia que el router estaba intentando ponerse en contacto con equipos que no existian en la red, desde 192.168.1.2 hasta 192.168.1.254.

No conozco el porque de esto, supongo que será algun defecto del router.

¿LA SOLUCIÓN?

Bastaria con configurar el NETGEAR en modo bridge. O si necesitamos si o si una ip local, configurariamos el NETGEAR en modo bridge y lo conectariamos a un router, y este a la máquina Linux configurada para manejar el trafico.

INSISTO. En la instalación que estaba realizando era ESTRICTAMENTE NECESARIO trabajar con el router del proveedor en modo NAT. Si no hubiera sido así podria haber configurado en modo bridge el router y problema solucionado.

Espero que esta entrada le sirva a alguien de ayuda ya que yo estuve pegando cabezazos hasta que encontré el por que y una solución.

Share

Retry Dial en Asterisk

Hola.

Aqui estoy de nuevo con otra pequeña aportación para la comunidad, esta vez les voy a mostrar como hacer un plan de marcado de Asterisk a prueba de bombas ( o casi jeje).

En este caso lo que vamos a hacer es trabajar con 2 troncales de 2 operadores SIP. Intentaremos sacar la llamada 3 veces por el primero, y si no lo conseguimos, reintentamos otras 3 veces más con el segundo, es muy sencillo.

 

; Definimos variables. Numero de intentos y proveedores
exten => s,1,Set(INTENTOS=3)
exten => s,n,Set(PROVEEDOR1=SIP/proveedor1)
exten => s,n,Set(PROVEEDOR2=SIP/proveedor2)

Con este parrafo definimos todas las variables que vamos a utilizar. En la primera linea, declaramos una variable llamada INTENTOS que valdrá 3, serán los intentos a realizar para cada proveedor. PROVEEDOR1 y PROVEEDOR2 estan definidos en mi archivo sip.conf.

 

; Intentamos sacar llamada por TRUNK 1
exten => s,n(llamar),Set(REALIZADOS=0)
exten => s,n(dial),Dial(${PROVEEDOR1}/${MACRO_EXTEN},30)
exten => s,n,Set(REALIZADOS=$[${REALIZADOS}+1])
exten => s,n,GotoIf($[${REALIZADOS} < ${INTENTOS}]?dial:proveedor2)

 

Con esto, intentamos sacar la llamada. La primera linea “setea” la variable REALIZADOS en 0 y a continuación se ejecuta el Dial, si ocurre algún problema sigue a la siguiente linea, en la que, incrementamos el valor de REALIZADOS en 1. Abajo comparamos si REALIZADOS es MENOR que INTENTOS, como si que lo es, ejecutará dial (volver a ejecutar de nuevo el Dial()). Esto ocurria 3 veces, a la 3º el plan de marcado seguirá hasta la etiqueta proveedor2.

 

; Reintentamos sacar llamada por TRUNK 2
exten => s,n(proveedor2),Set(REALIZADOS=0)
exten => s,n(redial),Dial(${PROVEEDOR2}/${MACRO_EXTEN},30)
exten => s,n,Set(REALIZADOS=$[${REALIZADOS}+1])
exten => s,n,GotoIf($[${REALIZADOS} < ${INTENTOS}]?redial)
exten => s,n,Goto(ERROR,1)

 

exten => ERROR,1,Playback(beep)

exten => ERROR,n,Hangup

 

En la primera linea volvemos a setear REALIZADOS en 0 y a continuación intentamos marcar de nuevo pero esta vez con $PROVEEDOR2.

Si falla, sigue su camino y incrementa la variable REALIZADOS. El gotoIf hará la misma comparación y mientras REALIZADOS sea menor que INTENTOS (3) seguirá intentandolo.

Si en esta ocasión falla al intentar sacar la llamada 3 veces, irá a parar a ERROR, el cual, hará que en el telefono suene un pitido y colgará.

 

 

 

 

Esto es todo, espero que les sirva.

Un saludo 😀

 

Share

Mysql dialplan Asterisk.

En algunos escenarios, trabajando con Asterisk, tenemos la necesidad de consultar datos de una base de datos, para por ejemplo, dar la posibilidad a un usuario a traves de una página dinámica en PHP activar o desactivar un buzón de voz. Esto como he dicho, se puede conseguir realizando consultas a Mysql desde el mismo dialplan de asterisk.

Es bastante sencillo, con lo que pondré varias lineas a modo de ejemplo:

Utilizaremos la función Noop de asterisk para saber en todo momento como recorre asterisk nuestro pequeño plan de marcado.

Para conseguir esto en asterisk se utiliza la función Mysql.

Lo primero que se tiene que hacer es conectar con el servidor (Mysql) y la base de datos con la que queremos trabajar.

Mysql(connect conex localhost usuario password base_de_datos)

– conex: Esta variable almacenara la sesión de la conexión. (La tendremos que indicar a las futuras consultas de mysql)
– Localhost: Seria la IP o nombre del servidor donde se aloja la base de datos
– Usuario: Aqui se indicaria el usuario de la base de datos
– Password: Password de la base de datos
– base_de_datos: Aqui el nombre de la base de datos con la que vamos a trabajar.

Ejemplo:

Mysql(connect conex localhost myuser mypassword dbasterisk)

Una vez explicado esto, se debe saber que este es el primer punto a realizar.

El segundo punto a realizar seria la consulta.
Lo único que cambia en este caso es la palabra connect por query. Indica a la función mysql que vamos a realizar una consulta.

Mysql(query consulta ${conex} ..CONSULTA MYSQL.. )

– consulta: Variable que retornará el retorno de la consulta
– ${conex}: Variable que indicamos anteriormente para realizar la conexion. Pasandole esta variable hacemos referencia a la conexión establecida anteriormente.
– ..CONSULTA MYSQL.. : Aqui se indicará una consulta Mysql estándar.

Ejemplo:

Mysql(query consulta ${conexion} SELECT dst FROM tabla_1 WHERE id=1 )

Recogeremos los valores del campo dst, cuya tabla es tabla_1 y el valor id sea 1..

Hemos conectado con mysql en el punto 1, hemos realizado la consulta en el punto 2. Ahora nos falta poder “leer” el contenido que nos a retornado dicha consulta.

Para esto utilizamos la función mysql seguida de fetch:

Mysql(fetch asignar ${consulta} var1)

– asignar: Esta variable retornará si la operación tubó exito o no.
– ${consulta}: Es la variable que indicamos anteriormente en la consulta. Le estamos diciendo que nos “extraiga” el resultado de dicha consulta que anteriormente ejecutamos con query.

– var1: Seria la variable a la que se pasaria el valor ya legible. Ahora podriamos utilizar Noop para leer su resultado en la consola de asterisk o para tratarla a lo largo del dialplan.

En el caso de que query nos devuelva más de un registro y queramos acceder al siguiente, podemos utilizar la nueva funcionalidad que SOLAMENTE ESTA DISPONIBLE PARA ASTERISK 1.8.

Mysql(Nextresult sigregistro ${connid})

-Nextresult: Se trata de la nueva funcionalidad agregada por asterisk en la versión 1.8. Permite ir avanzando entre todos los registros “soltados” por mysql. Si la consulta devolvió 4 registros diferentes, podremos acceder a esos 4 haciendo un Nextresult & fetch para cada uno de ellos. Con Nextresult pasamos de registro y con fetch lo rescatamos a una variable.

– sigregistro: Se trata de la variable donde se retornará el puntero al registro. Seria esta variable la que tendriamos que utilizar ahora en fetch.

Ejemplo:

Mysql(fetch asignar ${sigregistro} var1)

Con la linea anterior, el registro pasará a estar disponible desde la variable ${var1}

Una vez hemos terminado con todo lo relaciono con mysql tenemos que “limpiar” todo lo relacionado con la consulta y desconectarnos del servidor mysql.
Se consigue con:

Mysql(clear ${consulta})    # Para limpiar

– ${consulta}: Seria el puntero que indica la consulta anteriormente realizada.

Mysql(disconnect ${conex}) # para desconectar

– ${conex}: Seria el puntero que indica la conexión de la que queremos desconectarnos. (La anteriormente realizada)

Despues de aprender todo lo comentado, dejo a modo de ayuda todo el dialplan referente a las pruebas realizadas.

exten => 111,n,Noop(Vamos a conectar con Mysql)
exten => 111,n,Mysql(connect conex localhost miusuarioasterisk password999 asterisk-tabla)
exten => 111,n,Noop(Resultado de conexion: = ${conex})
exten => 111,n,Noop(Consultamos datos de la DB)
exten => 111,n,Mysql(query consulta ${conex} SELECT dst FROM cdr WHERE dst=123456789)
exten => 111,n,Noop(Resultado de consulta: ${consulta})
exten => 111,n,Noop(Asignamos el resultado de la consulta a var1)
exten => 111,n,Mysql(fetch asignacion ${consulta} var1)
exten => 111,n,Noop(Valor de variable VAR1 es: ${var1})
exten => 111,n,Noop(Limpiamos con clear)
exten => 111,n,Mysql(clear ${consulta})
exten => 111,n,Mysql(Vamos a desconectarnos del servidor Mysql con disconnect)
exten => 111,n,Mysql(disconnect ${conex})
exten => 111,n,Noop(Terminado…monovarlinux.org 😀 :=). Conocimiento libre! . Gracias linux & asterisk por existir)
exten => 111,n,Hangup

Como podeis ver, dicho dialplan se ejecutara al marcar 111. Podran ver todos los mensajes Noop, su salida, en la consola de asterisk, entrando a ella con asterisk -vvvvvvvvvr.

 

Espero que una vez más sirva de utilidad a alguien.
Como siempre, cada dia más y mejores. Conocimiento libre!

Un saludo.

Share