如何自定义全屏控制台背景 (TTY)?

Iva*_*van 20 tty virtual-console

我用全屏控制台(那些开Ctrl+ Alt+ F1... F6)积极已经到了一个想法,我想尝试用一种“壁纸”装饰它(当然是有点暗,一个单调以便它不会降低可读性),也许这看起来和感觉不错(或不,但我需要尝试)。它甚至会更好,如果我可以设置不同的图片不同的控制台的背景(一为Ctrl+ Alt+ F1,另一个用于Ctrl+ Alt+F2等)。

控制台具有比纯文本模式提供的更高的分辨率,这表明它们使用了成熟的图形模式,一切皆有可能。但是如何?

小智 15

我很确定 Linux 控制台驱动程序没有内置此功能,但是有一个名为的应用程序fbterm可以执行此操作。为了使背景图像工作,您还需要一个可以在帧缓冲区上显示图像的实用程序,例如fbi

sudo apt-get install fbterm fbi
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

(这将显示图像了几秒钟,然后退出,在文件中救了结果nifty-background.fbimg,更换nifty-background.fbimgnifty-background.png使用任何档案名称,你想,当然。)

命令的第一部分在将帧缓冲区内容转换为文件之前等待 1 秒。同时,第二部分(在 & 之后)启动fbi以在帧缓冲区上显示图像,以便当 cat 命令开始执行时(1 秒后),那里有一个图像要转储。他们按这个顺序排列的原因是因为我发现fbi如果它不在前台运行就会有问题,这意味着它必须是列表中的最后一个命令。

从那时起,无论何时你想运行fbterm,你都可以像这样启动它(你可能想要创建一个小包装脚本):

export FBTERM_BACKGROUND_IMAGE=1
cat nifty-background.fbimg > /dev/fb0; fbterm
Run Code Online (Sandbox Code Playgroud)


Jde*_*eBP 10

我可以将真实文本模式与其图形仿真区分开来。

...这是观察者可以将 Windows 上的真正 BSOD 与大约十年前进行轮次的笑话 BSOD 屏幕保护程序的操作区分开来的方法之一。在图形模式下使用显示适配器硬件显示块图形字符与在文本模式下由显示适配器硬件生成的字符略有不同。

是的,显示适配器处于图形模式。这种方式已经有一段时间了,现在。这是总是这样不上PC的显示适配器硬件系统。在 Linux 的早期,在 PC 兼容机上,控制台的显示适配器硬件处于文本模式。但是这种用途已经悄悄地被侵蚀到几乎没有。现在大多数用户的 Unicode 支持需要比文本模式硬件更大的字形集。机器固件(当然)使用图形模式显示启动画面(带有漂亮的图片和公司徽标),Linux 加载程序和系统初始化也是如此。

Linux 内核中内置了一个终端模拟器程序。它位于帧缓冲区和输入事件子系统之上,它使用内部内核接口来访问。它以一系列内核虚拟终端设备的形式呈现给应用程序模式系统,/dev/tty1等等。

这个程序相比,运行终端仿真器相当有限outwith Linux内核,作为普通的应用程序。它仅模拟真实终端功能的有限子集,并且缺少后者终端模拟器的附加功能。

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

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

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

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

进一步阅读


Ser*_*nyy 5

虽然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 
Run Code Online (Sandbox Code Playgroud)

附加信息

事实证明,用户不一定需要使用sudo; /dev/fb0属于video组,因此用户可以使用以下命令将自己添加到该组中

sudo usermod -a -G video $USER
Run Code Online (Sandbox Code Playgroud)

因此,上述脚本中对 root 的检查变得过时,特别是[ "$(whoami)" != "root" ] ||部分。