第 7 章 X 窗口系统

[警告]警告

本章是基于 2013 年发布的 Debian 7.0 (Wheezy) 编写的,所以其内容正在变得过时。

Debian 上的 X 窗口系统基于 X.Org 的源代码。

7.1. 关键软件包

这里有一些用于简易安装的(元)软件包。

表 7.1. X 窗口的关键(元)软件包列表

(元)软件包流行度大小说明
xorgI:45752X 库、一个 X 服务器、一系列字体以及一组基础的 X 客户端和工具(元软件包)
xserver-xorgV:66, I:492238X 服务器的全部套件及其配置
xbase-clientsI:2646各种 X 客户端(元软件包)
x11-commonV:372, I:755308X 窗口系统的文件系统的基础设施
xorg-docsI:62036X.Org 软件套件的各种文档
menuV:54, I:1971509为理解菜单的应用生成Debian菜单
menu-xdgV:31, I:10927将 Debian 菜单结构转换为 freedesktop.org xdg 菜单结构
xdg-utilsV:229, I:521327freedesktop.org 提供的集成桌面环境的工具
task-gnome-desktopI:1759标准 GNOME 桌面环境(元软件包)
task-kde-desktopI:666核心 KDE 桌面环境(元软件包)
task-xfce-desktopI:1069Xfce 轻量级桌面环境(元软件包)
task-lxde-desktopI:359LXDE 轻量级桌面环境(元软件包)
fluxboxV:2, I:93860Fluxbox:可配置度高且资源耗费低的 X 窗口管理器

关于 X 基础知识,请参考 X(7) 和 the LDP XWindow-User-HOWTO

7.2. 设置桌面环境

一个 桌面环境 通常是一个 X 窗口管理器、一个文件管理器和一套兼容的实用程序组合而成。

你能够在 aptitude 的任务菜单下安装全部的桌面环境,例如 GNOMEKDEXfce 或者 LXDE

[提示]提示

在Debian unstable/testing下,任务菜单可能与最新的软件包过渡状态不同步。在这种情况下,您需要取消选择aptitude(8)任务菜单下列出的一些(元)包。当取消选择 (元) 软件包时,您必须选择那些提供依赖项手动操作的软件包,避免它们被自动删除。

你也可以手动只建立一个 X 窗口管理器,例如 Fluxbox

关于 X 窗口管理器和桌面环境的介绍,参见 Window Managers for X

7.2.1. Debian 菜单

Debian 菜单系统menu 软件包中为带有 update-menus(1) 的文本和 X 程序提供了一个通用接口。每个软件包都会将它的菜单数据安装到 “/usr/share/menu/” 目录。参见 “/usr/share/menu/README”。

7.2.2. Freedesktop.org 菜单

每个遵从 Freedesktop.org xdg 菜单的软件包都会将由 “*.desktop” 提供的菜单数据安装到 “/usr/share/applications/” 下。符合 Freedesktop.org 标准的现代桌面环境会利用它们的数据使用 xdg-utils 软件包生成菜单。参见 “/usr/share/doc/xdg-utils/README”。

7.2.3. 从 Freedesktop.org 菜单到 Debian 菜单

为了从遵从 Freedesktop.org 菜单的窗口管理器环境(例如 GNOME 和 KDE)访问传统的 Debian 菜单,你必须安装 menu-xdg 软件包。

7.3. 服务器/客户端关系

X Window系统作为服务和客户端程序的组合被启动。在这里,serverclient的意义需要和localremote区分开来。

表 7.2. 服务器/客户端术语表

类型说明
X 服务器一个运行在本地主机上的程序,连接了使用者的显示和输入设备。
X 客户端一个运行在远程主机上的程序,它会与 X 服务器进行数据的处理和传输。
应用程序服务器一个运行在远程主机上的程序,会与应用程序客户端进行数据处理和传输。
应用程序客户端一个运行在本地主机上的程序,连接了使用者的显示和输入设备。

现代X服务器具有 MIT 共享内存扩展 ,他们和本地X客户端通过本地共享内存进行通讯. 这就绕过了网络透明的Xlib进程间通讯通道,提升了大型图像的处理性能.

7.4. X 服务器

