也許你配置過Windows開機(jī)啟動(dòng)的服務(wù),其中有些服務(wù)在日常的管理工作中用不到,我們就要把它停止,一來可以節(jié)省資源,二來可以減少安全隱患。在Linux上同樣也有相關(guān)的工具來管理系統(tǒng)的服務(wù)。
14.6.1 chkconfig服務(wù)管理工具
早期的CentOS 6上的服務(wù)管理工具為chkconfig,Linux系統(tǒng)所有的預(yù)設(shè)服務(wù)都可以通過查看/etc/init.d/目錄得到,如下所示:
# ls /etc/init.d/ functions README只有屈指可數(shù)的幾個(gè)文件,這是因?yàn)閺腃entOS 7起開始已經(jīng)不再延續(xù)CentOS 6版本的服務(wù)管理方案了。但是我們依然可以繼續(xù)使用chkconfig這個(gè)命令。系統(tǒng)的預(yù)設(shè)服務(wù)都可以通過這樣的命令實(shí)現(xiàn):service 服務(wù)名 start|stop|restart。這里的服務(wù)名就是/etc/init.d/目錄下的這些文件了。使用chkconfig啟動(dòng)某服務(wù)除了可以使用命令service xxx?start外,還可以使用命令/etc/init.d/xxx?start。 我們可以使用命令chkconfig --list列出所有的服務(wù)及其每個(gè)級(jí)別的開啟狀態(tài),如下所示:
# chkconfig --list注:該輸出結(jié)果只顯示 SysV 服務(wù),并不包含原生 systemd 服務(wù)。SysV 配置數(shù)據(jù)可能被原生 systemd 配置覆蓋。要列出 systemd 服務(wù),請執(zhí)行 'systemctl list-unit-files'。查看在具體 target 啟用的服務(wù)請執(zhí)行
'systemctl list-dependencies [target]'。在這里也會(huì)看到一個(gè)提示,它提示我們該命令輸出的內(nèi)容并沒有包含Rocky?8的原生systemd服務(wù),而這里僅僅列出來SysV服務(wù)。這也是/etc/init.d/目錄下面只有一兩個(gè)啟動(dòng)腳本的根本原因。也就是說,早期CentOS版本(7之前)采用的服務(wù)管理都是SysV,而從7開始換成了systemd。 Chkconfig列出來的服務(wù),有7個(gè)運(yùn)行級(jí)別(數(shù)字0~6),其為系統(tǒng)啟動(dòng)級(jí)別(CentOS 7之前版本的用法,而從CentOS 7開始已經(jīng)不再嚴(yán)格區(qū)分級(jí)別的概念了)。其中0作為shutdown動(dòng)作,1作為重啟至單用戶模式,6為重啟。在一般的Linux系統(tǒng)實(shí)現(xiàn)中,都使用了2、3、4、5幾個(gè)級(jí)別。在CentOS系統(tǒng)中,2表示無NFS支持的多用戶模式,3表示完全多用戶模式(也是最常用的級(jí)別),4保留給用戶自定義,5表示圖形登錄方式?,F(xiàn)在我們只是看到了各服務(wù)在每個(gè)級(jí)別下的開啟狀態(tài),那么如何去更改某級(jí)別下的開啟狀態(tài)呢?
# chkconfig --level 3 xxx off這里用--level指定級(jí)別,后面xxx是服務(wù)名,然后是off或者on。選項(xiàng)--level后面還可以指定多個(gè)級(jí)別,如下所示:
# chkconfig --level 345 xxx off另外還可以省略級(jí)別,默認(rèn)是針對級(jí)別2、3、4和5操作的,如下所示:
# chkconfig xxx onChkconfig還有一個(gè)功能,就是可以把某個(gè)服務(wù)加入系統(tǒng)服務(wù)或者刪除,即可以使用“chkconfig --add 服務(wù)名“或者“chkconfig --del?服務(wù)名“這樣的形式,并且可以在chkconfig --list的結(jié)果中查找到。
# chkconfig --del xxx # chkconfig --add xxx這個(gè)功能常用于把自定義的啟動(dòng)腳本加入到系統(tǒng)服務(wù)當(dāng)中。關(guān)于chkconfig工具,阿銘就先介紹這么多,畢竟systemd才是本書的主角。 14.6.2 systemd服務(wù)管理 上一節(jié)阿銘提到過,從CentOS 7開始不使用SysV而改為systemd了,這是因?yàn)閟ystemd支持多個(gè)服務(wù)并發(fā)啟動(dòng),而SysV只能一個(gè)一個(gè)地啟動(dòng),這樣最終導(dǎo)致的結(jié)果是systemd方式啟動(dòng)會(huì)快很多。但畢竟阿銘使用CentOS很多年,突然這樣一變化還是有點(diǎn)不太習(xí)慣,接下來的知識(shí)點(diǎn)也會(huì)讓你覺得systemd有點(diǎn)復(fù)雜。我們不妨對比著chkconfig工具來學(xué)習(xí)一下systemd。首先是列出系統(tǒng)所有的服務(wù),如下所示:
# systemctl list-units --all --type=service UNIT LOAD ACTIVE SUB DESCRIPTION atd.service loaded active running Job spooling tools auditd.service loaded active running Security Auditing Service chronyd.service loaded active running NTP client/server ● cloud-init-local.service not-found inactive dead cloud-init-local.service cpupower.service loaded inactive dead Configure CPU power relat> crond.service loaded active running Command Scheduler dbus.service loaded active running D-Bus System Message Bus ● display-manager.service not-found inactive dead display-manager.service dnf-makecache.service loaded inactive dead dnf makecache dracut-cmdline.service loaded inactive dead dracut cmdline hook dracut-initqueue.service loaded inactive dead dracut initqueue hook dracut-mount.service loaded inactive dead dracut mount hook dracut-pre-mount.service loaded inactive dead dracut pre-mount hook dracut-pre-pivot.service loaded inactive dead dracut pre-pivot and clea> dracut-pre-trigger.service loaded inactive dead dracut pre-trigger hook dracut-pre-udev.service loaded inactive dead dracut pre-udev hook dracut-shutdown.service loaded active exited Restore /run/initramfs on> ebtables.service loaded inactive dead Ethernet Bridge Filtering> emergency.service loaded inactive dead Emergency Shell firewalld.service loaded active running firewalld - dynamic firew> getty@tty1.service loaded active running Getty on tty1 import-state.service loaded active exited Import network configurat> initrd-cleanup.service loaded inactive dead Cleaning Up and Shutting > initrd-parse-etc.service loaded inactive dead Reload Configuration from> initrd-switch-root.service loaded inactive dead Switch Root initrd-udevadm-cleanup-db.service loaded inactive dead Cleanup udevd DB ip6tables.service loaded inactive dead IPv6 firewall with ip6tab>太多了,阿銘僅僅列出來一部分。那這些服務(wù)對應(yīng)的啟動(dòng)腳本文件在哪里呢?
# ls /usr/lib/systemd/system/ arp-ethers.service multi-user.target.wants sysinit.target.wants atd.service NetworkManager-dispatcher.service sys-kernel-config.mount auditd.service NetworkManager.service sys-kernel-debug.mount autovt@.service NetworkManager-wait-online.service syslog.socket basic.target network-online.target syslog.target.wants basic.target.wants network-pre.target systemd-ask-password-console.path bluetooth.target network.target systemd-ask-password-console.service文件同樣很多,阿銘僅僅列出來一部分。你會(huì)發(fā)現(xiàn)這個(gè)目錄下面的文件有點(diǎn)奇怪,有的是目錄,有的是文件,有的以.service為后綴,有的以.target為后綴,當(dāng)然還有其他的格式,這些東西到底是什么?有沒有不知所以的感覺?其實(shí)阿銘和你一樣,有點(diǎn)暈暈的,還是先來看與服務(wù)相關(guān)的知識(shí)點(diǎn)吧,下面是阿銘整理的一些常用命令:
# systemctl enable crond.service #讓某個(gè)服務(wù)開機(jī)啟動(dòng)(.service可以省略) #?systemctl?disable?crond.service? #不讓開機(jī)啟動(dòng) #?systemctl?status?crond.service? #查看服務(wù)狀態(tài) #?systemctl?start?crond.service? #啟動(dòng)某個(gè)服務(wù) #?systemctl?stop?crond.service??#停止某個(gè)服務(wù) #?systemctl?restart?crond.service?#重啟某個(gè)服務(wù) #?systemctl?is-enabled?crond? #查看某個(gè)服務(wù)是否開機(jī)啟動(dòng)其實(shí)關(guān)于服務(wù)的用法還有不少,但阿銘認(rèn)為有上面這些就夠用了。下面再介紹兩個(gè)概念,等你看完這部分內(nèi)容,對于上面不知所以的文件就會(huì)有些眉目了。我們先來說一個(gè)很重要的概念——unit。剛剛阿銘執(zhí)行命令ls /usr/lib/systemd/system的時(shí)候,下面有很多文件,其實(shí)可以把它們歸類為下面這幾大類。
service:系統(tǒng)服務(wù)。
target:多個(gè)unit組成的組。
device:硬件設(shè)備。
mount:文件系統(tǒng)掛載點(diǎn)。
automount:自動(dòng)掛載點(diǎn)。
path:文件或路徑。
scope:不是由systemd啟動(dòng)的外部進(jìn)程。
slice:進(jìn)程組。
snapshot:systemd快照。
socket:進(jìn)程間通信的套接字。
swap:swap文件。
timer:定時(shí)器。 ?
以上每種類型的文件都為一個(gè)unit,正是這些unit才組成了系統(tǒng)的各個(gè)資源(各個(gè)服務(wù)、各個(gè)設(shè)備等)。下面阿銘給大家介紹幾個(gè)和unit相關(guān)的命令:
# systemctl list-units # 列出正在運(yùn)行(active)的unit #?systemctl?list-units?--all?#?列出所有的unit(包括失敗的、inactive的) #?systemctl?list-units?--all?--state=inactive?#?列出所有inactive的unit #?systemctl?list-units?--all?--type=service?#列出所有狀態(tài)的service #?systemctl?list-units?--type=service?#列出狀態(tài)為active的service #?systemctl?is-active?crond.service?#查看某個(gè)unit是否active關(guān)于unit,阿銘不再多解釋,畢竟我們平時(shí)在工作中幾乎用不到它。下面再來看另外一個(gè)概念——target。target類似于CentOS 6里面的啟動(dòng)級(jí)別,但target支持多個(gè)target同時(shí)啟動(dòng)。target其實(shí)是多個(gè)unit的組合,系統(tǒng)啟動(dòng)說白了就是啟動(dòng)多個(gè)unit,為了管理方便,就使用target來管理這些unit。查看當(dāng)前系統(tǒng)的所有 target:
# systemctl list-unit-files --type=target // 注意和前面命令的區(qū)分 UNIT FILE STATE basic.target static bluetooth.target static cryptsetup-pre.target static cryptsetup.target static ctrl-alt-del.target disabled default.target indirect emergency.target static exit.target disabled final.target static getty-pre.target static getty.target static graphical.target static halt.target disabled hibernate.target static hybrid-sleep.target static initrd-fs.target static查看一個(gè) target 包含的所有 unit,如下所示:
# systemctl list-dependencies multi-user.target multi-user.target ● ├─atd.service ● ├─auditd.service ● ├─chronyd.service ● ├─crond.service ● ├─dbus.service ● ├─dnf-makecache.timer ● ├─firewalld.service ● ├─irqbalance.service ● ├─kdump.service ● ├─NetworkManager.service ● ├─plymouth-quit-wait.service ● ├─plymouth-quit.service ● ├─rsyslog.service ● ├─sshd.service ● ├─sssd.service因?yàn)閮?nèi)容太長,阿銘并沒有全部列出來,你可以在自己的CentOS 8上全部列出來,顯示效果還是很不錯(cuò)的,它以樹形的方式列出來,一目了然。下面還有幾個(gè)關(guān)于target的命令:
# systemctl get-default #查看系統(tǒng)默認(rèn)的target multi-user.target #?systemctl?set-default?multi-user.target? #設(shè)置默認(rèn)的target上面提到的multi-user.target等同于CentOS 6的運(yùn)行級(jí)別3,其實(shí)還有其他幾個(gè)target對應(yīng)0~6運(yùn)行級(jí)別,如下表所示。
介紹完了unit和target,阿銘再帶著你一起梳理一下service、unit以及target之間的聯(lián)系: (1) 一個(gè)service屬于一種unit; (2) 多個(gè)unit一起組成了一個(gè)target; (3) 一個(gè)target里面包含了多個(gè)service,你可以查看文件/usr/lib/systemd/system/sshd.service里面[install]部分的內(nèi)容,它就定義了該service屬于哪一個(gè)target。
編輯:黃飛
評(píng)論