Linux + kernel 3.19 + NVidia + LightDM = blank screen

Introducción

NVidia_logoEste problema empezó a suceder tan pronto como instalé Ubuntu 15.10 y sucedió también cuando se actualizó el kernel del Ubuntu 14.04 LTS.  Por esto concluyo por ahora que el problema se encuentra relacionado con el kernel (3.19.0-47) que estoy utilizando actualmente y los controladores de NVidia, tanto los propietarios como los de código abierto.

El sistema operativo inicia aparentemente bien pero al cargar la pantalla de autenticación de usuario de LightDM esta aparece negra a pesar de que se escucha el sonido que se reproduce al llegar a este punto y es aún posible ingresar el nombre de usuario y contraseña e iniciar sesión sin que aparezca nada en la pantalla.

Solución

Después de probar varias opciones la solución aparente a este problema consiste en agregar los parámetros acpi_osi=Linux rcutree.rcu_idle_gp_delay=1 a la variable GRUB_CMDLINE_LINUX_DEFAULT del Grub de la siguiente manera.

$ sudo vi /etc/default/grub

...
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_osi=Linux rcutree.rcu_idle_gp_delay=1"
...

$ sudo update-grub

Para consultar el valor actual de dicha variable en la sesión actual es posible ejecutar el siguiente comando.

$ cat /sys/module/rcutree/parameters/rcu_idle_gp_delay

Según la documentación de los parámetros del kernel, este valor representa el intervalo de activación para las CPU desocupadas que tienen llamados RCU.

Problemas reconociendo el touchpad de un Asus X455L en Linux Ubuntu 15.04

Aclaración de versiones

Este procedimiento sólo es necesario con versiones del Kernel inferiores a la 4.2 ya que a partir de esta versión (utilizada por Wily y Trusty de Ubuntu), los touchpads Focaltech se encuentran soportados de manera nativa.

Introducción

Una vez instalado Linux Ubuntu 15.04 en el portátil Asus X455L se evidencia que el touchpad no se encuentra funcionando correctamente.  Los gestos como el scroll vertical y horizontal no funcionan y el área de los botones también es sensible al movimiento haciendo muy difícil hacer clic sobre una ubicación precisa.

Al parecer este touchpad de FocalTech requiere de unos controladores específicos que aún no se encuentran incluidos en el kernel convencional.

$ xinput list

⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ PS/2 FocalTech FocalTech Touchpad in mouse emulation mode    id=13    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Video Bus                                   id=8    [slave  keyboard (3)]
    ↳ Sleep Button                                id=9    [slave  keyboard (3)]
    ↳ USB2.0 VGA UVC WebCam                       id=10    [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                            id=11    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=12    [slave  keyboard (3)]

La solución a este problema consiste en instalar estos controladores que han sido preparados por miembros de la comunidad (no directamente Asus).

Solución

Agregar el repositorio e instalar el paquete requerido.

$ sudo add-apt-repository ppa:hanipouspilot/focaltech-dkms

$ sudo apt-get update

$ sudo apt-get install focaltech-dkms

Reiniciar psmouse de la siguiente manera o reiniciar el sistema operativo completo.

$ sudo modprobe -r psmouse

$ sudo modprobe psmouse

Verificación

Una vez instalado correctamente el módulo con los controladores y reiniciado el sistema se obtiene este nuevo resultado con xinput.

$ xinput list

⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ PS/2 FocalTech FocalTech Touchpad           id=13    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Video Bus                                   id=8    [slave  keyboard (3)]
    ↳ Sleep Button                                id=9    [slave  keyboard (3)]
    ↳ USB2.0 VGA UVC WebCam                       id=10    [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                            id=11    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=12    [slave  keyboard (3)]

Recursos

  1. Repositorio de Ubuntu para el paquete focaltech-dkms.
    https://launchpad.net/~hanipouspilot/+archive/ubuntu/focaltech-dkms
  2. Repositorio de GitHub para el paquete psmouse-focaltech-dkms.
    https://github.com/markmandel/psmouse-focaltech-dkms

Actualizar el firmware y kernel de las Raspberry Pi

Introducción

RaspberryPiLogoAsí como es posible actualizar el sistema operativo (Raspbian) de la tarjeta Raspberry Pi también es posible actualizar el firmware de la misma y su kernel.

Esto normalmente sucede mediante el paquete raspberrypi-bootloader el cual se encuentra contenido en los repositorios estándar de Rasbpian.  Esta versión se actualiza con regular frecuencia y a pesar de no acostumbra  a ser la última disponible, acostumbra  a ser una bastante probada y estable.

Estos archivos –kernel, firmware y bootloader– residen en una partición independiente del directorio raíz en la tarjeta SD.  Por este motivo no es la Raspberry Pi que se actualiza sino la tarjeta SD con el sistema operativo.

Procedimiento

Si se desea actualizar el firmware y el kernel de la tarjeta a las últimas versiones disponibles se debe utilizar el siguiente comando.

$ sudo rpi-update

Debe tenerse en cuenta que esta versión posiblemente sea menos estable que la incluida en los repositorios.

Análisis de la actualización

Con la versión actual del firmware que se encuentra disponible en el repositorio de Raspbian.

$ sudo aptitude show raspberrypi-bootloader

    Package: raspberrypi-bootloader          
    State: installed
    Automatically installed: no
    Version: 1.20140107-1
    Priority: extra
    Section: admin
    Maintainer: Alex Bradbury <asb@asbradbury.org>
    Architecture: armhf
    Uncompressed Size: 53.9 M
    Description: Raspberry Pi bootloader
     This package contains the Raspberry Pi bootloader (plus,   temporarily, a kernel).
    Homepage: https://github.com/raspberrypi/firmware

Se cuenta con las siguientes versiones de firmware y kernel.

$ /opt/vc/bin/vcgencmd version

    Jan  6 2014 21:19:57
    Copyright (c) 2012 Broadcom
    version b00bb3ae73bd2799df0e938b7a5f17f45303fb53 (clean) (release)

$ uname -a

    Linux anita 3.10.25+ #622 PREEMPT Fri Jan 3 18:41:00 GMT 2014 armv6l GNU/Linux

Una vez se realizó la actualización del software utilizando rpi-update se obtuvieron las siguientes versiones.

$ /opt/vc/bin/vcgencmd version

    May  9 2014 16:52:52
    Copyright (c) 2012 Broadcom
    version c8ed097f7c23249e702bea3ed6b5720136ba00e4 (tainted) (release)

$ uname -a

    Linux anita 3.12.19+ #681 PREEMPT Fri May 9 16:36:10 BST 2014 armv6l GNU/Linux

Recursos

Emular la Raspberry Pi con Raspbian utilizando QEMU

Introducción

raspbianEs posible ejecutar Raspbian (ARM 1176) desde un PC (x86) mediante el uso de QEMU.

La emulación no es perfecta ya que aún no incluye todos los componentes ni es muy rápida, sin embargo será útil para efectos de experimentación.

Instalación de QEMU

$ sudo aptitude install qemu-system-arm qemu-system-common qemu-utils

Verificar que se cuenta con el soporte necesario para la CPU 1176 o la 1136-r2.

$ qemu-system-arm -cpu help | grep 1176

$ qemu-system-arm -cpu help | grep 1136

Si su distribución no cuenta con el soporte necesario, es posible compilar QEMU con soporte para ARM desde fuentes.

Si se desea utilizar Windows, es posible obtener una versión reciente de la distribución binaria de QEMU.

Obtener Raspbian

Descargar la versión mas reciente disponible en el sitio web oficial.

$ wget http://downloads.raspberrypi.org/raspbian_latest

Verificar la integridad del paquete descargado comparando su hash SHA1 con el especificado en el sitio de descargas oficial.

$ sha1sum 2014-01-07-wheezy-raspbian.zip

9d0afbf932ec22e3c29d793693f58b0406bcab86  2014-01-07-wheezy-raspbian.zip

Descomprimir el paquete descargado para obtener la imagen del sistema operativo.

$ unzip 2014-01-07-wheezy-raspbian.zip

Obtener el kernel

Para poder realizar la emulación de ARM desde x86 es necesario obtener un kernel compatible.  Al parecer el kernel mas utilizado para este tipo de emulación es el construido por xecdesign.com.

$ wget http://xecdesign.com/downloads/linux-qemu/kernel-qemu

Primer boot

En este primer inicio del sistema operativo será necesario realizar algunos ajustes al sistema operativo.

$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2014-01-07-wheezy-raspbian.img

Tenga en cuenta las siguientes recomendaciones.

  • Ajuste el nombre del archivo de la imagen del sistema operativo según la versión descargada.
  • No asigne mas de 256MB de memoria RAM a la emulación.

Comentar la siguiente línea en el archivo ld.so.preload.

$ vi /etc/ld.so.preload

    # /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so

De manera opcional, crear el archivo 90-qemu.rules con el siguiente contenido con el fin de crear enlaces a los dispositivos de los discos con nombres iguales a los utilizados por la Raspberry Pi.

$ vi /etc/udev/rules.d/90-qemu.rules

    KERNEL=="sda", SYMLINK+="mmcblk0"
    KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
    KERNEL=="sda2", SYMLINK+="root"

Reiniciar la emulación.

$ shutdown -t now

 Iniciar la emulación

$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-01-07-wheezy-raspbian.img

Recursos

Instalar un kernel sin soporte para Xen en Scientific Linux 5.x

Introducción

Dos de los servidores del cluster estaban presentando problemas con procesos muertos relacionados con tareas en el cron que intentaban acceder a /sys/hypervisor/uuid.  Al parecer el bug 225203 impide que se acceda a este recurso si el servicio de XenStored no se está ejecutando.

awk -v progname=/etc/cron.hourly/mcelog.cron progname {?????   print
> progname “:n”?????   progname=””;????       }????
/bin/bash /usr/bin/run-parts /etc/cron.hourly
cat /sys/hypervisor/uuid

Como el soporte de Xen no era requerido en estos servidores decidí removerlo.  Para hacer esto reemplacé el kernel de cada uno de estos equipos con el correspondiente kernel convencional.  Este procedimiento fue realizado utilizando Scientific Linux 5.4, sin embargo debe ser compatible con otros descendientes de RedHat como CentOS.

Procedimiento

Descargar e instalar los paquetes del nuevo kernel sin soporte para Xen.

# yum install kernel kernel-devel kernel-headers

Remover el kernel actual que cuenta con soporte para Xen.

# yum remove xen kernel-xen kernel-xen-devel

Reiniciar el servidor para que sea tomado en cuenta el nuevo kernel.

# reboot

Soporte a mas de 4GB de RAM en GNU/Linux Ubuntu de 32 bits

Introducción.

Es conocido que la arquitectura de 32 bits (i686) no puede direccionar 4GB o mas de memoria RAM (~2.8GB) aunque esta se encuentre físicamente instalada en la máquina.

Una solución para este problema consiste en utilizar un sistema operativo basado en una arquitectura de 64 bits (x64), la cual le permite direccionar una cantidad mayor de memoria.  El uso de esta arquitectura trae consigo algunos problemas que pueden ser incómodos en equipos de escritorio mas no en servidores.

  • El gasto de memoria RAM del sistema operativo es mayor.
  • Algunas aplicaciones de 32 bits no funcionan correctamente, por ejemplo el plugin de Flash.
  • Algunas aplicaciones y librerías que se distribuyen de manera binaria no se encuentran disponibles para 64 bits.

Finalmente he llegado a la conclusión que sólo debe utilizarse un sistema de 64 bits cuando realmente se amerite, en cualquier otro caso se deberá utilizar uno de 32 bits.

  • Servidores en producción.
  • Equipos que contengan máquinas virtuales sobre las cuales se ejecuten sistemas operativos de 64 bits.
  • Equipos con 4GB o mas de memoria RAM.

El último caso incluía también a las máquinas de escritorio que contaban con 4GB o mas de memoria RAM, es decir, era necesario instalarles un sistema operativo de 64 bits de lo contrario no podrían utilizar la totalidad de la memoria disponible.

Para evitar esto es posible utilizar un kernel con soporte para PAE (Physical Address Extension) sobre un sistema operativo de 32 bits.  Con esto se amplía el espacio de direcciones hasta 36 bits lo que permite direccionar hasta 64GB de memoria RAM.

A continuación se detallan los pasos necesarios para instalar el kernel con soporte para PAE en un computador de escritorio que utiliza GNU/Linux Ubuntu 10.10 de 32 bits como sistema operativo.

Procedimiento.

Inicialmente se cuenta con el kernel de 32 bits instalado por defecto.

$ uname -a

Linux jimezam-ultra 2.6.35-22-generic #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 i686 GNU/Linux

Este kernel no permite direccionar la totalidad de la memoria RAM a pesar de que el equipo cuenta con 4GB instalados físicamente.

$ free -m

total       used       free     shared    buffers     cached
Mem:          2926 762       2163          0         50        404
-/+ buffers/cache:        307       2618
Swap:         4769          0       4769

Se procede con la instalación del kernel con soporte para PAE.

$ sudo aptitude install linux-generic-pae linux-headers-generic-pae linux-image-generic-pae

Es necesario reiniciar la máquina para que el nuevo kernel recién instalado sea tenido en cuenta.

$ sudo reboot

El nuevo kernel sigue siendo de 32 bits pero ahora incluye el soporte para PAE.

$ uname -a

Linux jimezam-ultra 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux

Ahora es posible apreciar como la memoria direccionada es mayor en comparación con el kernel original.

$ free -m

total       used       free     shared    buffers     cached
Mem:          3922 898       3024          0         52        527
-/+ buffers/cache:        317       3604
Swap:         4769          0       4769

Enlaces.

Actualización del Kernel en Ubuntu 9.04

Introducción.

El día de hoy voy a actulizar el kernel del equipo de la oficina que tiene actualmente un 2.6.28-11-generic #42-Ubuntu SMP.  La nueva versión será la 2.6.29-4.

Supuestamente la versión actual tiene algunos problemas, en particular con las tarjetas de video Intel.  A pesar de que la tarjeta de video de este equipo es NVidia 7x si he notado a esta nueva versión de Ubuntu mas lenta, especialmente en temas de manejo de ventanas, así que voy a experimentar con la actualización a ver si se mejoran.

La versión 2.6.30 se encuentra disponible desde el día de ayer sin embargo leí en varios foros acerca de la posible incompatibildad con cierto hardware así que prefiero ir dando un pasito a la vez.

Procedimiento.

Descargar los paquetes requeridos del Kernel.

$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.29.4/linux-headers-2.6.29-02062904-generic_2.6.29-02062904_i386.deb

$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.29.4/linux-headers-2.6.29-02062904_2.6.29-02062904_all.deb

$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.29.4/linux-image-2.6.29-02062904-generic_2.6.29-02062904_i386.deb

Instalar los paquetes del Kernel.

$ sudo dpkg -i linux-headers-2.6.29-02062904-generic_2.6.29-02062904_i386.deb linux-headers-2.6.29-02062904_2.6.29-02062904_all.deb linux-image-2.6.29-02062904-generic_2.6.29-02062904_i386.deb

Reiniciar el sistema.

$ sudo reboot.

Enlaces.