关于 X 服务器的信息,参见xorg(1)。

7.4.1. X 服务器的(重新)配置

使用下面命令(重新)配置一个 X 服务器。

  1. # dpkg-reconfigure --priority=low x11-common
[注意]注意

新的 Linux 内核使用 DRMKMSudev,对图形和输入设备进行了良好的支持。X 服务器被重写以使用它们。因此 “/etc/X11/xorg.conf” 通常不存在于你的系统中。这些参数由内核进行配置。参见 Linux 内核文档中的 “fb/modedb.txt”。

对于高分辨率的 CRT 大显示器,最好将将刷新率设置为显示器支持的最高值(85 Hz 不错,75 Hz 也行)以减少闪烁。对于 LCD 显示器,较慢的标准刷新率(60 Hz)就可以了,因为它的反应较慢。

[注意]注意

当心,别使用过高的刷新率,这可能会导致你的显示器系统发生重大的硬件故障。

7.4.2. 连接到 X 服务器的方式

这里有一些方式,可以使 “X 服务器”(显示端)接受来自 “X 客户端”(应用端)的连接。

表 7.3. 连接到 X 服务器的方式

软件包流行度大小用户加密方式相关使用
xbase-clientsI:2646不检查xhost 命令弃用
xbase-clientsI:2646检查xauth 命令通过管道进行本地连接
openssh-clientV:803, I:9964298检查ssh -X 命令远程网络连接
gdm3V:165, I:2295101检查无(XDMCP)GNOME 显示管理器通过管道进行本地连接
sddmV:53, I:951742检查无(XDMCP)KDE 显示管理器通过管道进行本地连接
xdmV:3, I:6686检查无(XDMCP)X 显示管理器通过管道进行本地连接
wdmV:31, I:2842289检查无(XDMCP)WindowMaker 显示管理器通过管道进行本地连接
ldmV:0, I:0436检查LTSP 显示管理器远程 SSH 网络连接(瘦客户端)
[警告]警告

不要在不安全的网络中使用远程 TCP/IP 进行 X 连接,除非你有非常好的理由,例如使用了加密。未加密的远程 TCP/IP socket 连接容易遭到窃听攻击并且 Debian 系统默认禁用了它。请使用 “ssh -X”。

[警告]警告

也不要在不安全的网络中使用 XDMCP 连接。它通过未加密的 UDP/IP 传输数据,很容易遭到窃听攻击

[提示]提示

LTSP 代表 Linux 终端服务器项目(Linux Terminal Server Project)

7.5. 启动 X 窗口系统

X 窗口系统通常是作为 X 会话启动的,X 会话是 由 X 服务器和连接客户端组成的。对于常规的桌面系统,它们两个都是在一个工作站上运行的。

X 会话 由以下方式之一启动。

  • 从命令行用 startx 命令启动

  • 基于”graphical.target“的依赖关系,一个 X 图形显示管理器 的后台守护程序*dm 通过 systemd 启动。

[提示]提示

显示管理器后台守护进程(daemon)的启动脚本在实际执行它们自己时会检查 “/etc/X11/default-display-manager” 文件的内容。这可以确保只有一个 X 显示管理器 后台守护进程(daemon)程序被激活。

[提示]提示

关于 X 显示管理器的初始环境变量,参见 第 8.4.5 节 “只用于 X 窗口的特定语言环境”

本质上,所有的这些程序都是执行 “/etc/X11/Xsession” 脚本。之后 “/etc/X11/Xsession” 脚本通过 run-parts(8) 执行 “/etc/X11/Xsession.d/” 目录中的脚本。这本质上是通过 内建的 exec 命令执行按下面顺序第一个被找到的程序。

  1. X显示管理器调用”/etc/X11/Xsession“ 的参数中指定的脚本, 如果他被定义了。

  2. ~/.xsession” 或 “~/.Xsession” 脚本,如果它被定义。

  3. /usr/bin/x-session-manager” 命令,如果它被定义。

  4. /usr/bin/x-window-manager” 命令,如果它被定义。

  5. /usr/bin/x-terminal-emulator” 命令,如果它被定义。

