Proceso System consumiendo mucha CPU en un Windows virtualizado con VMWare

Me he tirado muchísimo tiempo tratando de identificar la fuente de un error que tenía en una máquina que trabaja con Windows 2008 Server R2 virtualizada en un VMWare ESXi.

Problema

El proceso System (el núcleo del sistema) estaba consumiendo tanta CPU que no dejaba prácticamente nada para los usuarios, y estos experimentaban interminables ralentizaciones.

Causa

Me mareó mucho la información sobre desactivar el módulo intelppm (los controladores de la CPU) que encontré en muchos sitios de Internet, pero todo eso no sirvió para nada más que para perder el tiempo.

Finalmente, la causa (al menos en mi caso) era que el archivo de paginación (el equivalente en Windows a las particiones swap) iba demasiado ahogado.

Solución

Ampliar el tamaño del disco duro desde VMWare (tuve que eliminar todas las snapshots para que me dejase), y después ampliar la partición desde Windows.

Cuidado con los “megas”

¡Contrata hoy el ADSL de 20 megas con un 15% de descuento!

Cuidado con esos megas.

En el habla cotidiana, la palabra megas es una abreviatura incorrecta e inexacta, de lo que las operadoras de telefonía se aprovechan para crear confusión y darte gato por liebre.

Vamos a diferenciar las 4 unidades de medida que se pueden entender por mega:

  1. Megabyte (MB): 1.000.000 bytes (recordemos que cada byte son 8 bits).
  2. Mebibyte (MiB): 1.048.576 (1024 x 1024) bytes.
  3. Megabit (Mb): 1.000.000 de bits (la octava parte de 1 MB).
  4. Mebibit (Mib): 1.048.576 bits (la octava parte de 1 MiB).

Es decir, que cuando la gente habla cotidianamente de megas, piensa que habla de megabytes, aunque en realidad esté hablando de mibibytes.

Sin embargo, cuando una compañía te vende conexiones de datos, siempre te está hablando en Mbps (Megabits por segundo), que es aproximadamente una octava parte de lo que tú crees que te están vendiendo (porque 1 byte son 8 bits).

Es decir, que el titular superior podríamos leerlo como:

¡Contrata hoy el ADSL de 2,5 MB/s con un 15% de descuento!

O, para ser más exactos:

¡Contrata hoy el ADSL de 2,384 MiB/s con un 15% de descuento!

Ahora ya nos entendemos…

Cómo transformar videos con GStreamer

Situación

Tienes unos cuantos vídeos en tu ordenador procedentes de diversas fuentes (cámara, móvil, Internet, etc.) con diversos formatos (.mp4, .mov, etc.) y quieres unificarlos en un formato libre (aunque no necesariamente, pero sí es recomendable) que ocupe menos espacio en tu disco duro (más información sobre los formatos de vídeo).

Solución fácil, pero uno por uno

Si no te importa ir archivo por archivo, lo más sencillo es usar Transmageddon, una aplicación que viene empaquetada en casi todas las distribuciones Linux, y que resulta muy fácil de utilizar.

Solución difícil, pero todos de una vez

Usaremos directamente GStreamer 1.0, que es la herramienta que usan entre bastidores casi todas las herramientas gráficas de audio en GNOME.

Crea un script llamado ~/.local/bin/gst-video-compress con este contenido:

#!/bin/bash

# Transform to Ogg (VP8 + Opus)
function transcode {
    gst-launch-1.0 \
        filesrc "location=$(readlink -f $1)" ! \
        decodebin name=demux ! \
            queue ! \
                progressreport "name=Encoding video for $1" ! \
                vp8enc ! \
                oggmux name=mux ! \
                filesink "location=$(readlink -f ${1%.*}).ogg" \
            demux. ! queue ! \
                progressreport "name=Encoding audio for $1" ! \
                audioconvert ! \
                audioresample ! \
                opusenc ! \
        mux. \
    && [ "$RM" == "y" ] && rm "$n"
}

# Fork it to make use of all processors
for f in $*; do
    while [ $(jobs | wc -l) -ge $(nproc) ]; do
        sleep 5
    done

    transcode $f &
done

# Don't exit until everything is finished
for j in $(jobs -p); do
    wait $j
done

Esto coge cualquier vídeo y lo transforma a Ogg (VP8 + Opus) con el mismo nombre de fichero que el anterior, y además transcodifica simultáneamente tantos videos como procesadores tengas. Si quieres entender lo que hace, consulta la explicación que ya di sobre qué son las tuberías de GStreamer y esta respuesta de Stack Overflow. También puedes usar el comando gst-inspect-1.0 con cada plugin (filesrc, decodebin, queue, etc.) para ver qué hace cada cual.

