Qemu con su error -22 (Invalid argument)

martes, 1 de septiembre de 2020 Sin comentarios

Hace unos meses moví todas las máquinas virtuales de Proxmox a Ubuntu 18.04 LTS y todo iba bien hasta que decidir actualizar a Ubuntu 20.04 LTS. Resulta que esta última versión incluye el kernel 5.4 que trae consigo una serie de modificaciones más restrictivas con respecto al acceso de zonas de memoria reservadas y que afectas a las agrupaciones IOMMU mal hechas por parte de algunas BIOS. El error que saltaba era similar al siguiente:

failed to setup container for group 28: memory listener initialization failed: Region mach-virt.ram: vfio_dma_map(0x563169753c80, 0x40000000, 0x100000000, 0x7fb2a3e00000) = -22 (Invalid argument)

Hice diversas modificaciones sobre el kernel para intentar evitar la restricción del mapeo de memoria sin ningún éxito. Probé a actualizar al kernel 5.8 de la rama de desarrollo de Ubuntu para acabar teniendo el mismo problema. La única solución era volver a Ubuntu 18.04 o directamente probar una distribución que trabajase con el kernel 5.3 que era el último que se sabía que funcionaba de forma permisiva en ese aspecto. Por tanto terminé con OpenSuse 15.2.

Todo ello me llevo a cuestionarme si el hardware (HP Gen8) que estaba intentando hacer funcionar merecía la pena tanto tiempo invertido o simplemente comprar otro equipo mejor preparado. Tras visitar numerosas webs me encontré con que la información relativa a las agrupaciones IOMMU no se ofrecen por parte de los fabricantes de placa base y que, futuras actualizaciones de la BIOS podían afectarlas. Lo que parece ser más orientativo es que las placas base más caras suelen ser mejores en ese aspecto y que para plataformas AMD hay que llevar cuidado con las actualizaciones de AGESA. Con lo que al final supone una lotería y voy a estirar el kernel 5.3 todo lo que pueda, a ver si en un futuro se publica algún método para seguir usando este hardware.

Contraseña en la BIOS del portátil

miércoles, 27 de mayo de 2020 Sin comentarios

La mayoría de fabricantes de portátiles permiten asignar una contraseña de acceso a su BIOS para evitar que se efectúen cambios en su configuración. Si nos encontramos con este inconveniente vamos a descubrir que dichos fabricantes no se esforzaron mucho en tal tarea.

Cuando al acceder a la BIOS el portátil nos pregunte la contraseña introduciremos una a una las siguientes contraseñas:

  1. 3hqgo3
  2. jqw534
  3. 0qww294e

Esto hará que el portátil nos devuelva un mensaje de error en hash. Dependiendo de la marca del portátil tendrá un formato u otro:

 Fabricante  Tipo de hash  Ejemplo de hash
 Asus Fecha 01-01-2011
 Compaq 5 dígitos decimales 12345
 Dell Número de serie 1234567-595B
 Fujitsu-Siemens 5 dígitos decimales 12345
 Fujitsu-Siemens 8 dígitos hexadecimales DEADBEEF
 Fujitsu-Siemens 5×4 dígitos hexadecimales AAAA-BBBB-CCCC-DEAD-BEEF
 Fujitsu-Siemens 5×4 dígitos decimales 1234-4321-1234-4321-1234
 Fujitsu-Siemens 6×4 dígitos decimales 8F16-1234-4321-1234-4321-1234
 Hewlett-Packard 5 dígitos decimales 12345
 Hewlett-Packard/Compaq Netbooks 10 caracteres CNU1234ABC
 Insyde H20 (generic) 8 dígitos decimales 03133610
Phoenix (generic) 5 dígitos decimales 12345
Sony 4×4 dígitos hexadecimales 1234-1234-1234-1234
Sony 7 dígitos numéricos 1234567
Samsung 12 dígitos hexadecimales 07088120410C0000

