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


17

我曾经主动使用全屏控制台(用Ctrl+ Alt+ F1... 打开的控制台F6),后来想到,我想尝试用某种“墙纸”装饰它(当然,这是一个相当黑暗和单调的墙纸)。 ,这样就不会降低可读性),也许看起来和感觉都不错(也可以,但是我需要尝试)。它甚至会更好,如果我可以设置不同的图片不同的控制台的背景(一为Ctrl+ Alt+ F1,另一个用于Ctrl+ Alt+ F2等)。

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


2
不可能。虚拟控制台仅是文本。
Sergiy Kolodyazhnyy

5
@Serg自从Linux甚至不存在以来,我就一直在使用纯文本模式-相信我,我可以将真实文本模式与它的图形仿真区分开。如今,很多人几乎无法想象,但在Linux 2.4天内,我什至没有安装X服务器的情况下一直在控制台中看电影。这使我怀疑这实际上是不可能的。
伊万

1
好的,让我纠正一下自己:我确实相信可以在控制台中查看图像和电影,因为它被称为framebuffer设备,但是在该屏幕上却被某些程序的输出所占用,例如fbi。TTY本身仍然只是一个文本设备
Sergiy Kolodyazhnyy 2015年

2
符合条件的问题我会悬赏。我实际上很感兴趣
Sergiy Kolodyazhnyy 2015年

Answers:


12

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

sudo apt-get install fbterm fbi

fbterm本身并不真正读取或显示背景图像,它希望其他程序在启动之前在屏幕上设置背景图像。还有中的说明fbterm手册页有关如何使用这一做fbv,绝对过时的和不支持的效用我甚至不能编译现代Ubuntu系统上。fbi是用于帧缓冲区的更清洁,更美观的图像查看器,但不幸的是,它没有更简单的“设置并退出”功能fbv,因此fbterm如果您尝试直接使用它,将会产生干扰。但是,我能够提出一种可行的替代方案:

首先,您将需要使用fbicat显示所需的图像,然后将其转储到“帧缓冲原始格式”图像文件中。以root身份在framebuffer控制台中运行:

( sleep 1; cat /dev/fb0 > nifty-background.fbimg ) & fbi -t 2 -1 --noverbose -a nifty-background.png

(这将显示图像了几秒钟,然后退出,在文件中救了结果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

7

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

…这是观察者可以将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本身不会自动清理,因此更适合此特定任务。

进一步阅读


问题询问如何为控制台创建背景图像。您的答案仅列出了可能的解决方案。因此,我会奖励其他答案,但是,我感谢您提供的大量信息。你有我的支持。
Sergiy Kolodyazhnyy 2015年

4

尽管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: /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" ] ||一部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.