这个过程会受 “/etc/X11/Xsession.options” 的影响。“/usr/bin/x-*” 命令所指向的准确程序,是由 Debian 选择系统决定的,并且可以通过 “update-alternatives --config x-session-manager” 修改。

细节参见 Xsession(5).

7.5.1. 使用 gdm3 启动 X 会话

gdm3(1) 让你从它的菜单中选择会话类型(或桌面环境:第 7.2 节 “设置桌面环境”),还有 X 会话的语言(或语言环境:第 8.4 节 “语言环境”) 。它在 “~/.dmrc” 中像下面那样设定选择的默认值。

  1. [Desktop]
  2. Session=default
  3. Language=ja_JP.UTF-8

7.5.2. 自定义 X 会话(经典方式)

系统中的 “/etc/X11/Xsession.options” 包含没有前置 “#” 字符的 “allow-user-xsession” 行,则定义了 “~/.xsession” 或 “~/.Xsession” 的任何用户都能够通过完全覆盖系统代码来自定义 “/etc/X11/Xsession” 的动作。在 “~/.xsession” 文件中的最后一个命令应该使用 “exec some-window/session-manager” 这样的形式来启动你最喜欢的 X 窗口/会话管理器。

如果使用了这个特性,系统实用程序选择的显示 (或登录) 管理器 (DM), 会话管理器或者窗口管理器 (WM) 会被忽略。

7.5.3. 自定义 X 会话(新方式)

以下是自定义 X 会话的新方式,它不会像上面那样完全覆盖系统代码。

  • 显示管理器 gdm3 可以选择一个特定的会话并将它设置为 “/etc/X11/Xsession” 的参数。

    • /etc/profile“, “~/.profile“, “/etc/xprofile“, 和 “~/.xprofile“ 文件会被作为 gdm3 启动进程的一部分来执行。
  • ~/.xsessionrc” 文件作为启动进程的一部分被执行。(独立桌面)

    • /etc/X11/Xsession.options“ 中的 “#allow-user-xsession“ 不会限制 “~/.xsessionrc“ 文件的执行。
  • ~/.gnomerc” 文件作为启动进程的一部分被执行。(仅 GNOME 桌面)

系统实用程序选择的显示 (或登录) 管理器 (DM), 会话管理器或者窗口管理器 (WM) 是相当不错的。

在这些配置文件里面,不应当有 “exec …“ 或 “exit“.

7.5.4. 通过 SSH 连接一个远程 X 客户端

使用 “ssh -X” 可以启用一个来自本地 X 服务器到远程应用程序服务器的安全连接。

如果你想避免命令行选项 “-X”,你需要将远程主机的 “/etc/ssh/sshd_config” 文件中的 “X11Forwarding” 设置为 “yes”。

在本地主机上启动 X 服务器。

在本地主机中打开一个 xterm

通过下列命令,运行 ssh(1) 建立与远程站点的连接。

  1. localname @ localhost $ ssh -q -X loginname@remotehost.domain
  2. Password:

通过下列命令,在远程站点运行一个 X 应用程序,例如 “gimp”。

  1. loginname @ remotehost $ gimp &

这个方法可以显示来自远程 X 客户端的输出,相当于它是通过一个本地 UNIX 域名 socket 进行本地的连接。

7.5.5. 连接互联网的安全 X 终端

连接互联网的 X 安全终端,并且会显示在远程运行的整个 X 桌面环境,这可以通过使用特定软件包(例如 ldm)轻松地做到。通过 SSH,你的本地机器会变成连接到远程应用程序服务器的一个安全瘦客户端。

7.6. X 窗口中的字体

在2002年,人们创建了发行版独立的库Fontconfig 2.0用于配置和定制字体访问. squeeze 以后的Debian使用 Fontconfig 2.0 进行字体配置.

X 窗口系统中的字体支持可以概括如下。

表 7.4. 支持 X 窗口字体系统的软件包

软件包流行度大小说明
xfonts-utilsV:66, I:542415X 窗口系统字体实用程序
libxft2V:143, I:662122Xft 的,一个库,连接到了带有 FreeType 字体栅格化库的 X 应用
libfreetype6V:426, I:994896FreeType 2.0 字体栅格化库
fontconfigV:354, I:776583Fontconfig 的,一个通用的字体配置库——支持二进制
fontconfig-configV:367, I:871442Fontconfig 的,一个通用的字体配置库——配置数据

