%3F.png)
Раньше я активно пользовался полноэкранными консолями (открывающимися с помощью 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 и остальными. Менее известны те, которые используют устройство(а) буфера кадра и устройства событий ввода для своего ввода/вывода. предоставляявиртуальные терминалы пользовательского пространства:
- zhcon(Пакет Ubuntu),
- фбпад,
- fbterm(Пакет Ubuntu) и его ответвления, такие какjfbterm(Пакет Ubuntu),
- bogl-bterm (Пакет Ubuntu),
- перекус
console-terminal-emulator
иconsole-fb-realizer
, и - кмскон.
Некоторые из них могут делать то, что вам нужно.
fbterm можно настроить на использование всего, что находится в буфере кадра при запуске, в качестве фонового изображения, например. Поэтому все, что нужно сделать, это использовать одну из нескольких других утилит для отображения изображений непосредственно на устройстве буфера кадра Linux, чтобы настроить фоновое изображение перед запуском fbterm. Существует несколько таких инструментов, в том числе:
- дфбг (Пакет Ubuntu),
- Али Голами Рудифбвис, и
- ФБР (Пакет Ubuntu).
fbvis и fbi очищают экран при выходе и требуют извилин, которые более подробно описаны в ответе Foogod. Однако dfbg не убирает за собой, что делает его более подходящим для этой конкретной задачи.
дальнейшее чтение
- https://unix.stackexchange.com/a/177209/5132
- https://unix.stackexchange.com/a/178807/5132
- https://unix.stackexchange.com/a/194218/5132
- Джонатан де Бойн Поллард (2015)."виртуальные терминалы пользовательского пространства". Руководство по еде. 1.20. еда. Программное обеспечение JdeBP.
- Джонатан де Бойн Поллард (2015).Краткий обзор виртуальных терминалов пользовательского пространства ну и ладно. Программное обеспечение JdeBP.
- Герт Уйттерховен (25 октября 1998 г.).К вашему сведению: изменения в консоли буфера кадров с версии 2.1.107. ядро linux.
решение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%
видимостью.