%3F.png)
Solía usar consolas de pantalla completa (las que se abren con Ctrl+ Alt+ F1... F6) activamente y se me ocurrió la idea de que me gustaría intentar decorarlas con una especie de "papel tapiz" (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 incluso mejor si pudiera configurar diferentes imágenes como fondo de consola diferente (una para Ctrl+ Alt+ F1, otra para Ctrl+ Alt+ F2, etc.).
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 para ellas se utiliza el modo gráfico completo y que todo es posible. ¿Pero cómo?
Respuesta1
Estoy bastante seguro de que el controlador de la consola de Linux no tiene esta capacidad incorporada; sin embargo, existe una aplicación llamada fbterm
que 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 por ejemplo fbi
:
sudo apt-get install fbterm fbi
fbterm
en realidad no lee ni muestra imágenes de fondo, espera que algún otro programa configure la imagen de fondo en la pantalla antes de comenzar. Hay instrucciones en la fbterm
pá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. fbi
es un visor de imágenes mucho más limpio y agradable para el framebuffer, pero desafortunadamente no tiene la funcionalidad "configurarlo y salir" del simpler fbv
, y por lo tanto interfiere fbterm
si intentas usarlo directamente. Sin embargo, pude encontrar una alternativa que funciona:
Primero, necesitará usar fbi
y cat
mostrar la imagen que desea y luego volcarla en un archivo de imagen de "formato sin formato 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á, habiendo guardado el resultado en el archivo nifty-background.fbimg
. Reemplace nifty-background.fbimg
y nifty-background.png
con los nombres de archivo que desee, por supuesto).
La primera parte del comando espera 1 segundo antes de transferir el contenido del framebuffer a un archivo. Al mismo tiempo, la segunda parte (después de &) se inicia fbi
para mostrar la imagen en el framebuffer, de modo que cuando el comando cat comience a ejecutarse (1 segundo después), haya una imagen allí para volcar. La razón por la que están en ese orden es porque descubrí que fbi
tenía problemas si no se ejecutaba en primer plano, lo que significa que tiene que ser el último comando de la lista.
A partir de ese momento, siempre que quieras ejecutar fbterm
, puedes iniciarlo así (es posible que desees crear un pequeño script contenedor):
export FBTERM_BACKGROUND_IMAGE=1
cat nifty-background.fbimg > /dev/fb0; fbterm
Respuesta2
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 BSOD de broma que circulaba hace aproximadamente una década. La visualización de caracteres de gráficos en bloque utilizando el hardware del adaptador de pantalla en modo de gráficos era sutilmente diferente de los caracteres generados por el hardware del adaptador de pantalla en modo de texto.
Sí, el adaptador de pantalla está en modo de gráficos. Ha sido así desde hace bastante tiempo. Fuesiemprede esta manera en sistemas sin hardware de adaptador de pantalla de PC. En los primeros años de Linux, en PC compatibles, la consola tenía el hardware del adaptador de pantalla en modo texto. Pero este uso se ha ido erosionando silenciosamente hasta prácticamente desaparecer. La compatibilidad con 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) utiliza el modo gráfico para las pantallas de presentación (con bonitas imágenes y logotipos de la empresa), 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á superpuesto al framebuffer y al subsistema de eventos de entrada, al que utiliza interfaces internas del kernel para acceder. Se presenta a los sistemas en modo de aplicación como una serie determinal virtual del núcleodispositivos, /dev/tty1
etc.
Este programa es bastante limitado en comparación con los emuladores de terminal que ejecutanafuerael kernel de Linux, como programas de aplicaciones comunes. Sólo emula un subconjunto limitado de la funcionalidad de un terminal real y carece de las características adicionales de estos últimos emuladores de terminal.
Son aquellos a quienes debes recurrir para esto. Es posible que esté 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 utilizan el(los) dispositivo(s) framebuffer y los dispositivos de eventos de entrada para su entrada/salida. Proporcionarterminales virtuales en el espacio de usuario:
- zhcon(paquete ubuntu),
- fbpad,
- término(paquete ubuntu) y sus horquillas comojfbterm(paquete ubuntu),
- bogl-bterm (paquete ubuntu),
- la comida
console-terminal-emulator
yconsole-fb-realizer
, y - kmscon.
Algunos de estos últimos pueden hacer lo que quieras.
fbterm se puede configurar para usar lo que esté en el framebuffer al inicio como imagen de fondo, por ejemplo. Entonces, todo lo que uno necesita hacer es usar una de las otras utilidades para mostrar imágenes directamente en un dispositivo framebuffer de Linux para configurar una imagen de fondo antes de ejecutar fbterm. Existen varias herramientas de este tipo, que incluyen:
- dfbg (paquete ubuntu),
- Ali Gholami Rudi'sfbvis, y
- FBI (paquete ubuntu).
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 solo, lo que lo hace más adecuado para esta tarea en particular.
Otras lecturas
- https://unix.stackexchange.com/a/177209/5132
- https://unix.stackexchange.com/a/178807/5132
- https://unix.stackexchange.com/a/194218/5132
- Jonathan de Boyne Pollard (2015)."terminales virtuales en el espacio de usuario". Guía de comida. 1.20. comida. Software de JdeBP.
- Jonathan de Boyne Pollard (2015).Un vistazo rápido a las terminales virtuales del espacio de usuario comida. Software de JdeBP.
- Geert Uytterhoeven (25 de octubre de 1998).Para su información: la consola del frame buffer cambia desde 2.1.107. kernel de Linux.
Respuesta3
Aunque la respuesta de Foogod no funcionó para mí, me llevó en la dirección correcta al proporcionar la mitad de la solución (es decir, leer los datos del framebuffer mientras fbi
se muestra una imagen en la pantalla TTY). Por lo tanto, le he otorgado la recompensa a su respuesta.
A continuación se muestra un script que facilita el inicio fbterm
con una ruta parcial a la imagen como un único argumento de línea de comando.
Uso
El script debe guardarse en un directorio que aparezca en su $PATH
variable. Preferiblemente debe estar en tu $HOME/bin
carpeta personal. Referirse a¿Cómo agregar un directorio a la RUTA?en la explicación de cómo agregar su personal bin
a $PATH
, pero crear un directorio llamado bin
en su directorio de inicio es suficiente para agregarlo al PATH
volver a iniciar sesión.
El script también debe tener permiso ejecutable; puedes configurarlo con chmod +x /path/to/script.sh
.
Finalmente, se debe ejecutar con sudo
, para permitir el acceso raíz para leer y escribir en /dev/fb0
.
Fuente del guión
También disponible enmi 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: https://askubuntu.com/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/fb0
pertenece al video
grupo, por lo que los usuarios podrían simplementeagregarse a ese grupousando
sudo usermod -a -G video $USER
Por lo tanto, las comprobaciones de root en el script anterior quedan obsoletas, específicamente [ "$(whoami)" != "root" ] ||
parte.
Respuesta4
Respuestasarribatrabajó para mi
Pero hay que especificardispositivopara el FBI:
fbi -d /dev/fb0
En mi caso, el FBI estaba intentando dri:/dev/dri/card0
Paralegibilidadposible utilizar imagemagick:
convert -fill '#202020' -colorize 80% "$1" /tmp/background
Esto imitará el fondo transparente al convertir la imagen en una superpuesta con color #202020
con 80%
visibilidad.