¿Cómo puedo personalizar un fondo de consola de pantalla completa (TTY)?

17

Solía ​​usar consolas de pantalla completa (las que se abrieron con Ctrl+ Alt+ F1... F6) de manera activa y se me ocurrió la idea de que me gustaría intentar decorarlo con un "fondo de pantalla" (uno bastante oscuro y monótono, por supuesto). para que no disminuya la legibilidad), tal vez esto podría verse y sentirse bien (o no, pero tengo que intentarlo). Sería aún mejor si pudiera configurar diferentes imágenes como fondo de consola diferente (una para Ctrl+ Alt+ F1, otra para Ctrl+ Alt+ F2etc.).

El hecho de que las consolas tengan una resolución mucho más alta que la que proporciona el modo de texto puro sugiere que se utiliza el modo gráfico completo y que todo es posible. ¿Pero cómo?

Ivan
fuente
2
Imposible. Las consolas virtuales son solo de texto.
Sergiy Kolodyazhnyy
55
@Serg He estado usando modos de solo texto desde que Linux ni siquiera existía; créanme, puedo distinguir el modo de texto real de su emulación gráfica. Muchas personas apenas pueden imaginar esto hoy en día, pero incluso he estado viendo películas en las consolas sin ningún servidor X instalado durante los días de Linux 2.4. Esto me hace dudar de que esto sea realmente imposible.
Ivan
1
OK, así déjenme corregir a mí mismo: yo creo en la visualización de imágenes y películas en la consola, a causa de algo saber como framebufferdispositivo, pero con esa pantalla está ocupada con una producción de algún programa, como por ejemplo fbi. TTY en sí mismo sigue siendo un dispositivo de solo texto
Sergiy Kolodyazhnyy
2
Daré una recompensa por tu pregunta una vez que sea elegible. Me interesó en realidad
Sergiy Kolodyazhnyy
1
Mira esto: code.google.com/p/fbterm
Sergiy Kolodyazhnyy

Respuestas:

12

Estoy bastante seguro de que el controlador de consola de Linux no tiene esta capacidad incorporada, sin embargo, hay una aplicación llamada fbtermque puede hacer esto. Para que las imágenes de fondo funcionen, también necesitará una utilidad que pueda mostrar una imagen en el framebuffer como fbi:

sudo apt-get install fbterm fbi

fbtermen realidad no lee ni muestra imágenes de fondo en sí, espera que algún otro programa configure la imagen de fondo en la pantalla antes de que comience. Hay instrucciones en la fbtermpágina de manual sobre cómo hacer esto usando fbv, una utilidad absolutamente anticuada y sin soporte que ni siquiera pude compilar en un sistema Ubuntu moderno. fbies un visor de imágenes mucho más limpio y agradable para el framebuffer, pero desafortunadamente no tiene la funcionalidad "configurarlo y salir" del más simple fbv, y por lo tanto interfiere fbtermsi intenta usarlo directamente. Sin embargo, pude encontrar una alternativa que funciona:

Primero, necesitará usar fbiy catmostrar la imagen que desea y luego volcarla en un archivo de imagen de "formato sin formato de framebuffer". Como root, en una consola framebuffer, ejecute:

( sleep 1; cat /dev/fb0 > nifty-background.fbimg ) & fbi -t 2 -1 --noverbose -a nifty-background.png

(Esto mostrará la imagen durante un par de segundos y luego saldrá, después de haber guardado el resultado en el archivo nifty-background.fbimg. Reemplace nifty-background.fbimgy nifty-background.pngcon cualquier nombre de archivo que desee, por supuesto).

La primera parte del comando espera 1 segundo antes de capturar el contenido del framebuffer en un archivo. Al mismo tiempo, la segunda parte (después de &) se inicia fbipara mostrar la imagen en el framebuffer, de modo que cuando el comando cat comienza a ejecutarse (1 segundo después), hay una imagen allí para volcar. La razón por la que están en ese orden es porque descubrí que fbitenía problemas si no se estaba ejecutando en primer plano, lo que significa que tiene que ser el último comando de la lista.

A partir de ese momento, cada vez que desee ejecutar fbterm, puede iniciarlo de la siguiente manera (es posible que desee crear un pequeño script de contenedor):

export FBTERM_BACKGROUND_IMAGE=1
cat nifty-background.fbimg > /dev/fb0; fbterm
Foogod
fuente
7

Puedo distinguir el modo de texto real de su emulación gráfica.

... que es una de las formas en que el observador podría distinguir un BSOD real en Windows de las acciones del protector de pantalla de broma BSOD que hizo las rondas hace una década más o menos. La visualización de los caracteres gráficos de bloque usando el hardware del adaptador de pantalla en modo gráfico fue sutilmente diferente de los caracteres generados por el hardware del adaptador de pantalla en modo texto.

Sí, el adaptador de pantalla está en modo gráfico. Ha sido así durante bastante tiempo, ahora. Siempre fue así en sistemas sin hardware de adaptador de pantalla de PC. En los primeros años de Linux, en las PC compatibles, la consola tendría el hardware del adaptador de pantalla en modo texto. Pero este uso se ha erosionado silenciosamente a casi nada. El soporte Unicode para la mayoría de los usuarios hoy en día requiere un conjunto de glifos más grande que el que tiene el hardware en modo texto. El firmware de la máquina (por supuesto) usa el modo gráfico para pantallas de presentación (con imágenes bonitas y logotipos de la compañía), al igual que el cargador de Linux y la inicialización del sistema.

