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

14

Ho usato le console a schermo intero (quelle aperte con Ctrl + Alt + F1 ... F6 ) attivamente e sono giunto all'idea che mi piacerebbe provare a decorarlo con una "carta da parati" di un tipo (un po 'cupo e monotono ovviamente per non diminuire la leggibilità), forse questo potrebbe sembrare sentirsi bene (o no, ma ho bisogno di provare). Sarebbe ancora meglio se potessi impostare immagini diverse come sfondo della console diversa (una per Ctrl + Alt + F1 , un'altra per Ctrl + Alt + F2 ecc.)

Il fatto che le console abbiano una risoluzione molto più alta rispetto a quella in puro testo suggerisce che per loro è stata utilizzata la modalità grafica completa e tutto è possibile. Ma come?

    
posta Ivan 24.11.2015 - 09:23
fonte

3 risposte

10

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

sudo apt-get install fbterm fbi

fbterm in realtà non legge o non 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 pagina man di fbterm su come fare ciò usando fbv , un'utilità assolutamente antiquata e non supportata che non riuscivo nemmeno a compilare su un moderno sistema Ubuntu. fbi è un visualizzatore di immagini molto più pulito e più bello per il framebuffer, ma sfortunatamente non ha la funzionalità "imposta e esci" del fbv più semplice, e quindi interferisce con fbterm se provi ad usarlo direttamente. Tuttavia, sono riuscito a trovare un'alternativa che funzioni:

In primo luogo, dovrai utilizzare fbi e cat per visualizzare l'immagine che desideri e quindi scaricarla in un file 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.fbimg e nifty-background.png con qualunque nome di file desideri, ovviamente.)

La prima parte del comando attende 1 secondo prima di importare il contenuto del framebuffer in un file. Allo stesso tempo, la seconda parte (dopo il & amp;) lancia fbi per visualizzare l'immagine sul framebuffer, in modo che quando il comando cat arriva all'esecuzione (1 secondo dopo), c'è un'immagine da scaricare. La ragione per cui sono nell'ordine è perché ho scoperto che fbi ha avuto 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 eseguire 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
    
risposta data Foogod 29.11.2015 - 02:07
fonte
4
  

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

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

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

C'è un programma di emulazione di terminale integrato nel kernel di Linux. È sovrapposto al framebuffer e al sottosistema degli eventi di input, che utilizza le interfacce del kernel interne per l'accesso. Si presenta ai sistemi in modalità applicazione come una serie di dispositivi terminale virtuale del kernel, /dev/tty1 e così via.

Questo programma è abbastanza limitato rispetto agli emulatori di terminale che eseguono fuori il kernel di Linux, come normali programmi applicativi. Emula solo un sottoinsieme limitato della funzionalità di un vero terminale e manca delle funzionalità aggiunte degli ultimi emulatori di terminale.

Sono quelli a cui devi cercare questo. Potresti avere familiarità con gli emulatori di terminale che usano X come 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 evento di input per il loro input / output. fornendo terminali virtuali spazio utente :

Alcuni di questi ultimi possono fare ciò che vuoi.

fbterm può essere configurato per usare, ad esempio, qualunque cosa si trovi nel framebuffer all'avvio come immagine di sfondo. 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 come:

fbvis e fbi cancellano lo schermo all'uscita e richiedono le convoluzioni spiegate in modo più dettagliato nella risposta di Foogod. dfbg, però, non ripulisce se stesso, rendendolo più adatto a questa particolare attività.

Ulteriori letture

risposta data JdeBP 04.12.2015 - 14:08
fonte
3

Sebbene la risposta di Foogod non abbia funzionato per me, mi ha portato nella giusta direzione, fornendo metà della soluzione (ovvero, leggendo i dati del framebuffer, mentre fbi mostra un'immagine sullo schermo TTY). Pertanto ho assegnato la sua risposta alla taglia.

Bellow è uno script che semplifica il lancio di fbterm con il percorso parziale dell'immagine come un singolo argomento della riga di comando

Utilizzo

Lo script deve essere salvato in una directory elencata nella variabile $PATH . Preferibilmente nella cartella $HOME/bin personale. Fai riferimento a Come aggiungere una directory al PERCORSO? sulla spiegazione di come aggiungere il tuo personale bin a $PATH , ma creare una directory chiamata bin nella tua home directory è sufficiente per aggiungerla a PATH al re-login.

Lo script deve anche avere l'autorizzazione eseguibile; puoi impostarlo con chmod +x /path/to/script.sh .

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

Origine script

Disponibile anche su 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: 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 

Informazioni aggiuntive

Si scopre che l'utente non ha necessariamente bisogno di usare sudo ; /dev/fb0 appartiene al gruppo video , quindi gli utenti potrebbero solo aggiungersi a quel gruppo utilizzando

sudo usermod -a -G video $USER

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

    
risposta data Sergiy Kolodyazhnyy 05.12.2015 - 09:37
fonte

Leggi altre domande sui tag