Wie kann ich einen Vollbild-Konsolenhintergrund (TTY) anpassen?

Wie kann ich einen Vollbild-Konsolenhintergrund (TTY) anpassen?

Ich habe früher Vollbildkonsolen (die mit Ctrl+ Alt+ F1... geöffnet wurden F6) aktiv verwendet und bin auf die Idee gekommen, sie mit einer Art „Hintergrundbild“ zu dekorieren (natürlich ein ziemlich dunkles und eintöniges, damit die Lesbarkeit nicht beeinträchtigt wird). Vielleicht sieht das gut aus und fühlt sich gut an (oder auch nicht, aber ich muss es versuchen). Noch besser wäre es, wenn ich verschiedene Bilder als Hintergrund für verschiedene Konsolen festlegen könnte (eines für Ctrl+ Alt+ F1, ein anderes für Ctrl+ Alt+ F2usw.).

Die Tatsache, dass die Konsolen eine viel höhere Auflösung haben als der reine Textmodus, lässt darauf schließen, dass für sie ein vollwertiger Grafikmodus verwendet wird und alles möglich ist. Aber wie?

Antwort1

Ich bin ziemlich sicher, dass der Linux-Konsolentreiber diese Fähigkeit nicht eingebaut hat, es gibt jedoch eine Anwendung namens, fbtermdie dies kann. Damit Hintergrundbilder funktionieren, benötigen Sie außerdem ein Dienstprogramm, das ein Bild im Framebuffer anzeigen kann, wie beispielsweise fbi:

sudo apt-get install fbterm fbi

fbtermliest oder zeigt Hintergrundbilder nicht selbst an, sondern erwartet, dass ein anderes Programm das Hintergrundbild auf dem Bildschirm einrichtet, bevor es startet. Auf der fbtermManpage finden Sie Anweisungen, wie Sie dies mit tun können fbv, einem absolut veralteten und nicht unterstützten Dienstprogramm, das ich nicht einmal auf einem modernen Ubuntu-System kompilieren konnte. fbiist ein viel saubererer und schönerer Bildbetrachter für den Framebuffer, hat aber leider nicht die „einstellen und beenden“-Funktionalität des einfacheren fbvund stört daher, fbtermwenn Sie versuchen, es direkt zu verwenden. Ich konnte jedoch eine Alternative finden, die funktioniert:

Zuerst müssen Sie fbiund verwenden cat, um das gewünschte Bild anzuzeigen und es dann in eine Bilddatei im „Framebuffer Raw-Format“ zu übertragen. Führen Sie als Root in einer Framebuffer-Konsole Folgendes aus:

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

(Dadurch wird das Bild einige Sekunden lang angezeigt und dann das Ende beendet. Das Ergebnis wird in der Datei gespeichert nifty-background.fbimg. Ersetzen Sie nifty-background.fbimgund nifty-background.pngnatürlich durch beliebige Dateinamen.)

Der erste Teil des Befehls wartet 1 Sekunde, bevor er den Inhalt des Framebuffers in eine Datei schreibt. Gleichzeitig wird der zweite Teil (nach dem &) gestartet, fbium das Bild im Framebuffer anzuzeigen, sodass, wenn der Befehl cat ausgeführt wird (1 Sekunde später), ein Bild zum Dumpen vorhanden ist. Der Grund für diese Reihenfolge ist, dass ich festgestellt habe, dass es fbiProbleme gab, wenn es nicht im Vordergrund ausgeführt wurde, was bedeutet, dass es der letzte Befehl in der Liste sein muss.

Von da an können Sie es, wann immer Sie es ausführen möchten fbterm, folgendermaßen starten (möglicherweise möchten Sie ein kleines Wrapper-Skript erstellen):

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

Antwort2

Ich kann den echten Textmodus von seiner grafischen Emulation unterscheiden.

… das ist eine der Möglichkeiten, mit denen der aufmerksame Beobachter einen echten BSOD unter Windows von den Aktionen des Scherz-BSOD-Bildschirmschoners unterscheiden kann, der vor etwa einem Jahrzehnt die Runde machte. Die Anzeige von Blockgrafikzeichen mithilfe der Grafikadapterhardware im Grafikmodus unterschied sich geringfügig von den von der Grafikadapterhardware im Textmodus generierten Zeichen.

Ja, der Grafikadapter ist im Grafikmodus. Das ist schon seit einiger Zeit so. Es warstetsauf diese Weise auf Systemen ohne PC-Grafikadapter-Hardware. In den frühen Jahren von Linux war die Grafikadapter-Hardware auf PC-kompatiblen Konsolen im Textmodus. Aber diese Nutzung ist still und leise auf praktisch nichts mehr zurückgegangen. Unicode-Unterstützung erfordert für die meisten Benutzer heutzutage einen größeren Glyphensatz als die Textmodus-Hardware hat. Die Maschinenfirmware verwendet (natürlich) den Grafikmodus für Begrüßungsbildschirme (mit hübschen Bildern und Firmenlogos), ebenso wie der Linux-Loader und die Systeminitialisierung.

