Ubuntu Desktop 实践 10、使用 fbterm 玩转全字符界面的 Linux

Ubuntu Desktop 实践 10、使用 fbterm 玩转全字符界面的 Linux

今天来一个怀旧的主题,那就是玩一玩全字符界面的 Linux。

有人可能会觉得这完全是废话啦,没有桌面,当然是使用命令行啦。

而且 Linux 的精髓不就是命令行吗?

这还有什么疑问?

但是,其实随着这些年硬件的发展,在裸机上玩命令行,还真的有点痛苦。不信?你看在我的 4K 分辨率的 X1 Carbon 2018 上的效果,如下图:

图1、4K 屏幕下的命令行

还有 Vim 的运行效果,如下图:

图2、4K 屏下纯文本界面下的 Vim

大家可以看出来,主要问题是屏幕的分辨率太高、字太小,次要问题是不能显示中文和特殊的符号,也不能输入中文。

这就让我不禁怀起旧来。大约在 6000 天之前,我还是用的一款华硕的笔记本,14 吋的 4:3 的屏幕,1024x768 的分辨率,那时候用 Linux 全字符界面是多么的爽。

不大不小的字体,黑底白字的屏幕,花花绿绿的代码,三四层楼那么高的逼格……

唉,一切都回不去了。

现在如果有人问我命令行怎么玩,我一定会告诉他在 Linux 桌面系统上起一个终端模拟器,想要装逼,那就设置成半透明的背景加一张拉风的壁纸,然后按 F11 全屏。

如果是要在服务器上使用,那还是老老实实 ssh 连上去。

如果一定要使用全字符界面的 Linux,那是不是就真的没办法用了呢?那也不一定,请听我慢慢道来。

先看一下我在使用桌面系统情况下的资源占用率,如下图:

图3、使用 htop 查看系统使用率

可以看到,我使用 Gnome 桌面系统,系统资源的占用率其实是很低的,16 个 CPU 核心就只有一个占用率 3.2%,32G 的内存只使用了 1.47G。这对于我来说,就是毛毛雨的啦。

等会儿我们进入全字符界面后,再测一下不要桌面系统时的资源占用率。

不过进入全字符界面之前,我得先做点准备工作,那就是为 fbterm 准备一张背景图片,这个需要用到 GIMP,这个只有在图形界面下才能完成。

我准备的背景图片如下图:

图4、我准备的背景图片,需要做一点加工

直接使用这个背景图片是不行的,因为背景图片亮度比较高,色彩太复杂,会使得我们的命令行看不清楚字。所以需要调整曲线和色阶,使图片变暗,做成背景半透明的效果。如下两图:

图5、调整曲线,目的是使暗部变亮,以便于尽量保留图像细节
图6、调整色阶,使图像整体变暗

好了,下面开始正式进入字符界面。

一、进入全字符界面的方法

有两个方法,第一种,是和桌面系统共存的方法,按Ctrl+Alt+F3Ctrl+Alt+F4Ctrl+Alt+F5Ctrl+Alt+F6键,可以切换到字符界面。

原理是什么呢?是 Linux 系统提供的虚拟 tty 功能。所有 Linux 系统在启动后,都会有多个虚拟 tty 可用,其中 tty1 到 tty7 可供用户登陆和使用,只需要使用Ctrl+Alt+F1Ctrl+Alt+F7切换即可。但是在使用桌面的 Ubuntu 中,如果只开一套桌面的话,则 tty1 被登录界面占用,tty2 被当前桌面系统占用,tty7 不知被什么占用,反正是没有命令行提示符。所以,我们可以在 tty3 到 tty6 中使用命令行界面。

什么?只开一套桌面?难道 Linux 可以开几套桌面环境吗?

还真的是可以的,没多开一套桌面环境,就需要多占用一个 tty。

以后有机会我专程为大家演示。

第二种进入全字符界面的方法,就是使系统开机后直接进入字符界面,不启动桌面环境。使用如下命令设置:

sudo systemctl set-default multi-user.target

然后重启系统就好了。

如果要回到桌面环境,使用如下命令设置:

sudo systemctl set-default graphical.target

然后重启系统,可以回到桌面环境。

这是由 systemd 控制的。如果有兴趣,可以学习 systemd 相关的知识。

二、在全字符界面下如何截图

这是我要解决的第二个问题,因为如果无法截图,我就无法和大家分享。

好在,全字符界面下,也有一个比较好的截图工具,那就是 fbgrab,使用如下命令安装:

sudo aptitude install fbcat

在全字符界面截图,包括我后面即将讲到的 fbterm,都需要 Linux 开启 Framebuffer 支持才行。目前在个人电脑上安装的 Linux,默认都开启了 Framebuffer,这个不需要担心。

其实严格来说,Framebuffer 也是一种图形系统。

使用 Framebuffer,在全字符界面下看图片和播放视频都没有问题。

使用 fbgrab 截图,我一般使用如下命令:

sudo fbgrab -s 10 xxx.png &

这样,会让 fbgrab 在后台运行,然后等待 10s,然后对当前的工作环境进行截图,保存为 .png 格式的图片。

前面那两张 4K 屏幕下字很小的图片,就是这么来的,大家可以放大了仔细看。

三、开启 Ubuntu 的 root 账户

Ubuntu 默认不开启 root 账户,平时所有的特权操作都使用 sudo 进行。

但是 fbterm 必须使用 root 账户运行,使用 sudo 都不行。运行sudo fbterm,会输出 stdin is not a interactive tty!

我查看了 fbterm 的源代码,发现它运行之前,会检查当前的 stdin 是不是 /dev/tty*,但是 sudo 运行程序的时候,又会起一个伪终端,这样,stdin 就变成了 /dev/pts/1,所以不能成功运行 fbterm。

