第 11 章 定制您的 Debian GNU/Linux 系统

目录

11.1. 如何确保所有程序使用相同的纸张大小?
11.2. 如何在不牺牲安全性的情况下提供对硬件外设的访问?
11.3. 如何用 Debian 的方式在启动时加载一个控制台字体?
11.4. 如何配置 X11 程序的默认设置?
11.5. Debian 系统是如何引导的?
11.6. 那么 Debian 使用传统的 System V init 时是什么情况?
11.7. 还有其他引导 Debian 系统的方式吗?
11.8. 软件包管理系统是如何处理含有其他软件包的配置文件的软件包的?
11.9. 如何覆盖软件包安装的文件,以使用一个不同的版本?
11.10. 如何把我在本地编译的软件包加入到软件包管理系统已知的软件包的列表中?
11.11. 有些用户喜欢 mawk,有些喜欢 gawk;有些喜欢 vim,有些喜欢 elvis;有些喜欢 trn,有些喜欢 tin;Debian 如何支持这种多样性?

11.1. 如何确保所有程序使用相同的纸张大小?

安装 libpaper1 软件包,它会询问您整个系统默认的纸张大小。这个设置会被保存在 /etc/papersize

您可以使用 PAPERSIZE 环境变量覆盖纸张大小设置。详情请见 papersize(5) 手册页。

11.2. 如何在不牺牲安全性的情况下提供对硬件外设的访问?

许多在 /dev 目录下的设备文件属于预定义的用户组。例如,/dev/sr0 属于 cdrom 组。

如果您希望某个用户能访问其中某个设备,只需要将该用户加入该设备所属的组,例如:

adduser 用户 组

使用这种方式可以不用更改设备文件的权限。

如果您是在用户的 shell 或者图形界面环境中执行该命令的,您需要注销再登录才能成为该组的有效成员。要检查您属于哪些组,请执行 groups

注意,自从引入 udev 之后,如果您更改了硬件外设的权限,这些权限可能在系统启动时被更改;如果恰好是您关心的硬件外设出现了这种情况,您需要修改 /etc/udev 中的规则。

11.3. 如何用 Debian 的方式在启动时加载一个控制台字体?

kbd 软件包支持这一操作,请编辑 /etc/kbd/config 文件。

11.4. 如何配置 X11 程序的默认设置?

Debian 的 X 应用程序会将应用程序资源数据安装到 /etc/X11/app-defaults/ 目录。如果您想要更改 X 应用程序的全局配置,请更改这些文件。它们已被标记为配置文件,所以它们的内容在升级过程中会被保留。

11.5. Debian 系统是如何引导的?

正如所有 Unix 系统一样,Debian 的引导以执行 init 程序为起点。和大多数 Linux 发行版一样,Debian 系统默认使用 systemd 作为 init 的实现。传统的 System-V 风格的 init 和其他方案也受支持。[6]

为了控制服务启动的顺序,传统的 System-V 风格的 Unix 系统使用运行级别(runlevel)。这一概念在 systemd 中被目标(target)所取代。要显示系统引导时 systemd 的默认目标,请执行

systemctl get-default

在引导过程中,systemd 会启动默认的目标文件 /lib/systemd/system/default.target 里列出的服务或其他目标。在 Debian 软件包安装过程中,会安装这些服务和目标的文件,并启用(enable)这些服务。如果您不希望某个特定的服务在开机时被启动,您不必卸载对应的软件包,而是可以运行

systemctl disable service.service

请使用在 /lib/systemd/system 中安装的服务文件的文件名(通常基于软件包的包名)。

服务文件 /lib/systemd/system/rc-local.service 为在引导后执行 /etc/rc.local 文件中的自定义脚本提供了一种简单的方式,这和运行 System-V 风格的 init 的 Debian 系统相似。注意:如果该脚本试图与控制台交互,比如询问用户密码或清空屏幕,脚本的执行将会失败。

您可以用以下命令检查任意服务的状态

service package status

。要启动或停止服务,请执行

service package start

以及

service package stop

service 命令可以在任何 Debian 系统支持的 init 系统中使用,而不仅仅是 systemd。不过,如果您希望能在任何支持 systemd 的 Linux 系统上执行同一个命令,要检查状态,您可以执行

systemctl status package.service

来获得相同的信息。

欲了解关于 Debian 中的 systemd 的更多信息,请阅读 https://wiki.debian.org/systemd

