Como posso personalizar o plano de fundo do console em tela cheia (TTY)?

Como posso personalizar o plano de fundo do console em tela cheia (TTY)?

Eu costumava usar consoles de tela cheia (aqueles abertos com Ctrl+ Alt+ F1... F6) ativamente e cheguei à ideia de que gostaria de tentar decorá-los com uma espécie de "papel de parede" (um tanto escuro e monótono, claro para que não diminua a legibilidade), talvez isso possa parecer agradável (ou não, mas preciso tentar). Seria ainda melhor se eu pudesse definir imagens diferentes como fundo de console diferente (uma para Ctrl+ Alt+ F1, outra para Ctrl+ Alt+ F2etc).

O fato dos consoles terem uma resolução muito maior do que o modo de texto puro sugere que o modo gráfico completo é usado para eles e tudo é possível. Mas como?

Responder1

Tenho certeza de que o driver do console Linux não possui essa capacidade incorporada, no entanto, existe um aplicativo chamado fbtermque pode fazer isso. Para fazer as imagens de fundo funcionarem, você também precisará de um utilitário que possa exibir uma imagem no framebuffer, como fbi:

sudo apt-get install fbterm fbi

fbtermNa verdade, não lê ou exibe imagens de fundo, ele espera que algum outro programa configure a imagem de fundo na tela antes de iniciar. Há instruções na fbtermpágina de manual sobre como fazer isso usando fbv, um utilitário absolutamente antiquado e sem suporte que eu não consegui compilar em um sistema Ubuntu moderno. fbié um visualizador de imagens muito mais limpo e agradável para o framebuffer, mas infelizmente não possui a funcionalidade "configure e saia" do mais simples fbve, portanto, interfere fbtermse você tentar usá-lo diretamente. No entanto, consegui encontrar uma alternativa que funciona:

Primeiro, você precisará usar fbie catpara exibir a imagem desejada e, em seguida, despejá-la em um arquivo de imagem "framebuffer raw format". Como root, em um console do framebuffer, execute:

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

(Isso exibirá a imagem por alguns segundos e depois sairá, salvando o resultado no arquivo nifty-background.fbimg. Substitua nifty-background.fbimge nifty-background.pngpelos nomes de arquivo que desejar, é claro.)

A primeira parte do comando espera 1 segundo antes de transferir o conteúdo do framebuffer para um arquivo. Ao mesmo tempo, a segunda parte (após o &) é iniciada fbipara exibir a imagem no framebuffer, de modo que quando o comando cat começar a ser executado (1 segundo depois), haja uma imagem para despejar. A razão pela qual eles estão nessa ordem é porque descobri que fbihavia problemas se não estivesse sendo executado em primeiro plano, o que significa que deve ser o último comando da lista.

A partir de então, sempre que quiser executar fbterm, você pode iniciá-lo assim (você pode criar um pequeno script wrapper):

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

Responder2

Posso distinguir o modo de texto real de sua emulação gráfica.

… que é uma das maneiras pelas quais o observador pode distinguir um BSOD real no Windows das ações do protetor de tela BSOD de piada que circulou há cerca de uma década. A exibição de caracteres gráficos de bloco usando o hardware do adaptador de vídeo no modo gráfico era sutilmente diferente dos caracteres gerados pelo hardware do adaptador de vídeo no modo de texto.

Sim, o adaptador de vídeo está no modo gráfico. Já faz algum tempo que é assim. Erasempredesta forma em sistemas sem hardware de adaptador de vídeo de PC. Nos primeiros anos do Linux, em PCs compatíveis, o console teria o hardware do adaptador de vídeo em modo texto. Mas esse uso foi silenciosamente reduzido a praticamente nada. O suporte Unicode para a maioria dos usuários hoje em dia requer um conjunto de glifos maior do que o hardware de modo texto. O firmware da máquina (é claro) usa modo gráfico para telas iniciais (com lindas imagens e logotipos de empresas), assim como o carregador do Linux e a inicialização do sistema.

Existe um programa emulador de terminal embutido no kernel do Linux. Ele está em camadas sobre o framebuffer e o subsistema de eventos de entrada, que usa interfaces internas do kernel para acessar. Ele se apresenta aos sistemas em modo de aplicação como uma série determinal virtual do kerneldispositivos /dev/tty1e assim por diante.

Este programa é bastante limitado em comparação com emuladores de terminal que rodamforao kernel do Linux, como programas aplicativos comuns. Ele emula apenas um subconjunto limitado de funcionalidades de um terminal real e não possui os recursos adicionais dos últimos emuladores de terminal.

São aqueles que você precisa procurar para isso. Você deve estar familiarizado com os emuladores de terminal que usam X para entrada/saída, como xterm, lxterminal, gnome-console, konsole, eterm, wterm e o resto. Menos conhecidos são aqueles que usam o(s) dispositivo(s) framebuffer e os dispositivos de evento de entrada para sua entrada/saída. fornecendoterminais virtuais no espaço do usuário:

Alguns destes últimos podem fazer o que você quiser.

O fbterm pode ser configurado para usar o que estiver no framebuffer na inicialização como imagem de fundo, por exemplo. Portanto, tudo o que é necessário fazer é usar um dos vários outros utilitários para exibir imagens diretamente em um dispositivo framebuffer Linux para configurar uma imagem de fundo antes de executar o fbterm. Existem várias dessas ferramentas, incluindo:

fbvis e fbi limpam a tela na saída e exigem as convoluções explicadas com mais detalhes na resposta de Foogod. dfbg, no entanto, não se limpa, tornando-o mais adequado para esta tarefa específica.

Leitura adicional

Responder3

Embora a resposta de Foogod não tenha funcionado para mim, ela me levou na direção certa, fornecendo metade da solução (ou seja, lendo dados do framebuffer enquanto fbimostra uma imagem na tela TTY). Portanto, concedi a recompensa à sua resposta.

Abaixo está um script que facilita a inicialização fbtermcom caminho parcial para a imagem como um único argumento de linha de comando

Uso

O script deve ser salvo em um diretório listado em sua $PATHvariável. De preferência, deve estar na sua $HOME/binpasta pessoal. Referir-seComo adicionar um diretório ao PATH?na explicação de como adicionar seu pessoal bina $PATH, mas criar um diretório chamado binem seu diretório inicial é suficiente para adicioná-lo PATHno login novamente.

O script também deve ter permissão executável; você pode configurá-lo com chmod +x /path/to/script.sh.

Finalmente, ele deve ser executado com sudo, para permitir acesso root para leitura e gravação em /dev/fb0.

Fonte do roteiro

Também disponível emmeu repositório 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 

informação adicional

Acontece que o usuário não precisa necessariamente usar sudo; /dev/fb0pertence ao videogrupo, então os usuários podem apenasadicionar-se a esse grupousando

sudo usermod -a -G video $USER

Assim, as verificações de root no script acima tornam-se obsoletas, especificamente [ "$(whoami)" != "root" ] ||part.

Responder4

Respostasacimafuncionou para mim

Mas preciso especificardispositivopara o FBI:

fbi -d /dev/fb0

No meu caso, o FBI estava tentando dri:/dev/dri/card0

Paralegibilidadepossível usar o imagemagick:

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

Isso imitará o fundo transparente, convertendo a imagem em sobreposição de cores #202020com 80%visibilidade

informação relacionada