你可以通过下列方法查看字体配置信息。

  • 使用 “xset q” 查看核心 X11 字体路径

  • 使用 “fc-match” 查看 fontconfig 的字体默认

  • 使用 “fc-list” 查看所有可用的 fontconfig 字体

[提示]提示

The Penguin and Unicode” 很好地概述了现代的 X 窗口系统。在 http://unifont.org/ 中的其它文档提供了关于 Unicode 字体、支持 Unicode 的软件以及国际化的相关信息,还有 免费/自由/开源(free/libre/open source,FLOSS) 操作系统中的 Unicode 可用性问题。

7.6.1. 基础字体

计算机字体有两种主要的类型。

  • 点阵字体(低分辨率栅格化下表现良好)

  • 轮廓/笔画字体(高分辨率栅格化下表现良好)

缩放点阵字体会导致图像产生锯齿,而缩放轮廓/笔画字体则生成平滑的图像。

Debian 系统中的点阵字体通常由压缩的 X11 pcf 点阵字体文件 提供,它带有 “.pcf.gz” 文件后缀名。

Debian 系统中的轮廓字体由以下提供。

  • PostScript Type 1 字体文件,它带有 “.pfb”(二进制字体文件)和 “.afm”(字体规格文件)文件后缀名。

  • TrueType(或 OpenType)字体文件,通常带有 “.ttf 文件后缀名。

[提示]提示

OpenType 是为了取代 TrueTypePostScript Type 1。

表 7.5. 相应的 PostScript Type 1 字体

字体软件包流行度大小无衬线字体衬线字体等宽字体字体来源
PostScriptN/AN/AHelveticaTimesCourierAdobe
gsfontsI:5994439Nimbus Sans LNimbus Roman No9 LNimbus Mono LURW (Adobe 兼容的大小)
gsfonts-x11I:8295Nimbus Sans LNimbus Roman No9 LNimbus Mono LPostScript Type 1 字体支持的 X 字体。
t1-cyrillicI:194878Free HelvetianFree TimesFree CourierURW 扩展(Adobe 兼容的大小)
lmodernV:13, I:11333270LMSansLMRomanLMTypewriter*基于现代计算机的可缩放 PostScript 和 OpenType 字体(来自 Tex)

表 7.6. 对应的 TrueType 字体

字体软件包流行度大小无衬线字体衬线字体等宽字体字体来源
ttf-mscorefonts-installerV:1, I:6492ArialTimes New RomanCourier New微软(Adobe 兼容的大小)(这会安装 non-free 数据)
fonts-liberationI:4692093Liberation SansLiberation SerifLiberation MonoLiberation 字体项目(微软兼容的大小)
fonts-freefont-ttfV:50, I:2766656FreeSansFreeSerifFreeMonoGNU 自由字体(微软兼容的大小)
fonts-dejavuI:47839DejaVu SansDejaVu SerifDejaVu Sans Mono覆盖了 Unicode 的 DejaVuBitstream Vera
fonts-dejavu-coreV:220, I:8092954DejaVu SansDejaVu SerifDejaVu Sans Mono覆盖了 Unicode 的 DejaVuBitstream Vera(sans、sans-bold、serif、serif-bold、mono、mono-bold)
fonts-dejavu-extraI:5167493N/AN/AN/A覆盖了 Unicode 的 DejaVuBitstream Vera(oblique、italic、bold-oblique、bold-italic、condensed)
ttf-unifontI:2121N/AN/AunifontGNU Unifont,带有 Unicode 5.1 基本多文种平面(BMP)中所有的可打印字符
[提示]提示

DejaVu 字体基于 Bitstream Vera 字体,并对其进行了扩充。

7.6.2. 其它字体

aptitude(8) 可以帮你轻松找到其它的字体。

  • 简单的软件包列表位于 “软件集” → “本地化”

  • 平面软件包列表可以使用 debtag 正则表达式来过滤字体数据:“~Gmade-of::data:font

  • 在软件包名称里采用下面的正则表达式来过滤得到BDF(位图)字体包列表: “~nxfonts-

  • 在软件包名称里采用下面的正则表达式来得到TrueType字体包列表: “~nttf-|~nfonts-

