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

14

Ich benutzte Vollbildkonsolen (die mit Strg + Alt + F1 ... F6 ) aktiv und zu einer Idee gekommen, die ich gerne versuchen würde, sie mit einem "wallpaper" von einer Art zu dekorieren (eine ziemlich dunkle und eintönige natürlich, so dass es die Lesbarkeit nicht verringern würde), vielleicht könnte das aussehen und fühle mich nett (oder nicht, aber ich muss es versuchen). Es wäre sogar besser, wenn ich verschiedene Bilder als Hintergrund der verschiedenen Konsole setzen könnte (eine für Strg + Alt + F1 , eine andere für Ctrl + Alt + F2 usw.)

Die Tatsache, dass die Konsolen eine viel höhere Auflösung als der reine Textmodus haben, legt nahe, dass ein vollwertiger graphischer Modus für sie verwendet wird und alles möglich ist. Aber wie?

    
Ivan 24.11.2015, 09:23
quelle

3 Antworten

10

Ich bin ziemlich sicher, dass der Linux-Konsolentreiber diese Fähigkeit nicht eingebaut hat, aber es gibt eine Anwendung namens fbterm , die dies tun kann. Damit Hintergrundbilder funktionieren, benötigen Sie außerdem ein Dienstprogramm, das ein Bild auf dem Framebuffer wie fbi :

anzeigen kann
sudo apt-get install fbterm fbi

fbterm liest oder zeigt Hintergrundbilder nicht selbst an, sondern erwartet von einem anderen Programm, das Hintergrundbild vor dem Start auf dem Bildschirm einzurichten. Es gibt Anweisungen auf der Manpage fbterm , wie man dies mit fbv macht, einem absolut antiquierten und nicht unterstützten Dienstprogramm, das ich nicht einmal auf einem modernen Ubuntu-System kompilieren konnte. fbi ist ein viel sauberer und netter Bildbetrachter für den Framebuffer, hat aber leider nicht die "set it and exit" -Funktionalität des einfacheren fbv und stört somit fbterm , wenn Sie versuchen, es direkt zu benutzen. Ich konnte jedoch eine Alternative finden, die funktioniert:

Zunächst müssen Sie fbi und cat verwenden, um das gewünschte Bild anzuzeigen und es dann in eine Bilddatei im Framebuffer-Rohformat abzulegen. 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

(Dies wird das Bild für ein paar Sekunden anzeigen und dann beenden, nachdem Sie das Ergebnis in der Datei nifty-background.fbimg gespeichert haben. Ersetzen Sie nifty-background.fbimg und nifty-background.png natürlich mit den gewünschten Dateinamen.)

Der erste Teil des Befehls wartet 1 Sekunde, bevor der Framebuffer-Inhalt in eine Datei umgewandelt wird. Zur gleichen Zeit startet der zweite Teil (nach dem & amp; amp;) fbi , um das Bild auf dem Framebuffer anzuzeigen, so dass, wenn der Befehl cat zur Ausführung kommt (1 Sekunde später), dort ein Bild zum Speichern vorhanden ist. Der Grund, warum sie in dieser Reihenfolge sind, liegt darin, dass fbi Probleme hatte, wenn sie nicht im Vordergrund ausgeführt wurde, was bedeutet, dass sie der letzte Befehl in der Liste sein muss.

Von nun an können Sie, wenn Sie fbterm ausführen möchten, das Programm so starten (Sie möchten vielleicht ein kleines Wrapper-Skript erstellen):

export FBTERM_BACKGROUND_IMAGE=1
cat nifty-background.fbimg > /dev/fb0; fbterm
    
Foogod 29.11.2015 02:07
quelle
4
  

Ich kann den echten Textmodus von seiner grafischen Emulation unterscheiden.

... das ist einer der Wege, auf denen der Beobachter einen echten BSOD auf Windows von den Aktionen des Bildschirmschoners joke BSOD unterscheiden kann, der vor etwa zehn Jahren die Runde gemacht hat. Die Anzeige von Blockgrafikzeichen unter Verwendung der Grafikkartenhardware im Grafikmodus unterschied sich geringfügig von den Zeichen, die von der Grafikkartenhardware im Textmodus generiert wurden.

