这是我的第一个系列文章,打算花一个学期的时间打造一个没有图形界面但是功能齐全的Archlinux。经过讨论,采用G.dab的提议来命名此系列为Moonlight in Twilight,暮光中的月色,简称MIT。在此感谢G.dab,也希望大家一起进步!

安装

参见我的另一篇文章——Arch Linux USB(安装篇),里面详细介绍了整个安装的过程。在这次的MIT系列中,又提供了安装的视频过程,注意其中在格式化的时候采用的命令`mkfs.ext4 -0 “^has_journal” /dev/sdXx”是为了增加U盘的读写次数而不创建日志文件,其他的步骤与之前的文章一致。但是要注意,没有日志文件如果在使用过程中出现意外断电或者热拔插,就会损失数据,所以最后我还是选择了使用日志。

终端

简介

尽管没有了图形界面,但是linux原生的tty并不能支持256色的输出、中文显示、输入法等功能,所以需要其他的解决方案。在这里,我采用的是framebuffer,也就是帧缓冲,不经由X服务器,直接对帧缓冲设备/dev/fb0进行操作,实现图像的显示。理论上来说,framebuffer的支持没有上限,可以调控屏幕的每一个像素点,但是直接基于framebuffer的应用很少(毕竟大家都去图形界面了)。这里我们使用fbterm这一基于framebuffer的终端。其实还有yaft也是基于framebuffer的,还有另一种技术KMS可以提供选择,但是fbterm是其中对中文最友好一个,fcitx对其有默认的插件支持。

主要参考:

主要还是多看看man page里面怎么写的,然后在AUR的讨论区看看有哪些问题别人已经遇到过了。

下面引自SDB:Fbterm

fbterm 是一个基于帧缓冲设备或 VESA 视频卡的 Linux 终端模拟器。它是用于 Runlevel 3 控制台也即无 X11 环境的纯终端,也就是说,和 Bash,Zsh 不同,它不能在 konsole 或 gnome-terminal 里面跑。它是目前可用的最强中文控制台。

特性

  • 启用了加速滚动后,和 Linux 内核终端的速度一样,也即作为一个模拟器,它能和 Runlevel 3 默认终端一样快。
  • 使用 fontconfig 配置字体,freetype2 渲染,与基于 Qt/Gtk+ 的图形应用一样
  • 可以动态的创建/销毁多达 10 个窗口
  • 可记录每个窗口的滚动历史
  • 自动检测当前语言的文本编码,支持中日韩双字节脚本。
  • 可动态使用快捷键切换预配置的额外文本编码
  • 与 gpm 服务器配合可跨窗口复制粘贴文本
  • 支持屏幕转向
  • 支持服务器-客户端结构的输入法
  • 支持背景图片

(其实这就是把man page翻译了一遍)

安装

在Archlinux上,你很容易安装fbterm,只要通过AUR即可

权限配置

一般来说,framebuffer设备的使用权限归于root和video组(可以用ls -l /dev/fb0查看)

所以需要把你的用户加到video组:

sudo gpasswd -a username video

同时,根据man page:

FbTerm 尝试将 linux 内核键映射表更改为设置快捷方式,这需要 SYS_TTY_CONFIG功能,因为内核版本 2.6.15。这意味着 FbTerm 应该是一个 setuid 0 程序,以允许非 root 用户使用快捷方式。FbTerm 仅在更改键映射表时暂时切换到 root 权限,我们相信它几乎没有安全问题。如果你真的不喜欢这个并且有一个启用了文件系统功能的 linux 内核,它允许用户在不使用 setuid 0(官方内核 2.6.27 包括它)的情况下为二进制文件提供 root 权限的子集,你可以运行命令“ sudo setcap ‘cap_sys_tty_config+ep’ /path/to/fbterm “。

FbTerm 将 /dev/tty0 输出重定向到当前子窗口的伪终端。在 linux 2.6.10 之前的版本中,只要输出还没有被重定向,任何人都可以这样做;从 2.6.10 版开始,只有 root 或具有CAP_SYS_ADMIN功能的进程可以执行此操作。您应该对 FbTerm 进行与上述类似的工作,以便为非 root 用户启用此功能。

简单来说,如果普通用户要使用快捷键,需要运行命令

sudo setcap 'cap_sys_tty_config+ep' /usr/bin/fbterm

中文显示

你得先创建配置文件,将其拷贝到~/.config/fbterm/fbtermrc(配置文件应该就在编译的目录下面,找不到的话可以参考文末我给出的配置)

通过fc-list查看已安装了那些字体,如果没有装中文字体先装上,在fbtermrcfont-names=一栏填上你需要使用的字体,并用逗号,分隔,比如font-names=XXX(通用字体),XXX(中文字体)

text-encoding一栏是编码格式,fbterm默认使用UTF-8,不改也没事。

通过fbterm -s xx(数字) -n XXX(字体)可以指定字体和字体大小进行调试,不过framebuffer对中文的绘制的确不是很好,能看就行了(最新测试,中文字体在fbterm下显示和图形界面完全一样,不过要确保使用的第一个字体里面没有中文,这样才会使用中文字体,因为我之前的配置是font-names=Freemono, LXGW WenKai Mono但是Freemono有比较难看的中文字体,我还以为是fbterm的问题)。

背景图像

FbTerm 不会直接加载和解析任何格式的图像文件,而是在定义变量FBTERM_BACKGROUND_IMAGE的情况下在启动时截取帧缓冲设备的屏幕截图,然后将此屏幕截图用作文本渲染的背景。为了启用背景图像支持,用户应首先使用图像查看器将图像放入帧缓冲设备。下面列出了使用 fbv 的脚本:

#!/bin/bash

# fbterm-bi: a wrapper script to enable background image with fbterm
# usage: fbterm-bi /path/to/image fbterm-options

echo -ne "\e[?25l" # hide cursor

fbv -ciuker "$1" << EOF
q
EOF

shift
export FBTERM_BACKGROUND_IMAGE=1
exec fbterm "$@"

首先得安装framebuffer下的图像显示工具fbv,可以直接由pacman安装,然后创建以上脚本,别忘了赋予可执行权限

你可以给这个脚本添加路径的环境变量,不过我采用的方式是在.zshrc里面创建了一个命令别名alias fbterm-bi="/path-to/fbterm-bi",这样也很方便

在这个脚本的使用中,需要指定图片路径$1"就是这个意思,如果只需要用一张背景图片而不愿意每次把图片路径打一遍,可以将fbv -ciuker "$1" << EOF改为fbv -ciuker "/path-to/image" << EOF。我的做法是又偷懒用zsh创建了别名,并且由于想改变背景的亮度(因为有时候终端的壁纸太亮,有些颜色看不清),所以一口气创建了四个命令fbterm1-fbterm4,分别对应不同的亮度和心情。

这里顺带提一笔,可以用fbgrab作为截图软件


闲谈

这里把话题扯开一下,这样看来配置和使用这个fbterm还是蛮简单的,为什么我还花了一个礼拜的时间折腾它呢。主要的困难在于输入法和颜色。但是,把问题解决了之后也还是蛮简单的,不要放弃,我们继续前行。

输入法

正如前文所说,fcitx对fbterm提供了支持。但是wiki上说fcitx正在维护,推荐使用fcitx5。没想到fcitx-fbterm也迁移到了fcitx5-fbterm,可以在aur上获取。但是出于我也不清楚的原因,fcitx5并没有在我的实验中正常运行。所以最后还是使用fcitx作为输入法。并且fcitx-fbterm虽然在aur里面,但是需要从google.code拉源码,所以一直下不下来,所以需要特殊的网络环境。

安装之后的配置倒是轻松,只要在fbtermrc找到input-method=fcitx-fbterm即可。

fbterm将fcitx作为一个服务器来使用,所以需要先自己运行fcitx,只要fcitx -d(注意,fcitx运行之后不会由于fbterm的退出而退出,所以只要运行一次即可)

当然,也可以设置fcitx自启动,但是考虑到使用中文输入法的机会也不多,各位根据自己的需求吧。

另外,需要在~/.config/fcitx/profile里面将需要使用的输入法改为Ture(不得不说,fcitx的配置文件真奇怪,里面都是注释。)

颜色

fbterm支持256色,但是……

当我运行ranger的时候并不能正确预览,就像在控制台一样,python会报颜色超出范围的错误。一开始我还以为是ranger出错了,看到在github上的确有类似的issue,不过人家是图形界面,需要设置TERM=xterm-256color的环境变量。我export了一下,还真的能显示了,但完全不是想要的效果。

后来仔细阅读了man page (fbterm),发现,fbterm虽然支持256色,但是默认TERM=linux,需要在命令前手动加上TERM=fbterm才能使用256色。在aur的评论区也有类似的讨论,不过没有很好的解决方案,直接设置TERM=fbterm的环境变量会在tmux和控制台中出现一定的问题,所以我又在.zshrc里加上了TERM=fbterm以及TERM=tmux-256color的别名,一个在fbterm中使用,一个在tmux中使用。

结尾

其实还是有许多问题的解救不是令人满意,如果大家有什么问题和解决方案,欢迎在讨论区提出。
贴一下我的fbtermrc:

# Configuration for FbTerm

# Lines starting with '#' are ignored.
# Note that end-of-line comments are NOT supported, comments must be on a line of their own.


# font family names/pixelsize used by fbterm, multiple font family names must be seperated by ','
# and using a fixed width font as the first is strongly recommended
font-names=LXGW WenKai Mono
font-size=19

# force font width (and/or height), usually for non-fixed width fonts
# legal value format: n (fw_new = n), +n (fw_new = fw_old + n), -n (fw_new = fw_old - n)
#font-width=
#font-height=

# terminal palette consists of 256 colors (0-255)
# 0 = black, 1 = red, 2 = green, 3 = brown, 4 = blue, 5 = magenta, 6 = cyan, 7 = white
# 8-15 are brighter versions of 0-7
# 16-231 is 6x6x6 color cube
# 232-255 is grayscale
color-0=000000
color-1=AA0000
color-2=00AA00
color-3=AA5500
color-4=0000AA
color-5=AA00AA
color-6=00AAAA
color-7=AAAAAA
color-8=555555
color-9=FF5555
color-10=55FF55
color-11=FFFF55
color-12=5555FF
color-13=FF55FF
color-14=55FFFF
color-15=FFFFFF

# default foreground/background colors (chosen from palette)
color-foreground=7
color-background=0

# max scroll-back history lines of every window, value must be [0 - 65535], 0 means disable it
history-lines=0

# up to 5 additional text encodings, multiple encodings must be seperated by ','
# run 'iconv --list' to get available encodings.
text-encodings=UTF-8

# cursor shape: 0 = underline, 1 = block
# cursor flash interval in milliseconds, 0 means disable flashing
cursor-shape=1
cursor-interval=500

# additional ascii chars considered as part of a word while auto-selecting text, except ' ', 0-9, a-z, A-Z
word-chars=._-

# change the clockwise orientation angle of screen display
# available values: 0 = 0 degree, 1 = 90 degrees, 2 = 180 degrees, 3 = 270 degrees
screen-rotate=0

# specify the favorite input method program to run
input-method=fcitx-fbterm

# treat ambiguous width characters as wide
#ambiguous-wide=yes

至于tmux是什么,请看下回分解。

附上新的终端照片(用fbgrab截的图)

fbtermfbterm