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