Hay un programa emulador de terminal integrado en el kernel de Linux. Está en capas en la parte superior del framebuffer y el subsistema de eventos de entrada, al que utiliza las interfaces internas del kernel para acceder. Se presenta a los sistemas en modo de aplicación como una serie de dispositivos de terminal virtual del núcleo , /dev/tty1y así sucesivamente.

Este programa es bastante limitado en comparación con los emuladores de terminal que se ejecutan fuera del núcleo de Linux, como programas de aplicaciones comunes. Solo emula un subconjunto limitado de la funcionalidad de un terminal real y carece de las características adicionales de los últimos emuladores de terminal.

Son aquellos a los que debe prestar atención para esto. Puede estar familiarizado con los emuladores de terminal que usan X para su entrada / salida, como xterm, lxterminal, gnome-console, konsole, eterm, wterm y el resto. Menos conocidos son los que usan los dispositivos framebuffer y los dispositivos de eventos de entrada para su entrada / salida. proporcionando terminales virtuales de espacio de usuario :

Algunos de estos últimos pueden hacer lo que quieras.

fbterm se puede configurar para usar lo que esté en el framebuffer al inicio como una imagen de fondo, por ejemplo. Entonces, todo lo que uno necesita hacer es usar una de las varias otras utilidades para mostrar imágenes directamente a un dispositivo Linux framebuffer para configurar una imagen de fondo antes de ejecutar fbterm. Existen varias herramientas de este tipo, que incluyen:

fbvis y fbi limpian la pantalla al salir y requieren las convoluciones que se explican con más detalle en la respuesta de Foogod. Sin embargo, dfbg no se limpia después de sí mismo, lo que lo hace más adecuado para esta tarea en particular.

Otras lecturas

JdeBP
fuente
La pregunta fue sobre cómo crear una imagen de fondo para la consola. Su respuesta solo enumera posibles soluciones. Por lo tanto, otorgo recompensas a la otra respuesta, sin embargo, agradezco la gran cantidad de información que ha proporcionado. Tienes mi voto a favor.
Sergiy Kolodyazhnyy
4

Aunque la respuesta de Foogod no funcionó para mí, me llevó a la dirección correcta, al proporcionarme la mitad de la solución (es decir, leer datos de framebuffer, mientras fbise muestra una imagen en la pantalla TTY). Por lo tanto, le he otorgado a su respuesta la recompensa.

Bellow es un script que facilita el inicio fbtermcon una ruta parcial a la imagen como un argumento de línea de comando único

Uso

La secuencia de comandos debe guardarse en un directorio que figura en su $PATHvariable. Preferiblemente debe estar en su $HOME/bincarpeta personal . Consulte ¿Cómo agregar un directorio a la RUTA? en la explicación de cómo agregar su personal bina $PATH, pero la creación de un directorio llamado binen su directorio personal es suficiente para añadirlo a PATHen la re-entrada.

El script también debe tener permiso ejecutable; puedes configurarlo con chmod +x /path/to/script.sh.

Finalmente, debe ejecutarse con sudo, para permitir el acceso de raíz para leer y escribir /dev/fb0.

Fuente de script

También disponible en mi repositorio de Github.

#!/bin/bash
# Author : Serg Kolo
# Date: Dec 5, 2015
# Description: Script to render image and set it as background
# in conjunction with fbterm
# Depends: fbterm,fbi, awk
# Written for: /ubuntu//q/701874/295286

function printUsage
{
  echo "<<< Script to set background image in TTY console"
  echo "<<< Written by Serg Kolo, Dec 5 , 2015"
  echo "<<< Usage: scriptName.sh /path/to/image"
  echo "<<< Must be ran with root privileges, in TTY only"
  echo "exiting"

}

# check if we're root, if there's at least one ARG, and it is a TTY

if [ "$(whoami)" != "root"   ] || [ "$#" -eq 0  ] ||  [ "$( tty | awk '{gsub(/[[:digit:]]/,""); gsub(/\/dev\//,"");print}' )" != "tty"  ] ;then

   printUsage
   exit 1
fi



# read the full path of the image

IMAGE="$( readlink -f "$@" )"

# Launch fbi with whatever image was supplied as command line arg
# then take out whatever is the data in framebuffer;
# Store that data to /tmp folder

( sleep 1; cat /dev/fb0 > /tmp/BACKGROUND.fbimg ; sleep 1; pkill fbi ) & fbi -t 2 -1 --noverbose -a  "$IMAGE"

# This portion is really optional; you can comment it out 
# if you choose so

echo "LAUNCH FBTERM ?(y/n)"
read ANSWER

if [ "$ANSWER" != "y"  ] ; then
   echo exiting
   exit 1
fi

# The man page states that fbterm takes screenshot of 
# what is currently in framebuffer and sets it as background
# if FBTERM_BACKGROUND_IMAGE is set to 1
# Therefore the trick is to send the framebuffer data captured
# in the last step (which will display the image on screen)
# and then launch fbterm. Note, that I send output from the command
# send to background in order to avoid the extra text displayed on 
# screen. That way we have clear image in framebuffer, without 
# the shell text, when we launch fbterm

export FBTERM_BACKGROUND_IMAGE=1 
clear
( cat /tmp/BACKGROUND.fbimg  > /dev/fb0 &) > /dev/null; sleep 0.25; fbterm 

información adicional

Resulta que el usuario no necesariamente necesita usar sudo; /dev/fb0pertenece al videogrupo, por lo que los usuarios podrían agregarse a ese grupo usando

sudo usermod -a -G video $USER

Por lo tanto, las comprobaciones de raíz en el script anterior se vuelven obsoletas, específicamente [ "$(whoami)" != "root" ] ||parte.

Sergiy Kolodyazhnyy
fuente