如何自定义全屏控制台背景(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。不过,我能够想出一个可行的替代方案:

首先,您需要使用fbicat显示所需的图像,然后将其转储到“帧缓冲区原始格式”图像文件中。以 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

答案2

我可以区分真实的文本模式和它的图形模拟。

…这是善于观察的人区分 Windows 上真正的 BSOD 与大约十年前流行的恶作剧 BSOD 屏幕保护程序操作的方法之一。使用显示适配器硬件在图形模式下显示的块图形字符与显示适配器硬件在文本模式下生成的字符略有不同。

是的,显示适配器处于图形模式。这种情况已经持续了一段时间。总是在没有 PC 显示适配器硬件的系统上,这种方式是可行的。在 Linux 的早期,在 PC 兼容机上,控制台会将显示适配器硬件设置为文本模式。但这种使用方式已悄然消失,几乎为零。如今,对于大多数用户来说,Unicode 支持需要比文本模式硬件更大的字形集。机器固件(当然)使用图形模式来显示启动画面(带有漂亮的图片和公司徽标),Linux 加载程序和系统初始化也是如此。

Linux 内核中内置了一个终端仿真程序。它位于帧缓冲区和输入事件子系统的顶层,使用内部内核接口进行访问。它以一系列内核虚拟终端设备/dev/tty1等等。

与运行超出Linux 内核的终端仿真器与普通应用程序类似,仅能模拟真实终端的有限部分功能,缺乏后者终端仿真器所具备的附加功能。

您需要为此寻找这些。您可能熟悉使用 X 作为输入/输出的终端仿真器,例如 xterm、lxterminal、gnome-console、konsole、eterm、wterm 等。不太为人所知的是使用帧缓冲设备和输入事件设备作为输入/输出的终端仿真器。提供用户空间虚拟终端

后者中的一些可以做你想做的事。

例如,可以配置 fbterm 以在启动时使用帧缓冲区中的任何内容作为背景图像。因此,您需要做的就是在运行 fbterm 之前使用其他几个用于将图像直接显示到 Linux 帧缓冲区设备的实用程序之一来设置背景图像。有几种这样的工具,包括:

fbvis 和 fbi 在退出时清除屏幕,并且需要在 Foogod 的回答中更详细解释的卷积。但是,dfbg 不会自行清理,这使得它更适合这个特定的任务。

进一步阅读

答案3

尽管 Foogod 的答案对我来说不起作用,但它确实为我指明了正确的方向,提供了一半的解决方案(即fbi在 TTY 屏幕上显示图像的同时读取帧缓冲区数据)。因此,我授予他的答案赏金。

Bellow 是一个脚本,它可以轻松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

就我的情况来说,FBI 正在尝试:/dev/dri/card0

为了可读性可以使用 imagemagick:

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

这将通过将图像转换为#202020具有80%可见性的颜色叠加来模拟透明背景

相关内容