第 3 章 系统初始化

作为系统管理员,粗略地了解 Debian 系统的启动和配置方式是明智的。尽管准确的细节在安装的软件包及对应的文档中,但这些知识对我们大多数人来说都是必须掌握的。

笔者基于自己和其他人的过往及现在的知识,尽己所能地提供关于 Debian 系统的知识要点及其配置的快速概览作为读者的参考。由于 Debian 系统在不断地更新中,系统的状况可能已经有所变化。在对系统做任何修改之前,请参考各个软件包的最新文档。

[提示]提示

bootup(7) 介绍了基于 systemd 的系统启动流程。(近期的 Debian)

[提示]提示

boot(7) 介绍了基于 UNIX System V Release 4 的系统启动流程。(旧版的 Debian)

3.1. 启动过程概述

计算机系统从上电事件到能为用户提供完整的操作系统(OS)功能为止,需要经历几个阶段的启动过程

为简便起见,笔者将讨论范围限定在具有默认安装的典型 PC 平台上。

典型的启动过程像是一个四级的火箭。每一级火箭将系统控制权交给下一级。

当然,这些阶段可以有不同的配置。比如,你编译了自己的内核,则可能会跳过迷你 Debian 系统的步骤。因此,在读者亲自确认之前,请勿假定自己系统的情况也是如此。

[注意]注意

对于 SUN 或 Macintosh 系统等非传统 PC 平台来说,ROM 上的 BIOS 及磁盘上的分区可能大不相同(第 9.5.2 节 “硬盘分区配置”)。对于这种情况,请另寻对应平台相关的文档。

3.1.1. 第一阶段:BIOS

BIOS 是启动过程的第一阶段,在上电事件后开始。CPU 的程序计数器在上电事件后被初始化为一个特定的内存地址,驻留在只读存储器(ROM)中的 BIOS 就是从这个特定的内存地址开始执行。

BIOS 执行硬件的基本初始化(POST: 上电自检)并将系统控制权交给你指定的下一步骤。BIOS 通常和硬件一同提供。

BIOS 启动屏幕通常指示了进入 BIOS 配置界面所需的按键。流行的按键是 F1、F2、F10、Esc、Ins 和 Del 键。假如你的启动屏幕被一个漂亮的图形界面隐藏,你可以按下某些按键(比如 ESC)取消隐藏。这些按键高度依赖于硬件。

硬件位置和 BIOS 启动的代码的优先级可以在 BIOS 配置界面中选择。通常,在已选择的设备(硬盘、软件、CD-ROM……)中,最先找到的设备的最开始的几个扇区将被加载到内存,并执行其中的初始化代码。初始化代码可以是以下任意一种。

  • 引导加载代码

  • 类似 FreeDOS 这样的过滤型操作系统的内核代码

  • 能够加载到如此小的空间中的目标操作系统的内核代码

通常,系统从主硬件的特定分区中引导。传统 PC 硬盘的最开始两个扇区中包含了主引导记录(MBR)。在 MBR 的末尾记录了磁盘分区信息及引导选择。BIOS 中执行的首段引导加载代码占据了 MBR 的其余部分。

3.1.2. 第二阶段:引载加载程序

引导加载程序是启动过程的第二阶段,由 BIOS 启动。引导加载程序将系统内核映像和 initrd 映像加载到内存并将控制权交给它们。initrd 映像是根文件系统映像,其支持程度依赖于所使用的引导加载程序。

Debian 系统通常使用 Linux 内核作为其默认的系统内核。当前 2.6/3.x 版本 Linux 内核的 initrd 镜像从技术上说是 initramfs(初始化 RAM 文件系统)镜像。基本的 initrd 镜像是 root 文件系统中各个文件使用 cpio 压缩得到的。 内核可以在启动流程中非常早的阶段,在加载基本的 initrd 镜像之前即更新微码。 以未压缩 cpio 格式存储微码二进制文件的 initrd 镜像和基本 initrd 镜像两部分可以联合组成一个 initrd 镜像,从而帮助实现上述功能。