Con ese hash y un script en python (en la mayoría de los casos) podremos obtener una contraseña para cuando arranque de nuevo el portátil. Y de dónde sale el script, pues normalmente de Internet como todo lo que la gente comparte.

Categories: Portátiles Tags: , ,

Cambiando prioridades de CPU e IO en KVM

jueves, 7 de mayo de 2020 Sin comentarios

En Proxmox creo recordar que se podía limitar el % de uso de la CPU de forma individual en cada máquina virtual. Como sustituto o equivalencia me topé con un script de Stuart Hopkins que a partir de un fichero de configuración permitía ajustar con el comando «nice» la prioridad del proceso de cada una de las instancias de nuestro KVM. Jim Klimov por su parte mejoró el script para permitir definir además qué prioridad de acceso al disco tendría cada una de esas instancias, completando de esa forma la funcionalidad del script.

El fichero de configuración tendría el siguiente aspecto:

### Note: comments or config lines from here on, e.g. no empty lines!
#
# KVM VM Priorities (NAME|NICEPRIO|IOCLASS|IOPRIO)
# IOCLASS – 1=realtime, 2=best-effort, 3=idle
# IOPRIO – 0=highest, 7=lowest
#
# e.g. MYVM|15|3|7
#
521-MaquinaVirtual|10|3|7

Por un lado tendría el nombre de la máquina virtual a la que le deseo aplicar los cambios «202-MaquinaVirtual», el «nice» a aplicar sería de 10 (-20 es la prioridad más alta, 19 la menor y 0 la por defecto), la clase de acceso al disco la mantendríamos en «idle» para que dejase paso al resto de procesos y una prioridad de 7 que es la más baja. Con todo ello pretendo que la máquina virtual suponga el menor impacto sobre los discos y que tenga un consumo de CPU moderado cuando tenga que compartirla.

Dicho lo anterior, en mi caso el script no me funcionaba porque no era capaz de leer el PID de mi máquina virtual, ya que el comando «ps» lo mostraba de la siguiente forma:

qemu-system-x86_64 -enable-kvm -name guest=521-MaquinaVirtual,debug-threads=on -S -object secret,………..

Así que cambié la línea que extrae el nombre de la máquina virtual que en un origen era así:

