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

我曾经主动使用全屏控制台(那些用Ctrl + Alt + F1F6打开的控制台)并且想出了一个想法,我想尝试用一种“壁纸”来装饰它(相当黑暗和单调的当然,这样不会降低可读性),也许这看起来和感觉很好(或不,但我需要尝试)。 如果我可以将不同的图片设置为不同的控制台背景(一个用于Ctrl + Alt + F1 ,另一个用于Ctrl + Alt + F2等),情况会更好。

控制台具有更高的分辨率,纯文本模式提供的事实表明,它们使用了完整的图形模式,一切皆有可能。 但是怎么样?

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

 sudo apt-get install fbterm fbi 

fbterm本身并不实际读取或显示背景图像,它希望其他程序在启动之前在屏幕上设置背景图像。 fbterm手册页中有关于如何使用fbv执行此操作的fbv ,这是一个绝对陈旧且不受支持的实用程序,我甚至无法在现代Ubuntu系统上编译。 fbi是一个更清洁,更好的帧缓冲区图像查看器,但遗憾的是没有更简单的fbv的“设置和退出”function,因此如果你试图直接使用它会干扰fbterm 。 但是,我能够提出一个有效的替代方案:

首先,您需要使用fbicat来显示所需的图像,然后将其转储为“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.fbimgnifty-background.png替换nifty-background.fbimg您希望的任何文件名。)

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

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

 export FBTERM_BACKGROUND_IMAGE=1 cat nifty-background.fbimg > /dev/fb0; fbterm 

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

…这是观察者能够区分Windows上的真正BSOD与大约十年前做过这一轮的笑话BSOD屏幕保护程序的行为的方式之一。 在图形模式下使用显示适配器硬件显示块图形字符与文本模式下显示适配器硬件生成的字符略有不同。

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

Linux内核中内置了一个终端仿真器程序。 它分层在framebuffer和输入事件子系统之上,它使用内部内核接口进行访问。 它将应用程序模式系统呈现为一系列内核虚拟终端设备, /dev/tty1等。

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

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

  • zhcon ( Ubuntu包 ),
  • fbpad ,
  • fbterm ( Ubuntu包 )及其forf ,如jfbterm ( Ubuntu包 ),
  • bogl-bterm( Ubuntu包 ),
  • nosh console-terminal-emulatorconsole-fb-realizer ,以及
  • kmscon 。

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

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

  • dfbg( Ubuntu包 ),
  • Ali Gholami Rudi的fbvis和
  • fbi( Ubuntu包 )。

fbvis和fbi在退出时清除屏幕,并要求在Foogod的答案中更详细解释的卷积。 但是,dfbg不会自行清理,因此更适合这项特殊任务。

进一步阅读

尽管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 

附加信息

事实certificate,用户不一定需要使用sudo ; /dev/fb0属于video组,因此用户只需将自己添加到该组即可

 sudo usermod -a -G video $USER 

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