Ahora puedes invocar ese script de la siguiente manera:

$ gst-video-compress *.mp4 *.mov

Y si quieres que automáticamente vaya borrando los ficheros conforme vaya transcodificándolos sin errores:

$ RM=y gst-video-compress *.mp4 *.mov

Cómo compartir los accesos directos de la barra de inicio entre sesiones de Windows

Situación

Como todos conocemos y asumimos (sorprendentemente), Windows es un sistema que se guarrea automáticamente con el tiempo.

Para evitarlo, hemos decidido virtualizar un escritorio Windows 2008 Server R2 (con la idea equivocada de que por ser Server será más estable) e instalarlo en modo amnésico, o no persistente (es decir, cada vez que apagas y enciendes la máquina virtual, los cambios desaparecen), programado para olvidar todo cada semana, pero trabajamos en un entorno con muchos usuarios que quieren guardar sus configuraciones para trabajar cómodamente.

Para conseguirlo, utilizamos una directiva de grupo GPO en la que configuramos la redirección de directorios (Folder Redirection) y perfiles móviles (Roaming Profile Path) para que todas las configuraciones de usuario se guarden en discos duros de red que se encuentran fuera de esta máquina.

Problema

Cuando un usuario ancla un acceso directo a la barra de inicio, todo funciona hasta que el servidor ejecuta su amnesia, tras lo cual desaparece misteriosamente de ahí.

Nos ponemos a investigar, y resulta que en la ruta %AppData%\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\ encontramos todos los accesos directos que el usuario ha anclado (de hecho, puede que hasta encuentres duplicados de alguno), así que… ¿por qué no le aparecen?

Motivo

El problema radica en que, para que los accesos directos aparezcan en la barra de inicio, no solo hace falta tenerlos en la carpeta que hemos comentado antes, sino que además hacen falta las configuraciones que encontramos en la ruta HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband del registro de Windows (que podemos abrir ejecutando regedit.exe), las cuales son olvidadas cada semana junto con el resto de cambios en el registro.

Solución

Lo que vamos a hacer es crear dos scripts que se encarguen de respaldar y restaurar esas claves del registro cada vez que el usuario inicia o cierra la sesión. Ambos los colocaremos en una ruta en que todos los usuarios tengan permisos de lectura y ejecución.

Creamos un fichero de texto llamado taskbar-save.bat que contenga esto:

reg export HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband %AppData%\taskband.reg

A este otro lo llamaremos taskbar-load.bat:

reg import %AppData%\taskband.reg

Ahora vamos a asignar esos scripts a donde les corresponde. Para ello, abrimos el Administrador de directivas de grupo > buscamos nuestro GPO > botón derecho > Editar > Configuración de usuario > Directivas > Configuración de Windows > Scripts (inicio de sesión o cierre de sesión), y encontraremos dos opciones.

Haz doble click en Iniciar sesión > Agregar > Selecciona el script taskbar-load.bat > Aceptar.

Hacemos lo mismo en Cerrar sesión, pero seleccionamos taskbar-save.bat.

Ahora, cada vez que un usuario cierre su sesión, se guardará su configuración de aplicaciones ancladas en %AppData%\taskband.reg, y cuando la vuelva a abrir, se cargará de ahí mismo.

Cómo evitar la advertencia de seguridad en los accesos directos ubicados en la red

Problema

Si tienes la maldición desgracia necesidad de tener que administrar un servidor Windows en un dominio, y de tener que configurar redirección de carpetas (Folder Redirection) para que el perfil del usuario se halle en la red en lugar de en la máquina local, es posible que te des contra este simpático cartelito de error cada vez que intentas lanzar un acceso directo desde el escritorio o la barra de tareas:

Advertencia de seguridad de Abrir Archivo: No podemos verificar quién creó este archivo. ¿Está seguro de que desea abrirlo?
Advertencia de seguridad de Abrir Archivo: No podemos verificar quién creó este archivo. ¿Está seguro de que desea abrirlo?

Solución

Para un solo usuario

La solución está en añadir el sitio de red a la lista de sitios locales. Claro, puedes hacerlo desde Opciones de Internet > Seguridad > Red local > Sitios > Añadir, pero eso solo funcionaría para un usuario, y hablamos de un dominio con muchos usuarios.

Si lo haces, recuerda añadir el sitio sin protocolo de red. Es decir, si tu servidor se llama RECALLSTACK, no lo añadas como \\RECALLSTACK ni como file://RECALLSTACK ni smb://RECALLSTACK. Añádelo como RECALLSTACK a secas.

Para todo el dominio

Entra en el administrador de directivas de grupo, crea un GPO para tus usuarios (si no lo tienes ya), púlsalo con el boton derecho > Editar.