Ja, der Grafikadapter befindet sich im Grafikmodus. So ist es jetzt schon eine ganze Weile. Es war immer so auf Systemen ohne PC-Display-Adapter-Hardware. In den frühen Jahren von Linux, auf PC-kompatiblen Geräten, hätte die Konsole die Display-Adapter-Hardware im Textmodus. Aber diese Verwendung hat sich zu so gut wie nichts erodiert. Die Unicode-Unterstützung für die meisten Benutzer erfordert heutzutage einen größeren Zeichensatz als die Textmodus-Hardware. Die Maschinenfirmware verwendet (natürlich) den Grafikmodus für Begrüßungsbildschirme (mit hübschen Bildern und Firmenlogos), ebenso wie der Linux-Lader und die Systeminitialisierung.

In den Linux-Kernel ist ein Terminal-Emulator-Programm integriert. Es liegt über dem Framebuffer und dem Input-Event-Subsystem, auf das interne Kernel-Interfaces zugreifen. Es stellt sich für Anwendungsmodus-Systeme als eine Reihe von kernel virtual terminal -Geräten dar, /dev/tty1 usw.

Dieses Programm ist ziemlich begrenzt im Vergleich zu Terminal-Emulatoren, die außerhalb des Linux-Kernels laufen, wie normale Anwendungsprogramme. Es emuliert nur eine begrenzte Teilmenge der Funktionalität eines realen Terminals und es fehlen die zusätzlichen Merkmale der letzteren Terminal-Emulatoren.

Darauf müssen Sie achten. Sie kennen vielleicht die Terminalemulatoren, die X für ihre Eingabe / Ausgabe verwenden, wie xterm, lxterminal, gnome-console, konsole, eterm, wterm und den Rest. Weniger bekannt sind diejenigen, die die Framebuffer-Vorrichtung (en) und die Eingangsereignisvorrichtungen für ihre Eingabe / Ausgabe verwenden. Bereitstellung virtueller Benutzer-Space-Terminals :

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

fbterm kann so konfiguriert werden, dass beim Start alle im Framebuffer befindlichen Daten als Hintergrundbild verwendet werden. Alles, was Sie tun müssen, ist, eines der anderen Dienstprogramme zu verwenden, um Bilder direkt auf einem Linux-Framebuffer-Gerät anzuzeigen, um ein Hintergrundbild vor dem Ausführen von fbterm einzurichten. Es gibt mehrere solcher Tools, einschließlich:

fbvis und fbi löschen den Bildschirm beim Beenden und benötigen die Faltungen, die in Foogods Antwort näher erläutert werden. dfbg räumt jedoch nicht auf, um es für diese spezielle Aufgabe besser geeignet zu machen.

Weiter lesen

JdeBP 04.12.2015 14:08
quelle
3

Obwohl Foogods Antwort für mich nicht funktionierte, brachte es mich in die richtige Richtung, indem ich die Hälfte der Lösung zur Verfügung stellte (nämlich Framebuffer-Daten lesen, während fbi ein Bild auf dem TTY-Bildschirm zeigt). Deshalb habe ich seiner Antwort die Prämie zugesprochen.

Bellow ist ein Skript, das das Starten von fbterm mit Teilpfad zum Bild als einzelnes Befehlszeilenargument vereinfacht.

Verwendung

Das Skript muss in einem Verzeichnis gespeichert werden, das in Ihrer $PATH -Variable aufgeführt ist. Vorzugsweise muss es in Ihrem persönlichen Ordner $HOME/bin sein. Siehe Wie fügt man dem PATH ein Verzeichnis hinzu? zur Erklärung, wie du dein persönliches bin zu $PATH hinzufügst, aber das Erstellen eines Verzeichnisses namens bin in Ihrem Home-Verzeichnis reicht aus, um es bei einer erneuten Anmeldung zu PATH hinzuzufügen.

Das Skript muss auch ausführbare Berechtigung haben; Sie können es mit chmod +x /path/to/script.sh festlegen.

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

Skriptquelle

Auch verfügbar auf meinem 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 Informationen

Es stellt sich heraus, dass der Benutzer nicht unbedingt sudo verwenden muss; /dev/fb0 gehört zu video group, also können Benutzer sich einfach zu dieser Gruppe hinzufügen , indem sie

verwenden
sudo usermod -a -G video $USER

Somit werden die Prüfungen für root im obigen Skript obsolet, speziell [ "$(whoami)" != "root" ] || part.

    
Sergiy Kolodyazhnyy 05.12.2015 09:37
quelle

Tags und Links