[提示]提示

您可以使用 lsinitramfs(8) 和 unmkinitramfs(8) 这两个工具检查 initrd 镜像文件的内容,它们由 initramfs-tools-core软件包提供。 另见 https://wiki.debian.org/initramfs 以了解更多信息。

Debian 系统默认将 PC 平台的 GRUB 引导加载程序的第一阶段代码安装在 MBR 中。可用的引导加载程序和配置选项如下。

表 3.1. 引导加载程序列表

软件包流行度大小initrd引导加载程序说明
grub-legacyV:0, I:2735支持传统 GRUB可智能识别磁盘分区和文件系统(例如 vfat、ext3…)。
grub-pcV:28, I:774533支持GRUB 第 2 版可智能识别磁盘分区和文件系统(例如 vfat、ext4…)。(默认安装)
grub-rescue-pcV:0, I:16367支持GRUB 第 2 版此为 GRUB 第 2 版的可引导修复映像(CD 和软盘)(PC / BIOS 版本)
liloV:0, I:2697支持Lilo依赖于数据在硬盘上的扇区位置。(较老)
syslinuxV:4, I:48343支持Isolinux可识别 ISO9660 文件系统。引导 CD 使用此项。
syslinuxV:4, I:48343支持Syslinux可识别 MSDOS 文件系统(FAT)。引导软盘使用此项。
loadlinV:0, I:190支持Loadlin新系统从 FreeDOS 或 MSDOS 中启动。
mbrV:0, I:750不支持Neil Turton 的 MBR此为取代 MSDOS MBR 的自由软件。只可识别硬盘分区。
[警告]警告

假如没有从 grub-rescue-pc 软件包中的映像制作出来的可引导修复盘(U盘、CD 或软盘),请勿玩弄引导加载程序。即使硬盘上没有可正常工作的引导加载程序,可引导修复盘也能引导你的系统。

传统 GRUB 的菜单配置文件位于 /boot/grub/menu.lst。例如,文件中有如下的配置条目。

  1. title Debian GNU/Linux
  2. root (hd0,2)
  3. kernel /vmlinuz root=/dev/hda3 ro
  4. initrd /initrd.img

