Cosas de Linux

Añadir las claves públicas de los repositorios oficiales de Ubuntu

# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com pubkey

Donde -pubkey- es la clave que necesitamos importar. Este dato nos lo dice normalmente el comando apt-get update al final, cuando nos informa del error PUBKEY

Convertir imagen .jpg -> .png escalando la imagen original y extendiendola a un tamaño determinado.

$ convert -filter Lanczos -scale 346x300 -extent 346x300 -gravity center -density 90 imagen.jpg imagenout.png

Opciones:

Convertir imagen .jpg -> .jpg escalando, extendiendo y recomprimiendo para dejar el mismo formato.

En este caso no se puede hacer directamente en el mismo comando, sinó que hay que hacer un paso intermedio

convirtiendo el .jpg a bmp por ejemplo y después convertir el .bmp a .jpg

$ convert -filter Lanczos -scale 346x300 -extent 346x300 -gravity center -density 90 imagen.jpg imagen.bmp && sleep 1 && convert imagen.bmp -quality 90 imagencomprimida.jpg

Opciones:

Hay que añadir un retardo entre un comando y el otro, para dar tiempo a que haga la primera conversión a bmp, ya que tarda algo más

Convertir imagen .jpg -> .png y hacer transparente el color de fondo

$ convert imagen.jpg -fuzz 10% -transparent white salida.png

Opciones:

Tablas para las resoluciones de pantalla y colores para la consola TTY

 
Colores 640x400 640x480 800x600 1024x768 1280x1024 1600x1200
4 bits 0x302 ----- ----- ----- ----- -----
8 bits 0x300 0x301 0x303 0x305 0x307 0x31C
15 bits 0x310 0x313 0x316 0x319 0x31D -----
16 bits 0x311 0x314 0x317 0x31A 0x31E -----
24 bits 0x312 0x315 0x318 0x31B 0x31F -----
32 bits 0x792 ----- ----- ----- ----- -----

Exportar base de datos desde phpMyAdmin

Para exportar una base de datos desde phpMyAdmin, la abrimos y a continuación seguimos estos pasos:

El resto de opciones que no se indican aquí se dejan por defecto. Para finalizar pulsamos en Continuar.

Enmascarar email usando CSS

Añadir esta regla al archivo css.

#em-info:after {
content: "info\40 costt.es";

Lo que hacemos es utilizar el elemento :after para que el contenido indicado por la propiedad content se escriba después del texto al que asignemos la clase em-info.

En este caso hemos sustituido la @ por el caracter especial \40 y en lugar del punto se usa su caracter especial \2E. Es importante dejar después un espacio, sino puede no funcionar correctamente la sustitucion y escribirse cualquier otro caracter.

Ahora en el código html o php de nuestra página se debe introducir lo siguiente

<p id=”em-info”> Email: </p>

Configurar servidor VPS para habilitar las conexiones ODBC con IBM iSeries por PHP

El servidor es un Debian 7 con Apache y PHP. Tal y como lo entregan no tiene instalados ni configurados los módulos ODBC.

1. Instalar el módulo php5-odbc. Versión instalada 5.4.4.

# apt-get install php5-odbc

2. Es necesario instalar los paquetes siguientes desde los repositorios Debian Testing. Necesitamos como mínimo la versión 2.3.1 de ambos paquetes. Con ello obtendremos las librerías libodbcinst.so.2 y libodbc.so.2. Son imprescincibles para que el unixODBC manager trabaja correctamente.

# apt-get install odbcinst1debian2 libodbc1 odbcinst

3. Descargar la versión más actual del unixODBC Manager desde la página oficial http://www.unixodbc.com
A fecha de este manual el archivo se llama unixODBC-2.3.2.tar.gz

4. Descomprimir y extraer el contenido. Compilamos e instalamos.

# cd /tmp
# wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.2.tar.gz
# tar -xvzf unixODBC-2.3.2.tar.gz
# cd unixODBC-2.3.2
# ./configure
# make
# make install

5. Descargamos desde IBM el i Access for Linux en su última versión. Los ficheros más actuales son
iSeriesAccess-7.1.0-1.0.i386.rpm
iSeriesAccess-7.1.0-1.0.x86_64.rpm

Usando el comando alien como root, generamos el paquete .deb y después lo instalamos.

# alien iSeriesAccess-7.1.0-1.0.x86_64.rpm
# dpkg -i iSeriesAccess-7.1.0-2_amd64.deb

iSeriesAccess se instala por defecto en la ruta /opt/ibm/iSeriesAccess.

La instalación debería también registrar el driver ODBC específico de IBM para conectar con las bases de datos DB2, es conveniente comprobarlo y se debe hacer manualmente. Para ello.

7. Comprobamos las rutas a los archivos de configuración ODBC.

$ odbcinst -j
unixODBC 2.3.2
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /home/alberto/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8 

El comando nos dice que los archivos de configuración están en la carpeta /usr/local/etc

7. Registramos el driver ODBC del iSeriesAccess.

# odbcinst -i -d -f /opt/ibm/iSeriesAccess/unixodbcregistration64

Este comando nos añadirá al archivo /usr/local/etc/odbcinst.ini lo siguiente:

[iSeries Access ODBC Driver]
Description = iSeries Access for Linux ODBC Driver
Driver = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
NOTE1= If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN's,
NOTE2= the following Driver64/Setup64 keywords will provide that support.
Driver64 = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup64 = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading = 2
DontDLClose = 1
[iSeries Access ODBC Driver 64-bit]
Description = iSeries Access for Linux 64-bit ODBC Driver
Driver = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading = 2
DontDLClose = 1

Nota importante. La configuración del archivo /usr/local/etc/odbcinst.ini se usa para los usuarios normales. Sin embargo es importante inroducir los mismos datos también en el archivo /etc/odbcinst.ini

8. Añadimos la ruta a las librerias del iSeriesAccess al path y recargamos el cache de librerias.

# echo “/opt/ibm/iSeriesAccess/lib64/” > /etc/ld.so.conf.d/iSeriesAccess.conf
# ldconfig

Con esto ya debería quedar el servidor configurado con el ODBC Manager (unixODBC) y el driver ODBC especifico de IBM para aceder a bases de datos DB2 en un servicor iSeries.

Referencias:

http://www-03.ibm.com/systems/power/software/i/access/linux/guide.html#intro
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Frzatv%2Frzatvrestodbc.htm
http://www14.software.ibm.com/webapp/download/nochargesearchquery.jsp?pgel=lnav (buscar “iSeries Access”)
http://www.unixodbc.com/
http://www.cosmocode.de/en/blog/gohr/2010-09/14-accessing-a-db2-from-php

Enlace al nuevo IBM Data Server Driver for ODBC and CLI.

http://www-01.ibm.com/support/docview.wss?rs=4020&uid=swg21385217

Enlaces sobre configuración Intel HDA

Busquedas en Google de:

ValueError: wrong proc file format (unknown dig1 bit)
"hda-analyzer" "unknown dig1 bit"

http://software.techassistbox.com/intellow-volume-mixer-correctasound-pre-amp-not-added-to-mixerhda-analyzer-crash_180198.html
http://www.alsa-project.org/main/index.php/Help_To_Debug_Intel_HDA
http://helllabs.org/codecgraph/

Busqueda en Google de:

hda-verb envy 17

http://www.asyndetic.com/blog/

Inkscape falla cuando se intena importar o abrir un archivo PDF

El fallo ocurre solo con la versión 0.48.4. Con la versión 0.48.3 no se reproduce el problema. Ejecutando Inkscape desde un terminal, el error que se obtiene es el siguiente:

