目录
作为系统管理员,了解 Debian 系统是如何启动和配置的,这是明智的。尽管确切的细节在已安装软件包的源文件及其文档中,但对于我们大多数人来说,这有点难以承受。
我尽力根据当前和以前我及其他人的知识,为您提供 Debian 系统的关键点及其配置的快速概述,供您参考。由于 Debian 系统是一个不断变化的目标,因此系统的情况可能已经发生了变化。在对系统进行任何更改之前,您应该参考每个软件包的最新文档。
计算机系统从开机事件到向用户提供功能齐全的操作系统 (OS) 经历了几个阶段的引导过程。
为了简单起见,我将讨论范围限制在具有默认安装的典型 PC 平台上。
典型的引导过程就像一个四级火箭。每个火箭级都将系统控制权交给下一个火箭级。
当然,这些可以进行不同的配置。例如,如果您编译了自己的内核,则可以跳过 mini-Debian 系统这一步。因此,在您自己检查之前,请不要假设您的系统就是这种情况。
![]() |
注意 |
---|---|
对于非传统 PC 平台,例如 SUN 或 Macintosh 系统,ROM 上的 BIOS 和磁盘上的分区可能大相径庭(第 9.3.2 节,“磁盘分区配置”)。对于这种情况,请在其他地方查找特定于平台的文档。 |
BIOS 是引导过程的第一阶段,由开机事件启动。BIOS 驻留在只读存储器 (ROM) 上,从特定的内存地址执行,CPU 的程序计数器通过开机事件初始化到该地址。
BIOS 执行硬件的基本初始化(POST:开机自检),并将系统控制权交给您提供的下一步。BIOS 通常随硬件一起提供。
BIOS 启动画面通常指示要按哪些键才能进入 BIOS 设置屏幕以配置 BIOS 行为。常用的键是 F1、F2、F10、Esc、Ins 和 Del。如果您的 BIOS 启动画面被漂亮的图形屏幕隐藏,您可以按一些键(例如 Esc)来禁用它。这些键高度依赖于硬件。
可以从 BIOS 设置屏幕中选择硬件位置和 BIOS 启动的代码的优先级。通常,第一个找到的选定设备(硬盘、软盘、CD-ROM、…)的前几个扇区被加载到内存中,并执行此初始代码。此初始代码可以是以下任何一项。
引导加载程序代码
过渡操作系统(例如 FreeDOS)的内核代码
如果目标操作系统的内核代码可以容纳在这个小空间中,则使用目标操作系统的内核代码
通常,系统从主硬盘分区的指定分区启动。传统 PC 上硬盘的前 2 个扇区包含主引导记录 (MBR)。包括启动选择在内的磁盘分区信息记录在此 MBR 的末尾。从 BIOS 执行的第一个引导加载程序代码占用此 MBR 的其余部分。
引导加载程序是由 BIOS 启动的引导过程的第二阶段。它将系统内核映像和 initrd 映像加载到内存中,并将控制权交给它们。此 initrd 映像是根文件系统映像,其支持取决于所使用的引导加载程序。
Debian 系统通常使用 Linux 内核作为默认系统内核。当前 2.6 Linux 内核的 initrd 映像在技术上是 initramfs(初始 RAM 文件系统)映像。initramfs 映像是根文件系统中文件的 gzipped cpio 存档。
Debian 系统的默认安装将第一阶段 GRUB 引导加载程序代码放置到 PC 平台的 MBR 中。有许多引导加载程序和配置选项可用。
表 3.1. 引导加载程序列表
引导加载程序 | 软件包 | 流行度 | 大小 | initrd 支持 | 描述 |
---|---|---|---|---|---|
GRUB Legacy | grub-legacy | http://qa.debian.org/popcon.php?package=grub-legacy | 1741 | 支持 | 它足够智能,可以理解磁盘分区和文件系统,例如 vfat、ext3 等。(lenny 默认) |
GRUB 2 | grub-pc | http://qa.debian.org/popcon.php?package=grub-pc | 461 | 支持 | 它足够智能,可以理解磁盘分区和文件系统,例如 vfat、ext3 等。 |
GRUB 2 | grub-rescue-pc | http://qa.debian.org/popcon.php?package=grub-rescue-pc | 3885 | 支持 | 这是 GRUB 2 可启动的救援映像(CD 和软盘)(PC/BIOS 版本) |
Lilo | lilo | http://qa.debian.org/popcon.php?package=lilo | 595 | 支持 | 它依赖于硬盘上数据的扇区位置。(旧) |
Isolinux | syslinux | http://qa.debian.org/popcon.php?package=syslinux | 134 | 支持 | 它理解 ISO9660 文件系统。这用于启动 CD。 |
Syslinux | syslinux | http://qa.debian.org/popcon.php?package=syslinux | 134 | 支持 | 它理解 MSDOS 文件系统 (FAT)。这用于启动软盘。 |
Loadlin | loadlin | http://qa.debian.org/popcon.php?package=loadlin | 104 | 支持 | 新系统从 FreeDOS/MSDOS 系统启动。 |
Neil Turton 的 MBR | mbr | http://qa.debian.org/popcon.php?package=mbr | 71 | 不支持 | 这是一个免费软件,可以替代 MSDOS MBR。它仅理解磁盘分区。 |
![]() |
警告 |
---|---|
在没有使用 |
对于 GRUB Legacy,菜单配置文件位于“/boot/grub/menu.lst
”。例如,它具有如下条目。
title Debian GNU/Linux root (hd0,2) kernel /vmlinuz root=/dev/hda3 ro initrd /initrd.img
对于 GRUB 2,菜单配置文件位于“/boot/grub/grub.cfg
”。它由“/usr/sbin/update-grub
”使用来自“/etc/grub.d/*
”的模板和来自“/etc/default/grub
”的设置自动生成。例如,它具有如下条目。
menuentry "Debian GNU/Linux" { set root=(hd0,3) linux /vmlinuz root=/dev/hda3 initrd /initrd.img }
对于这些示例,这些 GRUB 参数的含义如下。
表 3.2. GRUB 参数的含义
GRUB 参数 | 含义 |
---|---|
root
|
通过在 GRUB legacy 中将其设置为“(hd0,2) ”或在 GRUB 2 中设置为“(hd0,3) ”,使用主磁盘上的第 3 个分区 |
kernel
|
使用位于“/vmlinuz ”的内核,内核参数为:“root=/dev/hda3 ro ” |
initrd 支持
|
使用位于“/initrd.img ”的 initrd/initramfs 映像 |
![]() |
注意 |
---|---|
GRUB legacy 程序使用的分区号值比 Linux 内核和实用程序工具使用的正常值小 1。GRUB 2 程序修复了此问题。 |
![]() |
提示 |
---|---|
UUID(请参阅第 9.3.3 节,“使用 UUID 访问分区”)可用于标识块特殊设备,而不是其文件名,例如“ |
![]() |
提示 |
---|---|
您可以使用称为链式加载的技术从另一个引导加载程序启动一个引导加载程序。 |
请参阅“info grub
”和 grub-install(8)。
mini-Debian 系统是由引导加载程序启动的引导过程的第三阶段。它在内存中运行系统内核及其根文件系统。这是引导过程的可选准备阶段。
![]() |
注意 |
---|---|
术语“mini-Debian 系统”是作者为描述本文档的第三阶段引导过程而创造的。该系统通常被称为 initrd 或 initramfs 系统。Debian 安装程序使用内存中的类似系统。 |
“/init
”脚本作为内存中此根文件系统中的第一个程序执行。它是一个 shell 脚本程序,用于在用户空间中初始化内核并将控制权交给下一阶段。这个 mini-Debian 系统为引导过程提供了灵活性,例如在主引导过程之前添加内核模块或将根文件系统挂载为加密的。
您可以通过向内核启动参数提供“break=init
”等来中断引导过程的这一部分,以获得 root shell。有关更多中断条件,请参阅“/init
”脚本。这个 shell 环境足够复杂,可以很好地检查您机器的硬件。
此 mini-Debian 系统中可用的命令是精简的,主要由名为 busybox(1) 的 GNU 工具提供。
![]() |
注意 |
---|---|
当您在只读根文件系统上时,您需要为 |
表 3.3. Debian 系统的引导实用程序列表
![]() |
提示 |
---|---|
所有引导机制都通过“ |
![]() |
提示 |
---|---|
|
正常的 Debian 系统是由 mini-Debian 系统启动的引导过程的第四阶段。mini-Debian 系统的系统内核继续在此环境中运行。根文件系统从内存中的根文件系统切换到实际硬盘文件系统上的根文件系统。
“/sbin/init
”程序作为第一个程序执行,并执行主引导过程。Debian 通常使用带有 sysv-rc
软件包的传统 sysvinit 方案。有关确切的说明,请参阅 init(8)、inittab(5) 和 “/usr/share/doc/sysv-rc/README.runlevels.gz
”。此主引导过程基本上经历以下步骤。
Debian 系统进入运行级别 N(无),按照“/etc/inittab
”描述初始化系统。
Debian 系统进入运行级别 S,在单用户模式下初始化系统,以完成硬件初始化等。
Debian 系统进入指定的多用户运行级别(2 到 5)之一,以启动系统服务。
用于多用户模式的初始运行级别在“/etc/inittab
”的“initdefault”行中使用“init=
”内核启动参数指定。已安装的 Debian 系统在运行级别 2启动。
由 init 系统执行的所有实际脚本文件都位于目录“/etc/init.d/
”中。
每个运行级别都使用一个目录进行配置,并具有以下特定含义。
表 3.4. 运行级别列表及其用途描述
运行级别 | 目录 | 运行级别用途描述 |
---|---|---|
N
|
无 | 系统启动 (NONE) 级别(没有“/etc/rcN.d/ ”目录) |
0
|
/etc/rc0.d/
|
停止系统 |
S
|
/etc/rcS.d/
|
启动时的单用户模式(别名:“s ”) |
1
|
/etc/rc1.d/
|
从多用户模式切换的单用户模式 |
2
|
/etc/rc2.d/
|
多用户模式 |
3
|
/etc/rc3.d/
|
,, |
4
|
/etc/rc4.d/
|
,, |
5
|
/etc/rc5.d/
|
,, |
6
|
/etc/rc6.d/
|
重启系统 |
7
|
/etc/rc7.d/
|
有效的多用户模式,但通常不使用 |
8
|
/etc/rc8.d/
|
,, |
9
|
/etc/rc9.d/
|
,, |
您可以通过以下方式从控制台将运行级别更改为例如 4。
$ sudo telinit 4
![]() |
注意 |
---|---|
Debian 系统不会预先为运行级别 2 到 5 之间的运行级别分配任何特殊的含义差异。 Debian 系统上的系统管理员可以更改此设置。(即,Debian 不是 Red Hat Linux,也不是 Sun Microsystems 的 Solaris,也不是 Hewlett Packard 的 HP-UX,也不是 IBM 的 AIX,也不是……) |
当 init(8) 或 telinit(8) 命令进入运行级别“<n>”时,系统基本上按如下方式执行初始化脚本。
“/etc/rc<n>.d/
”中以“K
”开头的脚本名称按字母顺序执行,并带有单个参数“stop
”。(停止服务)
“/etc/rc<n>.d/
”中以“S
”开头的脚本名称按字母顺序执行,并带有单个参数“start
”。(启动服务)
例如,如果在运行级别目录中有链接“S10sysklogd
”和“S20exim4
”,则符号链接到“../init.d/sysklogd
”的“S10sysklogd
”将在符号链接到“../init.d/exim4
”的“S20exim4
”之前运行。
这种简单的顺序初始化系统是经典的 System V 风格的引导系统,并且一直使用到 Debian lenny
系统。
最近的 Debian 系统经过优化,可以改为并发执行初始化脚本。
insserv(8) 命令使用 LSB 软件包依赖信息并计算所有脚本之间的依赖关系。
请参阅“/usr/share/doc/insserv/README.Debian
”。
在 init 脚本的标头中定义的 LSB 软件包依赖信息确保了所需资源的可用性。
![]() |
警告 |
---|---|
除非您比维护人员更了解,否则不建议对“ |
例如,让我们设置一个类似于 Red Hat Linux 的运行级别系统,如下所示。
init
以运行级别 3 作为默认值启动系统。
init
不会在运行级别 (0,1,2,6) 中启动 gdm3(1)。
init
会在运行级别 (3,4,5) 中启动 gdm3(1)。
这可以通过使用编辑器在“/etc/inittab
”文件上更改启动运行级别并使用用户友好的运行级别管理工具(例如 sysv-rc-conf
或 bum
)来编辑运行级别来完成。如果您要改为仅使用命令行,则以下是如何操作(在默认安装 gdm3
软件包并选择它作为显示管理器之后)。
# cd /etc/rc2.d ; mv S21gdm3 K21gdm3 # cd /etc ; perl -i -p -e 's/^id:.:/id:3:/' inittab
请注意,启动显示管理器守护程序 xdm
、gdm3
、kdm
和 wdm
时,会检查“/etc/X11/default-display-manager
”文件。
![]() |
注意 |
---|---|
您仍然可以使用 startx(1) 命令从任何控制台 shell 启动 X。 |
“/etc/init.d/
”中每个 init 脚本的默认参数由“/etc/default/
”中的相应文件给出,该文件仅包含环境变量赋值。目录名称的这种选择是 Debian 系统特有的。它大致相当于 Red Hat Linux 和其他发行版中找到的“/etc/sysconfig
”目录。例如,“/etc/default/cron
”可用于控制“/etc/init.d/cron
”的工作方式。
“/etc/default/rcS
”文件可用于自定义 motd(5)、sulogin(8) 等的启动时默认值。
如果您无法通过更改此类变量来获得所需的行为,则可以修改 init 脚本本身。这些是系统管理员可编辑的配置文件。
内核维护系统主机名。运行级别 S 中的 init 脚本(符号链接到“/etc/init.d/hostname.sh
”)在启动时(使用 hostname
命令)将系统主机名设置为存储在“/etc/hostname
”中的名称。此文件仅应包含系统主机名,而不是完全限定域名。
要打印出当前主机名,请在不带参数的情况下运行 hostname(1)。
虽然根文件系统在内核启动时由内核挂载,但其他文件系统在运行级别 S 中由以下 init 脚本挂载。
“`/etc/init.d/mountkernfs.sh
`”用于“/proc
”、“/sys
”等中的内核文件系统。
“`/etc/init.d/mountdevsubfs.sh
`”用于“/dev
”中的虚拟文件系统
“`/etc/init.d/mountall.sh
`”用于使用“/etc/fstab
”的普通文件系统
“`/etc/init.d/mountnfs.sh
`”用于使用“/etc/fstab
”的网络文件系统
内核文件系统的挂载选项在“/etc/default/rcS
”中设置。请参阅 rcS(5)。
文件系统的挂载选项在“/etc/fstab
”中设置。请参阅 第 9.3.6 节,“通过挂载选项优化文件系统”。
![]() |
注意 |
---|---|
网络文件系统的实际挂载等待网络接口启动。 |
![]() |
警告 |
---|---|
在挂载所有文件系统后,每次启动时都会清理“ |
网络接口在运行级别 S 中由符号链接到“/etc/init.d/ifupdown-clean
”和“/etc/init.d/ifupdown
”的 init 脚本初始化。有关如何配置它们的详细信息,请参阅 第 5 章,网络设置。
许多网络服务(请参阅 第 6 章,网络应用程序)在多用户模式下,在启动时直接作为守护程序进程由 init 脚本启动,例如,“/etc/rc2.d/S20exim4
”(对于 RUNLEVEL=2),它是“/etc/init.d/exim4
”的符号链接。
一些网络服务可以使用超级服务器 inetd
(或其等效项)按需启动。inetd
在启动时由“/etc/rc2.d/S20inetd
”(对于 RUNLEVEL=2)启动,它是“/etc/init.d/inetd
”的符号链接。本质上,inetd
允许一个正在运行的守护程序调用其他几个守护程序,从而减少系统上的负载。
每当服务请求到达超级服务器 inetd
时,都会通过在“/etc/protocols
”和“/etc/services
”中的数据库中查找来识别其协议和服务。inetd
然后在“/etc/inetd.conf
”数据库中查找普通 Internet 服务,或在“/etc/rpc.conf
”中查找基于开放网络计算远程过程调用 (ONC RPC)/Sun RPC 的服务。
有时,inetd
不会直接启动预期的服务器,而是启动 TCP wrapper 程序 tcpd(8),并将预期的服务器名称作为其参数放在“/etc/inetd.conf
”中。在这种情况下,tcpd
在记录请求并使用“/etc/hosts.deny
”和“/etc/hosts.allow
”进行一些额外检查后,运行相应的服务器程序。
为了系统安全,请尽可能禁用网络服务程序。请参阅 第 4.6.4 节,“限制对某些服务器服务的访问”。
请参阅 inetd(8)、inetd.conf(5)、protocols(5)、services(5)、tcpd(8)、hosts_access(5)、hosts_options(5)、rpcinfo(8)、portmap(8) 和 “/usr/share/doc/portmap/portmapper.txt.gz
”。
系统消息可以通过“/etc/default/rsyslog
”和“/etc/rsyslog.conf
”为日志文件和屏幕显示进行自定义。请参阅 rsyslogd(8) 和 rsyslog.conf(5)。另请参阅 第 9.2.2 节,“日志分析器”。
内核消息可以通过“/etc/default/klogd
”为日志文件和屏幕显示进行自定义。在此文件中设置“KLOGD='-c 3'
”,然后运行“/etc/init.d/klogd restart
”。请参阅 klogd(8)。
您可以直接通过以下方式更改错误消息级别。
# dmesg -n3
表 3.5. 内核错误级别列表
错误级别值 | 错误级别名称 | 含义 |
---|---|---|
0 | KERN_EMERG | 系统不可用 |
1 | KERN_ALERT | 必须立即采取措施 |
2 | KERN_CRIT | 严重情况 |
3 | KERN_ERR | 错误情况 |
4 | KERN_WARNING | 警告情况 |
5 | KERN_NOTICE | 正常但重要的情况 |
6 | KERN_INFO | 信息 |
7 | KERN_DEBUG | 调试级别消息 |
对于 Linux 内核 2.6,udev 系统提供了用于自动硬件发现和初始化的机制(请参阅 udev(7))。在内核发现每个设备后,udev 系统启动一个用户进程,该进程使用来自 sysfs 文件系统(请参阅 第 1.2.12 节,“procfs 和 sysfs”)的信息,使用 modprobe(8) 程序(请参阅 第 3.5.12 节,“内核模块初始化”)加载支持它的所需内核模块,并创建相应的设备节点。
![]() |
提示 |
---|---|
如果“ |
设备节点的名称可以通过“/etc/udev/rules.d/
”中的 udev 规则文件进行配置。当前的默认规则倾向于创建动态生成的名称,从而导致非静态设备名称,但 cd 和网络设备除外。通过添加类似于 cd 和网络设备的自定义规则,您也可以为其他设备(例如 USB 记忆棒)生成静态设备名称。请参阅“Writing udev rules”或“/usr/share/doc/udev/writing_udev_rules/index.html
”。
由于 udev 系统在某种程度上是一个不断变化的目标,因此我将详细信息留给其他文档,并在此处描述最少的信息。
![]() |
提示 |
---|---|
对于 " |
modprobe(8) 程序使我们能够通过添加和删除内核模块,从用户进程配置运行中的 Linux 内核。udev 系统(参见 第 3.5.11 节,“udev 系统”)自动调用它来帮助内核模块初始化。
有一些非硬件模块和特殊的硬件驱动模块如下,它们需要通过在 "/etc/modules
" 文件中列出它们来预加载(参见 modules(5))。
TUN/TAP 模块,提供虚拟点对点网络设备 (TUN) 和虚拟以太网网络设备 (TAP),
netfilter 模块,提供 netfilter 防火墙功能 (iptables(8), 第 5.9 节,“Netfilter 基础设施”),以及
看门狗定时器驱动模块。
modprobe(8) 程序的配置文件位于 "/etc/modprobes.d/
" 目录下,如 modprobe.conf(5) 中所述。(如果您想避免某些内核模块被自动加载,请考虑在 "/etc/modprobes.d/blacklist
" 文件中将它们列入黑名单。)
由 depmod(8) 程序生成的 "/lib/modules/<version>/modules.dep
" 文件描述了 modprobe(8) 程序使用的模块依赖关系。
![]() |
注意 |
---|---|
如果您在启动时模块加载或使用 modprobe(8) 时遇到模块加载问题," |
modinfo(8) 程序显示有关 Linux 内核模块的信息。
lsmod(8) 程序很好地格式化了 "/proc/modules
" 的内容,显示了当前加载了哪些内核模块。
![]() |
提示 |
---|---|
您可以识别系统上的确切硬件。请参阅 第 9.6.3 节,“硬件识别”。 |
![]() |
提示 |
---|---|
您可以在启动时配置硬件以激活预期的硬件功能。请参阅 第 9.6.4 节,“硬件配置”。 |
![]() |
提示 |
---|---|
您可以通过重新编译内核来添加对设备的支持。请参阅 第 9.7 节,“内核”。 |