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

17

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

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

Иван
источник
2
Невозможно. Виртуальные консоли только текстовые.
Сергей Колодяжный,
5
@ Serg Я использую текстовые режимы с тех пор, как Linux даже не существовало - поверьте, я могу отличить настоящий текстовый режим от его графической эмуляции. В наше время многие вряд ли могут себе это представить, но я даже смотрел фильмы на консолях без установленного X-сервера вообще в течение 2,4 дней Linux. Это заставляет меня сомневаться, что это на самом деле невозможно.
Иван
1
Хорошо, позвольте мне исправить себя: я верю в просмотр изображений и фильмов в консоли, потому что что-то известно как framebufferустройство, но при этом экран занят выводом какой-то программы, например fbi. TTY сам по себе остается текстовым устройством
Сергей Колодяжный,
2
Я назначу щедрость на ваш вопрос, как только он получит право. Я заинтересовался на самом деле
Сергей Колодяжный
1
Проверьте это: code.google.com/p/fbterm
Сергей Колодяжный

Ответы:

12

Я почти уверен, что драйвер консоли 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
Foogod
источник
7

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

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

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

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

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

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

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

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

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

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

JdeBP
источник
Был задан вопрос о том, как создать фоновое изображение для консоли. Ваш ответ только перечисляет возможные решения. Поэтому я даю награду за другой ответ, однако я благодарю вас за предоставленную вами информацию. У тебя есть мой голос.
Сергей Колодяжный
4

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

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

использование

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

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

Наконец, он должен быть запущен с sudo, чтобы разрешить корневой доступ для чтения и записи /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: /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 

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

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

sudo usermod -a -G video $USER

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

Сергей Колодяжный
источник