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

17

Früher habe ich Vollbild-Konsolen (die mit Ctrl+ Alt+ F1... geöffnet wurden F6) aktiv verwendet und bin auf die Idee gekommen, sie mit einer Art "Tapete" zu dekorieren (eine ziemlich dunkle und eintönige natürlich) damit die Lesbarkeit nicht beeinträchtigt wird), könnte dies vielleicht gut aussehen und sich gut anfühlen (oder auch nicht, aber ich muss es versuchen). Es wäre sogar besser, wenn ich verschiedene Bilder als Hintergrund für die Konsole 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, legt nahe, dass der vollwertige Grafikmodus für sie verwendet wird und alles möglich ist. Aber wie?

Ivan
quelle
2
Unmöglich. Virtuelle Konsolen sind nur Textkonsolen.
Sergiy Kolodyazhnyy
5
@Serg Ich verwende seit jeher nur Text-Modi - glauben Sie mir, ich kann den echten Text-Modus von seiner grafischen Emulation unterscheiden. Viele Leute können sich das heutzutage kaum vorstellen, aber ich habe sogar Filme auf den Konsolen angeschaut, auf denen in den Tagen von Linux 2.4 überhaupt kein X-Server installiert war. Das lässt mich bezweifeln, dass dies tatsächlich unmöglich ist.
Ivan
1
OK, lassen Sie mich das korrigieren: Ich glaube an das Betrachten von Bildern und Filmen in der Konsole, weil etwas als framebufferGerät bekannt ist, aber mit diesem Bildschirm ist die Ausgabe eines Programms beschäftigt, wie z fbi. TTY an und für sich ist immer noch ein Nur-Text-Gerät
Sergiy Kolodyazhnyy
2
Ich werde eine Prämie auf Ihre Frage setzen, sobald sie berechtigt ist. Ich habe tatsächlich interessiert
Sergiy Kolodyazhnyy
1
Überprüfen Sie dies heraus: code.google.com/p/fbterm
Sergiy Kolodyazhnyy

Antworten:

12

Ich bin mir ziemlich sicher, dass im Linux-Konsolentreiber diese Funktion nicht integriert ist, es gibt jedoch eine Anwendung namens, fbtermdie dies ausführen kann. Um Hintergrundbilder Arbeit zu machen, werden Sie auch ein Dienstprogramm benötigen , die ein Bild auf dem Bildpuffer anzeigen kann wie fbi:

sudo apt-get install fbterm fbi

fbtermliest oder zeigt Hintergrundbilder selbst nicht an, sondern erwartet, dass ein anderes Programm das Hintergrundbild vor dem Start auf dem Bildschirm einrichtet. In der fbtermManpage finden Sie Anweisungen, wie Sie dies mit fbveinem absolut veralteten und nicht unterstützten Dienstprogramm tun können , das ich auf einem modernen Ubuntu-System nicht einmal kompilieren konnte. fbiist ein viel saubererer und schönerer Bildbetrachter für den Framebuffer, hat aber leider nicht die "set it and exit" -Funktion des Einfacheren fbvund stört somit, fbtermwenn Sie versuchen, ihn direkt zu verwenden. Ich konnte jedoch eine Alternative finden, die funktioniert:

Zuerst müssen Sie das gewünschte Bild verwenden fbiund catanzeigen und es dann in eine Bilddatei im "Framebuffer-Rohformat" sichern. 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 beendet, nachdem das Ergebnis in der Datei gespeichert wurde nifty-background.fbimg. Ersetzen Sie es nifty-background.fbimgund geben nifty-background.pngSie natürlich die gewünschten Dateinamen ein.)

Der erste Teil des Befehls wartet eine Sekunde, bevor der Inhalt des Framebuffers in eine Datei konvertiert wird. Gleichzeitig wird der zweite Teil (nach dem &) gestartet fbi, um das Bild im Framebuffer anzuzeigen. Wenn der cat-Befehl ausgeführt wird (1 Sekunde später), muss dort ein Bild gespeichert werden. Der Grund, warum sie in dieser Reihenfolge sind, ist, dass ich festgestellt habe, dass fbiProbleme aufgetreten sind, wenn sie nicht im Vordergrund ausgeführt wurden. Dies bedeutet, dass dies der letzte Befehl in der Liste sein muss.

Von da an fbtermkönnen Sie es jederzeit wie folgt starten (möglicherweise möchten Sie ein kleines Wrapper-Skript erstellen):

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

Ich kann den Echttextmodus von seiner grafischen Emulation unterscheiden.