而 fbterm 又必须要有 root 权限,因为 fbterm 需要访问 /dev/fb0,也需要修改内核中的键盘映射来注册它自己的快捷键。

所以我们只能使用 root 用户运行 fbterm。

开启 root 用户的办法很简单,就是为 root 用户设置密码就行了。命令为sudo passwd root

四、安装运行 fbterm,并设置 fbterm 的字体和输入法

使用sudo aptitude search fbterm查看一下和 fbterm 有关的软件包有哪些,如下图:

图7、和 fbterm 有关的包

可以看到,有一个 fbterm,还有三个包,和输入法有关。我当然选择最新的 fcitx5。所以安装 fbterm 和 fcitx5-frontend-fbterm。这里不赘述。

然后,按Ctrl+Alt+F3快捷键,进入字符界面,使用 root 用户登录。

先运行 fbterm 命令,再输入exit退出。

这次运行,会在/root目录下生成一个.fbtermrc文件,我们修改它的配置,主要是修改字体和输入法。我依然使用 UbuntuMono Nerd Font Mono 字体,在 4K 分辨率下,我选择的大小是 42。关于终端字体的论述,大家可以看我这一篇:


请记住,我们现在是以 root 用户在运行,所以我们要为 root 用户安装字体。很简单,把/home/youxia/.fonts目录复制到/root/.fonts即可。另外,我们同时也把/home/youxia/.vimrc文件和/home/youxia/.vim目录复制到/root目录下,那么,root 用户连 Vim 也有了。

.fbtermrc文件的配置内容如下:

图8、fbterm 的配置,也是它的显示效果

通过配置字体之后,再也不会觉得字太小了,中文和符号也能正确显示了,如下图:

图9、在 fbterm 下运行 Vim 的效果

五、开启 256 色的终端效果

从上图中可以看出,Vim 的显示并不完美,颜色不太好看,而且 airline 完全没有显示出来。随便写几行 cpp 代码测试一下,发现 Vim 的经典布局,效果是这样的:

图10、Vim 的显示效果

效果并不满意。为什么会这样呢?这是因为 Vim 认为 fbterm 提供的终端是传统的只有 8 种颜色的 linux 终端。为了使用 256 种颜色,需要设置环境变量 TERM 为 fbterm,命令为:

export TERM=fbterm

然后,再运行 Vim,就是下面这样的效果了:

图11、设置 TERM 环境变量后 Vim 的显示效果

该效果已经和桌面环境下基本无异了,除了没有背景图片。下面,我来为 fbterm 加上我之前准备的那个背景图片。

六、使 fbterm 显示背景图片

fbterm 本身是不能读取图片并将它设置为背景的。但是 fbterm 的文档里指出了一个办法,那就是先使用 fbv 将图片显示到屏幕上,然后启动 fbterm,使得 fbterm 具有背景图片的功能,为了这个功能,可以封装一个 Shell 脚本 fbterm-bi,我后面会展示。

这里,我先解决 fbv 的问题。

fbv 这个软件比较老了,Ubuntu 的软件仓库里没有。好在 github 里有,如下图:

图12、github 中的 fbv

先 clone 下来,然后自己编译,根据文档,编译之前,先安装 libungif,命令为sudo aptitude install libungif

在 Linux 环境下,我们经常需要自己编译和安装一些以源代码形式发布的软件。其命令基本上如下:

./configure
make
make install

这三板斧究竟用到了什么知识呢?用到了 autotools 来进行工程管理的知识,autotools 包含了 autoconfig、automake 这样的工具。使用 Linux 就是这么神奇,它会不知不觉让你学会很多知识。除了 autotools,现在流行的 cmake 也得好好学一下。当然,这都是后话了。

这里直接照着做就行了。

有了 fbv,再来看看 fbterm-bi 脚本文件是什么样的,如下图:

图13、fbterm-bi 脚本

可以看到,这个脚本很简单,它先使用 fbv 显示图片,然后设置环境变量 FBTERM_BACKGROUND_IMAGE=1,然后再启动 fbterm 就完事了。

所以,我们使用./fbterm-bi fbterm-background.png使用前面准备的背景图片启动 fbterm,效果如下图:

图14、带背景图片的 fbterm

再运行 Vim 是下面这样的效果:

图15、在带背景的 fbterm 中运行 Vim

七、关于中文输入法

在前面安装和设置 fbterm 的时候,我已经安装了fcitx5-frontend-fbterm软件包,并将输入法设置为fcitx5-fbterm

在安装fcitx5-frontend-fbterm时,已经自动安装了 fcitx5 输入法。

fcitx5-fbterm 只是 fbterm 中和 fcitx5 输入法沟通的桥梁,要想输入中文,还需要自己启动 fcitx5。

我使用的是fcitx5 &命令让 fcitx5 在后台运行。

这时,需要等一会儿,因为 fcitx5 启动比较慢。

最后,使用Ctrl+Shift+Space快捷键,就可以在 fbterm 中输入中文了,如下图:

图16、在 fbterm 中输入中文

八、最后,完全关掉桌面,进入全字符界面测试一下

使用sudo systemctl set-default multi-user.target,重启电脑,完全进入字符界面。使用htop看一下系统资源占用,是什么情况呢?让我来测试一下。

结果如下图:

图17、全字符界面下资源占用的测试

可以看到,在不开启桌面的情况下,资源占用急剧下降,CPU 只有一个核占用不到 1%,其余的核全部空闲,内存占用直接下降了 1G,从 1.47G 下降到了 447M。

在我的电脑上,这点资源节约算不上什么。但是如果你正好有一台只有 2G 内存的电脑,那就很可观了。

在服务器上,也可以这么玩。


祝大家玩得愉快!

编辑于 2023-11-17 20:13・IP 属地湖北