Come posso personalizzare uno sfondo console a schermo intero (TTY)?


17

Usavo le console a schermo intero (quelle aperte con Ctrl+ Alt+ F1... F6) attivamente e mi è venuta l'idea che mi piacerebbe provare a decorarlo con uno "sfondo" di un tipo (uno piuttosto scuro e monotono ovviamente in modo che non riduca la leggibilità), forse questo potrebbe apparire e sentirsi bene (o no, ma devo provare). Sarebbe ancora meglio se potessi impostare immagini diverse come sfondo della console diverso (uno per Ctrl+ Alt+ F1, un altro per Ctrl+ Alt+ F2ecc.).

Il fatto che le console abbiano una risoluzione molto più elevata fornita dalla modalità di testo puro suggerisce che per loro viene utilizzata la modalità grafica completa e tutto è possibile. Ma come?


2
Impossibile. Le console virtuali sono solo di testo.
Sergiy Kolodyazhnyy,

5
@Serg Uso le modalità solo testo da quando Linux non esisteva nemmeno - credimi, posso distinguere la modalità testo reale dalla sua emulazione grafica. Molte persone non riescono a immaginarlo al giorno d'oggi, ma ho persino visto film nelle console senza alcun server X installato durante i giorni di Linux 2.4. Questo mi fa dubitare che in realtà sia impossibile.
Ivan,

1
OK, mi permetta di correggere me stesso: credo nella visualizzazione di immagini e filmati in console, a causa di qualcosa noto come framebufferdispositivo, ma con quello schermo è occupato con l'output di alcuni programmi, come fbi. TTY in sé e per sé è ancora un dispositivo di solo testo
Sergiy Kolodyazhnyy

2
Metterò una taglia sulla tua domanda una volta che è ammissibile. In realtà mi sono interessato
Sergiy Kolodyazhnyy il

1
Dai

Risposte:


12

Sono abbastanza sicuro che il driver della console Linux non abbia questa capacità integrata, tuttavia esiste un'applicazione chiamata fbtermche può farlo. Per far funzionare le immagini di sfondo, avrai anche bisogno di un'utilità in grado di visualizzare un'immagine sul framebuffer come fbi:

sudo apt-get install fbterm fbi

fbtermin realtà non legge o visualizza le immagini di sfondo, si aspetta che qualche altro programma imposti l'immagine di sfondo sullo schermo prima che inizi. Ci sono istruzioni nella fbtermpagina di manuale su come farlo usando fbv, un'utilità assolutamente antiquata e non supportata che non sono riuscito nemmeno a compilare su un moderno sistema Ubuntu. fbiè un visualizzatore di immagini molto più pulito e gradevole per il framebuffer, ma sfortunatamente non ha la funzionalità "imposta ed esci" del più semplice fbv, e quindi interferisce con fbtermse si tenta di utilizzarlo direttamente. Tuttavia, sono stato in grado di trovare un'alternativa che funzioni:

Innanzitutto, dovrai utilizzare fbie catvisualizzare l'immagine desiderata, quindi scaricarla in un file di immagine "formato grezzo framebuffer". Come root, in una console framebuffer, esegui:

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