GRUB 第 2 版的菜单配置文件位于 /boot/grub/grub.cfg。此文件由 /usr/sbin/update-grub 根据 “/etc/grub.d/*“ 中的模板及 “/etc/default/grub“ 中的设置自动生成。例如,文件中有如下的配置条目。

  1. menuentry "Debian GNU/Linux" {
  2. set root=(hd0,3)
  3. linux /vmlinuz root=/dev/hda3
  4. initrd /initrd.img
  5. }

这些示例中,GRUB 参数的含义如下。

表 3.2. GRUB 参数的含义

GRUB 参数说明
root使用主磁盘的第 3 个分区,在传统 GRUB 中将此参数设置为 “(hd0,2)“,在 GRUB 第 2 版中将此参数设置为 “(hd0,3)
kernel使用位于 “/vmlinuz“ 的内核,同时将 “root=/dev/hda3 ro“ 作为参数传递给内核
initrd使用位于 “/initrd.img“ 的 initrd/initramfs 映像
[注意]注意

传统 GRUB 使用的分区号为 Linux 内核及各种实用工具使用的分区号减 1。GRUB 第 2 版修复了这个问题。

[提示]提示

在标识一个块设备时,可能需要使用 UUID(参见第 9.5.3 节 “使用 UUID 访问分区”)而不是类似 “/dev/hda3“ 这样的文件名,例如 “root=UUID=81b289d5-4341-4003-9602-e254a17ac232 ro“。

[提示]提示

如果使用了 GRUB,内核的启动参数可以在 /boot/grub/grub.cfg 里面设置。在 Debian 系统里,你不应该直接编辑 /boot/grub/grub.cfg。你可以通过编辑 /etc/default/grub 文件中 GRUB_CMDLINE_LINUX_DEFAULT 的值并运行 update-grub(8) 来更新 /boot/grub/grub.cfg

[提示]提示

通过使用链式引导技术,你可以在一个引导装载程序中启动另一个引导装载程序。

参见 “info grub” 及 grub-install(8)。

3.1.3. 第三阶段:迷你 Debian 系统

迷你 Debian 系统是启动流程的第三阶段,由引导加载程序启动。它会在内存中运行系统内核和根文件系统。这是启动流程的一个可选准备阶段。

[注意]注意

“迷你 Debian 系统”是笔者自创的术语,用于在本文档中描述启动流程的第三个阶段。这个系统通常被称为 initrd 或 initramfs 系统。内存中类似的系统在 Debian 安装程序中使用。

/init 程序是内存中的根文件系统上执行的第一个程序。这个程序在用户空间把内核初始化,并把控制权交给下一阶段。迷你 Debian 系统能够在主引导流程之前添加内核模块或以加密形式挂载根文件系统,使引导流程更加灵活。

  • 如果 initramfs 是由 initramfs-tools 创建,则”/init“ 程序是一个 shell 脚本程序。

    • 通过给内核添加 “break=init“ 等启动参数,你可以中断这部分启动流程以获取 root shell。更多中断条件请参见 ”/init“ 脚本。这个 shell 环境已足够成熟,你可通过它很好地检查机器的硬件。

    • 迷你 Debian 系统中可用的命令是精简过的,且主要由一个称为 busybox(1) 的 GNU 工具提供。

  • 如果 initramfs 是由 dracut 创建,则 “/init“ 程序是一个二进制 systemd 程序。

    • 迷你 Debian 系统中可用的命令是一个精简过的 systemd(1) 环境。
[小心]小心

当在一个只读的根文件系统上时,使用 mount 命令需要添加 -n 选项。

3.1.4. 第四阶段:常规 Debian 系统

常规 Debian 系统是启动流程的第四阶段,由迷你 Debian 系统启动。迷你 Debian 系统的内核在此环境下继续运行。根文件系统将由内存切换到实际的硬盘文件系统上。

init 程序是系统执行的第一个程序(PID=1),它启动其它各种程序以完成主引导流程。init 程序的默认路径是 ”/sbin/init“,但可通过内核启动参数修改,例如 ”init=/path/to/init_program“。

默认的 init 程序一直在变化中:

  • squeeze 之前的 Debian,使用简单的 SysV 风格的 init。

  • wheezy 版本的 Debian 对 SysV 风格的 init 做了改进:使用 LSB 头将启动步骤排序,同时并行执行启动脚本。

  • jessie 版本的 Debian 将默认 init 切换成 systemd,以使用事件驱动和并行初始化。

[提示]提示

你的系统中实际使用的 init 命令可以使用 “ps —pid 1 -f” 命令确认。

[提示]提示

在 Debian jessie 版本后,”/sbin/init“ 是一个到 “/lib/systemd/systemd“ 的符号链接。

表 3.3. Debian 系统启动工具列表

软件包流行度大小说明
systemdV:810, I:91615998基于事件且支持并发的 init(8) 守护进程(可替代 sysvinit
systemd-sysvV:802, I:914138systemd 需用的用以代替 sysvinit 的手册页和符号链接
systemd-cronV:1, I:1143提供 cron 后台守护进程(daemon)和 anacron 功能的 systemd 单元
init-system-helpersV:675, I:930131sysvinitsystemd 之间进行转换的帮助工具
initscriptsV:91, I:323176用于初始化和关闭系统的脚本
sysvinit-coreV:7, I:9276类 System V 的 init(8) 工具
sysv-rcV:183, I:33581类 System V 的运行级别修改机制
sysvinit-utilsV:494, I:99979类 System V 的实用工具(startpar(8),bootlogd(8),……)
lsb-baseV:881, I:99949Linux 标准规范 3.2 版的 init 脚本功能
insservV:210, I:330150利用 LSB init.d 脚本依赖性来组织启动步骤的工具
uswsuspV:3, I:8714使用 Linux 提供的用户态软件 suspend 的工具
kexec-toolsV:1, I:8278用于 kexec(8) 重启(热启动)的 kexec 工具
systemd-bootchartV:0, I:1128启动流程性能分析器
bootchart2V:0, I:094启动流程性能分析器
pybootchartguiV:0, I:0177启动流程性能分析器(可视化)
mingettyV:0, I:338仅包含控制台的 getty(8)
mgettyV:0, I:1315可智能调制解调的 getty(8) 替代品
[提示]提示

有关启动流程加速的最新信息,请参见 Debian 维基:启动流程加速词条。

3.2. Systemd 初始化

本节描述系统是怎样通过 PID=1 的 systemd(1) 程序来启动(即初始化进程)。

systemd 初始化进程基于单元配置文件 (参见 systemd.unit(5)) 来并行派生进程,这些单元配置文件使用声明样式来书写,代替之前的类 SysV 的过程样式。 这些单元配置文件从下面的一系列路径来加载 (参见 systemd-system.conf(5)) :

  • /lib/systemd/system“: OS 默认配置文件

  • /etc/systemd/system“: 系统管理员的配置文件,它将忽略操作系统默认的配置文件

  • /run/systemd/system“: 运行时产生的配置文件,它将忽略安装的配置文件

他们的相互依赖关系通过”Wants=“, “Requires=“, “Before=“, “After=“, … 等指示来配置,(参见 systemd.unit(5) 里的 “MAPPING OF UNIT PROPERTIES TO THEIR INVERSES”)。 资源控制也是被定义 (参见 systemd.resource-control(5)).

根据单元配置文件的后缀来区分它们的类型:

  • *.service 描述由 systemd 控制和监管的进程.参见 systemd.service(5).

  • *.device 描述在 sysfs(5) 里面作为 udev(7) 设备树展示的设备。参见 systemd.device(5).

  • *.mount 描述由 systemd 控制和监管的文件系统挂载点。参见 systemd.mount(5).

  • *.automount 描述由 systemd 控制和监管的文件系统自动挂载点。参见 systemd.automount(5).

  • *.swap 描述由 systemd 控制和监管的 swap 文件或设备。参见 systemd.swap(5).

  • *.path 描述被 systemd 监控的路径,用于基于路径的活动。参见 systemd.path(5).

  • *.socket 描述被 systemd 控制和监管的套接字,用于基于套接字的活动。参见 systemd.socket(5).

  • *.timer 描述被 systemd 控制和监管的计时器,用于基于时间的活动。参见 systemd.timer(5).

  • *.slice 管理 cgroups(7) 的资源。参见 systemd.slice(5).

  • *.scope 使用 systemd 的总线接口来程序化的创建,用以管理一系列系统进程。 参见 systemd.scope(5).

  • *.target 把其它单元配置文件分组,在启动的时候,来创建同步点。参见systemd.target(5).

系统启动时(即,init),systemd 进程会尝试启动”/lib/systemd/system/default.target(通常是到”graphical.target“的符号链接)。首先,一些特殊的 target 单元(参见 systemd.special(7)),比如 “local-fs.target“、”swap.target“和”cryptsetup.target“会被引入以挂载文件系统。之后,其它 target 单元也会根据单元依赖关系而被引入。详细情况,请阅读 bootup(7)。

systemd 提供向后兼容的功能。在 “/etc/init.d/rc[0123456S].d/[KS]<name>“ 里面的 SysV 风格的启动脚本仍然会被分析;telinit(8) 会被转换为 systemd 的单元活动请求。

[小心]小心

模拟的运行级别 2 到 4 全部被符号链接到了相同的“multi-user.target”。

3.2.1. 主机名

内核维护系统主机名。在启动的时候,通过 systemd-hostnamed.service 启动的系统单位设置系统的主机名,此主机名保存在 “/etc/hostname“。这个文件应该包含系统主机名,而不是全称域名。

不带参数运行 hostname(1) 命令可以打印出当前的主机名。

3.2.2. 文件系统

硬盘和网络文件系统的挂载选项可以在 “/etc/fstab“ 中设置,参见 fstab(5) 和 第 9.5.7 节 “通过挂载选项优化文件系统”

加密文件系统的配置设置在“/etc/crypttab”中。参见 crypttab(5)

软 RAID 的配置 mdadm(8) 设置在 “/etc/mdadm/mdadm.conf“. 参见 mdadm.conf(5).

[警告]警告

每次启动的时候,在挂载了所有文件系统以后,”/tmp“, “/var/lock“, 和 “/var/run“ 中的临时文件会被清空。

3.2.3. 网络接口初始化

对于使用 systemd 的现代 Debian 桌面系统,网络接口通常由两个服务进行初始化:lo 接口通常在“networking.service”处理,而其它接口则由“NetworkManager.service”处理。

参见 第 5 章 网络设置 来获取怎样来配置它们的信息。

3.2.4. 内核消息

在控制台上显示的内核错误信息,能够通过设置他们的阈值水平来配置。

  1. # dmesg -n3

表 3.4. 内核错误级别表

错误级别值错误级别名称说明
0KERN_EMERG系统不可用
1KERN_ALERT行为必须被立即采取
2KERN_CRIT危险条件
3KERN_ERR错误条件
4KERN_WARNING警告条件
5KERN_NOTICE普通但重要的条件
6KERN_INFO信息提示
7KERN_DEBUGdebug 级别的信息

3.2.5. 系统消息

systemd 下, 内核和系统的信息都通过日志服务 systemd-journald.service (又名 journald)来记录,放在”/var/log/journal“下的不变的二进制数据,或放在”/run/log/journal/“下的变化的二进制数据.这些二进制日志数据,可以通过 journalctl(1) 命令来访问。

systemd 下,系统日志工具 rsyslogd(8) 改变它的行为来读取变化的二进制数据(代替 systemd 之前的默认的”/dev/log“) ,并能够创建传统的不变的 ASCII 系统日志数据。

/etc/default/rsyslog“ 和 “/etc/rsyslog.conf“ 能够自定义系统消息的日志文件和屏幕显示。参见 rsyslogd(8) 和 rsyslog.conf(5),也可以参见第 9.2.2 节 “日志分析”

3.2.6. systemd 下的系统管理

systemd 不仅仅提供系统初始化,还提供通用的系统管理功能。比如说日志记录,登录管理,时间管理,网络管理等等。

systemd(1) 通过几个命令来管理:

  • systemctl(1) 命令控制 systemd 的系统和服务管理器(命令行),

  • systemsdm(1) 命令控制 systemd 的系统和服务管理器(图形界面),

  • journalctl(1) 命令查询 systemd 日志,

  • loginctl(1) 命令控制 systemd 登录管理器,

  • systemd-analyze(1) 分析系统启动性能。

这里有一个典型的 systemd 管理命令片段列表。确切含义,请阅读相关 man 手册页。

表 3.5. 典型的systemd 管理命令片段列表

操作类型命令片段
用于服务管理的图形界面图形界面systemadm“ (systemd-ui 软件包)
列出所有 target 单元配置单元systemctl list-units —type=target
列出所有 service 单元配置单元systemctl list-units —type=service
列出所有单元配置类型单元systemctl list-units —type=help
列出内存中所有 socket 单元单元systemctl list-sockets
列出内存中所有 timer 单元单元systemctl list-timers
启动 “$unit单元systemctl start $unit
停止 “$unit单元systemctl stop $unit
重新加载服务相关的配置单元systemctl reload $unit
停止和启动所有 “$unit单元systemctl restart $unit
启动 “$unit“ 并停止所有其它的单元systemctl isolate $unit
转换到 “图形“ (图形界面系统)单元systemctl isolate graphical
转换到 “多用户“ (命令行系统)单元systemctl isolate multi-user
转换到 “应急模式“ (单用户命令行系统)单元systemctl isolate rescue
向”$unit“发送杀死信号单元systemctl kill $unit
检查”$unit“服务是否是活动的单元systemctl is-active $unit
检查”$unit“服务是否是失败的单元systemctl is-failed $unit
检查”$unit|$PID|device“的状态单元systemctl status $unit|$PID|$device
显示”$unit|$job“的属性单元systemctl show $unit|$job
重设失败的”$unit单元systemctl reset-failed $unit”
列出所有单元服务的依赖性单元systemctl list-dependencies —all
列出安装在系统上的单元文件单元文件systemctl list-unit-files
启用 “$unit“ (增加符号链接)单元文件systemctl enable $unit
禁用 “$unit“ (删除符号链接)单元文件systemctl disable $unit
取消遮掩 “$unit“ (删除到 “/dev/null“ 的符号链接)单元文件systemctl unmask $unit
遮掩 “$unit“ (增加到 “/dev/null“ 的符号链接)单元文件systemctl mask $unit
获取默认的 target 设置单元文件systemctl get-default
设置默认 target 为”graphical“ (图形系统)单元文件systemctl set-default graphical
设置默认的 target 为”multi-user“ (命令行系统)单元文件systemctl set-default multi-user
显示工作环境变量环境变量systemctl show-environment
设置环境变量 “variable“ 的值为 “value环境变量systemctl set-environment variable=value
取消环境变量 “variable“ 的设置环境变量systemctl unset-environment variable
重新加载所有单元文件和后台守护进程(daemon)生命周期systemctl daemon-reload
关闭系统系统systemctl poweroff
关闭和重启系统系统systemctl reboot
挂起系统系统systemctl suspend
休眠系统系统systemctl hibernate
查看 “$unit“ 的工作日志日志journalctl -u $unit
查看 “$unit“的工作日志 (“tail -f“ 式样)日志journalctl -u $unit -f
显示每一个初始化步骤所消耗的时间分析systemd-analyze time
列出所有单元的初始化时间分析systemd-analyze blame
加载”$unit“文件并检测错误分析systemd-analyze verify $unit
跟踪 cgroups(7) 的启动过程Cgroupsystemd-cgls
跟踪 cgroups(7) 的启动过程Cgroupps xawf -eo pid,user,cgroup,args
跟踪 cgroups(7) 的启动过程Cgroup读取 “/sys/fs/cgroup/systemd/“ 下的 sysfs

这里, 上面例子中的”$unit“,可以是一个单元名(后缀.service.target 是可选的),或者,在很多情况下,也可以是匹配的多个单元 (shell 式样的全局通配符”*“, “?“, “[]“,通过使用 fnmatch(3) ,来匹配目前在内存中的所有单元的基本名称).

上面列子的系统状态改变命令,通常是通过”sudo“来处理,用以获得需要的系统管理权限。

systemctl status $unit|$PID|$device“ 的输出使用有颜色的点(“●”)来概述单元状态,让人看一眼就知道。

  • 白色的 “●” 表示一个 “不活动”或”变为不活动中”的状态。

  • 红色的 “●”表示“失败”或者“错误”状态。

  • 绿色”●”表示“活动”、“重新加载中”或“激活中”状态。

3.2.7. 定制 systemd

使用默认安装,通过 systemd 启动的过程中,在 network.target 启动后,很多网络服务 (参见 第 6 章 网络应用)作为后台守护进程(daemon)启动。 “sshd“ 也不列外。让我们修改为按需启动”sshd“ 作为一个定制化的例子。

首先,禁用系统安装的服务单元。

  1. $ sudo systemctl stop sshd.service
  2. $ sudo systemctl mask sshd.service

传统 Unix 服务的按需套接字激活(on-demand socket activation)系统由 indetd 超级服务来提供。在 systemd 下, 相同功能能够通过增加*.socket*.service 单元配置文件来启用。

sshd.socket 用来定义一个监听的套接字

  1. [Unit]
  2. Description=SSH Socket for Per-Connection Servers
  3. [Socket]
  4. ListenStream=22
  5. Accept=yes
  6. [Install]
  7. WantedBy=sockets.target

sshd@.service 作为 sshd.socket 匹配的服务文件

  1. [Unit]
  2. Description=SSH Per-Connection Server
  3. [Service]
  4. ExecStart=-/usr/sbin/sshd -i
  5. StandardInput=socket

然后重新加载。

  1. $ sudo systemctl daemon-reload

3.3. udev 系统

对于 Linux 内核 2.6 版和更新版本,udev 系统 提供了自动硬件发现和初始化机制。(参见 udev(7)).在内核发现每个设备的基础上,udev 系统使用从 sysfs 文件系统 (参见 第 1.2.12 节 “procfs 和 sysfs”)的信息启动一个用户进程,使用 modprobe(8) 程序 (参见 第 3.3.1 节 “内核模块初始化”)加载支持它所要求的内核模块, 创建相应的设备节点。

[提示]提示

如果由于某些理由,”/lib/modules/<kernel-version>/modules.dep“没有被 depmod(8) 正常生成,模块可能不会被 udev 系统按期望的方式加载。执行”depmod -a“ 来修复它。

设备节点的名字,可以通过”/etc/udev/rules.d/“里的 udev 文件来配置.当前默认的规则倾向创建动态生成的名字,除了光驱和网络设备外,会生成非静态的设备名。通过添加和光驱、网络设备类似的个性化规则,你也可以为 USB 盘之类的其它设备,生成静态设备名。 参见 “Writing udev rules“ 或 “/usr/share/doc/udev/writing_udev_rules/index.html“.

由于 udev 系统是一个正在变化的事物,我在其它文档进行了详细描述,在这里只提供了最少的信息。

[提示]提示

/etc/fstab“里面的挂载规则,设备节点不必需是静态的。你能够使用 UUID 来挂载设备,来代替”/dev/sda“之类的设备名. 参见 第 9.5.3 节 “使用 UUID 访问分区”.

3.3.1. 内核模块初始化

通过 modprobe(8) 程序添加和删除内核模块,使我们能够从用户进程来配置正在运行的 Linux 内核。udev 系统(参见 第 3.3 节 “udev 系统”)自动化它的调用来帮助内核模块初始化。

下面的非硬件模块和特殊的硬件驱动模块,需要被预先加载,把它们在”/etc/modules“文件里列出 (参见 modules(5)).

modprobe(8) 程序的配置文件是按 modprobe.conf(5)的说明放在”/etc/modprobes.d/“ 目录下,(如果你想避免自动加载某些内核模块,考虑把它们作为黑名单放在”/etc/modprobes.d/blacklist“ 文件里.)

/lib/modules/<version>/modules.dep“ 文件由 depmod(8) 程序生成,它描述了 modprobe(8) 程序使用的模块依赖性.

[注意]注意

如果你在启动时出现模块加载问题,或者 modprobe(8)时出现模块加载问题, “depmod -a“ 可以通过重构”modules.dep“来解决这些问题。

modinfo(8) 程序显示 Linux 内核模块信息。

lsmod(8) 程序以好看的格式展示”/proc/modules“的内容,显示当前内核加载了哪些模块。

[提示]提示

你能够精确识别你系统上的硬件。 参见第 9.4.3 节 “硬件识别”.

[提示]提示

你可以在启动时配置硬件来激活期望的硬件特征。参见 第 9.4.4 节 “硬件配置”.

[提示]提示

你可以重新编译内核来增加你的特殊设备的支持。参见 第 9.9 节 “内核”.