因为自由字体有时会受限,因此对于 Debian 用户而言,可以选择安装或分享一些商业的 TrueType 字体。为了简化该过程,建立一些方便的软件包。

  • mathematica-fonts

  • fonts-mscorefonts-installer

当你付出使用非自由字体污染你自由系统的代价后,你会得到一些相当不错的 trueType 字体。

7.6.3. CJK 字体

下面是一些主要关注 CJK 字符 的字体。

表 7.7. CJK 字体名称中所使用的暗示字体类型的关键词

字体类型日文字体名称中文字体名称韩文字体名称
无衬线gothic、ゴチックhei、gothicdodum、gulim、gothic
衬线mincho、明朝song、mingbatang

像 “VL PGothic” 这样带有 “P” 的字体名称是对应的 “VL Gothic” 字体修改宽度后的比例字体。

举个例子,Shift_JIS 的码表包含了 7070 个字符。它们可以像下面那样分类。

  • JIS X 0201 单字节字符(191 个字符,又名半角字符)

  • JIS X 0208 双字节字符(6879 个字符,又名全角字符)

使用修复宽度的 CJK 字体的双字节字符占用控制台终端的双倍宽度。为了应对这种情况,带有 “.hbf” 文件后缀名的 汉字点阵字体(Hanzi Bitmap Font,HBF)文件 被设计为包含了单字节和双字节字符的字体。

为了节省 TrueType 字体文件的空间,可以使用带有 “.ttc” 文件后缀名的 TrueType 字体集合文件。

为了覆盖复杂的编码字体空间, CID采用”%!PS-Adobe-3.0 Resource-CMap“开头的CMap文件作为PostScript类型1字体的关键字。这个几乎很少用在普通的X显示上,更多用于PDF等格式的文件渲染上。(参考 第 7.7.2 节 “X 实用应用”).

[提示]提示

对于Han unification,一些Unicode编码点阵期望能够有多样化的glyphs。其中最令人讨厌的在中日韩三个国家“U + 3001顿号”和“U + 3002表意的句号”的字符位置各不相同。配置日文中心字体的优先级,中文用的是” 7~/.fonts.conf 8”能够让日本感到有所平衡。

7.7. X 应用

7.7.1. X 办公应用

下面是一些基础的办公应用(LO 是 LibreOffice)。

表 7.8. 基础的 X 办公应用

软件包流行度软件包大小类型说明
libreoffice-writerV:188, I:44139333LO文字处理软件
libreoffice-calcV:188, I:43632973LO电子表格
libreoffice-impressV:176, I:4339934LO演示文稿
libreoffice-baseV:145, I:3257473LO数据库管理
libreoffice-drawV:177, I:43414600LO矢量图形编辑器(绘图)
libreoffice-mathV:174, I:4371963LO数学方程/公式编辑器
abiwordV:1, I:125141GNOME文字处理软件
gnumericV:6, I:219933GNOME电子表格
gimpV:68, I:34122313GTK位图图形编辑器 (绘图)
inkscapeV:55, I:20984823GNOME矢量图形编辑器(绘图)
diaV:5, I:313727GTK流程图和示意图编辑器
plannerV:0, I:51146GNOME项目管理
calligrawordsV:0, I:75717KDE文字处理软件
calligrasheetsV:0, I:610890KDE电子表格
calligrastageV:0, I:55102KDE演示文稿
calligraplanV:0, I:215342KDE项目管理
kexiV:0, I:27576KDE数据库管理
karbonV:0, I:73473KDE矢量图形编辑器(绘图)

7.7.2. X 实用应用

下面是一些引起我注意的基础实用应用。

表 7.9. 基础的实用应用

