Как я могу настроить полноэкранный фон консоли (TTY)?

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

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

4 ответа

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

sudo apt-get install fbterm fbi

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Хотя ответ Фугода не сработал для меня, он действительно привел меня в правильном направлении, предоставив половину решения (а именно, чтение данных кадрового буфера, в то время как 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://Ask-ubuntu.ru/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" ] || часть.

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

Но нужно указать устройство для фбр:

      fbi -d /dev/fb0

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

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

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

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

Другие вопросы по тегам