Linux 用户初始化配置与桌面系统解析
1. 用户默认配置
1.1 创建初始化文件
创建新用户初始化文件和选择默认配置的最佳方式是在系统中使用新测试用户进行实验。创建一个家目录为空的测试用户,避免将自己的配置文件复制到该测试用户的目录,要从零开始创建新的初始化文件。当你认为初始化配置可行后,以各种可能的方式(如在控制台、远程登录等)登录该测试用户,进行尽可能多的测试,包括测试窗口系统的操作和手册页面。若对该测试用户满意,可复制其初始化文件创建第二个测试用户。若一切正常,就得到了一套可分发给新用户的新配置文件。
1.2 默认 Shell
对于 Linux 系统中的任何新用户,默认 Shell 应选择 bash,原因如下:
- 用户使用的 Shell 与创建脚本时使用的一致(例如,csh 是出了名的不适合用于脚本编写,不要使用它)。
- bash 是 Linux 系统的标准 Shell。
- bash 使用 GNU readline,其界面与许多其他工具相同。
- bash 能对 I/O 重定向和文件句柄提供适当且易于理解的控制。
不过,许多 Unix 经验丰富的用户仍使用 csh 和 tcsh 等 Shell,因为他们不愿改变。如果你没有特别偏好,建议选择 bash 作为新用户的默认 Shell,用户可使用
chsh
命令更改自己的 Shell 以满足个人偏好。此外,还有其他一些 Shell(如 rc、ksh、zsh、es 等),其中 zsh 和 fish 有时在寻找替代 Shell 的新用户中很受欢迎,但有些 Shell 不适合初学者。
1.3 默认编辑器
在传统系统中,默认编辑器应为 vi 或 emacs,因为几乎所有 Unix 系统都有这两个编辑器,能为新用户减少长期使用中的问题。不过,Linux 发行版通常将 nano 配置为默认编辑器,因为它对初学者更友好。和 Shell 初始化文件一样,应避免使用大的编辑器初始化文件。在
.exrc
文件中添加一个小的
set showmatch
配置不会有问题,但要避免使用会显著改变编辑器行为或外观的配置,如
showmode
、自动缩进和外部边距等。
1.4 默认分页器
将环境变量
PAGER
默认设置为
less
是完全合理的。
1.5 初始化文件的陷阱
在初始化文件中应避免以下操作:
- 不要在 Shell 初始化文件中放置任何图形命令。
- 不要在 Shell 初始化文件中定义环境变量
DISPLAY
。
- 不要在 Shell 初始化文件中定义终端类型。
- 不要在默认初始化文件中过度节省描述性注释。
- 不要在初始化文件中执行在标准输出显示信息的命令。
- 永远不要在 Shell 初始化文件中定义
LD_LIBRARY_PATH
。
2. Linux 桌面系统组件
2.1 桌面系统概述
Linux 桌面系统具有很大的灵活性,用户体验大多来自应用程序或应用程序构建块。如果不喜欢某个应用程序,通常可以找到替代方案;如果所需的应用程序不存在,也可以自己编写。Linux 桌面系统没有像存储和网络那样明显的层次结构,每个组件执行特定任务,并在需要时与其他组件通信。部分组件共享图形工具包库等通用构建块,可将这些构建块视为简单的抽象层。
2.2 桌面组件分析
2.2.1 X Window 系统
X Window 系统是大多数桌面背后的核心基础设施,其基础发行版包括 X 服务器、客户端支持库和客户端。随着 GNOME 和 KDE 等桌面环境的出现,X 发行版的功能发生了变化,目前更侧重于管理渲染和输入设备的主服务器以及简化的客户端库。
X 服务器在系统中很容易识别,通常名为
X
,在进程列表中可看到它以多种选项运行,例如:
/usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
其中
:0
称为显示(display),代表通过通用键盘和/或鼠标访问的一个或多个监视器。通常,显示对应于连接到计算机的单个监视器,但也可以在同一显示上连接多个监视器。在使用 X 会话时,环境变量
DISPLAY
会配置为该显示的标识符。
在 Linux 中,X 服务器在虚拟终端上运行,上述示例中的
vt7
表示服务器指定在
/dev/tty7
上运行(通常服务器从第一个可用的虚拟终端开始)。可以在 Linux 上同时运行多个 X 服务器,但每个服务器需要唯一的显示标识符,可使用
Ctrl - Alt - Fn
键或
chvt
命令在服务器之间切换。
2.2.2 显示管理器
通常不会使用命令行启动 X 服务器,因为仅启动服务器不会定义要在其上运行的客户端,启动后只会得到一个空白屏幕。最常见的启动 X 服务器的方式是通过显示管理器,它会启动服务器并在屏幕上显示登录框。登录后,显示管理器会启动一组客户端,如窗口管理器和文件管理器,以便用户开始使用计算机。
常见的显示管理器有
gdm
(用于 GNOME)和
kdm
(用于 KDE),上述 X 服务器调用参数中的
lightdm
是一个多平台显示管理器,可启动 GNOME 或 KDE 会话。若想从虚拟控制台启动 X 会话而不使用显示管理器,可执行
startx
或
xinit
命令,但得到的会话可能很简单,与使用显示管理器得到的会话不同,因为其功能和初始化文件不同。
2.2.3 网络透明性
X 的一个特性是网络透明性,客户端通过协议与服务器通信,因此可以直接通过网络运行连接到不同计算机上运行的服务器的客户端,X 服务器监听 6000 端口以等待 TCP 连接。连接到该端口的客户端可以进行身份验证,然后向服务器发送窗口。但这种方法通常不提供加密,不安全。目前大多数发行版通过服务器的
-nolisten tcp
选项禁用 X 服务器的网络监听。不过,仍可使用 SSH 隧道从远程计算机运行 X 客户端,将 X 服务器的 Unix 域套接字连接到远程计算机的套接字。
2.3 探索 X 客户端
虽然人们通常不会从命令行操作图形用户界面,但有许多实用工具可用于探索 X Window 系统的各个部分,特别是可以在客户端运行时对其进行检查。
2.3.1 xwininfo 工具
xwininfo
是最简单的工具之一,无参数运行时,它会提示你点击一个窗口:
$ xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
点击后,会显示该窗口的信息列表,如位置和大小:
xwininfo: Window id: 0x5400024 "xterm"
Absolute upper-left X: 1075
Absolute upper-left Y: 594
注意窗口的 ID,X 服务器和窗口管理器使用该标识符来监控窗口。可使用
xlsclients -l
命令获取所有窗口 ID 和客户端的列表。
2.3.2 X 事件
X 客户端通过事件系统获取输入数据和服务器状态的其他信息。X 事件的工作方式与其他异步进程间通信事件(如 udev 事件和 D - Bus 事件)类似,X 服务器从输入设备等源接收信息,然后将该输入以事件的形式重新分发给任何感兴趣的 X 客户端。
可使用
xev
命令进行事件实验,运行该命令会打开一个新窗口,你可以在其中移动鼠标、点击和输入。操作时,
xev
会生成输出描述从服务器接收到的 X 事件。例如,鼠标移动的输出示例如下:
$ xev
--trecho omitido--
MotionNotify event, serial 36, synthetic NO, window 0x6800001,
root 0xbb, subw 0x0, time 43937883, (47,174), root:(1692,486),
state 0x0, is_hint 0, same_screen YES
MotionNotify event, serial 36, synthetic NO, window 0x6800001,
root 0xbb, subw 0x0, time 43937891, (43,177), root:(1688,489),
state 0x0, is_hint 0, same_screen YES
括号内的坐标,第一个表示鼠标指针在窗口内的 x 和 y 坐标,第二个(
root:
)表示指针在整个显示中的位置。
其他低级事件包括按键和按钮点击,一些更高级的事件表示鼠标是否进入或离开窗口,或者窗口是否获得或失去窗口管理器的焦点。例如,对应于离开和失去焦点的事件如下:
LeaveNotify event, serial 36, synthetic NO, window 0x6800001,
root 0xbb, subw 0x0, time 44348653, (55,185), root:(1679,420),
mode NotifyNormal, detail NotifyNonlinear, same_screen YES,
focus YES, state 0
FocusOut event, serial 36, synthetic NO, window 0x6800001,
mode NotifyNormal, detail NotifyNonlinear
xev
的一个常见用途是在重新映射不同键盘时提取键码和键符号。例如,按下
L
键的输出显示键码为 46:
KeyPress event, serial 32, synthetic NO, window 0x4c00001,
root 0xbb, subw 0x0, time 2084270084, (131,120), root:(197,172),
state 0x0, keycode 46 (keysym 0x6c, l), same_screen YES,
XLookupString gives 1 bytes: (6c) "l"
XmbLookupString gives 1 bytes: (6c) "l"
XFilterEvent returns: False
xev
还可通过
-id id
选项关联现有的窗口 ID(使用从
xwininfo
获取的 ID 或使用
-root
监控根窗口)。
2.4 理解 X 输入和偏好设置
X 的一个潜在令人印象深刻的特点是通常有多种方式配置偏好设置,且有些方法可能不起作用。例如,在 Linux 系统中,常见的键盘偏好是将
Caps Lock
键重新映射为
Control
键,有多种方法可以实现,从使用旧的
xmodmap
命令进行小调整到使用
setxkbmap
实用程序提供全新的键盘映射。确定使用哪种方法可能很困难,因为桌面环境可能会提供自己的配置和覆盖设置。
2.4.1 输入设备(一般情况)
X 服务器使用 X Input Extension 管理来自不同设备的输入数据。基本的输入设备有两种类型:键盘和指针(鼠标),可以关联任意数量的设备。为了同时使用多个相同类型的设备,X Input Extension 创建一个“虚拟核心”设备,将设备的输入数据传输到 X 服务器。核心设备称为主设备(master),连接到计算机的物理设备成为从设备(slaves)。
要查看计算机上设备的配置,可执行
xinput --list
命令:
$ xinput --list
Virtual core pointer id=2 [master pointer (3)]
Virtual core XTEST pointer id=4 [slave pointer (2)]
Logitech Unifying Device id=8 [slave pointer (2)]
Virtual core keyboard id=3 [master keyboard (2)]
Virtual core XTEST keyboard id=5 [slave keyboard (3)]
Power Button id=6 [slave keyboard (3)]
Power Button id=7 [slave keyboard (3)]
Cypress USB Keyboard id=9 [slave keyboard (3)]
每个设备都有一个关联的 ID,可用于
xinput
和其他命令。上述输出中,ID 为 2 和 3 的是核心设备,ID 为 8 和 9 的是实际设备。注意,计算机的电源按钮也被视为 X 的输入设备。
大多数 X 客户端期望从核心设备获取输入数据,因为它们无需关心事件的具体来源设备。实际上,大多数客户端对 X Input Extension 一无所知,但客户端可以使用该扩展选择特定的设备。每个设备都有一组关联的属性,可使用
xinput
命令和设备编号查看属性,例如查看 ID 为 8 的设备属性:
$ xinput --list-props 8
Device 'Logitech Unifying Device. Wireless PID:4026':
Device Enabled (126): 1
Coordinate Transformation Matrix (128): 1.000000, 0.000000, 0.000000,
0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Accel Profile (256): 0
Device Accel Constant Deceleration (257): 1.000000
Device Accel Adaptive Deceleration (258): 1.000000
Device Accel Velocity Scaling (259): 10.000000
--trecho omitido--
可以使用
--set - prop
选项更改许多有趣的属性(更多信息请参考
xinput(1)
手册页)。
2.4.2 鼠标
可以使用
xinput
命令操作与设备相关的配置,许多最有用的配置与鼠标(指针)有关。许多配置可以直接作为属性更改,但通常使用
xinput
的
--set - ptr - feedback
和
--set - button - map
等专用选项更方便。例如,如果你有一个三按钮鼠标,想反转按钮顺序(这对左撇子用户很实用),可执行以下命令:
$ xinput --set-button-map disp 3 2 1
2.4.3 键盘
国际上可用的各种不同键盘布局给任何窗口系统的集成带来了特殊困难。X 在其核心协议中一直有一个内部键盘映射功能,可使用
xmodmap
命令进行操作,但任何相对现代的系统都使用 XKB(X 键盘扩展)以获得更精确的控制。XKB 比较复杂,很多人在需要快速更改时仍使用
xmodmap
。XKB 的基本思想是可以定义一个键盘映射,使用
xkbcomp
命令进行编译,然后使用
setxkbmap
命令将该映射加载并激活到 X 服务器中。该系统有两个特别有趣的功能:
- 能够定义部分映射以补充现有映射,这对于将
Caps Lock
键更改为
Control
键等任务特别实用,并且被许多桌面环境中的图形键盘偏好实用程序使用。
- 能够为每个连接的键盘定义单独的映射。
2.4.4 桌面背景
旧的 X 命令
xsetroot
可用于设置背景颜色和根窗口的其他特性,但在大多数计算机上不起作用,因为根窗口通常不可见。相反,大多数桌面环境会在所有其他窗口后面放置一个大窗口,以实现“动态壁纸”和桌面文件导航等功能。可以通过命令行更改背景(例如,后续可能会介绍具体方法)。
以下是一个简单的 mermaid 流程图,展示了 X 服务器启动和客户端交互的基本流程:
graph LR
A[显示管理器] --> B[启动 X 服务器]
B --> C[等待客户端连接]
D[客户端] --> C
C --> E[处理客户端请求]
E --> F[渲染窗口]
F --> G[显示窗口]
H[输入设备] --> E
E --> D[返回输入数据]
通过以上内容,我们对 Linux 用户的初始化配置和桌面系统的各个组件有了较为详细的了解,掌握这些知识有助于更好地使用和管理 Linux 系统。
3. 桌面系统其他组件
3.1 窗口管理器
X 的客户端不一定是带窗口的用户应用程序,它们可以作为其他客户端的服务或提供其他接口功能。窗口管理器可能是最重要的客户端服务应用程序,因为它决定了如何在屏幕上组织窗口,并提供交互式装饰,如标题栏,使用户能够移动和最小化窗口,这些元素对用户体验至关重要。
窗口管理器有多种实现方式。例如,Mutter/GNOME Shell 和 Compiz 设计得相对独立,而其他一些则包含在 Xfce 等环境中。大多数 Linux 发行版中包含的窗口管理器都努力为用户提供舒适的体验,但也有一些提供特定的视觉效果或采用简约的方法。由于用户的偏好和需求多种多样且不断变化,Linux 可能永远不会有一个标准的窗口管理器,因此新的窗口管理器不断涌现。
3.2 工具包
桌面应用程序包含一些常见元素,如按钮和菜单,这些被称为小部件(widgets)。为了加速开发并提供统一的外观,程序员使用图形工具包来提供这些元素。在 Windows 或 Mac OS X 等操作系统中,供应商提供一个通用的工具包,大多数程序员都会使用。在 Linux 中,GTK+ 工具包是最常见的之一,但也经常会看到使用 Qt 框架等创建的小部件。
工具包通常由共享库和支持文件组成,例如包含图像和主题信息的文件。
3.3 桌面环境
虽然工具包为用户提供了统一的外观,但桌面的一些细节需要不同应用程序之间进行一定程度的协作。例如,一个应用程序可能希望与另一个应用程序共享数据,或者更新桌面上的通用通知栏。为了满足这些需求,工具包和其他库被组合成更大的包,称为桌面环境。GNOME、KDE、Unity 和 Xfce 是一些常见的 Linux 桌面环境。
工具包是大多数桌面环境的核心,但为了创建一个统一的桌面,环境还必须包含各种支持文件,如图标和配置,这些构成了主题。所有这些都整合在描述设计约定的文档中,例如菜单和应用程序标题的显示方式以及应用程序对系统特定事件的响应方式。
3.4 应用程序
在桌面之上是应用程序,如 Web 浏览器和终端窗口。X 应用程序可以从简单的(如古老的 xclock 程序)到复杂的(如 Chrome 浏览器和 LibreOffice 套件)不等。这些应用程序通常是独立的,但通常使用进程间通信来了解相关事件。例如,一个应用程序可能对新存储设备连接、新电子邮件或即时消息接收等事件感兴趣。这种通信通常通过 D - Bus 进行,后续会详细介绍。
4. D - Bus 服务
4.1 D - Bus 简介
D - Bus 是一个进程间通信服务,在 Linux 系统的多个部分中使用。它允许不同的应用程序和服务之间进行通信,使得它们能够共享信息和协同工作。例如,当一个新的存储设备连接到系统时,相关的应用程序可以通过 D - Bus 接收到通知,并做出相应的处理,如自动挂载设备。
4.2 D - Bus 的作用
4.2.1 应用程序间通信
不同的应用程序可以通过 D - Bus 相互通信。比如,一个音乐播放应用程序可以通过 D - Bus 向系统的通知服务发送消息,当播放一首新歌时,通知服务会在系统托盘显示相应的提示信息。
4.2.2 系统服务交互
系统服务也可以利用 D - Bus 进行交互。例如,网络管理器服务可以通过 D - Bus 与其他服务通信,当网络状态发生变化时,通知其他依赖网络的服务进行相应的调整。
4.3 D - Bus 的使用示例
虽然一般不会直接在命令行与 D - Bus 交互,但可以使用一些工具来查看和监控 D - Bus 的活动。例如,
dbus - monitor
命令可以用来监控 D - Bus 上的消息:
$ dbus-monitor
运行该命令后,它会实时显示 D - Bus 上传输的各种消息,包括消息的发送者、接收者、消息类型等信息。
5. 打印相关
5.1 Linux 打印系统概述
Linux 系统中的打印涉及多个组件,包括打印服务器、打印机驱动程序和打印队列等。打印服务器负责管理打印机和打印任务,打印机驱动程序则确保打印机能够正确处理不同类型的文档,打印队列用于存储等待打印的任务。
5.2 常见打印服务器
5.2.1 CUPS
CUPS(通用 Unix 打印系统)是 Linux 系统中最常用的打印服务器。它支持多种打印机类型和协议,并且提供了一个 Web 界面来管理打印机和打印任务。要访问 CUPS 的 Web 界面,可以在浏览器中输入
http://localhost:631
。
5.2.2 LPD
LPD(行式打印机守护进程)是一个较旧的打印服务器,在一些传统的 Unix 系统中仍然使用。虽然不如 CUPS 功能强大,但在某些特定环境中可能仍然会用到。
5.3 配置打印机
要在 Linux 系统中配置打印机,可以按照以下步骤进行:
1. 打开 CUPS 的 Web 界面(
http://localhost:631
)。
2. 点击“Administration”选项卡。
3. 点击“Add Printer”按钮。
4. 选择要添加的打印机类型(本地打印机或网络打印机)。
5. 按照提示完成打印机的配置,包括选择打印机驱动程序等。
5.4 打印任务管理
可以使用
lp
命令来提交打印任务,例如:
$ lp file.txt
该命令会将
file.txt
文件添加到打印队列中。要查看打印队列的状态,可以使用
lpstat
命令:
$ lpstat -t
该命令会显示当前打印队列中的所有任务的状态信息。
以下是一个简单的表格,总结了 Linux 打印系统的关键组件和命令:
| 组件/命令 | 描述 |
| — | — |
| CUPS | 通用 Unix 打印系统,常用的打印服务器 |
| LPD | 较旧的打印服务器 |
| lp | 提交打印任务的命令 |
| lpstat | 查看打印队列状态的命令 |
6. 总结与展望
6.1 总结
通过对 Linux 用户初始化配置和桌面系统的深入了解,我们知道了如何为新用户设置合适的默认配置,包括默认 Shell、编辑器、分页器等。同时,也详细了解了桌面系统的各个组件,如 X Window 系统、窗口管理器、工具包、桌面环境、应用程序等,以及 D - Bus 服务和打印系统的相关知识。这些知识对于更好地使用和管理 Linux 系统至关重要。
6.2 展望
随着技术的不断发展,Linux 桌面系统也在不断演进。未来可能会出现更多功能强大、用户友好的窗口管理器和桌面环境,同时,打印系统和进程间通信服务也会不断优化,以提供更好的用户体验。对于开发者来说,也将有更多的机会参与到 Linux 桌面系统的开发和改进中。
通过不断学习和实践,我们可以更好地掌握 Linux 系统的各种特性,充分发挥其优势,为我们的工作和生活带来便利。
以下是一个 mermaid 流程图,展示了 Linux 桌面系统组件之间的关系:
graph LR
A[X Window 系统] --> B[窗口管理器]
A --> C[工具包]
B --> D[桌面环境]
C --> D
D --> E[应用程序]
F[D - Bus 服务] --> E
G[打印系统] --> E
通过以上内容,我们对 Linux 操作系统的用户初始化配置和桌面系统有了全面而深入的认识,希望这些知识能够帮助你更好地使用和管理 Linux 系统。
222



被折叠的 条评论
为什么被折叠?