11.6. 那么 Debian 使用传统的 System V init 时是什么情况?

通过安装 sysvinit-core 软件包,Debian 支持使用传统的 System V init 引导系统。System V init 的配置文件(也就是 /etc/inittab)指定了启动时执行的第一个脚本应为 /etc/init.d/rcS。该脚本以 fork 产生子进程的方式运行 /etc/rcS.d/ 里面的全部脚本,以进行初始化工作,例如检查和挂载文件系统、加载模块、启动网络服务、设置时钟,以及其他初始化工作。

完成引导过程后,init 会执行默认运行级别所指定的目录的启动脚本(默认运行级别通过 /etc/inittabid 条目给出)。和大多数兼容 System V 的 Unix 一样,Linux 有 7 个运行级别:

  • 0(关闭系统),

  • 1(单用户模式),

  • 2 到 5(各种多用户模式),以及

  • 6(重启系统)。

Debian 系统默认的 id=2,意味着进入多用户模式时,默认的运行级别是“2”,所以会运行 /etc/rc2.d/ 中的脚本。

Debian 可利用 /etc/init.d/ 中每个脚本的 LSB 文件头,通过 insserv 使用基于依赖关系的启动顺序,也可以通过使用 startpar 进行并行启动以加快启动速度。

/etc/rcN.d/ 中任何目录的脚本都只是链接到 /etc/init.d/ 中的脚本的符号链接。不过,/etc/rcN.d/ 目录中每一个文件的名称都表明了 /etc/init.d/ 中的脚本的执行方式。准确地说,在进入任何运行级别前,所有以“K”开头的脚本都会被执行;这些脚本杀死(kill)服务。然后所有以“S”开头的脚本会被执行;这些脚本启动(start)服务。“K”或“S”后面的两位数表示脚本执行的顺序。数字小的脚本先执行。

这种方式之所以可行,是因为 /etc/init.d/ 中的脚本都接受一个参数,它可以为“start”、“stop”、“reload”、“restart”或者“force-reload”,然后就将执行参数所指定的任务。即使系统已经启动,也可以使用这些脚本来控制各种进程。

例如,命令

/etc/init.d/sendmail reload

中的“reload”会给 sendmail 守护进程发送一个信号,让它重新读取配置文件。

注意,不要使用 invoke-rc.d 来执行 /etc/init.d/ 中的脚本,而应当使用 service

11.7. 还有其他引导 Debian 系统的方式吗?