Im Linux-Kernel ist ein Terminalemulatorprogramm integriert. Es liegt über dem Framebuffer und dem Input-Event-Subsystem, auf das es über interne Kernel-Schnittstellen zugreift. Für Anwendungsmodussysteme präsentiert es sich als eine Reihe vonvirtuelles Kernel-TerminalGeräte /dev/tty1und so weiter.

Dieses Programm ist ziemlich eingeschränkt im Vergleich zu Terminalemulatoren, die laufenaußerhalbder Linux-Kernel, wie gewöhnliche Anwendungsprogramme. Es emuliert nur einen begrenzten Teil der Funktionalität eines echten Terminals und verfügt nicht über die zusätzlichen Funktionen der letzteren Terminalemulatoren.

Diese müssen Sie hierfür verwenden. Sie kennen vielleicht die Terminalemulatoren, die X für ihre Ein-/Ausgabe verwenden, wie xterm, lxterminal, gnome-console, konsole, eterm, wterm und die anderen. Weniger bekannt sind diejenigen, die die Framebuffer-Geräte und die Input-Event-Geräte für ihre Ein-/Ausgabe verwenden. BereitstellungVirtuelle Terminals im Benutzerbereich:

Einige dieser Letzteren können tun, was Sie wollen.

fbterm kann so konfiguriert werden, dass es beispielsweise beim Start als Hintergrundbild das verwendet, was sich im Framebuffer befindet. Man muss also nur eines der zahlreichen anderen Dienstprogramme zum direkten Anzeigen von Bildern auf einem Linux-Framebuffer-Gerät verwenden, um vor dem Ausführen von fbterm ein Hintergrundbild einzurichten. Es gibt mehrere solcher Tools, darunter:

fbvis und fbi löschen den Bildschirm beim Beenden und erfordern die Faltungen, die in der Antwort von Foogod ausführlicher erläutert werden. dfbg räumt jedoch nicht nach sich selbst auf und ist daher für diese spezielle Aufgabe besser geeignet.

Weiterführende Literatur

Antwort3

Obwohl Foogods Antwort bei mir nicht funktioniert hat, hat sie mich in die richtige Richtung geführt, indem sie die Hälfte der Lösung lieferte (nämlich das Lesen von Framebuffer-Daten, während fbiein Bild auf dem TTY-Bildschirm angezeigt wird). Daher habe ich seiner Antwort die Prämie zuerkannt.

fbtermUnten finden Sie ein Skript, das den Start mit einem Teilpfad zum Image als einzelnes Befehlszeilenargument erleichtert.

Verwendung

Das Skript muss in einem Verzeichnis gespeichert werden, das in Ihrer $PATHVariable aufgeführt ist. Vorzugsweise sollte es sich in Ihrem persönlichen $HOME/binOrdner befinden. SieheWie füge ich dem PATH ein Verzeichnis hinzu?Weitere Informationen finden Sie in der Erklärung, wie Sie Ihre persönlichen binDaten hinzufügen. Es reicht $PATHjedoch aus, in Ihrem Home-Verzeichnis ein Verzeichnis mit dem Namen zu erstellen, um es bei der erneuten Anmeldung hinzuzufügen.binPATH

Das Skript muss außerdem über Ausführungsberechtigungen verfügen; diese können Sie mit festlegen chmod +x /path/to/script.sh.

Schließlich muss es mit ausgeführt werden sudo, um Root-Zugriff zum Lesen und Schreiben zu ermöglichen /dev/fb0.

Skriptquelle

Auch verfügbar aufmein Github-Repository.

#!/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 

zusätzliche Information

Es stellt sich heraus, dass der Benutzer nicht unbedingt sudo; /dev/fb0gehört zur videoGruppe verwenden muss, also könnten Benutzer einfachsich selbst zu dieser Gruppe hinzufügenmit

sudo usermod -a -G video $USER

Daher werden die Überprüfungen auf Root im obigen Skript obsolet, insbesondere [ "$(whoami)" != "root" ] ||ein Teil davon.

Antwort4

Antwortenüberhat bei mir funktioniert

Aber muss spezifizierenGerätfür das FBI:

fbi -d /dev/fb0

In meinem Fall hat das FBI Folgendes versucht:/dev/dri/card0

FürLesbarkeitMöglichkeit, ImageMagick zu verwenden:

convert -fill '#202020' -colorize 80% "$1" /tmp/background

Dadurch wird ein transparenter Hintergrund imitiert, indem das Bild in eine Farbe #202020mit 80%Sichtbarkeit umgewandelt wird

verwandte Informationen