Debian系統(tǒng)初始化是指在安裝Debian操作系統(tǒng)后,進(jìn)行一系列的配置和設(shè)置,以確保系統(tǒng)能夠正常運(yùn)行并滿足用戶的需求。這些操作可以幫助用戶更好地理解和掌握Debian系統(tǒng),提高系統(tǒng)的可用性和安全性。本教程將詳細(xì)介紹Debian系統(tǒng)初始化的過程。
一、啟動(dòng)過程概述
二、Systemd
參考《Debian Systemd初始化》。
三、內(nèi)核消息
在控制臺(tái)上顯示的內(nèi)核錯(cuò)誤信息,能夠通過設(shè)置他們的閾值水平來配置。
# dmesg -n3
內(nèi)核錯(cuò)誤級別表:
錯(cuò)誤級別值 | 錯(cuò)誤級別名稱 | 說明 |
---|---|---|
0 | KERN_EMERG | 系統(tǒng)不可用 |
1 | KERN_ALERT | 行為必須被立即采取 |
2 | KERN_CRIT | 危險(xiǎn)條件 |
3 | KERN_ERR | 錯(cuò)誤條件 |
4 | KERN_WARNING | 警告條件 |
5 | KERN_NOTICE | 普通但重要的條件 |
6 | KERN_INFO | 信息提示 |
7 | KERN_DEBUG | debug 級別的信息 |
四、系統(tǒng)消息
在 systemd 下, 內(nèi)核和系統(tǒng)的信息都通過日志服務(wù) systemd-journald.service (又名 journald)來記錄,放在”/var/log/journal”下的不變的二進(jìn)制數(shù)據(jù),或放在”/run/log/journal/”下的變化的二進(jìn)制數(shù)據(jù).這些二進(jìn)制日志數(shù)據(jù),可以通過 journalctl(1) 命令來訪問。例如,可以顯示從最后一次啟動(dòng)以來的日志,按如下所示:
$ journalctl -b
典型的 journalctl 命令片段列表:
操作 | 命令片段 |
---|---|
查看從最后一次啟動(dòng)開始的系統(tǒng)服務(wù)和內(nèi)核日志 | “journalctl -b --system “ |
查看從最后一次啟動(dòng)開始的當(dāng)前用戶的服務(wù)日志 | “journalctl -b --user “ |
查看從最后一次啟動(dòng)開始的 “$unit ” 工作日志 |
“journalctl -b -u $unit “ |
查看從最后一次啟動(dòng)開始的 “$unit “的工作日志 (“tail -f ” 式樣) |
“journalctl -b -u $unit -f “ |
在 systemd 下,系統(tǒng)日志工具 rsyslogd(8) 可以被卸載。如果安裝了它,它會(huì)改變它的行為來讀取易失性二進(jìn)制日志數(shù)據(jù)(代替在 systemd 之前默認(rèn)的 “/dev/log”)并創(chuàng)建傳統(tǒng)的永久性 ASCII 系統(tǒng)日志數(shù)據(jù)。”/etc/default/rsyslog” 和 “/etc/rsyslog.conf” 能夠自定義日志文件和屏幕顯示。
五、系統(tǒng)管理
systemd 不僅僅提供系統(tǒng)初始化,還用 systemctl(1) 命令提供通用的系統(tǒng)管理操作。
典型的 systemctl 命令片段列表:
操作 | 命令片段 |
---|---|
列出所有 target 單元配置 | “systemctl list-units --type=target “ |
列出所有 service 單元配置 | “systemctl list-units --type=service “ |
列出所有單元配置類型 | “systemctl list-units --type=help “ |
列出內(nèi)存中所有 socket 單元 | “systemctl list-sockets “ |
列出內(nèi)存中所有 timer 單元 | “systemctl list-timers “ |
啟動(dòng) “$unit “ |
“systemctl start $unit “ |
停止 “$unit “ |
“systemctl stop $unit “ |
重新加載服務(wù)相關(guān)的配置 | “systemctl reload $unit “ |
停止和啟動(dòng)所有 “$unit “ |
“systemctl restart $unit “ |
啟動(dòng) “$unit ” 并停止所有其它的 |
“systemctl isolate $unit “ |
轉(zhuǎn)換到 “圖形 ” (圖形界面系統(tǒng)) |
“systemctl isolate graphical “ |
轉(zhuǎn)換到 “多用戶 ” (命令行系統(tǒng)) |
“systemctl isolate multi-user “ |
轉(zhuǎn)換到 “應(yīng)急模式 ” (單用戶命令行系統(tǒng)) |
“systemctl isolate rescue “ |
向”$unit “發(fā)送殺死信號 |
“systemctl kill $unit “ |
檢查”$unit “服務(wù)是否是活動(dòng)的 |
“systemctl is-active $unit “ |
檢查”$unit “服務(wù)是否是失敗的 |
“systemctl is-failed $unit “ |
檢查”$unit|$PID|device “的狀態(tài) |
“systemctl status $unit|$PID|$device “ |
顯示”$unit|$job “的屬性 |
“systemctl show $unit|$job “ |
重設(shè)失敗的”$unit “ |
“systemctl reset-failed $unit" |
列出所有單元服務(wù)的依賴性 | “systemctl list-dependencies --all “ |
列出安裝在系統(tǒng)上的單元文件 | “systemctl list-unit-files “ |
啟用 “$unit ” (增加符號鏈接) |
“systemctl enable $unit “ |
禁用 “$unit ” (刪除符號鏈接) |
“systemctl disable $unit “ |
取消遮掩 “$unit ” (刪除到 “/dev/null ” 的符號鏈接) |
“systemctl unmask $unit “ |
遮掩 “$unit ” (增加到 “/dev/null ” 的符號鏈接) |
“systemctl mask $unit “ |
獲取默認(rèn)的 target 設(shè)置 | “systemctl get-default “ |
設(shè)置默認(rèn) target 為”graphical ” (圖形系統(tǒng)) |
“systemctl set-default graphical “ |
設(shè)置默認(rèn)的 target 為”multi-user ” (命令行系統(tǒng)) |
“systemctl set-default multi-user “ |
顯示工作環(huán)境變量 | “systemctl show-environment “ |
設(shè)置環(huán)境變量 “variable ” 的值為 “value “ |
“systemctl set-environment variable=value “ |
取消環(huán)境變量 “variable ” 的設(shè)置 |
“systemctl unset-environment variable “ |
重新加載所有單元文件和后臺(tái)守護(hù)進(jìn)程(daemon) | “systemctl daemon-reload “ |
關(guān)閉系統(tǒng) | “systemctl poweroff “ |
關(guān)閉和重啟系統(tǒng) | “systemctl reboot “ |
掛起系統(tǒng) | “systemctl suspend “ |
休眠系統(tǒng) | “systemctl hibernate “ |
上面例子中的”$unit”,可以是一個(gè)單元名(后綴.service 和 .target 是可選的),或者,在很多情況下,也可以是匹配的多個(gè)單元 (shell 式樣的全局通配符”*”, “?”, “[]”,通過使用 fnmatch(3) ,來匹配目前在內(nèi)存中的所有單元的基本名稱).
上面列子的系統(tǒng)狀態(tài)改變命令,通常是通過”sudo”來處理,用以獲得需要的系統(tǒng)管理權(quán)限。
“systemctl status $unit|$PID|$device” 的輸出使用有顏色的點(diǎn)(“●”)來概述單元狀態(tài),讓人看一眼就知道。
- 白色的 “●” 表示一個(gè) “不活動(dòng)”或”變?yōu)椴换顒?dòng)中”的狀態(tài)。
- 紅色的 “●”表示“失敗”或者“錯(cuò)誤”狀態(tài)。
- 綠色”●”表示“活動(dòng)”、“重新加載中”或“激活中”狀態(tài)。
六、其它系統(tǒng)監(jiān)控
這里是 systemd 下其它零星的監(jiān)控命令列表。
systemd 下其它零星監(jiān)控命令列表:
操作 | 命令片段 |
---|---|
顯示每一個(gè)初始化步驟所消耗的時(shí)間 | “systemd-analyze time “ |
列出所有單元的初始化時(shí)間 | “systemd-analyze blame “ |
加載”$unit “文件并檢測錯(cuò)誤 |
“systemd-analyze verify $unit “ |
簡潔的顯示用戶調(diào)用會(huì)話的運(yùn)行時(shí)狀態(tài)信息 | “loginctl user-status “ |
簡潔的顯示調(diào)用會(huì)話的運(yùn)行時(shí)狀態(tài)信息 | “loginctl session-status “ |
跟蹤?cgroups?的啟動(dòng)過程 | “systemd-cgls “ |
跟蹤?cgroups?的啟動(dòng)過程 | “ps xawf -eo pid,user,cgroup,args “ |
跟蹤?cgroups?的啟動(dòng)過程 | 讀取 “/sys/fs/cgroup/ ” 下的?sysfs |
七、系統(tǒng)配置
1、主機(jī)名
內(nèi)核維護(hù)系統(tǒng)主機(jī)名。在啟動(dòng)的時(shí)候,通過 systemd-hostnamed.service 啟動(dòng)的系統(tǒng)單位設(shè)置系統(tǒng)的主機(jī)名,此主機(jī)名保存在 “/etc/hostname”。這個(gè)文件應(yīng)該只包含系統(tǒng)主機(jī)名,而不是全稱域名。不帶參數(shù)運(yùn)行 hostname(1) 命令可以打印出當(dāng)前的主機(jī)名。
2、文件系統(tǒng)
- 硬盤和網(wǎng)絡(luò)文件系統(tǒng)的掛載選項(xiàng)可以在 “/etc/fstab” 中設(shè)置,;
- 加密文件系統(tǒng)的配置設(shè)置在“/etc/crypttab”中;
- 軟 RAID 的配置 mdadm(8) 設(shè)置在 “/etc/mdadm/mdadm.conf”。
每次啟動(dòng)的時(shí)候,在掛載了所有文件系統(tǒng)以后,”/tmp”, “/var/lock”, 和 “/var/run” 中的臨時(shí)文件會(huì)被清空。
3、網(wǎng)絡(luò)接口初始化
對于使用 systemd 的現(xiàn)代 Debian 桌面系統(tǒng),網(wǎng)絡(luò)接口通常由兩個(gè)服務(wù)進(jìn)行初始化:lo 接口通常在“networking.service”處理,而其它接口則由“NetworkManager.service”處理。
4、云系統(tǒng)初始化
云系統(tǒng)實(shí)例可作為 “Debian 官方云鏡像 “或類似鏡像的克隆啟動(dòng)。對于此類系統(tǒng)實(shí)例,可使用 cloud-init 和 netplan.io 軟件包提供的功能配置主機(jī)名、文件系統(tǒng)、網(wǎng)絡(luò)、本地語言、SSH 密鑰、用戶和組等個(gè)性信息,并使用多種數(shù)據(jù)源(如原始系統(tǒng)鏡像中的文件和啟動(dòng)時(shí)提供的外部數(shù)據(jù))。這些軟件包使用 YAML 數(shù)據(jù)實(shí)現(xiàn)了聲明式系統(tǒng)配置。
5、調(diào)整 sshd 服務(wù)的自定義示例
使用默認(rèn)安裝,通過 systemd 啟動(dòng)的過程中,在 network.target 啟動(dòng)后,很多網(wǎng)絡(luò)服務(wù) (參見 第 6 章 網(wǎng)絡(luò)應(yīng)用)作為后臺(tái)守護(hù)進(jìn)程(daemon)啟動(dòng)。 “sshd” 也不列外。讓我們修改為按需啟動(dòng)”sshd” 作為一個(gè)定制化的例子。
首先,禁用系統(tǒng)安裝的服務(wù)單元。
$ sudo systemctl stop sshd.service $ sudo systemctl mask sshd.service
傳統(tǒng) Unix 服務(wù)的按需套接字激活(on-demand socket activation)系統(tǒng)由 inetd (或 xinetd)超級服務(wù)來提供。在 systemd 下, 相同功能能夠通過增加*.socket 和 *.service 單元配置文件來啟用。
sshd.socket 用來定義一個(gè)監(jiān)聽的套接字
[Unit] Description=SSH Socket for Per-Connection Servers [Socket] ListenStream=22 Accept=yes [Install] WantedBy=sockets.target
sshd@.service 作為 sshd.socket 匹配的服務(wù)文件
[Unit] Description=SSH Per-Connection Server [Service] ExecStart=-/usr/sbin/sshd -i StandardInput=socket
然后重新加載。
$ sudo systemctl daemon-reload
八、udev系統(tǒng)
從 Linux 內(nèi)核 2.6 版開始,udev系統(tǒng) 提供了自動(dòng)硬件發(fā)現(xiàn)和初始化機(jī)制。在內(nèi)核發(fā)現(xiàn)每個(gè)設(shè)備的基礎(chǔ)上,udev 系統(tǒng)使用從 sysfs 文件系統(tǒng)的信息啟動(dòng)一個(gè)用戶進(jìn)程,使用 modprobe(8) 程序加載支持它所要求的內(nèi)核模塊, 創(chuàng)建相應(yīng)的設(shè)備節(jié)點(diǎn)。
如果由于某些理由,”/lib/modules/kernel-version/modules.dep”沒有被 depmod(8) 正常生成,模塊可能不會(huì)被 udev 系統(tǒng)按期望的方式加載。執(zhí)行”depmod -a” 來修復(fù)它。
“/etc/fstab”里面的掛載規(guī)則,設(shè)備節(jié)點(diǎn)不必需是靜態(tài)的。能夠使用 UUID 來掛載設(shè)備,來代替”/dev/sda”之類的設(shè)備名. 參見 第 9.6.3 節(jié) “使用 UUID 訪問分區(qū)”.
1、內(nèi)核模塊初始化
通過 modprobe(8) 程序添加和刪除內(nèi)核模塊,使我們能夠從用戶進(jìn)程來配置正在運(yùn)行的 Linux 內(nèi)核。udev 系統(tǒng)自動(dòng)化它的調(diào)用來幫助內(nèi)核模塊初始化。
下面的非硬件模塊和特殊的硬件驅(qū)動(dòng)模塊,需要被預(yù)先加載,把它們在”/etc/modules”文件里列出 :
- TUN/TAP 模塊提供虛擬的 Point-to-Point 網(wǎng)絡(luò)設(shè)備 (TUN) 和虛擬的 Ethernet 以太網(wǎng)網(wǎng)絡(luò)設(shè)備 (TAP);
- netfilter 模塊提供 netfilter 防火墻能力;
- watchdog timer 驅(qū)動(dòng)模塊;
- modprobe(8) 程序的配置文件是按 modprobe.conf(5)的說明放在”/etc/modprobes.d/” 目錄下,(如果想避免自動(dòng)加載某些內(nèi)核模塊,考慮把它們作為黑名單放在”/etc/modprobes.d/blacklist” 文件里.);
- “/lib/modules/version/modules.dep” 文件由 depmod(8) 程序生成,它描述了 modprobe(8) 程序使用的模塊依賴性;
- 如果在啟動(dòng)時(shí)出現(xiàn)模塊加載問題,或者 modprobe(8)時(shí)出現(xiàn)模塊加載問題, “depmod -a” 可以通過重構(gòu)”modules.dep”來解決這些問題;
- modinfo(8) 程序顯示 Linux 內(nèi)核模塊信息;
- lsmod(8) 程序以好看的格式展示”/proc/modules”的內(nèi)容,顯示當(dāng)前內(nèi)核加載了哪些模塊。