如果您喜欢 System V init,但不喜欢 /etc/rc?.d/* 链接,您可以安装 file-rc 软件包。该软件包会把这些链接转换成单一的配置文件 /etc/runlevel.conf。

如果您既不喜欢 System V,也不喜欢 systemd,您可能会喜欢 openrc 或者 runit 或者 daemontools

11.8. 软件包管理系统是如何处理含有其他软件包的配置文件的软件包的?

举个例子,有些用户希望通过安装一组 Debian 软件包,再安装一个本地生成的、含有配置文件的软件包的方式,来搭建一个新的服务器。这通常不是个好主意,因为如果配置文件在另一个软件包里,dpkg 就不知道这些配置文件的存在,所以在这组软件包中的某一个被升级时,可能会写入有冲突的配置文件。

替代方案是,创建一个本地的软件包,用来编辑相关的软件包的配置文件。这样 dpkg 和软件包管理系统的其他组件就会认为这些文件已经被本地的“系统管理员”编辑,因此在相关软件包被升级时就不会尝试覆盖这些文件。

11.9. 如何覆盖软件包安装的文件,以使用一个不同的版本?

假设一位系统管理员或本地用户希望使用程序“login-local”,而不是 Debian 的 login 软件包提供的“login”程序。

不要

  • login-local 覆盖 /bin/login

软件包管理系统不会知道这一改变,所以当 login(或任何提供 /bin/login 的软件包)被安装或升级时,就会直接覆盖您自己的 /bin/login

作为替代,

  • 执行:

    dpkg-divert --divert /bin/login.debian /bin/login
    

    以使今后安装 Debian 的 login 软件包时,对 /bin/login 文件的写入都改为写入到文件 /bin/login.debian

  • 然后执行:

    cp login-local /bin/login
    

    来将您本地编译的程序移动到正确的位置。

运行 dpkg-divert --list 以查看您的系统中当前生效的转移(diversion)。

详细信息可阅读 dpkg-divert(8) 手册页。

11.10. 如何把我在本地编译的软件包加入到软件包管理系统已知的软件包的列表中?

执行命令:

dpkg-scanpackages 二进制目录 覆盖文件 [路径前缀] > my_Packages

其中:

  • “二进制目录”是 Debian 档案文件(通常扩展名为“.deb”)所在的目录。

  • “覆盖文件”是一个由发行版维护者维护的文件,对于“main”发行版而言,它通常位于 Debian 档案站点的 indices/override.main.gz。对于本地软件包,可以忽略这一项。

  • “路径前缀”是一个可选的字符串,可以添加到生成的 my_Packages 文件之前。

构建好文件 my_Packages 之后,使用以下命令将这一文件告诉软件包管理系统:

dpkg --merge-avail my_Packages

如果您使用 APT,您也可以将本地仓库添加到您的 sources.list(5) 文件中。

11.11. 有些用户喜欢 mawk,有些喜欢 gawk;有些喜欢 vim,有些喜欢 elvis;有些喜欢 trn,有些喜欢 tin;Debian 如何支持这种多样性?

有些情况下,两个软件包提供同一个程序的不同版本,两个版本提供相同的核心功能。用户可能出于习惯,或者因为其中一个软件包的用户界面比另一个更讨人喜欢,而偏向于使用其中一个。同一个系统上的其他用户可能会选择另一个版本。

Debian 使用一种“虚拟”软件包系统,以在有两个或更多的工具提供相同的基础功能时,允许系统管理员选择(或者让用户选择)他们最喜欢的一个,同时又能在不指定一个特定的软件包的情况下满足软件包的依赖关系要求。

例如,系统中可能有两个不同版本的新闻阅读器。新闻服务器软件包可能“推荐”在系统中安装至少一个新闻阅读器,但是选择 tin 还是 trn 则取决于每一位用户。这一需求是通过让 tintrn 软件包都提供虚包 news-reader 来实现的。调用哪一个程序是通过文件名是虚包名的软链接 /etc/alternatives/news-reader 指向所选择的文件,如 /usr/bin/trn,来决定的。

只靠一个软链接是不足以支持替代品程序的所有使用场景的;正常情况下,手册页,以及其他支持文件也必须要选择好。Perl 脚本 update-alternatives 提供了一种简单的方式,来确保与特定的软件包相关的所有文件都被选择为系统默认。

例如,要查看哪些可执行文件提供了“x-window-manager”,请执行:

update-alternatives --display x-window-manager

如果您想更改它,请执行:

update-alternatives --config x-window-manager

然后按屏幕上的提示操作(基本上就是按下您更喜欢的选项旁边的数字)。

如果一个软件包因为某些原因不将自己注册为窗口管理器(如果这是个错误,请向我们报告缺陷),或者您使用 /usr/local 目录中的窗口管理器,则屏幕上不会出现您喜欢的选项。您可以通过命令行选项更新链接,比如:

update-alternatives --install /usr/bin/x-window-manager \
  x-window-manager /usr/local/bin/wmaker-cvs 50

“install”选项的第一个参数是指向 /etc/alternatives/名称 的符号链接,其中“名称”是第二个参数。第三个参数是 /etc/alternatives/名称 应当指向的程序,第四个参数是优先级(越大表示该替代品越有可能被自动选择)。

要删除您所添加的替代品,只需要执行:

update-alternatives --remove x-window-manager /usr/local/bin/wmaker-cvs


[6] 2014 年,Debian 将默认的 init 系统从 System V init 改为了 systemd。2015 年 4 月发布的 Debian 8 “jessie”是首个将 systemd 作为默认 init 的版本。这一变更涉及到 Debian 技术委员会的四个决定缺陷 #727708 2014-02-11:“委员会决定 jessie 的 Linux 架构的默认 init 系统应当为 systemd。”缺陷 #746715 2014-08-01:“技术委员会期望维护者继续支持多种现有的 init 系统”,并合并合理的贡献。缺陷 #746578 2014-11-15:“委员会决定 systemd-shim 应当为 libpam-systemd 替代依赖关系列表的第一个,而不是 systemd-sysv。”这一决定使继续运行非 systemd 的 Debian 系统变得更加容易。缺陷 #762194 2017-11-04:“关于升级时自动切换 init 系统”