Ve a Configuración del equipo > Plantillas administrativas > Componentes de Windows > Internet Explorer > Panel de Control de Internet > Página de seguridad. Aquí deberás habilitar las siguientes directivas:

  • Lista de asignación de sitio a zona.
    • Habilítala.
    • Pulsa en Mostrar.
    • Añade una fila con los valores:
      • Nombre de valor: Aquí el nombre de tu servidor, por ejemplo RECALLSTACK.
      • Valor: 1
  • Activar detección automática de intranet.

Reflexiones finales

¿Y por qué hace falta activar la detección automática de intranet si ya le estoy diciendo explícitamente en la otra directiva que RECALLSTACK pertenece a dicha zona? ¿Y qué pasa si dentro de RECALLSTACK tienes una carpeta que sí es de fiar, pero otras que no? Ni idea, pero si no nunca te librarás de ese dichoso cartelito.

Cómo singularizar una máquina virtual Windows en un dominio

Problema

Tienes una máquina virtual Windows añadida a un dominio. La clonas, y al encender ese clon Windows se queja:

The name or security ID (SID) of the domain specified is inconsistent with the trust information for that domain

Ambas máquinas dejan de funcionar bien con el dominio.

Causa

Cada ordenador con Windows que está en un dominio tiene un SID (Security ID) que debe ser diferente. Si es el mismo, pasa esto.

Solución

Si tienes el ordenador en el dominio, sácalo de ahí y reinicia. Luego, como dicen en VMWare, hay que usar el programita Sysprep. Ejecuta en la línea de comandos:

C:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /reboot 

Si no encuentras el programa en esa ruta, consulta la lista de ubicaciones de Sysprep.

Tras reiniciar, vuelve a agregar la máquina al dominio y reinicia de nuevo.

Web descentralizada para todos

Ya estuvimos hablando de la descentralización de la mensajería instantánea con XMPP. Hoy me alegro de poder decir que cada vez es más fácil tener tu propio rincón privado de Internet. Os presento 3 distribuciones a tener en cuenta:

FreedomBox

Un subproyecto de Debian, el más antiguo de todos, y curiosamente el que más lentamente está avanzando.

Buenas intenciones, aunque lamentablemente aún no hay mucho que usar.

arkOS

Es el que más está llamando la atención últimamente. Derivado de Arch, respaldado por The CitizenWeb Project, y diseñado para instalar en Raspberry Pi.

Genesis, la interfaz de administración de arkOS
Genesis, la interfaz de administración de arkOS

YunoHost

Mi favorita, y a día de hoy la más usable.

Explicación del nombre de YunoHost
Explicación del nombre de YunoHost

Está basada en Debian, así que lo puedes instalar prácticamente donde quieras: Máquina virtual, VPS, Cubieboard, Raspberry Pi, Docker, etc.

En lugar de poner una foto de la impecable interfaz, te invito a que pruebes la demo que hay en su web.

Fish Shell

Si bien siempre me ha encantado Bash, hay que reconocer que Fish es increíble:

No te tienes que complicar configurando absolutamente nada, por defecto ya viene coloreando tu terminal, auto completando tus comandos y permitiendo llevar todo esto de las configuraciones de manera muy simple e intuitiva mediante una interfaz web (local, claro está) en donde tendrás al alcance absolutamente todo lo que quieras modificar; desde el historial de comandos, hasta las funciones a ejecutarse por defecto, colores, autocompletado inteligente y/o personalizado, ¿Ya les dije que el auto completado es inteligente y simplemente aprende tus comandos? ¡No tienes que decirle que haga nada, él solito aprende!

Nano, Desde Linux.

Instalación

# yum install fish
$ chsh --shell $(which fish)

Y ahora reinicia la sesión.

Extras

Se llaman Oh My Fish. Instalación:

$ curl -L https://github.com/bpinto/oh-my-fish/raw/master/tools/install.fish | fish

Compatible con Bash

Recuerda que, si usas el shebang correcto (#!/usr/bin/bash o #!/usr/bin/fish) al principio de cada script, no habrá problemas de compatibilidad entre shells.

Cómo limpiar los restos de Docker

Normalmente, cuando descubres Docker, te pones a bajar y probar imágenes como loco, a construir algunas que no funcionan bien… Al final se te queda una caché de demasiados GBi sin usar.

Limpiar los contenedores detenidos

$ docker rm $(docker ps --all --quiet)

En realidad, le hemos dicho que los borre todos, pero los que estén en marcha no los borrará salvo que le hubiéramos pasado la opción --force.

Limpiar las imágenes sin etiquetar

docker rmi $(docker images --filter dangling=true --quiet)