linux 修改时区_【003】一文全面掌握Linux初始化进程(超详细)
總第79篇
本文將詳細(xì)梳理Linux系統(tǒng)的初始化進(jìn)程systemd 。通過對(duì)此進(jìn)程的理解,你將對(duì)系統(tǒng)的初始化有一個(gè)深入的理解,從而更好地理解其它的操作。
Linux系統(tǒng)的開機(jī)過程是這樣的:從BIOS開始,進(jìn)入Boot Loader,再加載內(nèi)核系統(tǒng),進(jìn)行內(nèi)核初始化,最后啟動(dòng)初始化進(jìn)程。以前Linux的啟動(dòng)一直是采用init進(jìn)程的,啟動(dòng)服務(wù)的方式如下:
$sudo /etc/init.d/apache2 start 或者 $service apache2 start這種啟動(dòng)方式有兩個(gè)缺點(diǎn):一是啟動(dòng)時(shí)間長(zhǎng),init進(jìn)程是串行啟動(dòng),只有前一個(gè)進(jìn)程啟動(dòng)完成,才會(huì)啟動(dòng)下一個(gè)進(jìn)程;二是啟動(dòng)腳本復(fù)雜,init進(jìn)程只執(zhí)行啟動(dòng)腳本,不管其它事情,腳本需要處理各種情況,從而使得腳本變得很長(zhǎng)。
1.systemd概述
根據(jù)Linux慣例,字母d是守護(hù)進(jìn)程(daemon)的縮寫, systemd的含義是它要守護(hù)整個(gè)系統(tǒng)。 systemd是為了解決initd的缺點(diǎn)問題而誕生的, 它為系統(tǒng)的啟動(dòng)和管理提供了一套完整的解決方案。
使用systemd就不再需要initd了,它成了系統(tǒng)的第一個(gè)進(jìn)程(PID= 1),其它進(jìn)程都是它的子進(jìn)程。systemd初始化進(jìn)程服務(wù)采用并發(fā)啟動(dòng)機(jī)制,開機(jī)速度得到了很大的提升。可以用命令$ systemctl --version命令 查看systemd的版本。
systemd的優(yōu)點(diǎn)是功能強(qiáng)大,使用方便,其缺點(diǎn)是體系龐大,非常復(fù)雜,與操作系統(tǒng)的其它部分強(qiáng)耦合,下圖是systemd的體系架構(gòu)圖。
2. systemd對(duì)系統(tǒng)的管理
systemd并不是一個(gè)命令,而是一組命令,涉及到對(duì)系統(tǒng)各方面的管理。
- systemctl是systemd的主命令,用于管理系統(tǒng)。其常用的操作如下:
- systemd-analyze命令用于查看啟動(dòng)時(shí)的耗時(shí)。其常用的操作如下:
- hostnamectl命令用于查看當(dāng)前主機(jī)的信息。其常用的操作如下:
- localectl命令用于查看本地化設(shè)置。其常用的操作如下:
- timedatectl命令用于查看當(dāng)前時(shí)區(qū)設(shè)置。其常用的操作如下:
- loginctl命令用于查看當(dāng)前登錄用戶的相關(guān)信息。其常用的操作如下:
3. 資源單位Unit
systemd可以管理所有的系統(tǒng)資源,不同的資源統(tǒng)稱為Unit。 Linux系統(tǒng)中Unit可以分為12種,列表如下:
| Service Unit | 系統(tǒng)服務(wù) |
| Target Unit | 多個(gè)Unit構(gòu)成一個(gè)組 |
| Device Unit | 硬件設(shè)備 |
| Mount Unit | 文件系統(tǒng)的掛載點(diǎn) |
| Automount Unit | 自動(dòng)掛載點(diǎn) |
| Path Unit | 文件或路徑 |
| Scope Unit | 不是由systemd啟動(dòng)的外部進(jìn)程 |
| Slice Unit | 進(jìn)程組 |
| Snapshot Unit | systemd快照,可以切回某個(gè)快照 |
| Socket Unit | 進(jìn)程間通信的socket |
| Swap Unit | swap文件 |
| Timer Unit | 定時(shí)器 |
用systemctl list-units命令可以查看當(dāng)前系統(tǒng)的所有Unit。其常用的操作如下:
# 列出正在運(yùn)行的 Unit $ systemctl list-units# 列出所有Unit,包括沒有找到配置文件的或者啟動(dòng)失敗的 $ systemctl list-units --all# 列出所有沒有運(yùn)行的 Unit $ systemctl list-units --all --state=inactive# 列出所有加載失敗的 Unit $ systemctl list-units --failed# 列出所有正在運(yùn)行的、類型為 service 的 Unit $ systemctl list-units --type=service可以用systemctl status命令查看系統(tǒng)狀態(tài)和單個(gè)Unit的狀態(tài)。其常用操作如下:
# 顯示系統(tǒng)狀態(tài) $ systemctl status# 顯示單個(gè) Unit 的狀態(tài) $ sysystemctl status bluetooth.service# 顯示遠(yuǎn)程主機(jī)的某個(gè) Unit 的狀態(tài) $ systemctl -H root@rhel8.redhat.com status httpd.service# 顯示某個(gè) Unit 是否正在運(yùn)行 $ systemctl is-active application.service# 顯示某個(gè) Unit 是否處于啟動(dòng)失敗狀態(tài) $ systemctl is-failed application.service# 顯示某個(gè) Unit 服務(wù)是否建立了啟動(dòng)鏈接 $ systemctl is-enabled application.service對(duì)一用戶來說,最常用的操作就是啟動(dòng)或停止Unit(主要是service)。下面列出一常用的操作:
# 立即啟動(dòng)一個(gè)服務(wù) $ sudo systemctl start apache.service# 立即停止一個(gè)服務(wù) $ sudo systemctl stop apache.service# 重啟一個(gè)服務(wù) $ sudo systemctl restart apache.service# 殺死一個(gè)服務(wù)的所有子進(jìn)程 $ sudo systemctl kill apache.service# 重新加載一個(gè)服務(wù)的配置文件 $ sudo systemctl reload apache.service# 重載所有修改過的配置文件 $ sudo systemctl daemon-reload# 顯示某個(gè) Unit 的所有底層參數(shù) $ systemctl show httpd.service# 顯示某個(gè) Unit 的指定屬性的值 $ systemctl show -p CPUShares httpd.service# 設(shè)置某個(gè) Unit 的指定屬性 $ sudo systemctl set-property httpd.service CPUShares=500若Unit之間存在依賴關(guān)系,比如A依賴于B,這意味著在systemd啟動(dòng)A時(shí),會(huì)同時(shí)去啟動(dòng)B。可以用$ systemctl list-dependencies命令列出一個(gè)Unit的所有依賴,如下所示:
#列出藍(lán)牙服務(wù)的所有依賴資源 $ systemctl list-dependencies --all bluetooth.service #-all參數(shù)用來展開target,若不想展開,則可去掉4. Unit的配置文件
每個(gè)Unit都有一個(gè)配置文件,告訴systemd如何啟動(dòng)這個(gè)Unit。 systemd默認(rèn)從目錄/etc/systemd/system中讀取配置文件,但這個(gè)目錄中大部分是軟鏈接文件,真正的配置文件存放在目錄/usr/lib/systemd/system/中。
配置文件的后綴名,表明就是該Unit的種類,若無后綴名,則用默認(rèn)后綴名.service。
可以用systemctl enable或systemctl disable命令在兩個(gè)目錄間建立或取消符號(hào)鏈接,如下示例:
#建立符號(hào)鏈接 $ sudo systemctl enable atd.service # 等同于 $ sudo ln -s '/usr/lib/systemd/system/atd.service' '/etc/systemd/system/atd.service'#取消符號(hào)鏈接 $ sudo systemctl disable atd.service可以用systemctl list-unit-files命令列出所有的配置文件,如下圖所示:
可以看到每個(gè)配置文件的狀態(tài),其狀態(tài)含義如下:
- enabled:已建立啟動(dòng)鏈接;
- disabled:未建立啟動(dòng)鏈接;
- static:該配置文件沒有install部分,只能作為其它配置文件的依賴;
注意,僅從配置文件狀態(tài)還無法看出此Unit是否正在運(yùn)行,必須執(zhí)行systemctl status命令才可以。
對(duì)于目錄下的配置文件,一旦修改,就必須讓systemd重新加載配置文件,并重新啟動(dòng),否則修改不會(huì)生效,其操作步驟如下:
#如修改了httpd的配置文件,要先重載,再重啟 $ sudo systemctl daemon-reload $ sudo systemctl restart httpd.service配置文件就是普通的文本文件,可用systemctl cat命令查看配置文件的內(nèi)容。 配置文件的完整字段清單可以參考官方文檔 。
5. Target
systemd用target代替了傳統(tǒng)init啟動(dòng)模式里面的運(yùn)行級(jí)別的概念。每個(gè)target中包含多個(gè)Unit,這樣啟動(dòng)某個(gè)target就會(huì)啟動(dòng)里面所有的Unit,從這個(gè)意義上說,target相當(dāng)于一個(gè)“狀態(tài)點(diǎn)”,啟動(dòng)某個(gè)target就啟動(dòng)至某種狀態(tài)。
注意,傳統(tǒng)的運(yùn)行級(jí)別是互斥的,不可能多個(gè)RunLevel同時(shí)啟動(dòng),但是多個(gè)target可以同時(shí)啟動(dòng)。其常用的幾個(gè)操作如下:
# 查看當(dāng)前系統(tǒng)的所有 Target $ systemctl list-unit-files --type=target# 查看一個(gè) Target 包含的所有 Unit $ systemctl list-dependencies multi-user.target# 查看啟動(dòng)時(shí)的默認(rèn) Target $ systemctl get-default# 設(shè)置啟動(dòng)時(shí)的默認(rèn) Target $ sudo systemctl set-default multi-user.target# 切換 Target 時(shí),默認(rèn)不關(guān)閉前一個(gè) Target 啟動(dòng)的進(jìn)程, # systemctl isolate 命令改變這種行為, # 關(guān)閉前一個(gè) Target 里面所有不屬于后一個(gè) Target 的進(jìn)程 $ sudo systemctl isolate multi-user.targettarget與傳統(tǒng)RunLevel的對(duì)應(yīng)關(guān)系如下圖所示:
若想要將系統(tǒng)默認(rèn)的運(yùn)行目標(biāo)修改為“多用戶無圖形”模式,可直接用符號(hào)即可,命令如下:
$ sudo ln -sf /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target6. 日志管理
systemd統(tǒng)一管理所有Unit的啟動(dòng)日志,帶來的好處是,可以只用journalctl一個(gè)命令查看所有日志(包括內(nèi)核日志和應(yīng)用日志)。日志的配置文件是/etc/systemd/journald.conf。
journalctl的功能非常強(qiáng)大,其常用的操作如下示例:
# 查看所有日志(默認(rèn)情況下 ,只保存本次啟動(dòng)的日志) $ sudo journalctl# 查看內(nèi)核日志(不顯示應(yīng)用日志) $ sudo journalctl -k# 查看系統(tǒng)本次啟動(dòng)的日志 $ sudo journalctl -b $ sudo journalctl -b -0# 查看上一次啟動(dòng)的日志(需更改設(shè)置) $ sudo journalctl -b -1# 查看指定時(shí)間的日志 $ sudo journalctl --since="2020-10-01 18:18:18" $ sudo journalctl --since "20 min ago" $ sudo journalctl --since yesterday $ sudo journalctl --since "2019-01-10" --until "2020-01-11 00:00" $ sudo journalctl --since 09:00 --until "1 hour ago"# 顯示尾部的最新10行日志 $ sudo journalctl -n# 顯示尾部指定行數(shù)的日志 $ sudo journalctl -n 20# 實(shí)時(shí)滾動(dòng)顯示最新日志 $ sudo journalctl -f# 查看指定服務(wù)的日志 $ sudo journalctl /usr/lib/systemd/systemd# 查看指定進(jìn)程的日志 $ sudo journalctl _PID=1# 查看某個(gè)路徑的腳本的日志 $ sudo journalctl /usr/bin/bash# 查看指定用戶的日志 $ sudo journalctl _UID=33 --since today# 查看某個(gè) Unit 的日志 $ sudo journalctl -u nginx.service $ sudo journalctl -u nginx.service --since today# 實(shí)時(shí)滾動(dòng)顯示某個(gè) Unit 的最新日志 $ sudo journalctl -u nginx.service -f# 合并顯示多個(gè) Unit 的日志 $ journalctl -u nginx.service -u php-fpm.service --since today# 查看指定優(yōu)先級(jí)(及其以上級(jí)別)的日志,共有8級(jí) # 0: emerg # 1: alert # 2: crit # 3: err # 4: warning # 5: notice # 6: info # 7: debug $ sudo journalctl -p err -b# 日志默認(rèn)分頁輸出,--no-pager 改為正常的標(biāo)準(zhǔn)輸出 $ sudo journalctl --no-pager# 以 JSON 格式(單行)輸出 $ sudo journalctl -b -u nginx.service -o json# 以 JSON 格式(多行)輸出,可讀性更好 $ sudo journalctl -b -u nginx.serviceqq-o json-pretty# 顯示日志占據(jù)的硬盤空間 $ sudo journalctl --disk-usage# 指定日志文件占據(jù)的最大空間 $ sudo journalctl --vacuum-size=1G# 指定日志文件保存多久 $ sudo journalctl --vacuum-time=1years7.systemd應(yīng)用操作實(shí)戰(zhàn)
若想設(shè)置某個(gè)服務(wù)在開機(jī)時(shí)啟動(dòng),可以輸入如下命令:
#設(shè)置開機(jī)啟動(dòng)httpd.service $ sudo systemctl enable httpd設(shè)置開機(jī)啟動(dòng)以后,服務(wù)并不會(huì)立即啟動(dòng),必須等下一次開機(jī),如果現(xiàn)在就想運(yùn)行此服務(wù),可用:
$ sudo systemctl start httpd執(zhí)行此命令后,服務(wù)也有可能啟動(dòng)失敗,可用如下命令查看一下服務(wù)的狀態(tài):
$ sudo systemctl status httpd若你想終止正在運(yùn)行的服務(wù),可以執(zhí)行如下命令:
$ sudo systemctl stop httpd.service當(dāng)然有時(shí)可能此命令沒有響應(yīng),服務(wù)也沒有停下來,這時(shí)候不得不殺進(jìn)程了,可用如下命令:
$ sudo systemctl kill httpd.service也可以重啟服務(wù):
$sudo systemctl restart httpd.service本文到此結(jié)束!下篇繼續(xù)!
如果對(duì)你有幫助,請(qǐng)隨手 點(diǎn)贊 或 贊賞!關(guān)注本專欄,更多干貨與你分享。
=======================================================
歡迎【關(guān)注、私信 @武三郎】。我們一起交流一起進(jìn)步。
總結(jié)
以上是生活随笔為你收集整理的linux 修改时区_【003】一文全面掌握Linux初始化进程(超详细)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: activity 启动模式_Intent
- 下一篇: no scp yes 不提示_linux