web-dev-qa-db-fra.com

Comment personnaliser un arrière-plan de console en plein écran (ATS)?

J'avais l'habitude d'utiliser des consoles plein écran (celles ouvertes avec Ctrl+Alt+F1...F6) activement et sont venus à une idée que je voudrais essayer de le décorer avec un "papier peint" d'une sorte (un assez sombre et monotone bien sûr pour qu'il ne diminue pas la lisibilité), peut-être cela pourrait ressembler et se sentir bien (ou pas, mais j'ai besoin d'essayer). Ce serait encore mieux si je pouvais définir différentes images comme arrière-plan de la console (une pour Ctrl+Alt+F1, un autre pour Ctrl+Alt+F2 etc).

Le fait que les consoles aient une résolution bien supérieure à celle fournie par le mode texte pur suggère que le mode graphique à part entière est utilisé pour elles et que tout est possible. Mais comment?

16
Ivan

Je suis à peu près sûr que le pilote de console Linux ne possède pas cette capacité, mais il existe une application appelée fbterm qui peut le faire. Afin de faire fonctionner les images d’arrière-plan, vous aurez également besoin d’un utilitaire permettant d’afficher une image sur le framebuffer telle que fbi:

Sudo apt-get install fbterm fbi

fbterm ne lit pas et n'affiche pas les images d'arrière-plan, il s'attend à ce qu'un autre programme configure l'image d'arrière-plan à l'écran avant son démarrage. La page de manuel fbterm contient des instructions sur la procédure à suivre, à l'aide de fbv, un utilitaire totalement obsolète et non pris en charge que je ne pouvais même pas compiler sur un système Ubuntu moderne. fbi est une visionneuse d'images beaucoup plus propre et plus agréable pour le framebuffer, mais n'a malheureusement pas la fonctionnalité "régler et quitter" de la plus simple fbv, et interfère donc avec fbterm si vous essayez de l'utiliser directement. Cependant, j'ai pu proposer une alternative qui fonctionne:

Vous devez d’abord utiliser fbi et cat pour afficher l’image souhaitée, puis la vider dans un fichier image "format brut du tampon de trame". En tant que root, dans une console de framebuffer, exécutez:

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

(Cela affichera l'image pendant quelques secondes, puis quittera, après avoir enregistré le résultat dans le fichier nifty-background.fbimg. Remplacez nifty-background.fbimg et nifty-background.png par le nom de fichier de votre choix, bien sûr.)

La première partie de la commande attend 1 seconde avant de convertir le contenu du framebuffer dans un fichier. En même temps, la deuxième partie (après le &) lance fbi pour afficher l'image sur le framebuffer, de sorte que lorsque la commande cat arrive à s'exécuter (1 seconde plus tard), il y a une image à vider. La raison pour laquelle ils sont dans cet ordre est parce que j’ai trouvé que fbi avait des problèmes s’il ne fonctionnait pas au premier plan, ce qui signifie que ce devait être la dernière commande de la liste.

À partir de là, chaque fois que vous voulez exécuter fbterm, vous pouvez le démarrer comme suit (vous pouvez créer un petit script wrapper):

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

Je peux distinguer le mode texte réel de son émulation graphique.

… Qui est l’un des moyens permettant à l’observateur de distinguer un véritable BSOD sous Windows des actions de l’écran de veille plaisant BSOD qui a fait le tour il ya une dizaine d’années. L'affichage des caractères graphiques en bloc à l'aide du matériel de la carte graphique en mode graphique était légèrement différent des caractères générés par le matériel de la carte graphique en mode texte.

Oui, la carte graphique est en mode graphique. Il en est ainsi depuis un bon moment maintenant. C'était toujours de cette façon sur les systèmes dépourvus de matériel d'adaptateur d'affichage PC. Dans les premières années de Linux, sur les ordinateurs compatibles PC, le matériel de la carte graphique était en mode texte sur la console. Mais cette utilisation a discrètement érodé à peu près rien. La prise en charge Unicode par la plupart des utilisateurs nécessite de nos jours un ensemble de glyphes plus important que celui du matériel en mode texte. Le firmware de la machine (bien sûr) utilise le mode graphique pour les écrans de démarrage (avec de jolies images et les logos de la société), tout comme le chargeur Linux et l’initialisation du système.

Il existe un programme d'émulateur de terminal intégré au noyau Linux. Il se superpose au framebuffer et au sous-système d'événements en entrée, auxquels il utilise des interfaces internes du noyau pour accéder. Il se présente aux systèmes en mode application comme une série de terminaux virtuels du noyau , de /dev/tty1 et ainsi de suite.

Ce programme est assez limité comparé aux émulateurs de terminaux qui exécutent en dehors du noyau le noyau Linux, en tant que programmes d’application ordinaires. Il n'émule qu'un sous-ensemble limité des fonctionnalités d'un terminal réel et ne possède pas les fonctionnalités supplémentaires des émulateurs de ce dernier.

Ce sont ceux que vous devez rechercher pour cela. Vous connaissez peut-être les émulateurs de terminaux qui utilisent X pour leurs entrées/sorties, tels que xterm, lxterminal, gnome-console, konsole, eterm, wterm et le reste. Moins connus sont ceux qui utilisent le (s) périphérique (s) du framebuffer et les périphériques d’événement en entrée pour leur entrée/sortie. fournissant terminaux virtuels de l'espace utilisateur :

Certains de ces derniers peuvent faire ce que vous voulez.

fbterm peut être configuré pour utiliser, par exemple, tout ce qui se trouve dans le framebuffer au démarrage comme image d’arrière-plan. Il suffit donc d'utiliser l'un des nombreux autres utilitaires pour afficher les images directement sur un framebuffer Linux afin de définir une image d'arrière-plan avant d'exécuter fbterm. Il existe plusieurs de ces outils, notamment:

fbvis et fbi effacent l'écran à la sortie et exigent les circonvolutions expliquées plus en détail dans la réponse de Foogod. dfbg, cependant, ne nettoie pas après lui-même, le rendant plus approprié pour cette tâche particulière.

Lectures complémentaires

6
JdeBP

La réponse de Foogod n'a pas fonctionné pour moi, mais elle m'a conduit dans la bonne direction, en fournissant la moitié de la solution (à savoir, la lecture des données du framebuffer, alors que fbimontre une image sur l'écran TTY). J'ai donc accordé sa récompense à la réponse.

Bellow est un script qui facilite le lancement de fbtermavec un chemin partiel de l’image en tant qu’argument unique en ligne de commande.

Utilisation

Le script doit être enregistré dans un répertoire répertorié dans votre variable $PATH. De préférence, il doit être dans votre dossier personnel $HOME/bin. Reportez-vous à la section Comment ajouter un répertoire au chemin PATH? Pour plus d'informations, comment ajouter votre nom personnel bin à $PATH, mais la création d'un répertoire appelé bindans votre répertoire personnel est suffisante pour l'ajouter à PATHlors de la nouvelle connexion .

Le script doit également avoir une autorisation exécutable; vous pouvez le définir avec chmod +x /path/to/script.sh.

Enfin, il doit être exécuté avec Sudoname__, afin de permettre un accès root pour la lecture et l'écriture sur /dev/fb0.

Source du script

Egalement disponible sur mon dépôt 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 

Informations supplémentaires

Il s'avère que l'utilisateur n'a pas nécessairement besoin d'utiliser Sudoname__; /dev/fb0 appartient au groupe videoafin que les utilisateurs puissent simplement s'ajouter eux-mêmes à ce groupe en utilisant

Sudo usermod -a -G video $USER

Ainsi, les vérifications de la racine dans le script ci-dessus deviennent obsolètes, en particulier la partie [ "$(whoami)" != "root" ] ||.

4