目录
作爲系統管理員,粗略地瞭解 Debian 系統的啓動和配置方式是明智的。儘管準確的細節在安裝的軟件包及對應的文檔中,但這些知識對我們大多數人來說都是必須掌握的。
筆者基於自己和其他人的過往及現在的知識,盡己所能地提供關於 Debian 系統的知識要點及其配置的快速概覽作爲讀者的參考。由於 Debian 系統在不斷地更新中,系統的狀況可能已經有所變化。在對系統做任何修改之前,請參考各個軟件包的最新文檔。
![]() |
警告 |
---|---|
本章是基於 2013 年發佈的 Debian 7.0 ( |
計算機系統從上電事件到能爲用戶提供完整的操作系統(OS)功能爲止,需要經歷幾個階段的啓動過程。
爲簡便起見,筆者將討論範圍限定在具有默認安裝的典型 PC 平臺上。
典型的啓動過程像是一個四級的火箭。每一級火箭將系統控制權交給下一級。
當然,這些階段可以有不同的配置。比如,你編譯了自己的內核,則可能會跳過迷你 Debian 系統的步驟。因此,在讀者親自確認之前,請勿假定自己系統的情況也是如此。
![]() |
注意 |
---|---|
對於 SUN 或 Macintosh 系統等非傳統 PC 平臺來說,ROM 上的 BIOS 及磁盤上的分區可能大不相同(第 9.5.2 节 “硬碟分割槽配置”)。對於這種情況,請另尋對應平臺相關的文檔。 |
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 的其餘部分。
引導加載程序是啓動過程的第二階段,由 BIOS 啓動。引導加載程序將系統內核映像和 initrd 映像加載到內存並將控制權交給它們。initrd 映像是根文件系統映像,其支持程度依賴於所使用的引導加載程序。
Debian 系統通常使用 Linux 內核作爲其默認的系統內核。當前 2.6/3.x 版本 Linux 內核的 initrd 映像從技術上說是 initramfs(初始化 RAM 文件系統)映像。initramfs 映像是根文件系統中所有文件的 cpio 歸檔再經過 gzip 壓縮得到。
![]() |
警告 |
---|---|
使用新的 multi-segment initramfs 之後,上述內容已不正確。請參見錯誤 #790100。 |
Debian 系統默認將 PC 平臺的 GRUB 引導加載程序的第一階段代碼安裝在 MBR 中。可用的引導加載程序和配置選項如下。
表 3.1. 引導加載程序列表
軟件包 | 流行度 | 大小 | initrd | 引導加載程序 | 說明 |
---|---|---|---|---|---|
grub-legacy | V:0, I:2 | 710 | 支持 | 傳統 GRUB | 可智能識別磁盤分區和文件系統(例如 vfat、ext3…)。 |
grub-pc | V:32, I:872 | 561 | 支持 | GRUB 第 2 版 | 可智能識別磁盤分區和文件系統(例如 vfat、ext4…)。(默認安裝) |
grub-rescue-pc | V:0, I:1 | 5239 | 支持 | GRUB 第 2 版 | 此爲 GRUB 第 2 版的可引導修復映像(CD 和軟盤)(PC / BIOS 版本) |
lilo | V:0, I:4 | 694 | 支持 | Lilo | 依賴於數據在硬盤上的扇區位置。(較老) |
syslinux | V:6, I:64 | 300 | 支持 | Isolinux | 可識別 ISO9660 文件系統。引導 CD 使用此項。 |
syslinux | V:6, I:64 | 300 | 支持 | Syslinux | 可識別 MSDOS 文件系統(FAT)。引導軟盤使用此項。 |
loadlin | V:0, I:1 | 84 | 支持 | Loadlin | 新系統從 FreeDOS 或 MSDOS 中啓動。 |
mbr | V:1, I:11 | 50 | 不支持 | Neil Turton 的 MBR | 此爲取代 MSDOS MBR 的自由軟件。只可識別硬盤分區。 |
![]() |
警告 |
---|---|
假如沒有從 |
傳統 GRUB 的菜單配置文件位於 /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
|
使用主磁盤的第 3 個分區,在傳統 GRUB 中將此參數設置爲 "(hd0,2) ",在 GRUB 第 2
版中將此參數設置爲 "(hd0,3) "
|
kernel
|
使用位於 "/vmlinuz " 的內核,同時將 "root=/dev/hda3
ro " 作爲參數傳遞給內核
|
initrd
|
使用 initrd/initramfs 映像,其位於
"/initrd.img "
|
![]() |
注意 |
---|---|
傳統 GRUB 使用的分區號爲 Linux 內核及各種實用工具使用的分區號減 1。GRUB 第 2 版修復了這個問題。 |
![]() |
提示 |
---|---|
在標識一個塊設備時,可能需要使用 UUID(參見第 9.5.3 节 “使用 UUID 訪問分割槽”)而不是類似
" |
![]() |
提示 |
---|---|
如果使用了 GRUB,內核的啓動參數可以在
|
![]() |
提示 |
---|---|
通過使用鏈式引導技術,你可以在一個引導裝載程序中啓動另一個引導裝載程序。 |
參見 “info grub
” 及
grub-install(8)。
迷你 Debian 系統是啓動流程的第三階段,由引導加載程序啓動。它會在內存中運行系統內核和根文件系統。這是啓動流程的一個可選準備階段。
![]() |
注意 |
---|---|
“迷你 Debian 系統”是筆者自創的術語,用於在本文檔中描述啓動流程的第三個階段。這個系統通常被稱爲 initrd 或 initramfs 系統。內存中類似的系統在 Debian 安裝程序中使用。 |
/init
腳本是內存中的根文件系統上執行的第一個程序。它是一個 shell
腳本程序,用於內存在用戶空間的初始化並把控制權交給下一階段。迷你 Debian
系統能夠在主引導流程之前添加內核模塊或以加密形式掛載根文件系統,使引導流程更加靈活。
通過給內核添加 “break=init
" 等啓動參數,你可以中斷這部分啓動流程以獲取 root
shell。更多中斷條件請參見 ”/init
“ 腳本。這個 shell
環境已足夠成熟,你可通過它很好地檢查機器的硬件。
迷你 Debian 系統中可用的命令是精簡過的,且主要由一個稱爲 busybox(1) 的 GNU 工具提供。
![]() |
小心 |
---|---|
當在一個只讀的根文件系統上時,使用 |
常規 Debian 系統是啓動流程的第四階段,由迷你 Debian 系統啓動。迷你 Debian 系統的內核在此環境下繼續運行。根文件系統將由內存切換到實際的硬盤文件系統上。
init 程序是系統執行的第一個程序(PID=1),它啓動其它各種程序以完成主引導流程。init
程序的默認路徑是 ”/sbin/init
“,但可通過內核啓動參數修改,例如
”init=/path/to/init_program
"。
默認的 init 程序一直在變化中:
![]() |
提示 |
---|---|
" |
![]() |
提示 |
---|---|
你的系統中實際使用的 init 命令可以使用 “ |
表 3.3. Debian 系統啓動工具列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
initscripts
|
V:847, I:956 | 208 | 用於初始化和關閉系統的腳本 |
sysvinit-core
|
V:18, I:24 | 225 | 類 System V 的 init(8) 工具 |
sysv-rc
|
V:847, I:956 | 123 | 類 System V 的運行級別修改機制 |
sysvinit-utils
|
V:875, I:999 | 110 | 類 System V 的實用工具(startpar(8),bootlogd(8),……) |
lsb-base
|
V:881, I:999 | 49 | Linux 標準規範 3.2 版的 init 腳本功能 |
insserv
|
V:792, I:936 | 140 | 利用 LSB init.d 腳本依賴性來組織啓動步驟的工具 |
systemd
|
V:648, I:730 | 9334 |
基於事件且支持並發的
init(8)
守護進程(可替代 sysvinit )
|
uswsusp
|
V:4, I:13 | 699 | 使用 Linux 提供的使用者態軟體 suspend 的工具 |
kexec-tools
|
V:1, I:8 | 267 | 用於 kexec(8) 重啟(熱啟動)的 kexec 工具 |
bootchart2
|
V:0, I:1 | 94 | 啟動流程效能分析器 |
pybootchartgui
|
V:0, I:1 | 177 | 啟動流程效能分析器(視覺化) |
mingetty
|
V:0, I:3 | 35 | 僅包含控制檯的 getty(8) |
mgetty
|
V:0, I:1 | 302 | 可智慧調製解調的 getty(8) 替代品 |
![]() |
提示 |
---|---|
有關啟動流程加速的最新資訊,請參見 Debian 維基:啟動流程加速詞條。 |
![]() |
小心 |
---|---|
當前預設的 Debian 系統已不使用 SysV 風格的 init。請閱讀其它資源以獲取關於現代的基於 systemd 的 init。參見 Debian 管理員手冊 |
本章節描述優秀而老式的 SysV 風格的 init 是如何引導系統的。你的 Debian 系統的運作方式並不與此處描述的內容完全相同,但瞭解這些基礎內容頗具教育意義,因為更新的 init 系統傾向於提供相同的功能。
SysV 風格的啟動流程本質上經歷了以下幾個階段。
Debian 系統進入執行級別 N(無)並根據
“/etc/inittab
” 的描述初始化系統。
Debian 系統進入執行級別 S 並在單使用者模式下完成系統的硬體初始化等等。
Debian 系統進入某個指定的多使用者執行級別(2 到 5)並啟動各個系統服務。
多使用者模式的初始執行級別,可通過核心啟動引數 “init=
” 指定,或在
“/etc/inittab
” 中的 "initdefault" 行指定。已安裝的 Debian
系統以執行級別 2 啟動。
init 系統實際執行的所有指令碼檔案都在 “/etc/init.d/
” 目錄中。
參見
init(8)、inittab(5)
及 “/usr/share/doc/sysv-rc/README.runlevels.gz
” 以獲取確切的解釋。
每一個執行級別都使用一個目錄存放其配置,其特定的含義如下。
表 3.4. 執行級別及其使用方法描述列表
執行級別 | 目錄 | 執行級別使用方法描述 |
---|---|---|
N
|
無 |
系統引導(無)級別(沒有 “/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 既不是紅帽 Linux,也不是 Sun 公司的 Solaris,也不是惠普的 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
” 和
“../init.d/exim4
”,那麼 “S10sysklogd
” 將在
“S20exim4
” 之前執行。
這種簡單的順序初始化系統屬於經典的 System V 風格的啟動系統,在 Debian
系統 lenny
及以前的版本中使用。
相反,最近版本的 Debian 系統優化成同時執行各個初始化指令碼。
insserv(8) 命令利用 LSB 包依賴資訊計算出所有指令碼的依賴關係。
參見 “/usr/share/doc/insserv/README.Debian
”。
在 init 指令碼頭部定義的 LSB 包依賴資訊保證了所需資源的可用性。
![]() |
警告 |
---|---|
不建議對 ” |
例如,讓我們來建立如下類似 Red Hat Linux 的執行級別系統。
init
預設以 runlevel=3 啟動系統。
init
不會在 runlevel=(0,1,2,6) 時啟動
gdm3(1)。
init
會在 runlevel=(3,4,5) 時啟動
gdm3(1)。
可以通過修改 "/etc/inittab
" 檔案來改變啟動等級並且也可以使用使用者友好的執行級別管理工具例如
sysv-rc-conf
或者 bum
來更改執行級別。如果你只想用命令列方式的話,如下是你應該怎樣去做的步驟(預設安裝 gdm
軟體包後,在顯示器管理工具中選中它)。
# cd /etc/rc2.d; mv S21gdm3 K21gdm3 # cd /etc; perl -i -p -e 's/^id:.:/id:3:/' inittab
請注意當啟動顯示器管理程序時:xdm
,gdm3
,sddm
和
wdm
,"/etc/X11/default-display-manager
"
檔案會被檢查。
![]() |
注意 |
---|---|
你也可以在任何控制檯介面用 startx(1) 命令啟動 X。 |
"/etc/init.d
" 中的每個 init 指令碼的預設引數由
"etc/default
" 中的對應檔案給出,此對應檔案只包含環境變數分配。這些目錄是 Debian 系統特定的,它們大致相當於 Red Hat Linux 和其他發行版中的
"/etc/sysconfig
"
目錄。例如,“/etc/default/cron
" 可以控制
"/etc/init.d/cron
" 的執行方式。
The "/etc/default/rcS
" file can be used to customize
boot-time defaults for
motd(5),
sulogin(8),
etc.
如果通過改變這些變數不能達到你所想要的效果,那麼你應該修改 init 指令碼。如下是一些系統管理員可以編輯的配置檔案。
核心包含了系統主機名。在啟動的時候,連結到
"/etc/init.d/hostname.sh
" 執行等級為 S 的 init 指令碼設定了系統主機名 (使用
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
" for normal filesystems using
"/etc/fstab
"
"/etc/init.d/mountnfs.sh
" for network filesystems
using"/etc/fstab
"
特殊核心檔案系統(procfs, sysfs, 和 tmpfs 用於 /proc
,
/sys
, /tmp
, /run
等等)的掛載選項在 "/etc/default/rcS
"
中設定。參考rcS(5)。
硬碟和網路檔案系統的掛載選項可以在 "/etc/fstab
" 中設定,參考 第 9.5.7 节 “通過掛載選項優化檔案系統”。
![]() |
注意 |
---|---|
實際上的網路檔案系統的掛載是在網路介面啟動以後開始的。 |
![]() |
警告 |
---|---|
每次啟動的時候,在掛載了所有檔案系統以後," |
網路介面在 S 執行級別通過連結到 "/etc/init.d/ifupdown-clean
" 和
"/etc/init.d/ifupdown
" 的 init 指令碼來初始化。參考第 5 章 網絡設置來獲得配置它們的資訊。
許多網路服務(參考第 6 章 網路應用)在啟動多使用者模式的時候通過 init
指令碼直接作為後臺守護程序啟動,例如 “/etc/rc2.d/S20exim4
”(執行級別為2)有一個指向
"/etc/init.d/exim4
" 的符號連結。
一些網路服務能夠使用 super-server
inetd
(或者它的等價物) 啟動。在啟動的時候,inetd
通過連結到
"/etc/init.d/inetd
" 的
"/etc/rc2.d/S20inetd
" 啟動 (執行等級為
2)。根本上,inetd
允許一個正在執行的守護程序去呼叫其它程序,減輕了系統的負載。
Whenever a request for service arrives at super-server inetd
, its
protocol and service are identified by looking them up in the databases in
"/etc/protocols
" and "/etc/services
".
inetd
then looks up a normal Internet service in the
"/etc/inetd.conf
" database, or a Open Network Computing Remote
Procedure Call (ONC RPC)/Sun RPC based service in
"/etc/rpc.conf
".
Sometimes, inetd
does not start the intended server
directly but starts the TCP wrapper
program,
tcpd(8),
with the intended server name as its argument in
"/etc/inetd.conf
". In this case, tcpd
runs the appropriate server program after logging the request and doing some
additional checks using "/etc/hosts.deny
" and
"/etc/hosts.allow
".
為了系統安全,應該儘可能的關掉網路服務程式。參考第 4.6.4 节 “限制訪問某些服務端的服務”。
參考
inetd(8),
inetd.conf(5),
protocols(5),
services(5),
tcpd(8),
hosts_access(5),
host_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 | debug 級別的資訊 |
Linux 核心 2.6 和更新的核心,udev 系統 提供了自動硬體發現和初始化機制。(參見 udev(7)).在核心發現每個裝置的基礎上,udev 系統使用從 sysfs 檔案系統 (參見 第 1.2.12 节 “procfs 和 sysfs”)的資訊啟動一個使用者程序,使用 modprobe(8) 程式 (參見 第 3.3.1 节 “核心模組初始化”)載入支援它所要求的核心模組, 建立相應的裝置節點。
![]() |
提示 |
---|---|
如果由於某些理由," |
裝置節點的名字,可以通過"/etc/udev/rules.d/
"裡的 udev
檔案來配置.當前預設的規則傾向建立動態生成的名字,除了光碟機和網路裝置外,會生成非靜態的裝置名。通過新增和光碟機、網路裝置類似的個性化規則,你也可以為
USB 盤之類的其它裝置,生成靜態裝置名。 參見 "Writing udev
rules" 或
"/usr/share/doc/udev/writing_udev_rules/index.html
".
由於 udev 系統是一個正在變化的事物,我在其它文件進行了詳細描述,在這裡只提供了最少的資訊。
![]() |
提示 |
---|---|
" |
通過 modprobe(8) 程式新增和刪除核心模組,使我們能夠從使用者程序來配置正在執行的 Linux 核心。udev 系統(參見 第 3.3 节 “udev 系統”)自動化它的呼叫來幫助核心模組初始化。
下面的非硬體模組和特殊的硬體驅動模組,需要被預先載入,把它們在"/etc/modules
"檔案裡列出 (參見
modules(5)).
TUN/TAP 模組提供虛擬的 Point-to-Point 網路裝置 (TUN) 和虛擬的 Ethernet 乙太網網路裝置 (TAP),
netfilter 模組提供 netfilter 防火牆能力(iptables(8), 第 5.9 节 “Netfilter 網路過濾框架”),
watchdog timer 驅動模組。
modprobe(8)
程式的配置檔案是按
modprobe.conf(5)的說明放在"/etc/modprobes.d/
"
目錄下,(如果你想避免自動載入某些核心模組,考慮把它們作為黑名單放在"/etc/modprobes.d/blacklist
"
檔案裡.)
"/lib/modules/<version>/modules.dep
" 檔案由
depmod(8)
程式生成,它描述了
modprobe(8)
程式使用的模組依賴性.
![]() |
注意 |
---|---|
如果你在啟動時出現模組載入問題,或者
modprobe(8)時出現模組載入問題,
" |
modinfo(8) 程式顯示 Linux 核心模組資訊。
lsmod(8)
程式以好看的格式展示"/proc/modules
"的內容,顯示當前核心載入了哪些模組。
![]() |
提示 |
---|---|
你能夠精確識別你係統上的硬體。 參見第 9.4.3 节 “硬體識別”. |
![]() |
提示 |
---|---|
你可以在啟動時配置硬體來啟用期望的硬體特徵。參見 第 9.4.4 节 “硬體配置”. |
![]() |
提示 |
---|---|
你可以重新編譯核心來增加你的特殊裝置的支援。參見 第 9.9 节 “核心”. |