软件包流行度软件包大小类型说明
evinceV:116, I:329954GNOME文档(pdf)阅读器
okularV:46, I:11814646KDE文档(pdf)阅读器
calibreV:9, I:3654876KDE电子书转换器和库管理
fbreaderV:2, I:153074GTK电子书阅读器
evolutionV:31, I:229475GNOME个人信息管理(群组软体和电子邮件)
kontactV:1, I:162152KDE个人信息管理(群组软体和电子邮件)
scribusV:2, I:2330375KDE桌面页面布局编辑器
glabelsV:0, I:41326GNOME标签编辑器
gnucashV:3, I:1232304GNOME个人会计
homebankV:0, I:31044GTK个人会计
kmymoneyV:0, I:212036KDE个人会计
shotwellV:19, I:2236451GTK数码照片管理器
xsaneV:17, I:1732346GTK扫描仪前段
[小心]小心

为了让 evinceokular 使用 Cmap 数据(第 7.6.3 节 “CJK 字体”)来显示 CJK PDF 文档,必须要安装 poppler-data 软件包(之前为 non-free,参见 第 11.4.1 节 “Ghostscript”)。

[注意]注意

如果在 GNOME 桌面环境中没有相应功能的软件,那么安装例如 scribus(KDE)这样的软件包是完全可以接受的。但别安装过多功能重复的软件包,这会使你的菜单凌乱。

7.8. X 琐事

7.8.1. 剪贴板

使用鼠标的 3 个按键来进行 X 选择是 X 原生的剪贴板(参见 第 1.4.4 节 “Unix类型的鼠标操作”)。

[提示]提示

Shift-Insert 等同于单击鼠标中键。

表 7.10. 基础的 X 选择程序

软件包流行度软件包大小类型说明
xselV:10, I:4459XX 选择的命令行接口
xclipV:9, I:4964XX 选择的命令行接口

现代的桌面环境(GNOME、KDE……)提供了不同的剪贴板系统用于剪切、复制和粘贴,它们使用鼠标左键和关键键(CTRL-X、CRTL-C 和 CTRL-V)。

7.8.2. X 中的键盘和鼠标按钮映射

xmodmap(1) 是 X 窗口系统中用来修改键盘和鼠标按钮映射的工具。为了获得 keycode,你需要在 X 中运行 xev(1) 并按下对应按键。为了获得 keysym 的含义,你需要查看 “/usr/include/X11/keysymdef.h” 文件(x11proto-core-dev 软件包)中 MACRO 的定义。文件中所有的 “#define” 语句后面都是以 “XK_” 开头,后接 keysym 名称。

7.8.3. 典型的 X 客户端

大多数传统的 X 客户端程序,例如 xterm(1),可以用一组标准的命令行选项来启动,从而指定大小、字体和显示。

它们还使用 X 资源数据库来配置它们的外观。系统默认的 X 资源保存在 “/etc/X11/Xresources/*” 中,应用默认的 X 资源保存在 “/etc/X11/app-defaults/*” 中。使用这些设置作为起点。

~/.Xresources” 文件被用来保存用户资源设定。这个文件在登陆时会自动合并到默认的 X 资源。要更改这些设置并使其立即生效,使用下列命令将它们合并到数据库中。

  1. $ xrdb -merge ~/.Xresources

参见 x(7) 和 xrdb(1).

7.8.4. X 终端模拟器 —— xterm

http://dickey.his.com/xterm/xterm.faq.html 可以了解到关于 xterm(1) 的一切信息。

7.8.5. 以 root 运行 X 客户端

[警告]警告

不要通过在显示管理器(例如 gdm3)的提示符后输入 root 来以 root 身份启动 X 显示/会话管理器,因为这是不安全的,即使你打算进行管理员操作。以 root 运行整个 X 架构被认为是不安全的。你必须总是使用尽可能低权限的账号,例如普通的用户账号。

运行一个特殊的 X 客户端(例如使 “foo” 取得 root 权限)的简单方法是像下面那样使用 sudo(8) 等。

  1. $ sudo foo &
  1. $ sudo -s
  2. # foo &
  1. $ ssh -X root@localhost
  2. # foo &
[小心]小心

为了该目的像上面那样使用 ssh(1) 会浪费资源。

为了使 X 客户端链接到 X 服务器,请注意以下几点。

  • 旧用户 “$XAUTHORITY” 和 “$DISPLAY” 环境变量的值必须复制给新用户。

  • $XAUTHORITY” 环境变量的值所指向的文件必须对新用户可读。