alberto@envy:~$ inkscape
*** Error in `inkscape': malloc(): memory corruption: 0x0000000009bc6590 ***
Emergency save activated!
El problema no está extrictamente en Inkscape, sino en las librerias Poppler. La solucción es actualizar las librerias Poppler.

Múltiples versiones de PHP en el panel Plesk

  1. Logearse en el servidor VPS como root.

  2. Descargar la versión de PHP que necesitemos desde la página web https://php.net/downloads.php y descomprimir el ficher. En este ejemplo usaremos la versión 5.5.10.

    tar -xvzf php-5.5.10.tar.gz
  3. Instalar las dependencias.

    apt install libxml2 libxml2-dev
  4. Configurar PHP, compilar e instalar.

    cd php-5.5.10
    ./configure --prefix /usr/local/php-5.5.10
    make
    make install
  5. Establecer el archivo php.ini

    cp php.ini-development /usr/local/lib/php.ini

    Editar el php.ini para adaptar las opciones que se necesiten. En caso de que se quiera configurar otra localización del archivo php.ini, ejecutar ./configure con la opción --with-config-file-path=/ruta en el paso 4.

  6. Registrar la nueva versión de PHP en el panel Plesk.

    /usr/local/bin/php_handler --add -displayname NN -path RUTA AL PHP CGI -phpini RUTA EL PHP.INI -type PHP HANDLER -id NN-CUSTOM 

    Donde:

    • -displayname NN, es el nombre de la versión de PHP que se mostrará en el Panel. Es recomendable incluir el número de versión. Por ejemplo se puede poner "5.5.10-custom”
    • -path RUTA AL PHP CGI, es la localización al fichero binario PHP CGI. Esto se pude averiguar en la salida del comando make install, en la línea "installing PHP CBI binary". Por ejemplo si vemos la línea "installing PHP CGI binary: /usr/local/bin/", la localización que tenemos que indicar es "/usr/local/bin/php-cgi".
    • -phpini RUTA AL PHP.INI, es la localización del fichero php.ini. Por ejemplo "/usr/local/lib/php.ini
    • -type PHP HANDLER es el tipo de PHP handler asociado con esta versión. Los PHP handler que están soportados son: CGI y FastCGI. El mod_php no está soportado.
    • -id NN-CUSTOM (opcional), es el identificador que se usará para referirse a esta versión PHP cuando se ajuste o cuando se borre.

      Ejemplo:
      /usr/local/psa/bin/php_handler --add -displayname 5.5.10 -path /usr/local/php-5.5.10/bin/php-cgi -phpini /usr/local/lib/php.ini -type fastcgi -id 5.5.10

NOTA IMPORTANTE: Aunque habría que hacer más comprobaciones para estar seguro, parece que si habilitamos como PHP handler al módulo de Apache en lugar del FastCGI, no se producen tantos desbordamientos de momeria. Esta configuración es para la versión de PHP existente por defecto en el servidor VPS, es decir la 5.4.4.

Crear paquetes .deb a partir de código fuente

Además de las dependencias específicas de cada programa, lo que necesitamos para poder crear los paquetes .deb es lo siguiente:

# apt-get install dh-make devscript fakeroot build-essential

Para este ejemplo vamos a compilar Gimp a partir de los fuentes y crear el paquete .deb.

$ mkdir gimp-deb
$ cd gimp-deb
$ tar -xvjf gimp-2.8.14.tar.bz2
$ cd gimp-2.8.14
$ dh_make -e email@localhost

En lugar de email@localhost se puede poner cuaquier otro correo.

El comando anterior nos pregunta que tipo de paquete deseamos crear y nos da varias opciones. En este caso tenemos que escoger la opción single s

$ ./configure

Si todo ha ido bien, la configuración terminará sin errores. Si se muestra alguno debido a dependencias incumplidas, ver cuales son, instalarlas y volver a repetir el proceso hasta que termine sin errores.

$ dpkg-buildpackage -rfakeroot

El proceso es posible que nos haga algunas preguntas, respondemos lo que nos interese y después de un tiempo, si no hay errores, creará en la carpeta superior el archivo .deb, junto con los fuentes.

Cliente de correo para consola Mutt.

$ echo “Este es el texto del mensaje” | mutt -s “Asunto del correo” destinatario@correo.com

- Para enviar uno o varios archivos adjuntos.

$ echo “Texto del mensaje” | mutt -s “Asunto” destinatario@correo.com -a fichero.txt imagen.jpg

- Para enviar con copia CC.

$ echo “Texto del mensaje” | mutt -s “Asunto” destinatario@correo.com -c otromail@mail.com

- Escribir el cuerpo del email con el comando echo es útil cuando el texto es de una línea, pero sino se hace complicado y demasiado largo para una sola línea de comandos. En este caso lo mejor es no usar echo. Mutt nos abrirá el editor de textos que tengamos predefinido en consola y podremos componer el mensaje con más comodidad, guardamos el texto y se abrirá el interfaz de mutt. Pulsamos “y” para enviar.

$ mutt -s “Asunto” destinatario@correo.com -c otromail@mail.com

Copias de seguridad y restauración en PostgreSQL

En primer lugar hay que cambiar al usuario postgres u otro con los permisos adecuados para la base de datos que deseamos manejar. En este caso el usuario alberto tiene permisos totales sobre la base de datos costtes01.

Para hacer un backup de una base de datos:

$ su postgres

postgres@debian:/$ pg_dump [conexión] [opciones] basededatos > ficherobackup

Cuando hacemos el backup con el usuario postgres, debemos hacer la copia en el directorio temporal /tmp, después como usuario postgres le cambiamos el propietario, y finalmente con nuestro propio usuario la movemos a nuestra carpeta de copias de seguridad.

Ejemplo donde el usuario actual ya tiene privilegios en la base de datos:

$ pg_dump -v -F custom -d costtes02 -f costtes02-20150717-1.backup

Las opciones de conexión pueden ser estas:

-h, --host=hostname Indica el nombre de la máquina donde corre el servidor Postgresql.

-p, --port=port Indica el puerto, por defecto es 5432.

-U, --username=username Indica el usuario con el que se conectará. Como ya hemos abierto sesión en consola con el usuario postgres, no es necesario volver a introducirlo.

-W, --password Fuerza a pg_dump a solicitar la contraseña de usuario.

-w, --no-password No solicita contraseña de usuario. Se suele poner cuando la contraseña ya se envía por otros medios. Como en este caso donde ya se ha iniciado sesión con el usuario postgres.

Donde tenemos las siguientes opciones:

-v, --verbose Habilita la salida detallada en pantalla.

-a, --data-only Hace un backup solo de los datos y no del esquema.

-c, --clean Incluye en el backup instrucciones para eliminar los elementos antes de restaurarlos. De esta forma se evitan los errores de que los elementos ya existen cuando se restauran.

-C, --create Incluye las instrucciones para crear la base de datos. Esto es útil si pretendemos restaurar un crear la base de datos al mismo tiempo.

-f <archivo>, --file=<archivo> Escribe la salida en el archivo especificado, si no se indica nada se envia el volcado a la salida estándar.

-F <formato>, --format=<formato> Especifica el formato de salida. Los tipos de formato pueden ser:

p, plain Texto plano.

c, custom Formato personalizable. En este tipo de formato siempre se hace compresión.

t, tar Crea una salida en formato tar.

-n <nombre_esquema>, --schema=<nombre_esquema> Realiza la copia unicamente de los esquemas indicados junto con todos los objetos que contengan. Si no se indica nada se hace el dump de todos los esquemas que no sean del sistema. Para incluir múltiples esquemas se pueden tantas opciones -n como sean necesarias.

-N <nombre_esquema>, --exclude-schema=<nombre_esquema> Omite los esquemas indicados a la hora de realizar el backup. Si se desea excluir múltiples esquemas, se pueden añadir tantas opciones -N como sean necesarias.

-s, --schema-only Hace el backup solo del esquema, no incluye los datos.

-t <nombre_tabla>, --table=<nombre_tabla> Hace un backup solo de la tabla indicada. Si se desean incluir múltiples tablas, se pueden añadir tantas opciones -t como sean necesarias. Hay que tener en cuenta que pg_dump no tiene en cuentas las dependencias, por tanto se ha de prestar atención en incluir todas las tablas necesarias y que tengan realación con llaves primarias o foráneas y así garantizar que la posterior restauración se hace exitosamente.

-T <nombre_tabla>, --exclude-table=<nombre_tabla> Exluye del backup las tablas indicadas. Se pueden añadir tantas opciones -T como sean necesarias.

--inserts Utilizará inserts en lugar de copy en las instrucciones SQL.

--port=<puerto> Especifica el puerto. Por defecto es 5432.

Para restaurar una base de datos usando pg_restore

Atención. pb_restore solo debe usarse con los backups creados con pg_dump usando la opción de formato personalizable -F c

pg_restore [opciones] [archivo]

Opciones generales:

-d, --dbname=NOMBRE nombre de la base de datos a la que conectarse

-f, --file=ARCHIVO nombre del archivo de salida

-F, --format=c|d|t formato del volcado (debería ser automático)

-l, --list imprime una tabla resumida de contenidos del archivador

-v, --verbose modo verboso

--help muestra esta ayuda y termina

--version muestra información de la versión y termina

Opciones que controlan la recuperación:

-a, --data-only reestablece sólo los datos, no el esquema

-c, --clean tira (drop) la base de datos antes de recrearla

-C, --create crea la base de datos de destino

-e, --exit-on-error abandonar al encontrar un error por omisión, se continúa la restauración

-I, --index=NOMBRE reestablece el índice nombrado

-j, --jobs=NUM máximo de procesos paralelos para restaurar

-L, --use-list=ARCHIVO usa la tabla de contenido especificada para ordenar la salida de este archivo

-n, --schema=NAME reestablece sólo los objetos en este esquema

-O, --no-owner no reestablece los dueños de los objetos

-P, --function=NOMBRE(args) reestablece la función nombrada

-s, --schema-only reestablece el esquema únicamente, no los datos

-S, --superuser=NOMBRE especifica el nombre del superusuario que se usa para deshabilitar los disparadores (triggers)

-t, --table=NOMBRE reestablece la tabla nombrada

-T, --trigger=NOMBRE reestablece el disparador (trigger) nombrado

-x, --no-privileges no reestablece los privilegios (grant/revoke)

-1, --single-transaction reestablece en una única transacción

--disable-triggers deshabilita los disparadores (triggers) durante el restablecimiento sólo de datos

--no-data-for-failed-tables no reestablece datos de tablas que no pudieron ser creadas

--no-security-labels no restaura etiquetas de seguridad

--no-tablespaces no vuelca asignaciones de tablespace

--use-set-session-authorization usa órdenes SET SESSION AUTHORIZATION en lugar de ALTER OWNER para reestablecer dueños

Opciones de la conexión:

-h, --host=ANFITRIÓN anfitrión de la base de datos o directorio del enchufe (socket)

-p, --port=PUERTO número del puerto de la base de datos

-U, --username=USUARIO nombre de usuario con el cual conectarse

-w, --no-password nunca pedir una contraseña

-W, --password fuerza un prompt para la contraseña (debería ser automático)

--role=ROLENAME hace SET ROLE antes de restaurar

Si no se especifica un archivo de entrada, se usa la entrada estándar.

Soluciones para búsquedas en Postresql ignorando acentos.

Solución 1: Crear una función que intercambie las vocales acentuadas por su homólogas sin acento.

CREATE OR REPLACE FUNCTION sp_ascii(character varying)

RETURN text AS $BODY$

SELECT TRANSLATE

($1,

'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇ',

'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcC');

$BODY$

LANGUAGE 'sql';

Solución 2. Usar la extensión unaccent que viene dentro del paquete postgresql-contrib.

- Instalamos el paquete contrib.

# apt-get install postgresql-contrib

- Como root nos cambiamos al usuario postgres, nos situamos en la base de datos donde queremos instalar la extensión y la instalamos.

# su - postgres

postgres@envy:~$ psql basededatos

psql (9.1.13, servidor 9.1.14)

Digite «help» para obtener ayuda.

basededatos=# CREATE EXTENSION unaccent;

La extensión unaccent instalará en la base de datos indicada, un diccionario, una plantilla y cuatro funciones.

Un uso habitual de la funcion unaccent es el siguiente:

SELECT * FROM articulos

WHERE unaccent(descripcion) ILIKE unaccent('%sillon%')

Esta consulta buscará en la tabla “articulos” todos los registros, donde el campo “descripcion” contenga la palabra “sillon”, ignorando los acentos. Como además usamos ILIKE, la consulta ignorará también mayúsculas y minúsculas. Al utilizar los comodiles %, la consulta buscará la cadena “sillon” en cualquier parte del campo.

Configurar phpmyadmin en virtualmin.

Cuando se instala Virtualmin, por defecto configura los virtual servers para que ejecuten los scripts php usando fcgi. Esto se hace para aumentar la seguridad, ya que así los scripts se ejecutaran con el usuario de cada virtual server, no afectanto a los demás. Si se usara el módulo mod_php todos los scripts se ejecutarían desde el usuario de apache www-data lo cual siempre es más peligroso.

Sin embargo esto supone un problema cuando instalamos phpmyadmin, ya que por defecto presupone que php se ejecutará desde el módulo mod_php y no desde fcgi. Si intentamos lanzar phpmyadmin justo después de instalarlo, apache no ejecutará los ficheros php y se limitará a abrirlos como texto plano.

Para hacer que phpmyadmin corra usando el módulo mod_fcgi hay que editar el archivo de configuración /etc/phpmyadmin/apache.conf y añadir lo siguiente:

<Directory /usr/share/phpmyadmin>

...

Options +ExecCGI

...

<IfModule mod_fcgid.c>

AddHandler fcgid-script .php

FCGIWrapper /ruta_servidor/fcgi-bin/php5.fcgi .php

AllowOverride All

Order allow,deny

allow from all

</IfModule>

...

</Directory>

ruta_servidor en un entorno virtualmin suele ser siempre /home/nombre_servidor

Virtualmin añade el archivo php5.fcgi cuando creamos el servidor virtual.

El contenido del archivo php5.fcgi será algo parecido a esto:

#!/bin/bash

PHPRC=$PWD/../etc/php5

export PHPRC

umask 022

export PHP_FCGI_CHILDREN

PHP_FCGI_MAX_REQUESTS=99999

export PHP_FCGI_MAX_REQUESTS

SCRIPT_FILENAME=$PATH_TRANSLATED

export SCRIPT_FILENAME

exec /usr/bin/php5-cgi

Hay que notar que en esto caso los archivos de configuración de php5 usados son los que hay dentro de cada servidor virtual “$PWD/../etc/php5” y no los que genéricos de /etc/php5.

También hay que tener en cuenta que Virtualmin modifica las ruta de los scripts ejecutables por el módulo mod_suexec, que normalmente es /var/www, pero que este caso se cambia por /home. El fichero de configuracion es /etc/apache2/suexec/www-data

Streamripper con retransmisión de la pista en red local

Esto sirve para grabar en un directorio la música que que capturamos desde una url determinada, y al mismo tiempo la retransmitimos por un puerto para que cualquiera en la red local pueda reproducirla.

streamripper url-o-direccion-ip -r 9000 -d /directoriobase -D “%q - %A - %T”

Donde:

url-o-direccion-ip Es la url o dirección ip de la emisora (P. ej: listen.cinemix.fr)

-r 9000 Es el número de puerto de retransmisión.

-d /directoriobase Es el directorio donde se grabarán las pistas (P. ej: /mnt/datos1/Musica/Cinemix)

-D “%q - %A - %T”Es el patrón utilizado para el nombre de la pista.

%q = número secuencial.

%A = artísta.

%T = título de la pista.

Reset del error 6C10 en la impresora Canon Pixma iP3600

Con este procedimiento lo que hacemos es resetear el contador del absorvedor de tinta de limpieza.

Referencia: http://www.fixkb.com/2011/06/reset-canon-printer-ink-absorber.html

Vídeo que explica las razones del error 6C10 y como solucionarlo: http://www.youtube.com/watch?v=-0tb07N1dIo

VMware 11 en sistemas Debian Testing (stretch)

Es posible que VMware Workstation 11 no arranque correctamente con la nueva versión testing de Debian. Eso es porque hay algun que otro problema con las versiones de algunas librerías. Para que arranque hay que ejecutar el siguiente comando:

$ /usr/lib/vmware/bin/launcher.sh /usr/lib/vmware/lib /usr/lib/vmware/bin/vmware /usr/lib/vmware/libconf

La acceleración 3D no funciona correctamente en guest con sistemas Windows 7 de 64 bits (no he probado en otros). Para que funcione es necesario editar el archivo .vmx de la máquina virtual y añadir al final la siguiente línea:

[...]

mks.gl.allowBlacklistedDrivers = “TRUE”

ACTUALIZACIÓN: Con la versión de VMware 12 no es necesario lanzar las librerías específicas de VMware.

VMware 11 no carga correctamente los módulos del kernel al iniciar el servicios

El problema ocurre cuando intentamos arrancar una máquina virtual y nos indica que no se encuentran cargados los módulos vmmon, vmnet y vmci. Sin embargo estos módulos se compilan correctamente y se pueden encontrar en /lib/modules/$(uname -r)/misc.

Cuando compilamos los módulos, el proceso se realiza correctamente pero optenemos el siguiente resultado al intentar cargarlos al final de la compilación:

# vmware-modconfig --console --install-all

[...]

Starting VMware services:

Virtual machine monitor done

Virtual machine communication interface failed

VM communication interface socket family failed

Blocking file system done

Virtual ethernet done

VMware Authentication Daemon done

Unable to start services

Indica que falla la carga del Virtual machine communication interface (vmci) y el VM communication interface socket family (vsock).

Si intentamos iniciar manualmente el servicio vmware vemos que devuelve un error.

# systemctl start vmware

Job for vmware.service failed. See 'systemctl status vmware.service' and 'journalctl -xn' for details.

La salida del systemctl status vmware es:

# systemctl status vmware

● vmware.service - LSB: VMware VMX service for virtual machines

Loaded: loaded (/etc/init.d/vmware)

Active: failed (Result: exit-code) since vie 2015-06-26 19:51:03 CEST; 1min 10s ago

Docs: file:///etc/insserv/overrides/vmware

Process: 6510 ExecStart=/etc/init.d/vmware start (code=exited, status=1/FAILURE)

jun 26 19:51:03 debian vmware[6510]: Starting VMware services:

jun 26 19:51:03 debian vmware[6510]: [33B blob data]

jun 26 19:51:03 debian vmware[6510]: [50B blob data]

jun 26 19:51:03 debian vmware[6510]: [51B blob data]

jun 26 19:51:03 debian vmware[6510]: [30B blob data]

jun 26 19:51:03 debian vmware[6510]: [26B blob data]

jun 26 19:51:03 debian vmware[6510]: [38B blob data]

jun 26 19:51:03 debian systemd[1]: vmware.service: control process exited, code=exited status=1

jun 26 19:51:03 debian systemd[1]: Failed to start LSB: VMware VMX service for virtual machines.

jun 26 19:51:03 debian systemd[1]: Unit vmware.service entered failed state.

Y si ejecutamos journalctl -xn obtenemos lo siguiente:

# journalctl -xn

-- Logs begin at vie 2015-06-26 19:39:57 CEST, end at vie 2015-06-26 19:51:03 CEST. --

jun 26 19:51:03 debian kernel: vmw_vsock_vmci_transport: Unknown symbol vmci_event_unsubscribe (err -22)

jun 26 19:51:03 debian kernel: vmw_vsock_vmci_transport: disagrees about version of symbol vmci_get_context_id

jun 26 19:51:03 debian kernel: vmw_vsock_vmci_transport: Unknown symbol vmci_get_context_id (err -22)

jun 26 19:51:03 debian vmware[6510]: [51B blob data]

jun 26 19:51:03 debian vmware[6510]: [30B blob data]

jun 26 19:51:03 debian vmware[6510]: [26B blob data]

jun 26 19:51:03 debian vmware[6510]: [38B blob data]

jun 26 19:51:03 debian systemd[1]: vmware.service: control process exited, code=exited status=1

jun 26 19:51:03 debian systemd[1]: Failed to start LSB: VMware VMX service for virtual machines.

-- Subject: Unit vmware.service has failed

-- Defined-By: systemd

-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

--

-- Unit vmware.service has failed.

--

-- The result is failed.

jun 26 19:51:03 debian systemd[1]: Unit vmware.service entered failed state.

SOLUCCIÓN:

El error lo localizamos en el script que lanza el servicio vmware, /etc/init.d/vmware. Incomprensiblemente las funciones que se encargan de cargar y descargar los módulos del kernel, llaman a estos por un nombre que no es el correcto. Por lo tanto editamos el script y hacemos los siguientes cambios:

# nano /etc/init.d/vmware

- Buscamos la función vmwareStartVmci() y cambiamos la línea que pone:

vmwareLoadModule “$mod” por vmwareLoadModule “$vmci”

- Buscamos la función vmwareStopVmci() y cambiamos la línea que pone:

vmwareUnloadModule “${mod}” por vmwareUnloadModule “${vmci}”

- Buscamos la función vmwareStartVsock() y cambiamos la línea que pone:

vmwareLoadModule “$mod” por vmwareLoadModule “vsock”

- Buscamos la función vmwareStopVsock y cambiamos la línea que pone:

vmwareUnloadModule “$mod” por vmwareUnloadModule “$vsock”

Guardamos el fichero y ya podemos iniciar el servicio y cargará los módulos correctamente.

# systemctl start vmware

Para comprobar que los módulos están cargados.

# lsmod | grep -e vmmon -e vmnet -e vmci -e vsock

vmnet 50198 13

vmci 80223 0

vsock 30772 0

vmmon 81251 0

Parche para Vmware Workstation 11 y kernel 3.19 y superiores.

Vmware Workstation 11.1.0 y Player (Pro) 7.1.0, soportan solo hasta la versión de kernel 3.18. Cuando se intenta compilar el módulo vmnet sobre un kernel 3.19 o superior, la compilación falla.

Primero descargamos el parche.

$ curl http://pastie.org/pastes/9934018 -o /tmp/vmnet-3.19.patch

Cambiamos a la carpeta de los fuentes de Vmware y extraemos los fuentes del módulo vmnet.

$ cd /usr/lib/vmware/modules/source

# tar -xf vmnet.tar

Aplicamos el parche.

# patch -p0 -i /tmp/vmnet-3.19.patch

Volvemos a crear el archivo tar.

# tar -cf vmnet.tar vmnet-only

Borramos la carpeta vmnet-only

# rm -R *-only

Para finalizar compilamos los módulos

# vmware-modconfig --console --install-all

Referencias:

https://wiki.archlinux.org/index.php/VMware

VMWare 11/12 no arranca en sistemas con kernel 4.2

El problema sucede después de actualizar a la versión de kernel 4.2. Ni VMware Workstation ni VMPlayer son capaces de cargarse. Descartados los problemas habituales de compilación de los módulos para la versión del kernel. Hay que tener en cuenta que para la versión 12 no son necesarios parches.

Si miramos en el log de vmware, situado en /tmp/vmware-[usuario]/vmware-apploader-xxxxxx.log, vemos al final del archivo algo similar a lo siguiente:

[...]

2015-10-20T18:44:52.821+02:00| appLoader| W115: Unable to load libvmwareui.so from /usr/lib/vmware/lib/libvmwareui.so/libvmwareui.so: /usr/lib/vmware/lib/libvmwareui.so/libvmwareui.so: undefined symbol: _ZN4Glib10spawn_syncERKSsRKNS_11ArrayHandleISsNS_17Container_Helpers10TypeTraitsISsEEEENS_10SpawnFlagsERKN4sigc4slotIvNSA_3nilESC_SC_SC_SC_SC_SC_EEPSsSG_Pi

2015-10-20T18:44:52.821+02:00| appLoader| W115: Unable to load dependencies for /usr/lib/vmware/lib/libvmware.so/libvmware.so

2015-10-20T18:44:52.821+02:00| appLoader| W115: Unable to execute /usr/lib/vmware/bin/vmware.

Lo que nos indica que el problema está en la carga del módulo “libvmwareui.so”.

En la web de Techezone nos indican donde está el problema y como soluccionarlo.

http://www.techezone.com/question/ws-12-on-linux-undefined-symbol-in-libvmwareui-so/

Basicamente sucede que al instalar el kernel 4.2, se actualizan varios módulos, concretamente el módulo “libglibmm-2.4.so.1.3.0” que es incompatible con las versiones 11/12 de VMware. La solucción es borrar el enlace simbólico que apunta a este módulo y crear un nuevo enlace que apunte al módulo que está en el directorio de instalación de VMware. Los pasos son estos:

# rm /usr/lib/x86_64-linux-gnu/libglibmm-2.4.so.1

# ln -s /usr/lib/vmware/lib/libglibmm-2.4.so.1/libglibmm-2.4.so.1 /usr/lib/x86_64-linux-gnu/libglibmm-2.4.so.1

CUIDADO: Estamos sobreescribiendo un enlace simbólico a un módulo de una versión diferente. Se ha de estar muy seguro de que ninguna otra aplicación pueda necesitar la versión del sistema. Si se usa GNOME es probable que surgan problemas, mientras que si se utiliza KDE es menos problable que haya problemas. Aun así habrá que tener cuidado con las palicaciones GTK que corramos sobre KDE.

En caso de incompatiblidad con otros programas, se puede optar por crear un script que lance VMware y cambie el enlace y que lo vuelva a restaurar después de terminar la aplicación.

Optimizar NFS para un mayor rendimiento

- Opciones para el fichero /etc/exports:

Formato: directorio_compartido nombre_maquina(opciones)

Ejemplo:

/exports 192.168.0.0/24(rw,no_subtree_check,no_root_squash,crossmnt,fsid=0,sync)

directorio_compartido El directorio que se exportará por NFS.

nombre_maquina Máquinas de clientes autorizados, puede ser un nombre de máquina, una dirección IP o un rango de direcciones IP. 192.168.0.0/24 o 19.168.0.0:255.255.255.0 autorizan toda la red.

opciones Las diferentes opciones disponibles para el servidor NFS. Por ejemplo:

--------------------

rw/ro Exporta el directorio en modo lectura-escritura o solo lectura.

root_squash Mapea los requerimientos del UID/GID 0 (user root) al usuario anónimo (defecto)

no_root_squash No mapea root al usuario anónimo.

all_squash Mapea todos los usuarios al usuario anónimo.

subtree_check/no_subtree_check Si se exporta un subdirectorio, el servidor comprueba que el fichero solicitado esté en el arbol de directorios exportado (defecto no).

sync Modo síncrono. Requiere que todas las operaciones de escritura se completen antes de continuar (defecto).

async Modo asíncrono. No requiere que las escrituras se completen para continuar. Es más rápido pero puede provocar pérdida de datos ante una caida o apagado acidental del servidor.

secure Los requerimientos deben de provenir de un puerto por debajo de 1024.

insecure Los requerimientos pueden provenir de cualquier número de puerto.

fsid=0 Designa este path como la raíz de los directorios exportados por NFSv4.

crossmnt Permite que los directorios debajo de raíz se muestren adecuadamente. Alternativamente se puede poner la opción nohide en cada uno de esos directorios.

- Opciones de montaje para el cliente NFS:

Ejemplo de entrada en /etc/fstab

...

192.168.0.10:/ /mnt/dir_remoto nfs4 rw,user,noauto,dev,nosuid,rsize=1048576,wsize=1048576,hard,intr

...

Opciones:

rw Monta el directorio remoto en modo lectura-escritura.

user Permite que cualquier usuario, no solo root, pueda montar el directorio remoto.

auto/noauto El directorio remoto se monta o no se monta de forma automática al iniciar el sistema.

dev

nosuid

rsize/wsize Especifican el tamaño del datagrama utilizado por los clientes NFS cuando realizan peticiones de lectura (r) y escritura (w). El valor mínimo es 1024 y el máximo 1048576 (un megabyte). Se debe indicar en múltiplos de 1024. Si se indica un valor inferior a 1024, el servidor asigna automáticamente el valor de 4096. Si el valor indicado es mayor que el soportado por el servidor o cliente, entonces estas opciones se negocian a los valores máximos que soporten ambos.

hard El programa que acceda a un fichero en un sistema de ficheros montado por NFS, se colgará cuando el servidor falle. El proceso no puede interrumpirse ni matarse, a menos que uno también especifique la opción intr. Cuando el servidor NFS esté de nuevo disponible, el programa continuará por donde estuviera como si nada hubiera ocurrido. Esta es la opción más recomendable.

soft Esta opción permite al kernel esperar un rato y rendirse después, si el servidor NFS no responde durante un tiempo determinado. El tiempo se puede especificar con la opción timeo=x. Esta opción podría ser de utilidad si el servidor NFS no respondierá a veces, o si fuera rearrancado mientras algún proceso estuviera intentando obtener un fichero de el. Esta opción normalmente dará muchos problemas.

intr/nointr Selecciona si se permiten señales para interrumpir las operaciones de archivos en este punto de montaje. Si no se especifica ninguna opción (o si se especifica nointr), las señales no interrumpen las operaciones de archivos NFS. Si se especifica intr, llamadas al sistema devuelven EINTR si una operación NFS en curso es interrumpida por una señal. Estas opciones están obsoletas desde el kernel 2.6.25 (solo para NFSv4).

Ejemplo de montaje desde la línea de comandos:

# mount -t nfs4 192.168.0.10:/ /mnt/remoto -o rsize=1048576,wsize=1048576,hard,intr

Para más información ver las entradas del manual nfs(5), exports(5)

EDIT: He leido que puede mejorar el rendimiento de NFS con ficheros grandes (de varios GB) y también evitar cuelgues del cliente, si se usa la versión 3 de NFS en lugar de la 4. Para ello sería necesario indicar en el montaje -t nfs y en las opciones añadir nfsvers=3

No lo he probado todavía.

Se pueden modificar el número de threads que el servidor NFS puede procesar, lo que aumentará ligeramente el rendimiento. Para ello editamos /etc/default/nfs-kernel-server y cambiamos el valor de RPCNFSDCOUNT de 8 a 32.

# Number of servers to start up

RPCNFSDCOUNT=32

[...]

Enlaces interesantes:

https://wiki.archlinux.org/index.php/NFS/Troubleshooting#Performance_issues

http://www.slashroot.in/how-do-linux-nfs-performance-tuning-and-optimization

http://www.cyberciti.biz/faq/nfs4-server-debian-ubuntu-linux/

http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch29_:_Remote_Disk_Access_with_NFS#Troubleshooting_NFS

http://nfs.sourceforge.net/nfs-howto/

Solución al problema de las fotos en Google Earth 7.x.x

El problema está en esta versión de Google Earth y la compatibilidad de las librerías QT que trae el propio programa. La solución al problema la encontré en la web lamiradadelreplicante.com donde el autor 'tannhausser' publica la solución que el a su vez encontró en el foro de OpenSuse, del usuario Amirpli.

La solución original de Amirpli está orientada a OpenSuse y tannhausser la adapto para aplicarla a Gecko. Yo lo que he hecho es adaptar esta solución a Debian Stretch. Tan solo hay que cambiar algunas rutas y los nombres de algunas librerías necesarias.

Descargamos la última versión estable desde la web de Google Earth. En mi caso es la versión de 64 bits.

Si tenemos una versión previa instalada, antes tenemos que desinstalarla, si quedara rastro de la carpeta de instalación también la borramos junto con su contenido y como usuario borramos todos los archivos de configuración para evitar posibles problemas.

# apt-get purge google-earth-stable

# rm -R /opt/google/earth

$ rm -R $HOME/.googleearth $HOME/.config/Google

Instalamos Google Earth.

# dpkg -i google-earth-stable_current_amd64.deb

Como mi entorno de escritorio es KDE, la mayoría de las librerías QT ya están instaladas, en caso contrarío habría que instalarlas también. En mi caso solo tuve que instalar o comprobar que estuvieran instaladas las siguientes. También necesitamos el compilador gcc.

# apt-get install libfreeimage3 libqtwebkit4 libqt4-dev gcc

Nos situamos en la carpeta de instalación de Google Earth, creamos una nueva carpeta y movemos a ella las librerías QT originales que se instalan con el programa.

# cd /opt/google/earth/free

# mkdir originales-qtlib

# mv libQt* originales-qtlib

Sin salirnos de la carpeta de instalación de Google Earth, creamos un archivo c++ llamado baifaao.cpp y escribimos dentro el siguiente código.

# nano baifaao.cpp

/* amirpli 2013/11/28 */

#include <QtCore/QAtomicInt>

extern "C" {

int _Z34QBasicAtomicInt_fetchAndAddOrderedPVii(QAtomicInt *a, int b) {

return a->fetchAndAddOrdered(b);

}

}

A continuación compilamos el código.

# gcc -I/usr/include/qt4 -O3 -fPIC --shared baifaao.cpp -o baifaao.so

Si todo va bien obtendremos el archivo faifaao.so en la carpeta de instalación de Google Earth.

A continuación debemos modificar el script de inicio llamado googleearth que hay enl a carpeta de instalación del programa.

# nano googleearth

Nos desplazamos hacia el final del script y añadimos debajo de la línea “cd $script_path;” la siguiente línea:

“export LD_PRELOAD=/usr/lib/libfreeimage.so.3:/opt/google/earth/free/baifaao.so”

[...]

script_path=$(FindPath $0);

cd $script_path;

export LD_PRELOAD=/usr/lib/libfreeimage.so.3:/opt/google/earth/free/baifaao.so

LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./googleearth-bin "$@"

Con esto ya podemos lanzar el programa y debería funcionar todo correctamente, mostrando sin problemas las fotos de Panoramio entre otras. Gracias a Amirpli por la solución y a tannhausser por plublicarla perfectamente explicada en su web.

Referencias:

http://lamiradadelreplicante.com/2014/07/11/solucion-al-problema-de-las-fotos-de-panoramio-en-google-earth/#comment-45338

http://forums.opensuse.org/showthread.php/485283-Google-Earth-7/page6

Operaciones con archivos de audio y vídeo

$ mencoder -oac copy -ovc copy -o videofinal.mp4 video1.mp4 video2.mp4 ...

$ mencoder -oac mp3lame -ovc x264 videoentrada.avi -o videosalida.mp4

$ ffmpeg -i audio-entrada.ac3 -acodec libmp3lame -ar 48000 -ab 256k -ac 2 audio-salida.mp3

$ ffmpeg -i audio-entrada.dts -acodec ac3 -ac 6 -ab 448k audio-salida.ac3

Donde:

-ac Indica los canales de audio. En este caso son 6 canales, es decir 5.1.

-ab Indica el bitrate del archivo de salida. En este caso serán 448 Kb/s.

$ ffmpeg -i “concat:audio-1.mp3|audio-2.mp3|...|audio-n.mp3” -acodec copy audio-salida.mp3

$ ffmpeg -i video-entrada -vcodec copy -acodec copy -ss 1 -t 3600 video-salida

Donde:

-ss 1 Indica el inicio de la extración en segundos. En este caso desde el segundo 1.

-t 3600 Indica el número de segundos que serán extraidos. En este caso 3600 segundos = 1 hora.

$ ffmpeg -f alsa -i plughw:0,0 -acodec mp3 -f X11grab -s 1920x1080 -r 25 -i :0.0 -s hd1080 -qscale 0 video.mp4

Donde:

1920x1080 Indica el tamaño de la pantalla que se va a grabar, puede ser toda o un area.

hd1080 Indica la resolución del vídeo de salida.

qscale 0 Indica que se mantenga el factor de escala.

plughw:0,0 Indica la tarjeta de audio usada para entrada de audio.

Tutorial de ffmpeg

La estructura básica del comando es la siguiente.

ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file} ...

mode Indica el modo de interlace a adoptar.

parity La paridad de campo asumida por el vídeo interlazado.

0, tff

1, bff

-1, auto (valor por defecto)

deint Especifica que marcos se desentrelazarán.

0, all (valor por defecto)

1, interlaced

filename, f Establece el nombre del fichero de imagen bitmap que se usará. Para crear esta imagen lo adecuado es hacer una captura de pantalla del vídeo u después editarlo con un programa como Gimp. Se hace una selección de la zona donde va el logo y se rellenadicha selección de color blanco, el resto de la imagen se rellena de negro. Se guarda el fichero en cualquiera de los formatos de imagen soportados por libavformat (jpg, png, bmp, etc).

iw, in_wEstablece el ancho de entrada

ih, in_hEstablece la altura de entrada

xLa posición horizontal, en el vídeo de entrada, del eje izquierdo del vídeo de salida

yLa posición vertical, en el vídeo de entrada, del eje superior del vídeo de salida

Ejemplos:

- Recorta un area con un tamaño de 100x100 en la posición 12,34

crop=100:100:12:34

crop=w=100:h=100:x=12:y=34

- Recorta el area central de la entrada con un tamaño de 100x100

crop=100:100

- Recorta 10 píxeles desde los bordes derecho e izquierdo, y 100 píxeles desde los bordes superior e inferior

crop=iw-2*10:ih-2*100

Donde: iw-2*10 significa que al ancho actual de la entrada (iw) se le resta 10 a cada lado (2*10) y al alto actual (ih) se le restan 100 arriba y 100 abajo (2*100)

scale Cambia el tamaño del vídeo de entrada, usando la librería libswscale. Esta es una mejor alternativa a la opción -s. Algunas opciones son:

w, width Establece la expresión que indica el ancho del vídeo de salida

h, height Establece la expresión que indica el alto del vídeo de salida

Ejemplos:

- Indica un tamaño del vídeo de salida de 1280x720

scale=1280:720

scale=w=1280:h=720

- Indica un ancho de 1920 y deja que ffmpeg decida el alto manteniendo la proporción de la entrada

scale=1920:trunc(ow/a/2)*2

Donde: ow es el ancho del vídeo de salida (1920), a es la proporción (iw/ih), trunc coge unicamente la parte entera de la operación entre paréntesis

Ejemplos de utilización de ffmpeg

ffmpeg -f image2 -framerate 12 -i foto-%02d.jpg -s 720x576 video_fotos.mp4

Sintaxis:

-f image2 Fuerza el formato de los fichero de entrada como imagen

-i foto-%02d.jpg Indica que la entrada la forman un grupo de imágenes cuyo nombre empieza por “foto-” seguido por un número de secuencia compuesto por dos dígitos que pueden tener un cero a la izquierda.

-framerate Establece el número de cuadros por segundo. Por defecto es 25

ffmpeg -i input_video.ts -vf "yadif, removelogo=f=logo.png, crop=in_w-2*1:in_h-2*138, scale=1920:trunc(ow/a/2)*2" -c:v libx264 -b:v 3000000 -c:a libfaac -ac 2 -b:a 128000 propo1.mp4

time ffmpeg -i video-entrada.ts -vf “yadif, scale=720:trunc(ow/a/2)*2” -c:v libx264 -b:v 1125000 -c:a libfdk_aac -b:a 128k video-salida.mp4

time ffmpeg -i video-entrada.ts -vf “yadif, scale=1024x576” -c:v libx264 -b:v 1120k -c:a libfdk_aac -b:a 128k video-salida.mp4

Pulseaudio sube bruscamente el volumen al máximo

El problema se produce cuando abrimos una aplicación que usa el sistema de sonido, si esa aplicación está configurada para tener el volumen al máximo, Pulseaudio sube el volumen maestro al máximo para todas las demás aplicaciones.

Por defecto el comportamiento de Pulseaudio es igualar todos los niveles de sonido, por lo tanto para evitar esta molesta situación, hay que editar el archivo “/etc/pulse/daemon.conf” y configurar el parámetro “flat-volumes = no”.

# nano /etc/pulse/daemon.conf

[...]

flat-volumes = no

[...]

Modificar “system.dat” de Android 5.x

Descargar las herramientas necesarias en una carpeta incluida en el path, por ejemplo $HOME/bin.

make_ext4fs

rimg2sdat

sdat2img

sefcontext-tools

Les damos permisos de ejecución.

$ chmod +x make_extfs rimg2sdat sdat2img

Extaemos la rom desde el archivo zip.

$ unzip rom-original.zip -d nombredir

Donde:

rom-original.zip es la rom que queremos extraer.

nombredir es el directorio donde se extraerán los ficheros, si no existe se crea.

Nos cambiamos a la carpeta “nombredir” y extraemos la imagen de system desde el archivo system.new.dat

$ sdat2img.py system.transfer.list system.new.dat system.img

Creamos una carpeta de trabajo y montamos la imagen de system.img.

$ mkdir systemdev

# mount -t ext4 -o loop system.img systemdev/

Con esto tendremos dentro de systemdev todo el contenido de system, para poder editar y modificar todo lo necesario.

Para crear la nueva imagen “system.img”.

A partir de la versión 7.X.X (Nougat), el archivo file_contexts pasa a ser un archivo binario compilado (file_contexts.bin). Para poder crear la nueva imagen usando la herramienta make_ext4fs, necesitamos convertirlo primero a texto. Para ello usamos la herramienta sefcontext de la siguiente manera:

$ sefcontext -o file_context file_context.bin

Una vez obtenido el fichero “file_context” ya podemos crear la imagen.

# /home/alberto/bin/make_ext4fs -T 0 -S file_contexts -l 1073741824 -a system system_new.img systemdev/

Con ello obtendremos un nuevo archivo llamado system_new.img.

Nota. Como las herramientas las hemos guardado en la carpeta bin de nuestro $HOME, al ejecutar make_ext4fs como root debemos indicar la ruta completa. Otra opción sería copiar las herramientas a /usr/local/bin.

Creamos el nuevo .dat a partir del .img anterior.

$ rimg2sdat system_new.img

Nota. El comando anterior nos crea unos nuevos “system.new.dat” y “system.transfer.list”, reemplazando los archivos originales, por lo que no es mala idea previamente hacer un backup de los mismos por si algo saliera mal.

Para finalizar solo queda añadir al archivo .zip de la rom original, los nuevos archios creados: file_contexts, system.new.dat, system.patch.dat y system.transfer.list.

$ zip -r ../rom-original.zip file_contexts system.new.dat system.patch.dat system.transfer.list

Abrir aplicaciones GTK2 y GTK3 con un tema diferente al predeterminado

En ocasiones puede ser necesario abrir una determinada aplicacion GTK con un tema distinto al que tenemos asigando por defecto. Por ejemplo, la versión 0.91 de Inkscape no se lleva bien con el tema Oxygen-gtk.

Para ello debemos editar la orden que lanza el programa y añadir la variable para que cargue el tema que nosotros queramos. Por ejemplo:

env GTK2_RC_FILES=/usr/share/themes/gnome-breeze-master/gtk-2.0/gtkrc /usr/bin/inkscape %F

Arrancará Inkscape usando el tema gnome-breeze-master. Como Inkscape usa las librerías gtk 2, le indicamos que cargue el gtkrc para esta librería. En el caso de que la aplicación use las liberías gtk 3, hay que indicar el directorío gtk-3.0 en lugar de gtk-2.0.

Copia de seguridad completa del servidor VPS usando como almacenamiento MEGA

Con este procedimiento haremos una copia completa de todo el sistema y los datos de un servidor VPS. Una vez obtengamos el fichero comprimido con el backup, lo pasaremos al almacenamiento en la nube de Mega.

  1. Instalar programas necesarios.

    El primer paso es instalar en nuestro servidor VPS todo lo necesario para poder hacer la copia. Vamos a crear un fichero tar comprimido con gzip, una vez creado lo vamos a cifrar usando openssl enc y finalmente lo vamos a transferir a nuestro almacenamiento Mega. Tar y gzip ya estarán instalados y es de suponer que openssl y enc también, nos falta por instalar en nuestro servidor el programa que nos permitira conectar con el servidor Mega.

    El programa necesario es megacmd. Podemos descargar los fuentes y compilarlo desde la web del autor.

    # cd /tmp

    # wget https://github.com/t3rm1n4l/megacmd/archive/master.zip

    Descomprimimos el archivo megacmd-master.zip, lo compilamos y lo copiamos en /usr/local/bin.

    # unzip megacmd-master.zip

    # cd megacmd-master

    # make

    # cp megacmd /usr/local/bin

    NOTA: En Debian 7 existe un problema con la versión de golang-go necesaria para poder compilar, ya que requiere una versión superior. Se puede soluccionar esto instalando golang-go desde los repositorios de Testing o también se puede compilar en otro PC y después copiar directamente el binario al VPS, ya que solo se requiere el binario para funcionar. Eso si, ha de estar compilado en la misma arquitectura.

    Ahora tenemos que crear el archivo .megacmd.json en el home del usuario. Como estamos en el VPS lo vamos a crear para el usuario root.

    # nano /root/.megacmd.json

    Escribimos el siguiente contenido:

    {

    "User" : "USUARIO_MEGA",

    "Password" : "PASSWORD_DE_USUARIO_MEGA",

    "DownloadWorkers" : 4,

    "UploadWorkers" : 4,

    "SkipSameSize" : true,

    "Verbose" : 1

    }

    A continuación probamos si funciona, para ello ejecutamos lo siguiente:

    # megacmd list mega:/

    Deberíamos obtener la lista de los archivos y directorios que hay en la raiz de nuestro sitio Mega.

    Si no la tenemos ya creada, podemos crear una carpeta para almacenar nuestras copias. Por ejemplo:

    # megacmd mkdir mega:/backup_vps

    Con esto ya deberíamos tener todo lo necesario, lo siguiente es crear las copias, cifrarlas y pasarlas a Mega.

  2. Hacer copia de seguridad.

    Vamos a hacer una copia de seguridad de todo el sistema, incluyendo las carpetas de usuario, email, páginas web, etc. En la copia no vamos a incluir las carpetas /dev, /proc y /sys, ni tampoco los sockets que abren los servidores de Apache y Postfix. Esta copia de seguridad completa nos permitirá en caso de desastre restaurar el servidor al estado anterior, es decir haremos un snapshot del servidor.

    Una buena práctica siempre que se pueda, es detener los servicios y servidores que modifican ficheros, para evitar que estos cambien durante el proceso de copia. Lo ideal sería detenerlos a un horario que no afecte al funcionamiento del servidor, es decir de madrugada, por lo que es casi obligado crear unas reglas de cron para hacerlo automáticamente.

    Los servicios que deberían detenerse podrían ser estos: apache2, bind9, postgresql, mysql, rsyslog, webmin, usermin, postfix, dovecot, proftpd. Al terminar hay que acordarse de volver a iniciarlos.

    Creamos un archivo de texto /tmp/lista-sockets con la lista de los sockets abiertos por Apache y Postfix.

    # find /var /run -type s -print > /tmp/lista-sockets

    Si no la tenemos ya creada, vamos a crear una carpeta para poder trabajar llamada backup y nos cambiamos a ella.

    # mkdir /backup

    # cd /backup

    A continuación ya podemos crear el archivo .tar.gz con la copia completa, excluyendo lo comentado antes.

    tar -czpvf backuptotal-fecha-hora.tar.gz --exclude=/backup/* --exclude=/dev/* --exclude=/proc/* --exclude=/sys/* -X /tmp/lista-sockets / 2>error.log

    Donde:

    -czpvf Crea un tar, comprimido con gzip, preservando permisos, en modo verbose, en el fichero indicado.

    --exclude=/directorio/* Excluye de la copia unicamente el contenido de los directorios indicados, pero incluye el propio directorio (hay que poner al final el /*). En el caso de la carpeta /backup es necesario hacerlo para excluir de la copia el propio archivo .tar.gz del backup, de lo contrario se metería en un bucle muy poco recomendable.

    -X nombrefichero Excluye de la copia los ficheros y directorios indicados dentro de nombrefichero.

    2>error.log Dirigimos los mensajes de error generados hacia el fichero error.log.

  1. Cifrar el archivo de copia de seguridad.

    Después de crear el archivo .tar.gz de la copia de seguridad, vamos a cifrarlo para evitar que nadie puede ver su contenido. Esta fase podría evitarse si el archvio lo descargamos a nuestro PC local, pero cuando se almacena en la nube, es importante tomar todas las medidas posibles para intentar proteger su contenido.

    Para cifrar el archivo vamos a usar openssl enc y cifraremos usando aes256, por lo que si aun no está instalado en el servidor hemos de instlarlo. Aquí damos por supuesto que ya lo tenemos instalado y configurado.

    El cifrado con openssl consiste en utilizar una contraseña o frase para cifrar con aes256. La contraseña puede ser todo lo larga que se quiera, es recomendable no utilizar palabras que vengan en el diccionario, ya que podrían ser fácilmente descubiertas por fuerza bruta. Lo mejor es usar combinaciones de letras mayúsculas y minúsculas, números y todo tipo de caracteres especiales. La contraseña se puede pasar también desde un fichero.

    Para cifrar introduciendo la contraseña manualmente:

    # openssl enc -e -aes256 -in backuptotal-fecha-hora.tar-gz -out backuptotal-fecha-hora.bc

    Nos pedirá la contraseña, que debemos introducir dos veces.

    Para cifrar pasando la contraseña desde el archivo oculto .keyfile:

    # openssl enc -kfile /root/.keyfile -e -aes256 -in backuptotal-fecha-hora.tar.gz -out backuptotal-fecha-hora.bc

    Importante: La opción -kfile toma la contraseña de la primera línea del fichero .keyfile.

    Nota: La extensión del archivo cifrado puede ser cualquiera. Por ejemplo: bc = backup cifrado

    Una vez obtenido el archivo de copia de seguridad con cifrado aes256, podemos borrar el archivo tar.gz y también el archivo error.log, ya que únicamente queremos pasar a Mega el archivo cifrado.

    # rm *.tar.gz *.log

  1. Sincronizar la carpeta /backup del VPS con la carpeta backup_vps de Mega.

    Como último paso tan solo nos quedaría guardar el archivo de copia de seguridad cifrado en el almacenamiento de Mega. Para ello ejecutamos lo siguiente:

    # megacmd sync /backup mega:/backup_vps

    En la consola veremos el progreso de transferencia.

    Opcionalmente, una vez terminada la transferencia y hayamos comprobado que el archivo se copio correctamente, para ahorrar espacio en nuestro servidor VPS podemos borrar este archivo.

Restaurar copia de seguridad completa de sistema y datos en un servidor VPS

En el caso de desastre total de nuestro servidor VPS, siempre podremos devolverlo al estado que tenía restaurando la copia de seguridad, que previamente hemos guardado en nuestro almacenamiento en la nube de Mega. En el caso de que el servidor se haya corrompido por completo, lo mejor sería reinstalar el sistema operativo y devolverlo al estado incial que tiene cuando lo contratamos, es decir solo el sistema operativo, servidor SSH y muy poco más. Como tenemos un shapshot podemos recuperarlo fácilmente y por completo, sin tener que instalar y configurar todos los programas de nuevo y por supuesto restaurando todas las páginas web, buzones de email, etc, etc.

  1. Actualizar Debian / Instalar openssl.

    Como decíamos el servidor VPS recien instalado el S.O. viene totalmente límpio, con apenas el servidor SSH para poder acceder remotamente. En un servidor Debian básico ya debería venir instalado por defecto openssl, en caso contrario lo instalamos.

    Como después vamos a restaurar por completo el sistema, no tiene mucho sentido hacer un upgrade ahora, ya que todo se cambiará con las versiones de la copia de seguridad. Por tanto simplemente verificamos que disponemos de openssl y sino está instalado lo instalamos.

    # apt-get install openssl

  1. Instalar megacmd.

    Para poder conectar con nuestro almacenamiento en la nube, Mega, tenemos que descargar e instalar el programa megacmd.

    Podemos descargar los fuentes y compilarlo desde la web del autor.

    # cd /tmp

    # wget https://github.com/t3rm1n4l/megacmd/archive/master.zip

    Descomprimimos el archivo megacmd-master.zip, lo compilamos y lo copiamos en /usr/local/bin. Si es necesario, instalar los programas y dependencias necesarios para descomprimir (unzip) y compilar.

    # unzip megacmd-master.zip

    # cd megacmd-master

    # make

    # cp megacmd /usr/local/bin

    NOTA: En Debian 7 existe un problema con la versión de golang-go necesaria para poder compilar, ya que requiere una versión superior. Se puede soluccionar esto instalando golang-go desde los repositorios de Testing o también se puede compilar en otro PC y después copiar directamente el binario al VPS, ya que solo se requiere el binario para funcionar. Eso si, ha de estar compilado en la misma arquitectura.

    Ahora tenemos que crear el archivo .megacmd.json en el home del usuario. Como estamos en el VPS lo vamos a crear para el usuario root.

    # nano /root/.megacmd.json

    Y escribimos el siguiente contenido:

    {

    "User" : "USUARIO_MEGA",

    "Password" : "PASSWORD_DE_USUARIO_MEGA",

    "DownloadWorkers" : 4,

    "UploadWorkers" : 4,

    "SkipSameSize" : true,

    "Verbose" : 1

    }

    A continuación probamos si funciona, para ello ejecutamos lo siguiente:

    # megacmd list mega:/

    Deberíamos obtener la lista de los archivos y directorios que hay en la raiz de nuestro sitio Mega.

    Con esto ya deberíamos tener todo lo necesario, lo siguiente es crear las copias, cifrarlas y pasarlas a Mega.

  1. Descargar el archivo de copia de seguridad cifrado desde Mega.

    Vamos a descargar el archivo de copia de seguridad en la carpeta /backup de nuestro VPS, por tanto primero debemos crearla. Después nos cambiamos a su interior.

    # mkdir /backup

    # cd /backup

    Descargamos el archivo de copia de seguridad.

    # megacmd get mega:/backup_vps/backuptotal-fecha-dia.bc /backup/

    Atención: Es importante poner la última en el nombre de la carpeta backup.

  1. Desciframos el archivo de copia de seguridad.

    Para descifrar el archivo usamos openssl pasando la misma contraseña que usamos para cifrarlo. Al igual que cuando lo ciframos, tenemos dos formas de hacerlo, pasando la contraseña manualmente o a través de un fichero.

    Para descifrar el archivo pasando la contraseña manualmente:

    # openssl enc -d -aes256 -in backuptotal-fecha-dia.bc -out backuptotal-fecha-dia.tar.gz

    Para descifrar el archivo pasando la contraseña desde un fichero, primero creamos el fichero con la contraseña y lo guardamos oculto en el directorio root. Por ejemplo /root/.keyfile. Después ejecutamos:

    # openssl enc -kfile /root/.keyfile -d -aes256 -in backuptotal-fecha-hora.bc -out backuptotal-fecha-dia.tar.gz

    Importante: La opción -kfile toma la contraseña de la primera línea del fichero .keyfile.

  1. Restaurar el sistema.

    Al restaurar el sistema con la copia de seguridad sobreescribimos absolutamente todo el sistema, incluidas las carpetas de usuario de /home, bases de datos, páginas web, correo electrónico, etc. Como vamos a restaurar sobre un sistema límpio es de suponer que no hay ningún servidor instalado aun (apache, postfix, mysql, etc), por tanto no es necesario detener nada.

    Para restaurar ejecutamos:

    # tar -xzpvf backuptotal-fecha-hora.tar.gz -C / 2>error.log

    Revisamos error.log para ver si ha habido algún error importante, aunque es de esperar que todo haya salido bien.

  2. Reiniciar sistema.

    Para finalizar con la restauración, reinciamos el sistema y una vez vuelva a estar operativo conectamos de nuevo por SSH y revisamos que todo esté correctamente restaurado y que todos los servidores y servicios funcionan bien, incluidos los buzones del correo electrónico.

    Si todo está bien y para ahorrar espacio podemos borrar el contenido de la carpeta /backup.

Transferencia de archivos y directorios hacia/desde servidor remoto usando SCP

El comando scp usando desde consola nos permite enviar y descargar archivos y carpetas de forma segura entre un servidor remoto y nuestro PC local. El comando scp utiliza ssh para las transferencias, por lo que las comunicaciones son seguras. Estos son algunos ejemplos:

-l Es el límite de ancho de banda expresado en kbps.

Para ver más opciones del comando scp ver las páginas del manual.

Configurar router Huawei HG556a para conexión a Movistar

Esta configuración se basa en un router con la versión de firmware V100R001C10B083, aunque es de suponer que pueda ser igual en otros.

Aunque el router soporta los idiomas inglés y español, es importante hacer todas las configuraciones desde la interface en inglés, ya que en español tiene algunas deficiencias en los menús.

  1. Conectamos al router unicamente a la alimentación (sin conectar a la LAN ni a la línea telefónica).
    Resetear el router manteniendo pulsado el botón Reset durante al menos 5 segundos.
  2. Conectar el router a la red y acceder desde el navegador a la dirección http://192,168,0,1 accediendo con el usuario administrador, que por defecto debería ser este.

    Usuario: admin
    Contraseña: VF-EShg556

  3. Reseteamos el router a los valores de fábrica.
    Management - Settings - Restore Default → Restore Default Settings
  4. Desactivamos el acceso de administración remota y cambiamos contraseñas.
    Management - SNMP Agent → Disable
    Management - TR-069 → Disable
    Management - Access Control - Services → Marcar todos los servicios de la columna LAN excepto SNMP y TR069. No marcar ningúno de la columna WAN.
    Management - Access Control - IP Addresses → Eliminar todas las IPs y Disable.
    Management - Access Control - User Management → Cambiar la clave a todos los usuarios.
  5. Configuramos los datos de conexión a la red de Movistar.
    Advanced Setup → Seleccionamos ADSL Uplink y pulsamos Next. En la lista de configuraciones WAN borramos todas las que haya. Después pulsamos sobre Add y añadimos una nueva configuración con estos datos:

    - VPI: 8
    - VCI: 32
    - Service Category: UBR Without PCR

    - PPP over Ethernet (PPPoE)
    - Encapsulation Mode: LLC/SNAP-BRIDGING

    - PPP Username: adslppp@telefonicanetpa
    - PPP Password: adslppp
    - PPPoE Service Name: Movistar (es opcional, sirve para identificar el servicio)
    - PPP's MTU: 1492
    - PPP's LCP Echo-req Interval: 30
    - PPP keepalive attempts number: 3
    - Authentication Method: AUTO
    - Connect method: auto
    - Bridge PPPoE Frames Between WAN and Local Ports: Marcar

    - Enable WAN Service: Marcar
    - Service Name: Data

    En la última pantalla nos muestra un resumen de la configuración. Pulsamos en Save.

  6. Configuramos los DNS. Este router no los coge automáticamente desde el proveedor, por lo que hay que introducirlos manualmente.
    Advanced Setup - DNS - DNS Server → Desmarcamos “Use the Data pvc's DNS” y “DNS Proxy Enable”.

    - Primary DNS server: 80,58,61,250
    - Secondary DNS server: 80,58,61,254

  7. Hacemos un backup de la configuración y editamos el fichero manualmente ya que también hemos de modificar los DNS en este archivo.
    Management - Settings - Backup → Backup Settings

    - Guardamos el archivo backupsettings.conf y lo abrimos con un editor de texto.
    - Buscamos la línea que comienza por: <entry1 address=”192,168,0,1”
    - Sustituimos los valores asignados a “lanDNS1” y “lanDNS2” por los respectivos valores de DNS primario y secundario configurados en el apartado anterior.
    - Salimos guardando los cambios en el archivo.

  8. Importamos el archivo de configuración al router.
    Management - Settings - Update → Pulsamos en Examinar para inicar el archivo modificado en el paso anterior y pulsamos en Update Settings.
  9. Salvamos la configuración y reinciamos el router.
    Management - Save/Reboot → Save/Reboot

Downgrade de Debian testing (Stretch) a Debian stable (Jessie)

Hacer un downgrade en Debian es relativamente sencillo de hacer, pero se han de tener en cuenta otros factores que pueden hacer que algunas aplicaciones o programas no funcionen correctamente, por ejemplo Vmware, o las tarjetas de red Realtek. Lo que requerirá que después compilemos de nuevo los módulos desde sus respectivos fuentes.

¡NO ESTÁ SOPORTADO POR DEBIAN!. Aunque técnicamente es posible, este proceso no está soportado por Debian, ya que hacer un downgrade puede llevar a un sistema inestable y lleno de problemas.

¡IMPORTANTE!. Si aun sopesando los riesgos nos empeñamos en hacer el downgrade, antes de hacer nada es imprescindible realizar una copia de seguridad de la partición raiz / de nuestro Debian. Hemos de que tener en cuenta que vamos a cambiar todo el sistema operativo, incluidos todos los servicios, librerías y módulos, incluso el kernel y las cabederas del kernel. Para hacer un backup la mejor opción es usar Clonezilla desde un live CD o desde una memoria USB.

El primer paso para hacer el downgrade es editar el archivo /etc/apt/sources.list y borrar toda línea que haga referencia a la rama testing y sustituirla por la rama stable.

Cambiamos...

deb http://ftp.fr.debian.org/debian/ stretch main non-free contrib

deb-src http://ftp.fr.debian.org/debian/ stretch main non-free contrib

deb http://security.debian.org/ stretch/updates main contrib non-free

deb-src http://security.debian.org/ stretch/updates main contrib non-free

deb http://ftp.fr.debian.org/debian/ stretch-updates main contrib non-free

deb-src http://ftp.fr.debian.org/debian/ stretch-updates main contrib non-free

[...]

deb ftp://ftp.deb-multimedia.org stretch main non-free

[...]

Por esto:

deb http://ftp.fr.debian.org/debian/ jessie main non-free contrib

deb-src http://ftp.fr.debian.org/debian/ jessie main non-free contrib

deb http://security.debian.org/ jessie/updates main contrib non-free

deb-src http://security.debian.org/ jessie/updates main contrib non-free

deb http://ftp.fr.debian.org/debian/ jessie-updates main contrib non-free

deb-src http://ftp.fr.debian.org/debian/ jessie-updates main contrib non-free

[...]

deb ftp://ftp.deb-multimedia.org jessie main non-free

[...]

A continuación usaremos pinning para obtener la etiqueta correcta de la versión predeterminada de Debian. Para ello editamos o creamos si no existe, el fichero /etc/apt/preferences, y creamos una entrada para stable o modificamos la que exista, dejándola así:

Package: *

Pin: release a=stable

Pin-Priority: 1001

Para saber más podemos ver las páginas del manual: man apt-preferences o visitar esta página.

El siguiente paso es ejecutar un apt update, upgrade y dist-upgrade para hacer el downgrade todo el sistema.

# apt-get update

# apt-get upgrade

# apt-get dist-upgrade

Contestaremos afirmativamente a la pregunta de apt sobre si queremos hacer downgrading de todos los paquetes.

Es posible que algún paquete falle durante el downgrade, por lo que tomaremos nota de ellos para purgarlos manualmente y después volver a instalar la versión deseada. Echando un vistazo a /var/log/apt/history.log y /var/log/dpkg.log, podemos ver que paquetes se han instalado, actualizado o eliminado y los problemas que han podido surgir en el proceso.

Si hubiera algun tipo de problema con dependencias, podemos ejecutar el siguiente comando para intentar corregirlo.

# apt-get -f install

Si fuese necesario, volveríamos a ejecutar los apt-get upgrade y dist-upgrade hasta que el proceso no devuelva ningún tipo de error.

Kde Power Management ignora los tiempos de oscurecer y apagar pantalla

Este fallo sucede desde hace unas cuantas versiones para atras de la 4.14.2 y si no lo arregan supongo que se seguirá arrastrando este bug en versiones siguientes.

Power Management o Administrador de energía de Kde no respeta los tiempos fijados para los parámetros de “Oscureder pantalla” y “Apagar pantalla”. O al menos no tal y como se puede entender, sino que hace unos cálculos propios en función de los valores que nosotros pongamos ahí. Por ejemplo:

Configuración 1.

Oscurecer pantalla: 6 min.
Apagar pantalla: 8 min.
Brillo de pantalla: 50%

Lo que sucede es lo siguiente: Ocurece 25% a los 3 min. Oscurece 6% a los 4,5 mm. Apaga pantalla a los 6 min.
El valor de 8 min para apagar pantalla lo ignora por completo.

Configuración 2.

Oscurecer pantalla: 3 min.
Apagar pantalla: 8 min.
Brillo de pantalla: 50%.

Lo que sucede es: Oscurece 25% a los 1,5 min. Oscurece 6% a los 2,25 min. Apaga pantalla a los 3 min.
El valor asignado a Apagar pantalla de 8 min lo ignora.

Configuración 3.

Oscurecer pantalla: 6 min.
Apagar pantalla: 4 min.
Brillo de pantalla: 50%.

Lo que sucede es que a los 4 minutos se apaga la pantalla completamente, sin oscurecer primero.

Conclusión final:

Si el valor de “Apagar pantalla” es menor que “Oscurecer pantalla”, se apaga en el tiempo fijado en “Apagar pantalla”.

Si el valor de “Apagar pantalla” es mayor o igual que “Oscurecer pantalla”, la pantalla oscurece y después se apaga:
- Primera fase: Al llegar a la mitad del tiempo fijado en “Oscurecer pantalla”, baja el brillo 1/2 del inicial.
- Segunda fase: Al llegar a 3/4 del tiempo fijado en Oscurecer pantalla, baja el brillo 1/8 del inicial.
- Tercera fase: Al llegar al tiempo fijado en Oscurecer pantalla, la pantalla se apaga.

Por lo que he podido probar, lo anterior es válido tanto para el modo de energia AC como con batería.

Sin embargo hay veces, no tengo ni idea del porqué, todo esto se mantiene únicamente cuando el ordenador arranca desde un apagado total. Cuando le da la gana, si arranca después de hibernar o de una suspensión, los únicos tiempos que respeta son los fijados en el el perfil de “Batería baja”.

Mientras no arreglen este bug, esto es lo que hay.

Protección de wp-admin y wp-login de Wordpress

Lo que vamos a hacer es proteger con contraseña la carpeta wp-admin y el fichero wp-login.php. De forma que cuando se pretenda acceder a ellos, el servidor nos solicite un usuario y contraseña del sistema con permisos para acceder a esta carpeta y fichero.

En este ejemplo voy a usar Virtualmin para crear el usuario y proteger la carpeta, aunque la forma de hacerlo debería ser similar para otros paneles de control, Cpanel, Plesk, etc. Tambien se puede hacer manualmente desde SSH, pero eso sería otra historia.

  1. Proteger carpeta wp-admin.

    Dentro de Virtualmin, en el menú de la izquierda elegimos el dominio de Wordpress, más abajo desplegamos el menú de Servicios y pulsamos en Protected Directories.

  1. Crear un usuario y asignar permisos de acceso a la carpeta.

Con los pasos 1 y 2, hemos creado el fichero .htaccess de la carpeta wp-admin con el siguiente contenido:

AuthUserFile "/home/dominio/www/wp-admin/htusers"

AuthType Basic

AuthName "Carpeta privada"

require valid-user

<Files htusers>

deny from all

</Files>

Tambien se ha creado dentro de la carpeta wp-admin el fichero htusers con los datos de nombre de usuario y contraseña para el usuario que hemos creado. Si damos permiso a más usuarios, estos se añadirán a este fichero.

La ruta al fichero htusers puede ser diferente según el panel de control o configuración de Apache. Cambiarla según cada caso para poner la correcta.

  1. Evitar errores de redirecciones en URL amigables y enlaces permanentes.

    Cuando configuramos Wordpress para que trabaje con enlaces permanentes o URL amigables, es más que probable que tengamos errores de redirecciones al proteger la carpeta wp-admin.

    Para evitar esto debemos editar el fichero .htaccess de la raiz del dominio Wordpress y añadir al principio del fichero la siguiente línea.

    ErrorDocument 401 default

    [...]

  1. Proteger fichero wp-login.php

    Este fichero es necesario también protegerlo con contraseña. Para ello editamos el fichero .htaccess de la raiz del Wordpress y a continuación de la línea ErrorDocument ... del paso anterior, añadimos lo siguiente.

    ErrorDocument 401 default

    <Files wp-login.php>

    AuthUserFile “/home/dominio/www/wp-admin/htusers”

    AuthType Basic

    AuthName “Carpeta privada”

    require valid-user

    </Files>

    [...]

    No olvidar verificar la ruta en AuthUserFile y cambiarla por la correcta.

    ¿Qué inconvenientes tiene proteger wp-login.php?.

    Como sabemos Wordpress es uno de los CMS más utilizados en el mundo, es fácil de instalar y de usar, es de código abierto y se publican regularmente actualizaciones que corrigen problemas de seguridad. Sin embargo el hecho de que sea tan popular y de código abierto hace que cualquiera pueda descubrir fácilmente los agujeros de seguridad y atacar por ahí.

    Protegiendo las carpetas wp-admin y el fichero wp-login.php mediante contraseña, aumentamos la seguridad y evitaremos muchos ataques, pero ningún sistema es 100% seguro.

    Ahora bien, si en nuestra web Wordpress queremos permitir el registro de usuarios, proteger wp-login.ph no es viable, ya que cada vez que un nuevo usuario quiera registrarse, se le solicitará la contraseña para acceder a este fichero protegido. Si optamos por mantener el fichero protegido, tendremos que implementar algún systema alternativo de registro y login, diferente al que usa Wordpress por defecto.

  1. Permitir las solicitudes AJAX

    Al proteger la carpeta wp-admin hemos evitado que se hagan peticiones a ese directorio, sin embargo debemos permitir que la api Ajax de Wordpress si pueda acceder, de lo contrario es posible que dejen de funcionar algunos plugins, temas o widgets que utilicen Ajax.

    El api Ajax de Wordpress se ejecuta desde el archivo admin-ajax.php, para solucionar este problema debemos editar el fichero .htaccess de la raiz de Wordpress y permitir las solicitudes que vengan desde admin-ajax.php. Para ello añadimos al final lo siguiente.

    [...]

    <Files admin-ajax.php>

    Order allow,deny

    Allow from all

    Satisfy any

    </Files>

  1. Permitir solicitudes de imágenes, CSS y JavaScript

    Es posible que algunos plugins y temas necesiten acceder a contenido de la carpeta wp-admin, pero que al haber protegido no podrán acceder y en consecuencia no se podrán mostrar correctamente. Esto no siempre es necesario, pero en el caso de tener problemas con la visualización de imágenes, carga de ficheros CSS o JavaScript de la carpeta wp-admin, tendremos que crear un .htaccess para cada una de estas carpetas.

    Creamos un fichero .htacces en las carpetas wp-admin/images, wp-admin/css y wp-admin/js con el siguiente contenido.

    Order allow,deny

    Allow from all

    Satisfy any

Protección contra ataques a xmlrpc.php de Wordpress

Como ya explicaba en el anterior artículo “Protección de wp-admin y wp-login.php”, Wordpress, al ser uno de los CMS más utilizado en el mundo, es muy susceptible de recibir ataques que intentan aprovechar cualquier vulverabilidad o fallo, sea en el propio núcleo de Wordpres, como en plugins, plantillas, etc.

En esta entrada vamos a ver una manera sencilla de proteger el archivo xmlrpc.php, nuestro objetivo es protegernos contra ataques que intenten descubrir nuestra contraseñas por fuerza bruta y ataques por denegación de servicio DDoS. En otras palabras y para simplificar, evitar que nuestro servidor sea bombardeado por miles de peticiones entrantes y que por tanto pueda llegar a bloquearse.

Pero antes es mejor saber que es el protocolo xmlrpc y para que sirve. Evidentemente si está incluido en Wordpres, es porque se utiliza para algo.

Es necesario dejar claro que, si bien con este método y otros similares, dejamos nuestra instalación de Wordpress mucho más protegida contra ataques que al principio, siempre tiene sus inconvenientes o al menos es algo que hay que tener en cuenta cuando se utilizan plugins como Jetpack for Wordpress que utiliza el protocolo XML-RPC. En este caso hay otros métodos de protección que pueden ser igual de efectivos, pero que al mismo tiempo permiten que estos plugins sigan funcionando con total normalidad.

Para finalizar, debemos tener en cuenta que cuando actualicemos Wordpress o nuestra plantilla, es posible que los archivos que hemos modificado se sustituyan por unos nuevos, por lo que sería necesario repetir estos pasos de nuevo.

Montar particiones LVM

Si queremos montar particiones LVM en un ordenador con Linux, no se puede hacer con el habitual comando 'mount', sino que neceistaremos algunas herramientas específicas para poder montar los volúmenes creados con el sistema de archivos LVM. Si todavía no lo hemos hecho, instalamos los paquetes lvm2 y fuse2fs. Este último es necesario cuando el disco con el volumen lógico fue creado en un sistema no Intel, por ejemplo un NAS con una arquitectura SPARC.

# apt-get install lvm2 fuse2fs

A partir de ahora ya podemos utilizar varias herramientas para manejar y montar los volúmenos lógicos.
En este ejemplo vamos a trabajar con un disco extraido de un Netgear ReadyNas Duo.

Para ver el nombre del grupo de volúmenos utilizamos 'vgscan'

# vgscan
Reading all physical volumes.  This may take a while...
Found volume group "c" using metadata type lvm2

Nos dice que se encontró un grupo con el nombre “c”.

Para obtener mayor información sobre el grupo se puede utilizar el comando 'vgdisplay'

# vgdisplay
 --- Volume group ---
VG Name c
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 929,09 GiB
PE Size 32,00 MiB
Total PE 29731
Alloc PE / Size 29731 / 929,09 GiB
Free PE / Size 0 / 0
VG UUID 1Rb25h-fTUs-p1nw-RuD1-IpMl-hAdg-v4r4Ez

En la línea VG Name nos dice que tenemos un grupo llamado “c”

A partir de este momento ya podríamos trabajar con los volúmenes lógicos, pero antes tenemos que ver si son accesibles, es decir, si están activados. Para ello usamos el comando 'lvscan'.

# lvscan

inactive '/dev/c/c' [929,09 GiB] inherit

Si el volumen está inactivo no se puede montar. Lo activamos con el comando 'vgchange'.

# vgchange -ay /dev/c/c

Si hubiera un grupo con varios volúmenes, se pueden activar todos usando 'vgchange -ay <nombre_grupo>'
Para desactivar un volúmen o todos los volúmenes de un grupo se usará la opción '-an'

Si volvemos a ejecutar 'lvscan' ahora obtendremos.

# lvscan

ACTIVE '/dev/c/c' [929,09 GiB] inherit

En este momento ya se puede montar el volumen. Si el disco fué creado en un PC, se podría usar el comando 'mount'.

# mount /dev/c/c <punto_de_montaje>

Pero como el disco viene de un NAS con una arhitectura distinta a x86, se tiene que usar FUSE y concretamente el comando 'fuse2fs'

# fuse2fs -o ro -o sync_read -o allow_other /dev/c/c /mnt/nas

Opciones:
-o roMonta el volúmen lógico de solo lectura
-o sync_readRealiza todas las lecturas de forma síncrona
-o allow_otherPermite que usuarios distintos de root puedan acceder al volumen montado

Configurar NGINX para PHP 7.4

Instalar el paquete nginx-full

# apt install nginx-full

Instalar los paquetes de php 7.4

# apt-get install php7.4-fpm php7.4-mbstring php7.4-mysql php7.4-curl php7.4-gd php7.4-curl php7.4-zip php7.4-xml

Si fueran necesarios otros, los instalamos también.

Editamos el fichero de configuración del sitio por defecto de nginx.

# nano /etc/nginx/sites-enabled/default

Añadimos index.php a la lista, dejándolo de esta forma.

index index.php index.html index.htm index.nginx-debian.html;

Buscamos.

#location ~ \.php$ {

# include snippets/fastcgi-php.conf;

#

# # With php-fpm (or other unix sockets):

# fastcgi_pass unix:/run/php/php7.4-fpm.sock;

# # With php-cgi (or other tcp sockets):

# fastcgi_pass 127.0.0.1:9000;

#}

Y lo modificamos para que quede así.

location ~ \.php$ {

include snippets/fastcgi-php.conf;

#

# # With php-fpm (or other unix sockets):

fastcgi_pass unix:/run/php/php7.4-fpm.sock;

# # With php-cgi (or other tcp sockets):

# fastcgi_pass 127.0.0.1:9000;

}

Para finalizar reiniciamos nginx.

# systemctl restart nginx