Как настроить фон полноэкранной консоли (TTY)?

Как настроить фон полноэкранной консоли (TTY)?

Раньше я активно пользовался полноэкранными консолями (открывающимися с помощью Ctrl+ Alt+ F1... F6) и пришел к мысли, что хотел бы попробовать украсить их своего рода "обоями" (конечно, довольно темными и монотонными, чтобы не снижать читабельность), возможно, это будет выглядеть и ощущаться хорошо (или нет, но мне нужно попробовать). Было бы еще лучше, если бы я мог устанавливать разные картинки в качестве фона для разных консолей (одну для Ctrl+ Alt+ F1, другую для Ctrl+ Alt+ F2и т. д.).

Тот факт, что у консолей разрешение гораздо выше, чем в чисто текстовом режиме, говорит о том, что для них используется полноценный графический режим и все возможно. Но как?

решение1

Я почти уверен, что драйвер консоли Linux не имеет встроенной возможности, однако есть приложение, fbtermкоторое может это сделать. Чтобы фоновые изображения работали, вам также понадобится утилита, которая может отображать изображение на фреймбуфере, например fbi:

sudo apt-get install fbterm fbi

fbtermна самом деле не считывает и не отображает фоновые изображения, он ожидает, что какая-то другая программа настроит фоновое изображение на экране перед запуском. На fbtermстранице руководства есть инструкции о том, как это сделать с помощью fbv, абсолютно устаревшей и неподдерживаемой утилиты, которую я даже не смог скомпилировать в современной системе Ubuntu. fbi— гораздо более чистый и приятный просмотрщик изображений для кадрового буфера, но, к сожалению, не имеет функциональности «установить и выйти», как у более простого fbv, и, таким образом, мешает, fbtermесли вы пытаетесь использовать его напрямую. Однако мне удалось придумать альтернативу, которая работает:

Сначала вам нужно будет использовать fbiи catдля отображения нужного вам изображения, а затем сбросить его в файл изображения "framebuffer raw format". Как root, в консоли framebuffer выполните:

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

(Это отобразит изображение на пару секунд, а затем завершит работу, сохранив результат в файле nifty-background.fbimg. Замените nifty-background.fbimgи nifty-background.pngна любые имена файлов, которые вы пожелаете, конечно.)

Первая часть команды ждет 1 секунду, прежде чем cat передаст содержимое буфера кадра в файл. В то же время вторая часть (после &) запускается fbiдля отображения изображения в буфере кадра, так что когда команда cat приступает к выполнению (через 1 секунду), там уже есть изображение для дампа. Причина, по которой они расположены в таком порядке, заключается в том, что я обнаружил, что у нее возникали fbiпроблемы, если она не была запущена на переднем плане, а это значит, что она должна быть последней командой в списке.

С этого момента, когда бы вы ни захотели запустить fbterm, вы можете запустить его следующим образом (возможно, вам захочется создать небольшой скрипт-оболочку):

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

решение2

Я могу отличить настоящий текстовый режим от его графической эмуляции.

… что является одним из способов, с помощью которых наблюдательный человек может отличить настоящий BSOD в Windows от действий шуточной заставки BSOD, которая ходила около десяти лет назад. Отображение символов блочной графики с использованием оборудования видеоадаптера в графическом режиме слегка отличалось от символов, генерируемых оборудованием видеоадаптера в текстовом режиме.

Да, видеоадаптер находится в графическом режиме. Это было так уже довольно долгое время. Это быловсегдатаким образом на системах без аппаратного адаптера дисплея ПК. В ранние годы Linux на ПК-совместимых устройствах консоль имела аппаратное обеспечение адаптера дисплея в текстовом режиме. Но это использование тихо сошло на нет. Поддержка Unicode для большинства пользователей в настоящее время требует большего набора глифов, чем есть у аппаратного обеспечения текстового режима. Прошивка машины (конечно) использует графический режим для заставок (с красивыми картинками и логотипами компаний), как и загрузчик Linux и инициализация системы.

В ядро ​​Linux встроена программа эмулятора терминала. Она располагается поверх буфера кадров и подсистемы событий ввода, к которым она использует внутренние интерфейсы ядра для доступа. Она представляет себя системам режима приложений как рядвиртуальный терминал ядраустройства /dev/tty1и т. д.

Эта программа довольно ограничена по сравнению с эмуляторами терминала, которые работаютнаружуядро Linux, как обычные прикладные программы. Он эмулирует только ограниченное подмножество функциональных возможностей реального терминала и не имеет дополнительных функций последних эмуляторов терминала.

Это те, на которые вам нужно обратить внимание. Вы можете быть знакомы с эмуляторами терминала, которые используют X для своего ввода/вывода, такими как xterm, lxterminal, gnome-console, konsole, eterm, wterm и остальными. Менее известны те, которые используют устройство(а) буфера кадра и устройства событий ввода для своего ввода/вывода. предоставляявиртуальные терминалы пользовательского пространства:

Некоторые из них могут делать то, что вам нужно.

fbterm можно настроить на использование всего, что находится в буфере кадра при запуске, в качестве фонового изображения, например. Поэтому все, что нужно сделать, это использовать одну из нескольких других утилит для отображения изображений непосредственно на устройстве буфера кадра Linux, чтобы настроить фоновое изображение перед запуском fbterm. Существует несколько таких инструментов, в том числе:

fbvis и fbi очищают экран при выходе и требуют извилин, которые более подробно описаны в ответе Foogod. Однако dfbg не убирает за собой, что делает его более подходящим для этой конкретной задачи.

дальнейшее чтение

решение3

Хотя ответ Foogod'а не сработал для меня, он направил меня в правильном направлении, предоставив половину решения (а именно, чтение данных кадрового буфера, пока fbiотображается изображение на экране TTY). Поэтому я присудил его ответу награду.

Ниже представлен скрипт, который упрощает запуск fbtermс частичным путем к изображению в виде одного аргумента командной строки.

Применение

Скрипт должен быть сохранен в каталоге, указанном в вашей $PATHпеременной. Предпочтительно, чтобы он был в вашей личной $HOME/binпапке. См.Как добавить каталог в PATH?на объяснении того, как добавить ваши личные данные binв $PATH, но создания каталога с именем binв вашем домашнем каталоге достаточно, чтобы добавить его в PATHпри повторном входе в систему.

Скрипт также должен иметь разрешение на исполнение; вы можете установить его с помощью chmod +x /path/to/script.sh.

Наконец, его необходимо запустить с помощью sudo, чтобы разрешить root-доступ для чтения и записи в /dev/fb0.

Источник скрипта

Также доступно намой репозиторий 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 

Дополнительная информация

Оказывается, пользователю не обязательно использовать sudo; /dev/fb0принадлежит к videoгруппе, поэтому пользователи могут простодобавить себя в эту группус использованием

sudo usermod -a -G video $USER

Таким образом, проверки на наличие root в приведенном выше скрипте становятся устаревшими, в частности [ "$(whoami)" != "root" ] ||часть.

решение4

Ответывышесработало для меня

Но нужно уточнитьустройстводля ФБР:

fbi -d /dev/fb0

В моем случае ФБР пыталось:/dev/dri/card0

Длячитабельностьможно использовать imagemagick:

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

Это имитирует прозрачный фон, преобразуя изображение в наложенный цвет #202020с 80%видимостью.

Связанный контент