新聞中心
簡(jiǎn)介
早期的centos 5系統(tǒng)上,使用的init系統(tǒng)是SysV init。這套系統(tǒng)運(yùn)行穩(wěn)定,使用shell腳本的形式,串行地一個(gè)個(gè)啟動(dòng)進(jìn)程,當(dāng)前一個(gè)進(jìn)程啟動(dòng)完畢后,再啟動(dòng)后一個(gè)。這種方式帶來的缺點(diǎn)是:

創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站與策劃設(shè)計(jì),鼎城網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:鼎城等地區(qū)。鼎城做網(wǎng)站價(jià)格咨詢:028-86922220
- 計(jì)算機(jī)的啟動(dòng)速度很慢,后面的進(jìn)程必須等待前面的進(jìn)程依次串行地啟動(dòng)完畢方可啟動(dòng)。
- 有的服務(wù)可能在啟動(dòng)后很長的一段時(shí)間或者幾乎不會(huì)使用到,例如服務(wù)器中的打印服務(wù)。
發(fā)展到CentOS 6的時(shí)候,init系統(tǒng)換成了Upstart,這個(gè)系統(tǒng)有效的解決了上述的缺點(diǎn),實(shí)現(xiàn)了并行啟動(dòng)和按需啟動(dòng)。
而到了CentOS 7的時(shí)候,則出現(xiàn)了Systemd這套init系統(tǒng),它更加完善了并行啟動(dòng)和按需啟動(dòng),使得啟動(dòng)的速度更上一層樓。這里的按需啟動(dòng),指的是某個(gè)服務(wù)被設(shè)置為開機(jī)啟動(dòng),當(dāng)開機(jī)時(shí)該服務(wù)并沒有真正的啟動(dòng),只是注冊(cè)好了socket占用,等待第一次有請(qǐng)求進(jìn)來的時(shí)候,Systemd懸掛該請(qǐng)求然后啟動(dòng)服務(wù),服務(wù)啟動(dòng)完畢后就恢復(fù)該請(qǐng)求,從而實(shí)現(xiàn)按需啟動(dòng),這種方式也變相加速了系統(tǒng)的啟動(dòng)速度。
Systemd不僅僅是一個(gè)服務(wù),還可以用于管理系統(tǒng)自身的方方面面,例如日志、類似crond的任務(wù)調(diào)度程序(timer)、電源管理等等。
Systemd支持向后兼容(backward compatible)SysV init的腳本等其他的諸多特性,使得其目前在慢慢成為Linux發(fā)行版的一種標(biāo)準(zhǔn),這是一件好事。
這篇文章所能闡述的也只是Systemd的皮毛而已。主要描述了運(yùn)維人員在日常使用中應(yīng)該掌握的systemctl命令,以及如何閱讀unit文件以及尋找?guī)椭?/p>
Unit
在Systemd中使用配置文件來進(jìn)行管理,這些配置文件叫做unit。unit有許許多多的類型,如下。
| Unit 類型 | 文件擴(kuò)展名 | 描述 |
| Service unit | .service | 用于管理系統(tǒng)的服務(wù)unit,最常用,一般由所安裝的服務(wù)所提供(httpd、MySQL等) |
| Target unit | .target | target unit表示的是期望系統(tǒng)運(yùn)行于哪個(gè)狀態(tài)下,用戶的目標(biāo)是什么。比如運(yùn)行于支持圖形顯示的狀態(tài)下,那么它除了可以提供CLI的shell界面以外,還需要額外啟用許多服務(wù)等組件用于支持圖形界面,這些組件也是一個(gè)個(gè)的unit,所以target就是多個(gè)unit的集合(這些unit之間還有先后和依賴關(guān)系)。因此,target就是用來模擬以前的運(yùn)行級(jí)別(runlevel)的概念。 |
| Automount unit | .automount | 文件系統(tǒng)自動(dòng)掛載點(diǎn)。 |
| Device unit | .device | 一個(gè)被內(nèi)核所識(shí)別的設(shè)備文件。 |
| Mount unit | .mount | 一個(gè)文件系統(tǒng)的掛載點(diǎn)。 |
| Path unit | .path | 文件系統(tǒng)中的一個(gè)文件或目錄。 |
| Scope unit | .scope | 一個(gè)外部創(chuàng)建的進(jìn)程。 |
| Slice unit | .slice | 一組用于管理系統(tǒng)進(jìn)程的分層組織的單元。 |
| Snapshot unit | .snapshop | Systemd管理器所保存的一個(gè)狀態(tài),因此稱之為快照。 |
| Socket unit | .socket | 一個(gè)進(jìn)程間通信(IPC)socket。 |
| Swap unit | .swap | 一個(gè)swap設(shè)備或者swap文件。 |
|
Timer unit |
.timer |
一個(gè)Systemd timer。 |
Unit配置文件
unit文件存在于三個(gè)位置:
- /usr/lib/systemd/system/:軟件程序包所提供的unit文件。例如httpd程序包提供了httpd.service文件。
- /run/systemd/system/:運(yùn)行時(shí)所創(chuàng)建的unit文件。優(yōu)先級(jí)高于已安裝的服務(wù)unit文件所在的目錄。
- /etc/systemd/system/:通過systemctl enable所創(chuàng)建的和用于擴(kuò)展一個(gè)服務(wù)所添加的unit文件目錄。優(yōu)先級(jí)高于運(yùn)行時(shí)unit文件。
優(yōu)先級(jí):/etc/systemd/system/ --> /run/systemd/system/ --> /usr/lib/systemd/system/。
Systemd配置文件
主特性
- 基于socket激活(socket-based):在引導(dǎo)時(shí),系統(tǒng)針對(duì)所有支持這類激活的系統(tǒng)服務(wù)創(chuàng)建監(jiān)聽socket,一旦服務(wù)啟動(dòng)就將這些socket傳遞給它們。這不僅允許systemd并行啟動(dòng)服務(wù),還使得服務(wù)在重啟的時(shí)候不會(huì)丟失任何在其服務(wù)不可用期間發(fā)送給它的消息(因?yàn)橄嚓P(guān)的socket仍然可以訪問并且將所有的消息放入隊(duì)列中)。該特性需要使用socket unit。
- 基于總線激活(bus-based):當(dāng)?shù)谝淮伪豢蛻舳顺绦蛟L問的時(shí)候,使用D-Bus用于IPC的系統(tǒng)服務(wù)可以按需啟動(dòng)。該特性需要使用D-Bus服務(wù)文件。
- 基于設(shè)備激活(device-based):當(dāng)某種特定的硬件設(shè)備被插入或者可用時(shí),支持基于設(shè)備激活的系統(tǒng)服務(wù)可以按需啟動(dòng)。該特性需要使用device unit。
- 基于路徑激活(path-based):當(dāng)一個(gè)文件或者目錄改變其狀態(tài)時(shí),支持基于路徑激活的系統(tǒng)服務(wù)可以按需啟動(dòng)。該特性需要使用path unit。
- 掛載和自動(dòng)掛載點(diǎn)管理:Systemd監(jiān)視和管理掛載和自動(dòng)掛載點(diǎn)。該特性需要使用mount和automount unit。
- 進(jìn)擊的并行性(aggressive parallelization):由于具備基于socket激活的特性,只要所有監(jiān)聽的socket準(zhǔn)備就緒,systemd就可以并行啟動(dòng)服務(wù)。結(jié)合系統(tǒng)服務(wù)的按需激活特性,并發(fā)激活有效地減少了系統(tǒng)啟動(dòng)的時(shí)間。
- 支持事務(wù)的(transactional)unit激活邏輯:在激活或者關(guān)閉(deactivate)一個(gè)unit之前,systemd會(huì)計(jì)算它的依賴關(guān)系,創(chuàng)建一個(gè)臨時(shí)事務(wù),驗(yàn)證事務(wù)的一致性。當(dāng)一個(gè)事務(wù)出現(xiàn)不一致的情況時(shí),systemd會(huì)在其報(bào)錯(cuò)之前嘗試去校對(duì)它并從中移除一些不重要的工作。
- 向后兼容(backward compatibility)SysV init:支持遵循LSB標(biāo)準(zhǔn)的SysV init腳本。
兼容性變化
Systemd在設(shè)計(jì)的時(shí)候盡可能做到與SysV和Upstart兼容,不過還是有一些點(diǎn)是不同的,需要留意:
- Systemd對(duì)于運(yùn)行級(jí)別的支持是有限的,并不是所有的運(yùn)行級(jí)別都支持。其對(duì)于運(yùn)行級(jí)別的支持是通過target unit來實(shí)現(xiàn)的,類似一種映射關(guān)系,例如graphical.target映射到runlevel5。systemd程序包在發(fā)行的時(shí)候包含了runlevel命令,不過用戶因該盡量避免使用該命令。
- systemctl程序不支持自定義子命令。在CentOS 6的SysV init腳本中,除了支持start、stop和restart這些基礎(chǔ)子命令以外,腳本作者還可以撰寫任何自己希望實(shí)現(xiàn)的功能實(shí)現(xiàn)額外的子命令。例如RHEL 6中的iptables腳本支持panic子命令,該子命令告訴系統(tǒng)進(jìn)入panic模式,丟棄所有的流入和流出的數(shù)據(jù)包。而systemctl,僅支持文檔中列出的子命令。
- 非由systemd所啟動(dòng)的服務(wù),無法收到systemctl管理。當(dāng)使用systemd啟動(dòng)服務(wù)的時(shí)候,systemd會(huì)記錄并追蹤服務(wù)的主進(jìn)程PID,systemctl命令通過該P(yáng)ID來管理服務(wù)進(jìn)程。若用戶通過程序的CLI程序啟動(dòng)服務(wù)的話,那么systemd就無法獲取并追蹤該P(yáng)ID了。
- Systemd只能停止運(yùn)行中的服務(wù)。在以前,RHEL 6和以往的版本中,系統(tǒng)使用【/etc/rc0.d/】中的字符鏈接來關(guān)閉所有可用的服務(wù)而不關(guān)心它們的狀態(tài)。在systemd中,只有運(yùn)行中的服務(wù)會(huì)被關(guān)閉了。
- 系統(tǒng)服務(wù)無法從標(biāo)準(zhǔn)輸入流中讀取數(shù)據(jù)。當(dāng)systemd啟動(dòng)一個(gè)服務(wù)的時(shí)候,會(huì)將/dev/null和服務(wù)的STDIN關(guān)聯(lián)起來,使得用戶無法與其交互。
- 系統(tǒng)服務(wù)不會(huì)從調(diào)用它們的用戶和會(huì)話中繼承任何上下文(context,例如HOME和PATH這類環(huán)境變量)。每個(gè)服務(wù)運(yùn)行在一個(gè)干凈的執(zhí)行上下文中。
- 當(dāng)加載一個(gè)SysV init腳本的時(shí)候,systemd從LSB頭中讀取依賴關(guān)系并在運(yùn)行時(shí)解釋。
- Systemd的服務(wù)unit有一個(gè)代碼寫死的5分鐘超時(shí)時(shí)長,用于處理那些運(yùn)行出現(xiàn)故障的服務(wù)。這個(gè)時(shí)長可以在獨(dú)立的服務(wù)類unit文件中修改。
管理服務(wù)
在SysV init和Upstart中,使用【/etc/rc.d/init.d/】下的shell腳本(一般是bash)來管理服務(wù),使用的命令是service和chkconfig。在Systemd中使用service類型的unit文件(.service文件)來管理,使用的命令統(tǒng)一為systemctl。
由于向后兼容的特性的存在,舊命令依然可用,但是官方并不建議。新舊命令的對(duì)應(yīng)關(guān)系如下。
service命令和systemctl命令對(duì)照表,service命令用于管理一個(gè)服務(wù)的啟動(dòng)和停止。
| service | systemctl | 描述 |
| service name start | systemctl start name.service | 啟動(dòng)一個(gè)服務(wù) |
| service name stop | systemctl stop name.service | 停止一個(gè)服務(wù) |
| service name restart | systemctl restart name.service | 重啟一個(gè)服務(wù) |
| service name condrestart | systemctl try-restart name.serivce | 只有當(dāng)服務(wù)處于運(yùn)行狀態(tài)時(shí)才重啟服務(wù) |
| service name reload | systemctl reload name.service | 重載服務(wù),一般用于配置文件的修改后執(zhí)行 |
| serivce name status |
systemctl status name.service systemctl is-active name.service |
查看服務(wù)的運(yùn)行狀態(tài) |
| service --status-all | systemctl list-units --type service --all | 查看所有服務(wù)的運(yùn)行狀態(tài) |
chkconfig命令和systemctl命令對(duì)照表,chkconfig命令用于管理服務(wù)的開機(jī)啟動(dòng)情況以及將服務(wù)納入chkconfig管理。
| chkconfig | systemctl | 描述 |
| chkconfig name on | systemctl enable name.service | 使服務(wù)開機(jī)啟動(dòng) |
| chkconfig name off | systemctl disable name.service | 禁止服務(wù)開機(jī)啟動(dòng) |
| chkconfig --list name |
systemctl status name.service systemctl is-enable name.service |
查看服務(wù)是否開機(jī)啟動(dòng) |
| chkconfig --list | systemctl list-unit-files --type service | 列出所有的服務(wù)并檢查其是否開機(jī)啟動(dòng) |
| chkconfig --list | systemctl list-dependencies --after | 列出在指定的unit之前需要被啟動(dòng)的服務(wù) |
| chkconfig --list | systemctl list-dependencies --before | 列出在指定的unit之后需要被啟動(dòng)的服務(wù) |
在書寫unit名稱的時(shí)候,一般是建議寫全名,這樣比較能顧名思義,例如“httpd.service”。不過簡(jiǎn)寫,不寫unit類型后綴,那么systemctl也是可以識(shí)別的,如下2個(gè)命令的效果是一樣的,systemctl會(huì)自動(dòng)識(shí)別unit類型。
~]# systemctl stop nfs-server.service ~]# systemctl stop nfs-server
unit的名稱如果比較長,可以定義一個(gè)簡(jiǎn)短的別名,想查看別名的話使用如下命令。show子命令可以查看很多unit的信息。
[root@c7-server ~]# systemctl show httpd.service -p Names Names=httpd.service
如果結(jié)合chroot命令來運(yùn)行systemctl命令的話,大部分命令是不可用的,除了systemctl enable和systemctl disable,詳見官方文檔。
列出服務(wù)
列出所有當(dāng)前已載入的服務(wù)。
[root@c7-server ~]# systemctl list-units --type service UNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-xorg.service loaded active running ABRT Xorg log watcher ... ● kdump.service loaded failed failed Crash recovery kernel arming ...
UNIT:unit的完整名稱。
LOAD:加載的情況。
ACTIVE:高級(jí)激活狀態(tài)。
SUB:低級(jí)激活狀態(tài)。這個(gè)狀態(tài)會(huì)取決于unit的類型有不同的狀態(tài)值。
DESCRIPTION:描述。
默認(rèn)情況下列出的是已激活的服務(wù)(不過從上述結(jié)果來看,狀態(tài)為failed的也可以被列出),想要查看已加載的所有狀態(tài)的服務(wù)的話,需要傳遞--all選項(xiàng)。
注:--type和--all均有縮寫版,為了顧名思義,這里盡量都參照官方文檔,給出了完整版選項(xiàng)。
從結(jié)果上來看,LOAD狀態(tài)為not-found的也可以被列出。
[root@c7-server ~]# systemctl list-units --type service --all UNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-vmcore.service loaded inactive dead Harvest vmcores for ABRT ... ● apparmor.service not-found inactive dead apparmor.service ... ● kdump.service loaded failed failed Crash recovery kernel arming ...
查看所有已安裝的服務(wù)類unit單元,并可查看其是否開機(jī)啟動(dòng)。
[root@c7-server ~]# systemctl list-unit-files UNIT FILE STATE proc-sys-fs-binfmt_misc.automount static ... tmp.mount disabled ... cups.path enabled ... sssd-autofs.service indirect ...
顯示服務(wù)狀態(tài)
[root@c7-server ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:httpd(8)
man:apachectl(8)
[root@c7-server ~]# systemctl start httpd.service
[root@c7-server ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2019-11-22 11:49:33 CST; 1s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 3193 (httpd)
Status: "Processing requests..."
Tasks: 6
CGroup: /system.slice/httpd.service
├─3193 /usr/sbin/httpd -DFOREGROUND
├─3195 /usr/sbin/httpd -DFOREGROUND
├─3196 /usr/sbin/httpd -DFOREGROUND
├─3197 /usr/sbin/httpd -DFOREGROUND
├─3199 /usr/sbin/httpd -DFOREGROUND
└─3201 /usr/sbin/httpd -DFOREGROUND
Nov 22 11:49:32 c7-server systemd[1]: Starting The Apache HTTP Server...
Nov 22 11:49:33 c7-server systemd[1]: Started The Apache HTTP Server.
服務(wù)處于啟動(dòng)或停止的狀態(tài)時(shí),有不同的狀態(tài)信息顯示。使用root用戶執(zhí)行此命令,還可以顯示日志信息。
如果僅希望查看服務(wù)是否啟動(dòng),是否開機(jī)啟動(dòng)的話,可使用如下命令。
[root@c7-server ~]# systemctl is-active httpd.service active [root@c7-server ~]# systemctl is-enabled httpd.service disabled
啟動(dòng)、停止和重啟等
~]# systemctl start httpd.service ~]# systemctl stop httpd.service ~]# systemctl restart httpd.service
如果服務(wù)原本是停止的狀態(tài),則執(zhí)行restart會(huì)啟用該服務(wù)。如果我們希望只有當(dāng)服務(wù)當(dāng)前是啟動(dòng)的狀態(tài)才重啟的話,那么應(yīng)該執(zhí)行try-restart。
~]# systemctl try-restart httpd.service
某些服務(wù)支持在不打斷運(yùn)行狀態(tài)的情況下重載服務(wù)從而讀取配置文件。
~]# systemctl reload httpd.service
如果服務(wù)不支持重載的話,服務(wù)會(huì)忽略systemd的reload操作。為了方便,確保修改的配置文件一定會(huì)生效,可以執(zhí)行如下2個(gè)子命令。
reload-or-restart:嘗試reload,如果服務(wù)不支持就restart。
reload-or-try-restart:嘗試reload,如果服務(wù)不支持就try-restart。如果服務(wù)本身沒啟動(dòng),那么再執(zhí)行了此命令后應(yīng)該也不會(huì)啟動(dòng),需要手工啟動(dòng)。啟動(dòng)時(shí),服務(wù)就會(huì)去讀取配置文件了。
~]# systemctl reload-or-restart httpd.service ~]# systemctl reload-or-try-restart httpd.service
開機(jī)啟動(dòng)
~]# systemctl enable httpd.service ~]# systemctl disable httpd.service
當(dāng)我們?cè)O(shè)置開機(jī)啟動(dòng)的時(shí)候,systemd會(huì)讀取服務(wù)的配置文件(/usr/lib/systemd/system/httpd.service)中的[Install]部分。
[Install] WantedBy=multi-user.target
根據(jù)此部分的內(nèi)容創(chuàng)建字符鏈接。
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
如果服務(wù)本身是開機(jī)啟動(dòng)的,那么再執(zhí)行一次enable的話并不會(huì)創(chuàng)建字符鏈接文件。想確保其一定創(chuàng)建的話,可使用reenable。
~]# systemctl reenable httpd.service Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service. Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
關(guān)閉開機(jī)啟動(dòng),就是刪除字符鏈接了。
~]# systemctl disable httpd.service Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
systemd支持mask操作,如果一個(gè)服務(wù)被mask了,那么它無法被手動(dòng)啟動(dòng)或者被其他服務(wù)所啟動(dòng),也無法被設(shè)置為開機(jī)啟動(dòng)。
[root@c7-server ~]# systemctl mask httpd.service Created symlink from /etc/systemd/system/httpd.service to /dev/null. [root@c7-server ~]# systemctl start httpd.service Failed to start httpd.service: Unit is masked. [root@c7-server ~]# systemctl enable httpd.service Failed to execute operation: Cannot send after transport endpoint shutdown
可使用unmask來取消mask。
~]# systemctl unmask httpd.service Removed symlink /etc/systemd/system/httpd.service.
啟動(dòng)一個(gè)沖突的服務(wù)
在systemd中存在積極的(positive)依賴和消極的(negative)依賴。啟動(dòng)某個(gè)特定的服務(wù),可能會(huì)要求啟動(dòng)一個(gè)或多個(gè)其他服務(wù)(此為積極的依賴),或者要求停止一個(gè)或多個(gè)其他服務(wù)(此為消極的依賴)。
當(dāng)你嘗試啟動(dòng)某個(gè)服務(wù)的時(shí)候,systemd會(huì)自動(dòng)解決這些依賴關(guān)系。注意,systemd不會(huì)顯式通知用戶。如果你已經(jīng)啟動(dòng)了一個(gè)服務(wù)A(比如postfix),然后你嘗試啟動(dòng)服務(wù)B(比如sendmail),服務(wù)B和服務(wù)A有消極的依賴關(guān)系,那么當(dāng)你啟動(dòng)服務(wù)B的時(shí)候,服務(wù)A會(huì)自動(dòng)被停止。
注:sendmail和postfix都是郵件服務(wù),之間存在消極的依賴關(guān)系。
TARGET
Systemd上使用target來模仿以前的運(yùn)行級(jí)別的概念。不過要注意,這只是模仿,并不代表完全一樣。target可以看作是一系列的unit的集合從而實(shí)現(xiàn)某個(gè)運(yùn)行級(jí)別的功能。并且這些target之間會(huì)存在一個(gè)依賴鏈的關(guān)系。例如想啟動(dòng)圖形界面(graphical.target)的話,就需要啟動(dòng)圖形服務(wù)(gdm.service)或者賬戶服務(wù)(accounts-daemon.service)并且需要激活multi-user.target。同樣地,multi-user.target需要啟動(dòng)網(wǎng)絡(luò)服務(wù)(NetworkManager.service)或者D-Bus(dbus.service)并激活basic.target。basic.target也有自己的依賴。
運(yùn)行級(jí)別和target的對(duì)應(yīng)關(guān)系如下表。
| 運(yùn)行級(jí)別 | Target Units | 描述 |
| 0 | runlevel0.target, poweroff.target | 關(guān)閉系統(tǒng)并關(guān)閉電源 |
| 1 | runlevel1.target, rescue.target | 救援模式 |
| 2 | runlevel2.target, multi-user.target | 非圖形的多用戶模式 |
| 3 | runlevel3.target, multi-user.target | 非圖形的多用戶模式 |
| 4 | runlevel4.target, multi-user.target | 非圖形的多用戶模式 |
| 5 | runlevel5.target, graphical.target | 帶圖形的多用戶模式 |
| 6 | runlevel6.target, reboot.target | 重啟 |
查看、切換運(yùn)行級(jí)別/target的新舊命令如下表所示,應(yīng)盡量避免使用舊的命令。
| 舊命令 | 新命令 | 描述 |
| runlevel | systemctl list-units --type target | 查看當(dāng)前系統(tǒng)運(yùn)行于哪個(gè)target下 |
| telinit runlevel | systemctl isolate name.target | 修改當(dāng)前的target |
查看默認(rèn)target
~]# systemctl get-default graphical.target
這個(gè)值的獲取,其實(shí)是去檢索字符鏈接。
~]# ls -l /etc/systemd/system/default.target lrwxrwxrwx. 1 root root 36 Oct 17 15:06 /etc/systemd/system/default.target -> /lib/systemd/system/graphical.target
查看當(dāng)前target
~]# systemctl list-units --type target UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System bluetooth.target loaded active active Bluetooth cryptsetup.target loaded active active Local Encrypted Volumes getty-pre.target loaded active active Login Prompts (Pre) getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network-pre.target loaded active active Network (Pre) network.target loaded active active Network nfs-client.target loaded active active NFS client services nss-user-lookup.target loaded active active User and Group Name Lookups paths.target loaded active active Paths remote-fs-pre.target loaded active active Remote File Systems (Pre) remote-fs.target loaded active active Remote File Systems rpc_pipefs.target loaded active active rpc_pipefs.target slices.target loaded active active Slices sockets.target loaded active active Sockets sound.target loaded active active Sound Card swap.target loaded active active Swap sysinit.target loaded active active System Initialization timers.target loaded active active Timers
這個(gè)命令查詢出來的,是當(dāng)前已加載并激活的target。那么我們?nèi)绾螐睦锩嬲业疆?dāng)前的target是什么呢?
在bootup(7)的man手冊(cè)中有描述,并不是所有的unit都是并行啟動(dòng)的,局部并行,整體依然是有先后次序之分的。例如:
sysinit.target --> basic.target --> multi-user.target --> graphical.target
rescue.target和emergency.target應(yīng)該都是單獨(dú)出現(xiàn),也就是說:
見到rescue.target或者emergency.target或者graphical.target,那么就是對(duì)應(yīng)的target,這三者之間不會(huì)有并存的關(guān)系。
見到multi-user.target,就看看有沒有g(shù)raphical.target,沒有的話那就是multi-user.target。
設(shè)置默認(rèn)target
~]# systemctl set-default multi-user.target Removed symlink /etc/systemd/system/default.target. Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
修改當(dāng)前的target
類似于以前的切換運(yùn)行級(jí)別。
~]# systemctl isolate multi-user.target
執(zhí)行了該命令以后,我在Xshell的終端不會(huì)斷開,不過VMware中的虛擬機(jī)已經(jīng)退出了GUI進(jìn)入了CLI。
切換救援(rescue)模式
當(dāng)正常的系統(tǒng)啟動(dòng)流程失敗的時(shí)候,可以進(jìn)入救援模式。救援模式是一種單用戶的模式,用于讓用戶修復(fù)系統(tǒng)。在救援模式中,OS嘗試掛載所有的文件系統(tǒng)并啟動(dòng)一些重要的系統(tǒng)服務(wù),但它不會(huì)激活網(wǎng)絡(luò)服務(wù)也只允許單用戶同時(shí)登錄。類似于以前的單用戶模式。
~]# systemctl rescue
切換至救援模式以后,Xshell終端全部退出并無法登陸,并收到廣播通知。
Broadcast message from root@c7-server on pts/1 (Fri 2019-11-22 17:14:20 CST): The system is going down to rescue mode NOW!
如果管理員不想讓用戶收到這個(gè)通知,可以使用--no-wall選項(xiàng)。
VMware控制臺(tái)退出登錄并要求root密碼重新登錄。
也可以使用isolate子命令切換至救援模式,但是isolate的方式,不會(huì)向其他用戶發(fā)送切換救援模式的通知。
~]# systemctl isolate recue.target
切換緊急(emergency)模式
緊急模式是最小化的系統(tǒng)環(huán)境,相比救援模式,它所提供的服務(wù)就更少了,僅用于當(dāng)進(jìn)入救援模式都失敗的時(shí)候。
緊急模式中,僅以只讀的方式掛載根文件系統(tǒng),其他的所有本地文件系統(tǒng)均不掛載,不會(huì)激活網(wǎng)絡(luò)服務(wù),只啟動(dòng)少許基本服務(wù),需要root密碼。
同樣也支持isoloate切換方式和--no-walls選項(xiàng)。同樣會(huì)退出Xshell的終端,僅在VMware控制臺(tái)允許登錄。因此就不截圖了,貼命令即可。
~]# systemctl emergency ~]# systemctl emergency --no-walls ~]# systemctl isolate emergency.target
電源管理
在systemd中使用systemctl統(tǒng)一了電源管理,新舊命令對(duì)照表如下:
| 舊命令 | 新命令 | 描述 |
| halt | systemctl halt | 停止系統(tǒng) |
| poweroff | systemctl poweroff | 關(guān)機(jī) |
| reboot | systemctl reboot | 重啟 |
| pm-suspend | systemctl suspend | 懸掛系統(tǒng) |
| pm-hibernate | systemctl hibernate | 休眠系統(tǒng) |
| pm-suspend-hybrid | systemctl hybrid-sleep | 休眠并懸掛系統(tǒng) |
關(guān)機(jī)
在Linux中,關(guān)閉系統(tǒng)指的是halt,它會(huì)停止所有的進(jìn)程以及CPU,但是并沒有關(guān)閉掉電源。而poweroff則比較接近于我們所理解的關(guān)機(jī)。
如果在VMware中halt了一個(gè)系統(tǒng),那么它會(huì)提示你需要手工關(guān)閉計(jì)算機(jī)的電源才可完成關(guān)機(jī)。而poweroff則不用。
因此在Linux環(huán)境下的關(guān)機(jī),應(yīng)該是使用poweroff來取代halt。
正確關(guān)機(jī):
~]# systemctl poweroff
同樣,關(guān)機(jī)命令會(huì)向系統(tǒng)中的用戶發(fā)送消息,支持--no-wall選項(xiàng)不發(fā)送消息。
~]# systemctl poweroff --no-all
關(guān)機(jī)也可以通過shutdown命令。雖然該命令也會(huì)調(diào)用systemctl來完成關(guān)機(jī),但是它支持延時(shí)關(guān)機(jī)和取消延時(shí)關(guān)機(jī)。
~]# shutdown --poweroff hh:mm ~]# shutdown --halt +m ~]# shutdown -c
時(shí)間的參數(shù),可以修改為now,等同于+0,表示立即關(guān)機(jī)。
重啟
~]# systemctl reboot ~]# systemctl reboot --no-wall
懸掛和休眠
懸掛(suspend)指的是將系統(tǒng)的運(yùn)行狀態(tài)保存在內(nèi)存中同時(shí)伴隨內(nèi)存模塊異常,并關(guān)閉機(jī)器中的大部分設(shè)備。當(dāng)用戶回到計(jì)算機(jī)面前時(shí),可以從內(nèi)存中恢復(fù)。由于是從內(nèi)存中恢復(fù)并且避免了再一次引導(dǎo)系統(tǒng),因此它的恢復(fù)速度比休眠(hibernation)要快。
如果在懸掛期間電源出現(xiàn)故障,那么系統(tǒng)的狀態(tài)就會(huì)丟失了。
~]# systemctl suspend
休眠(hibernate)和懸掛的作用相似,都是保存系統(tǒng)的狀態(tài)避免了再次重新引導(dǎo)系統(tǒng),區(qū)別在于休眠是將系統(tǒng)的狀態(tài)保存在磁盤中。因此其恢復(fù)系統(tǒng)的速度較慢。
~]# systemctl hibernate
還有一個(gè)休眠并懸掛系統(tǒng)。
~]# systemctl hybrid-sleep
感覺作為運(yùn)維,休眠和懸掛應(yīng)該是不怎么會(huì)在服務(wù)器上所使用的,因此了解下常見的關(guān)機(jī)和重啟操作即可。
創(chuàng)建和修改unit文件
Unit文件存在于文章開頭處提到的三個(gè)目錄,其中“/etc/systemd/system/”目錄是留給管理員自定義的,因此我們自定義的unit文件建議放該目錄下。
Unit文件的文件名:
unit_name.type_extension
unit名和類型都是可替換的,合在一起叫做完整(full)的unit文件名。
例如sshd有兩個(gè)常見的unit文件:sshd.service和sshd.socket。
如果我們想對(duì)一個(gè)unit做選項(xiàng)補(bǔ)充的話,可以新增一個(gè)“.d”目錄并在其下創(chuàng)建補(bǔ)充的配置文件。例如當(dāng)我們想為sshd.service增加自定義的配置選項(xiàng)時(shí),可以創(chuàng)建sshd.service.d/custom.conf配置文件。詳見文檔。
另外,還可以存在“sshd.service.wants/”和“sshd.service.requires/”目錄,這些目錄下都是字符鏈接文件,鏈接到其他的unit文件,以此來決定sshd.service的依賴關(guān)系。字符鏈接會(huì)自動(dòng)產(chǎn)生,也可人為創(chuàng)建。詳見文檔。
了解unit文件的結(jié)構(gòu)
Unit文件由典型的三部分構(gòu)成:
- [Unit]:包含通用的選項(xiàng),不受unit類型所影響。這部分主要提供了unit的簡(jiǎn)單描述信息,指定其行為,定義其依賴關(guān)系。
- [unit type]:這部分的選項(xiàng),是和unit類型相關(guān)的。即如果是.service類的unit,就有其相關(guān)的特定選項(xiàng)。
- [Install]:在通過systemctl enable或者disable的時(shí)候,所涉及到的選項(xiàng)。
~]# man -k systemd ... systemd.scope (5) - Scope unit configuration systemd.service (5) - Service unit configuration systemd.slice (5) - Slice unit configuration systemd.snapshot (5) - Snapshot unit configuration systemd.socket (5) - Socket unit configuration ... systemd.swap (5) - Swap unit configuration systemd.target (5) - Target unit configuration ...
當(dāng)編輯或者新建了unit的文件,需要使用該命令重載systemd,使其知曉。
~]# systemctl daemon-reload
總結(jié)
最后對(duì)于unit文件的具體描述比較少,在初級(jí)運(yùn)維的時(shí)候可能就夠用了。但是在慢慢深入后,對(duì)于系統(tǒng)的排錯(cuò)或者需要開發(fā)服務(wù)的時(shí)候,就需要來了解這塊的內(nèi)容了,到時(shí)候若有遇到再來補(bǔ)充。
本文名稱:CentOS7上的系統(tǒng)管理之:Systemd和systemctl
當(dāng)前鏈接:http://www.dlmjj.cn/article/dhdpsgc.html


咨詢
建站咨詢