(Questo visualizzerà l'immagine per un paio di secondi e poi uscirà, dopo aver salvato il risultato nel file nifty-background.fbimg. Sostituisci nifty-background.fbimge nifty-background.pngcon qualsiasi nome di file desideri, ovviamente.)

La prima parte del comando attende 1 secondo prima di catturare il contenuto del framebuffer in un file. Allo stesso tempo, la seconda parte (dopo il simbolo &) si avvia fbiper visualizzare l'immagine sul framebuffer, in modo che quando il comando cat si avvicina all'esecuzione (1 secondo dopo), ci sia un'immagine da scaricare. Il motivo per cui sono in questo ordine è perché ho scoperto che fbiaveva dei problemi se non era in esecuzione in primo piano, il che significa che deve essere l'ultimo comando nell'elenco.

Da quel momento in poi, ogni volta che vuoi eseguirlo fbterm, puoi avviarlo in questo modo (potresti voler creare un piccolo script wrapper):

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

7

Riesco a distinguere la modalità testo reale dalla sua emulazione grafica.

... che è uno dei modi in cui l'osservante potrebbe distinguere un vero BSOD su Windows dalle azioni dello screen saver BSOD che ha fatto il giro di un decennio fa. La visualizzazione di caratteri grafici a blocchi utilizzando l'hardware dell'adattatore di visualizzazione in modalità grafica era leggermente diversa dai caratteri generati dall'hardware dell'adattatore di visualizzazione in modalità testo.

Sì, l'adattatore del display è in modalità grafica. È stato così per un po 'di tempo, ora. È sempre stato così su sistemi senza hardware dell'adattatore display PC. Nei primi anni di Linux, su PC compatibili la console avrebbe avuto l'hardware dell'adattatore del display in modalità testo. Ma questo uso si è eroso tranquillamente praticamente in nulla. Il supporto Unicode per la maggior parte degli utenti al giorno d'oggi richiede un set di glifi più grande rispetto all'hardware in modalità testo. Il firmware della macchina (ovviamente) utilizza la modalità grafica per schermate iniziali (con belle immagini e loghi aziendali), così come il caricatore Linux e l'inizializzazione del sistema.

C'è un programma di emulazione terminale integrato nel kernel Linux. È sovrapposto al framebuffer e al sottosistema di eventi di input, a cui utilizza le interfacce del kernel interno per accedere. Si presenta ai sistemi in modalità applicazione come una serie di dispositivi terminali virtuali del kernel/dev/tty1 e così via.

Questo programma è piuttosto limitata rispetto a emulatori di terminale che corrono al di fuori del kernel di Linux, come programmi applicativi ordinari. Emula solo un sottoinsieme limitato della funzionalità di un terminale reale e manca delle funzionalità aggiunte di questi ultimi emulatori di terminali.

Sono quelli che devi cercare per questo. Potresti avere familiarità con gli emulatori di terminale che usano X per il loro input / output, come xterm, lxterminal, gnome-console, konsole, eterm, wterm e il resto. Meno noti sono quelli che utilizzano i dispositivi framebuffer e i dispositivi degli eventi di input per i loro input / output. fornire terminali virtuali nello spazio utente :

Alcuni di questi ultimi possono fare quello che vuoi.

fbterm può essere configurato per usare qualsiasi cosa sia presente nel framebuffer all'avvio come immagine di sfondo, per esempio. Quindi tutto ciò che si deve fare è usare una delle tante altre utility per visualizzare le immagini direttamente su un framebuffer Linux per impostare un'immagine di sfondo prima di eseguire fbterm. Esistono diversi strumenti di questo tipo, tra cui:

fbvis e fbi liberano lo schermo all'uscita e richiedono le convoluzioni che sono spiegate più in dettaglio nella risposta di Foogod. dfbg, tuttavia, non ripulisce dopo se stesso, rendendolo più adatto a questo specifico compito.

Ulteriori letture


La domanda è stata posta su come creare un'immagine di sfondo per la console. La tua risposta elenca solo potenziali soluzioni. Quindi conferisco generosità all'altra risposta, tuttavia, ti ringrazio per la ricchezza di informazioni che hai fornito. Hai il mio voto.
Sergiy Kolodyazhnyy il

4

Sebbene la risposta di Foogod non abbia funzionato per me, mi ha portato nella giusta direzione, fornendo metà della soluzione (vale a dire, leggere i dati del framebuffer, mentre fbista mostrando un'immagine sullo schermo TTY). Pertanto ho assegnato alla sua risposta la generosità.

Bellow è uno script che semplifica l'avvio fbtermcon il percorso parziale dell'immagine come singolo argomento della riga di comando

uso

Lo script deve essere salvato in una directory elencata nella $PATHvariabile. Preferibilmente deve essere nella tua $HOME/bincartella personale . Fare riferimento a Come aggiungere una directory al PERCORSO? sulla spiegazione su come aggiungere il vostro personal bina $PATH, ma la creazione di una directory chiamata binnella vostra home directory è sufficiente aggiungerlo a PATHsulla ri-login.

Lo script deve inoltre disporre dell'autorizzazione eseguibile; puoi impostarlo con chmod +x /path/to/script.sh.

Infine, deve essere eseguito con sudo, per consentire l'accesso come root per la lettura e la scrittura /dev/fb0.

Fonte dello script

Disponibile anche sul mio repository 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: /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 

informazioni addizionali

Si scopre che l'utente non deve necessariamente usare sudo; /dev/fb0appartiene al videogruppo, quindi gli utenti possono semplicemente aggiungersi a quel gruppo usando

sudo usermod -a -G video $USER

Pertanto, i controlli per root nello script precedente diventano obsoleti, in particolare [ "$(whoami)" != "root" ] ||parte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.