vm_name=$(ps -o cmd -p $vm_pid 2>/dev/null | tail -n 1 | sed -e ‘s/^[^0-9a-zA-Z]*//g’ | sed -e ‘s/^.*-name\ \([a-zA-Z0-9]*\).*/\1/’ 2>/dev/null)

Por esta otra:

vm_name=$(ps -o cmd -p $vm_pid 2>/dev/null | tail -n 1 | sed -e ‘s/^[^0-9a-zA-Z]*//g’ | awk ‘{print $4}’ 2>/dev/null| awk -F’=’ ‘{print $2}’ 2>/dev/null|awk -F’,’ ‘{print $1}’ 2>/dev/null)

No sé si será igual para todo el mundo o afecta sólo a mi configuración, pero el script es sencillo de entender y editar para ajustarlo a las necesidades de cada uno.

Y, por supuesto, con tenerlo en cron para que ajuste la configuración por si hemos reiniciado alguna máquina no cuesta mucho.

Conectando desde nuestro ordenador a Android por SSH

martes, 5 de mayo de 2020 Sin comentarios

Si disponemos de un dispositivo Android al cual queremos acceder por SSH para, por ejemplo, trasferir ficheros porque MTP es intratable desde Linux (al menos con KDE), podemos hacerlo a través de una aplicación llamada Termux. Esta aplicación nos habilita un terminal desde el cual podemos instalar paquetes y configurarlos de forma muy similar a como lo haríamos en cualquier distribución de Linux.

Instalaremos el servicio, averiguaremos con qué usuarios estamos accediendo al terminal, le cambiaremos la contraseña y mostraremos nuestra IP local:

pkg install openssh

whoami

passwd

ifconfig

sshd

Y con un simple comando desde nuestro ordenador conectaremos:

ssh usuario@192.168.1.123 -p8022

Si queremos tener acceso a la tarjeta microSD, tendremos que darle permisos de almacenamiento a la aplicación Termux desde los ajustes de Android. Una vez hecho eso podremos acceder en modo lectura. Para poder realizar escrituras deberemos ejecutar lo siguiente en Termux:

termux-setup-storage

Esto nos habilitará ciertas zonas de escritura dentro del móvil:

cd $HOME/storage

ls -l

Lo anterior nos devolverá algo similar a lo siguiente:

dcim -> /storage/emulated/0/DCIM
downloads -> /storage/emulated/0/Download
external-1 -> /storage/3868-4120/Android/data/com.termux/files
movies -> /storage/emulated/0/Movies
music -> /storage/emulated/0/Music
pictures -> /storage/emulated/0/Pictures
shared -> /storage/emulated/0

La carpeta «external-1» nos llegaría a la tarjeta microSD donde podríamos copiar ficheros y después moverlos con alguna aplicación de Android.

Y para dejar de utilizar nuestro servicio SSH solo tendremos que ejecutar lo siguiente:

pkill sshd

Si queremos automatizar el arranque del servicio SSH cuando abramos la aplicación, sólo tenemos que crear el fichero «~/.bashrc» con «vi» y añadir lo siguiente:

alias exit=»pkill sshd && exit»

sshd
echo «Your IP is: »
ifconfig | grep -Eo ‘inet (addr:)?([0-9]*\.){3}[0-9]*’ | grep -Eo ‘([0-9]*\.){3}[0-9]*’ | grep -v ‘127.0.0.1’

Con lo anterior tendremos el servicio en marcha y nos mostrará en pantalla la IP local que tenemos actualmente. Además incorporamos un alias al comando «exit» que terminará el servicio SSH, lo que nos da un poco de comodidad a la hora de cerrar sesiones.

Categories: Android, GNU/Linux Tags: , , , , ,

Problemas con actualizaciones en Windows 8.1

martes, 5 de mayo de 2020 Sin comentarios

En su día ya me topé con algún Windows 8.1 que se quedaba en bucle infinito sin llegar a actualizar nada, simplemente buscando. Acabé encontrando un remedio para sistemas que se han quedado bastante rezagados en cuanto actualizaciones.

El primer paso es desactivar las actualizaciones automáticas desde el Panel de Control y reiniciar el sistema, o en su lugar detener el servicios que se encarga de Windows Update.

Ejecutar el siguiente script como administrador que limpiará la cache de actualizaciones:

@ECHO OFF
echo Simple Script to Reset / Clear Windows Update
echo.
PAUSE
echo.
attrib -h -r -s %windir%\system32\catroot2
attrib -h -r -s %windir%\system32\catroot2\*.*
net stop wuauserv
net stop CryptSvc
net stop BITS
ren %windir%\system32\catroot2 catroot2.old
ren %windir%\SoftwareDistribution sold.old
ren «%ALLUSERSPROFILE%\application data\Microsoft\Network\downloader» downloader.old
net Start BITS
net start CryptSvc
net start wuauserv
echo.
echo Task completed successfully…
echo.
PAUSE

Tendremos que descargar dos actualizaciones concretas: la KB3173424 (para x86 o x64) y la KB3172614 (para x86 o x64). Puede ser que necesitemos instalar previamente la actualización de abril de 2014 Update Rollup (KB2919355) y la de abril de 2015 Servicing Stack Update (KB3021910). Después de instalar lo anterior reiniciaremos el sistema, habilitaremos de nuevo las actualizaciones automáticas y ahora nuestro sistema no debería quedar atrapado en un bucle.

Sustituyendo NFS por sistema de archivos 9p de KVM

lunes, 4 de mayo de 2020 Sin comentarios

En una de las máquinas virtuales tenía funcionando dos aplicaciones que hacían uso intensivo de lectura/escritura de información que tengo almacenada en una unidad NFS. Toda esa actividad acababa generando un consumo considerable de CPU y, de alguna forma, mayor actividad en los discos duros de lo que sería normal.

Opté por añadir un sistema de ficheros compartido entre el sistema anfitrión e invitado para intentar no poner por medio el servicio NFS. El sistema de ficheros sería de tipo «mapped» lo que nos llevaría a una serie de inconvenientes en cuanto a permisos en los ficheros creados pero que nos dejaría escribir sin mayores problemas:

<filesystem type=»mount» accessmode=»mapped»>
<source dir=»/mnt/unidadCompartida»/>
<target dir=»unidadCompartida»/>
<alias name=»fs0″/>
<address type=»pci» domain=»0x0000″ bus=»0x00″ slot=»0x08″ function=»0x0″/>
</filesystem>

Para montar la unidad en el sistema invitado sólo hay que añadir la siguiente línea en el fichero «/etc/fstab»:

unidadCompartida /mnt/unidadCompartida 9p trans=virtio,version=9p2000.L,cache=mmap,rw 0 0

Hay que tratar de recordar añadir las opciones de «version=9p2000.L,cache=mmap» para evitar problemas con aplicaciones como «rtorrent» cuyo log nos devolvería lo siguiente:

Could not create: memory:524288 block:1 errno:22 errmsg:Invalid argument.

Para arreglar el tema de permisos en la carpeta compartida, como desde un primer momento no tuve la previsión de hacerlo de este modo, lo arreglé con una pequeña tarea en el Cron del sistema anfitrión:

*/15 * * * * /bin/chmod 777 -R /mnt/unidadCompartida/

De este modo, cada 15 minutos, se le otorga permisos a todo el mundo sobre el contenido de dicha carpeta para que otras máquinas puedan acceder a él sin problemas. Obviamente, se tiene que saber lo qué se hace y almacena en dicha carpeta, porque un 777 abarca mucho.

Autofs para unidades NFS

viernes, 17 de abril de 2020 Sin comentarios

Autofs nos permite montar unidades bajo demanda. En mi caso mi intención era evitar montar las unidades NFS en el arranque y dejarlo para cuando realmente necesitase acceder a ellas. Esto nos ahorra tiempo de carga y libera recursos cuando no estemos haciendo uso de ellos.

Su instalación es bastante simple en OpenSuse:

zypper install autofs

Editaremos un fichero «/etc/auto.master» que contendrá el punto de montaje de nuestras unidades NFS, el fichero con la información acerca de las unidades y el tiempo que dejará pasar después de su último uso para desmontarla:

+auto.master
/mnt/nfs /etc/auto.nfs –timeout=60

Crearemos el fichero «auto.nfs» que contendrá el nombre de la carpeta donde queremos montar la unidad NFS, el tipo de sistema de fichero incluyendo algunos parámetros de conexión y la ruta hasta la unidad de red:

equipo100 -fstype=nfs,soft,nolock 192.168.1.100:/mnt/Equipo100Share
equipo200 -fstype=nfs,soft,nolock 192.168.1.200:/mnt/Equipo200Share

Esto hará que tengamos dos directorios «/mnt/nas/equipo100» y «/mnt/nas/equipo200». Para que se monten tendremos que escribir la ruta completa en nuestro gestor de ficheros («dolphin» en mi caso) o simplemente hacer accesos directos a ellos.

Para terminar reiniciaremos el servicio para que cargue la configuración y, si no lo está por defecto, habilitaremos el servicio en el arranque del sistema:

systemctl restart autofs

systemctl enable autofs

Categories: GNU/Linux, OpenSuse Tags: , ,

Mejorando los tiempos de arranque en Gnu/Linux

viernes, 17 de abril de 2020 Sin comentarios

En Linux tenemos una serie de herramientas que nos permiten analizar qué servicios tardan más en arrancar que otros y observar como afecta a sus dependencias.

Con el siguiente comando obtenemos los tiempos generales en segundo que tarda cada parte del sistema en estar preparado:

systemd-analyze

A veces no te puedes fiar al 100% y se recomienda el uso de un cronómetro para comprobarlo, pero indudablemente nos da una valoración aproximada.

Con el siguiente comando obtendremos un listado de los procesos que intervienen en el arranque del sistema ordenados por tiempo:

systemd-analyze blame

Y el comando que más utilidad me proporciona personalmente es el que nos genera un gráfico con barras que nos hacen entender los tiempos de los procesos y sus dependencias:

systemd-analyze plot > boot_analysis.svg

El fichero «.svg» que se genera lo podemos abrir con Gimp o algún navegador web.

En mi caso, con OpenSuse Tumbleweed, teniendo dos unidades montadas a través de «autofs» hice lo siguiente:

  • «systemctl disable NetworkManager-wait-online.service» un servicio que simplemente retrasa al resto hasta que tenemos conexión de red. En mi caso, al no tener ningún servicio dependiente de la red pude deshabilitarlo y ahorrarme 7 segundos.
  • Cambié la administración de red de «Wicked» a «NetworkManager», con lo que la conexión de red queda relegada a la carga de escritorio del usuario.
  • Deshabilité el servicio «btrfsmaintenance-refresh.service» ya que no tenía ningún dispositivo de almacenamiento con BTRFS.
  • Desinstalé «Postfix» porque no le daba ningún uso, no envío correo electrónico ni espero recibir notificaciones por ese medio en la cuenta «root».

Con todo lo anterior realizado pasé de más de 40 segundos a 18. Puede parecer poco ahorro, pero se agradece.

De Ubuntu 18.04 Server a cliente Kodi

miércoles, 15 de abril de 2020 Sin comentarios

Partiendo del hecho de que una Ubuntu Server carece de interfaz gráfica tal cual la conocemos habitualmente, a la hora de instalar un Kodi y que sea lo único que aparezca se hace algo laborioso.

Instalaremos Kodi con lo siguiente:

add-apt-repository ppa:team-xbmc/ppa
apt install kodi

En caso de tener una tarjeta gráfica de Nvidia, instalaremos su driver propietario:

apt install ubuntu-drivers-common
ubuntu-drivers devices
ubuntu-drivers autoinstall

Observando los diferentes escritorios a los que podemos optar, yo elegí Lubuntu por su ligereza:

tasksel –list-task
tasksel install lubuntu-core
service lightdm start

Con lo anterior ya deberíamos tener una interfaz gráfica donde hacer login que hará que arranque Kodi nada más entrar. Para no necesitar introducir la contraseña podemos hacer que entre automáticamente creando un fichero «/etc/lightdm/lightdm.conf.d/50-myconfig.conf» que incluya lo siguiente:

[Seat:*]
autologin-user=nombre_de_usuario
autologin-user-timeout=0

Sin embargo, nos encontraremos con problemas para hacer passthrough de sonido a través del HDMI de la gráfica. Tendremos que crear un script que se inicie con la sesión que recoja estos comandos:

echo autospawn = no > $HOME/.config/pulse/client.conf
pulseaudio –kill > /dev/null 2>&1

 

Software libre para servicios en red

domingo, 5 de abril de 2020 Sin comentarios

Desde la comunidad Self-Hosted de Reddit encontré un repertorio lleno de alternativas de software libre para cubrir las necesidades que se nos puedan pasar por la cabeza y que podemos implantar con mayor o menor dificultad en nuestro servidor. Desde luego sirve como buen punto de partida cuando sabemos que queremos algo pero no sabemos por dónde empezar a probar proyectos.