… Das ist eine der Möglichkeiten, mit denen der Beobachter ein echtes BSOD unter Windows von den Aktionen des witzigen BSOD-Bildschirmschoners unterscheiden kann, der vor etwa zehn Jahren die Runde gemacht hat. Die Anzeige von Blockgrafikzeichen unter Verwendung der Grafikadapterhardware im Grafikmodus unterschied sich geringfügig von den Zeichen, die von der Grafikadapterhardware im Textmodus generiert wurden.

Ja, der Grafikadapter befindet sich im Grafikmodus. Das ist jetzt schon eine ganze Weile so. Auf Systemen ohne PC-Grafikkarte war das immer so. In den Anfangsjahren von Linux verfügte die Konsole auf PC-kompatiblen Geräten über die Display-Adapter-Hardware im Textmodus. Aber diese Nutzung hat sich leise auf so ziemlich nichts ausgewirkt. Für die Unicode-Unterstützung der meisten Benutzer ist heutzutage ein größerer Glyphensatz erforderlich als für die Hardware im Textmodus. 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.

Es gibt ein Terminal-Emulator-Programm, das in den Linux-Kernel integriert ist. Es ist auf den Framebuffer und das Eingabeereignis-Subsystem gelegt, auf das es über interne Kernel-Schnittstellen zugreift. Er präsentiert sich auf anwendungs Modus - Systeme als eine Reihe von Kernel virtuellen Terminal - Geräte, /dev/tty1und so weiter.

Dieses Programm ist im Vergleich zu Terminalemulatoren, die nicht mit dem Linux-Kernel kompatibel sind , wie normale Anwendungsprogramme, ziemlich eingeschränkt . Es emuliert nur eine begrenzte Teilmenge der Funktionalität eines realen Terminals und es fehlen die zusätzlichen Funktionen der letzteren Terminalemulatoren.

Darauf müssen Sie achten. Möglicherweise sind Sie mit den Terminalemulatoren vertraut, die X für ihre Ein- / Ausgabe verwenden, z. B. xterm, lxterminal, gnome-console, konsole, eterm, wterm und der Rest. Weniger bekannt sind diejenigen, die die Framebuffer-Geräte und die Eingabeereignisgeräte für ihre Eingabe / Ausgabe verwenden. Bereitstellung virtueller Terminals für Benutzer :

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

fbterm kann so konfiguriert werden, dass z. B. alles, was sich beim Start im Framebuffer befindet, als Hintergrundbild verwendet wird. Sie müssen also nur eines der anderen Hilfsprogramme zum direkten Anzeigen von Bildern auf einem Linux-Framebuffer 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 Windungen, die in Foogods Antwort näher erläutert werden. dfbg räumt jedoch nicht von selbst auf, sodass es für diese bestimmte Aufgabe besser geeignet ist.

Weitere Lektüre

JdeBP
quelle
Die Frage lautete, wie ein Hintergrundbild für die Konsole erstellt werden soll. Ihre Antwort listet nur mögliche Lösungen auf. Daher gebe ich der anderen Antwort ein Kopfgeld, aber ich danke Ihnen für die Fülle an Informationen, die Sie zur Verfügung gestellt haben. Du hast meine Zustimmung.
Sergiy Kolodyazhnyy
4

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 bereitgestellt hat (nämlich Framebuffer-Daten zu lesen, während fbiein Bild auf dem TTY-Bildschirm angezeigt wird). Deshalb habe ich seiner Antwort das Kopfgeld zugesprochen.

Bellow ist ein Skript, das das Starten erleichtert fbterm mit einem Teilpfad zum Image als einzelnes Befehlszeilenargument

Verwendung

Das Skript muss in einem Verzeichnis gespeichert werden, das in Ihrer $PATHVariablen aufgeführt ist. Vorzugsweise muss es in Ihrem persönlichen $HOME/binOrdner sein. Siehe Wie füge ich ein Verzeichnis zum PATH hinzu? auf Erklärung , wie Sie Ihre persönlichen hinzufügen binzu $PATH, sondern ein Verzeichnis mit dem Namen Erzeugen derbin in Ihrem Home - Verzeichnis ist ausreichend , um es hinzuzufügen , PATHauf Wieder Login.

Das Skript muss außerdem über eine ausführbare Berechtigung verfügen. Sie können es mit einstellenchmod +x /path/to/script.sh .

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

Skriptquelle

Auch in meinem Github-Repository verfügbar .

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

zusätzliche Information

Es stellt sich heraus, dass Benutzer nicht unbedingt verwenden müssen sudo; /dev/fb0gehört zur videoGruppe, so dass die Nutzer könnten nur sich selbst zu dieser Gruppe hinzufügen , indem

sudo usermod -a -G video $USER

Daher sind die Überprüfungen für root im obigen Skript nicht mehr aktuell, insbesondere nur [ "$(whoami)" != "root" ] ||teilweise.

Sergiy Kolodyazhnyy
quelle