也許你配置過Windows開機啟動的服務,其中有些服務在日常的管理工作中用不到,我們就要把它停止,一來可以節省資源,二來可以減少安全隱患。在Linux上同樣也有相關的工具來管理系統的服務。
14.6.1 chkconfig服務管理工具
早期的CentOS 6上的服務管理工具為chkconfig,Linux系統所有的預設服務都可以通過查看/etc/init.d/目錄得到,如下所示:
# ls /etc/init.d/ functions README只有屈指可數的幾個文件,這是因為從CentOS 7起開始已經不再延續CentOS 6版本的服務管理方案了。但是我們依然可以繼續使用chkconfig這個命令。系統的預設服務都可以通過這樣的命令實現:service 服務名 start|stop|restart。這里的服務名就是/etc/init.d/目錄下的這些文件了。使用chkconfig啟動某服務除了可以使用命令service xxx?start外,還可以使用命令/etc/init.d/xxx?start。 我們可以使用命令chkconfig --list列出所有的服務及其每個級別的開啟狀態,如下所示:
# chkconfig --list注:該輸出結果只顯示 SysV 服務,并不包含原生 systemd 服務。SysV 配置數據可能被原生 systemd 配置覆蓋。要列出 systemd 服務,請執行 'systemctl list-unit-files'。查看在具體 target 啟用的服務請執行
'systemctl list-dependencies [target]'。在這里也會看到一個提示,它提示我們該命令輸出的內容并沒有包含Rocky?8的原生systemd服務,而這里僅僅列出來SysV服務。這也是/etc/init.d/目錄下面只有一兩個啟動腳本的根本原因。也就是說,早期CentOS版本(7之前)采用的服務管理都是SysV,而從7開始換成了systemd。 Chkconfig列出來的服務,有7個運行級別(數字0~6),其為系統啟動級別(CentOS 7之前版本的用法,而從CentOS 7開始已經不再嚴格區分級別的概念了)。其中0作為shutdown動作,1作為重啟至單用戶模式,6為重啟。在一般的Linux系統實現中,都使用了2、3、4、5幾個級別。在CentOS系統中,2表示無NFS支持的多用戶模式,3表示完全多用戶模式(也是最常用的級別),4保留給用戶自定義,5表示圖形登錄方式?,F在我們只是看到了各服務在每個級別下的開啟狀態,那么如何去更改某級別下的開啟狀態呢?
# chkconfig --level 3 xxx off這里用--level指定級別,后面xxx是服務名,然后是off或者on。選項--level后面還可以指定多個級別,如下所示:
# chkconfig --level 345 xxx off另外還可以省略級別,默認是針對級別2、3、4和5操作的,如下所示:
# chkconfig xxx onChkconfig還有一個功能,就是可以把某個服務加入系統服務或者刪除,即可以使用“chkconfig --add 服務名“或者“chkconfig --del?服務名“這樣的形式,并且可以在chkconfig --list的結果中查找到。
# chkconfig --del xxx # chkconfig --add xxx這個功能常用于把自定義的啟動腳本加入到系統服務當中。關于chkconfig工具,阿銘就先介紹這么多,畢竟systemd才是本書的主角。 14.6.2 systemd服務管理 上一節阿銘提到過,從CentOS 7開始不使用SysV而改為systemd了,這是因為systemd支持多個服務并發啟動,而SysV只能一個一個地啟動,這樣最終導致的結果是systemd方式啟動會快很多。但畢竟阿銘使用CentOS很多年,突然這樣一變化還是有點不太習慣,接下來的知識點也會讓你覺得systemd有點復雜。我們不妨對比著chkconfig工具來學習一下systemd。首先是列出系統所有的服務,如下所示:
# 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>太多了,阿銘僅僅列出來一部分。那這些服務對應的啟動腳本文件在哪里呢?
# 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文件同樣很多,阿銘僅僅列出來一部分。你會發現這個目錄下面的文件有點奇怪,有的是目錄,有的是文件,有的以.service為后綴,有的以.target為后綴,當然還有其他的格式,這些東西到底是什么?有沒有不知所以的感覺?其實阿銘和你一樣,有點暈暈的,還是先來看與服務相關的知識點吧,下面是阿銘整理的一些常用命令:
# systemctl enable crond.service #讓某個服務開機啟動(.service可以省略) #?systemctl?disable?crond.service? #不讓開機啟動 #?systemctl?status?crond.service? #查看服務狀態 #?systemctl?start?crond.service? #啟動某個服務 #?systemctl?stop?crond.service??#停止某個服務 #?systemctl?restart?crond.service?#重啟某個服務 #?systemctl?is-enabled?crond? #查看某個服務是否開機啟動其實關于服務的用法還有不少,但阿銘認為有上面這些就夠用了。下面再介紹兩個概念,等你看完這部分內容,對于上面不知所以的文件就會有些眉目了。我們先來說一個很重要的概念——unit。剛剛阿銘執行命令ls /usr/lib/systemd/system的時候,下面有很多文件,其實可以把它們歸類為下面這幾大類。
service:系統服務。
target:多個unit組成的組。
device:硬件設備。
mount:文件系統掛載點。
automount:自動掛載點。
path:文件或路徑。
scope:不是由systemd啟動的外部進程。
slice:進程組。
snapshot:systemd快照。
socket:進程間通信的套接字。
swap:swap文件。
timer:定時器。 ?
以上每種類型的文件都為一個unit,正是這些unit才組成了系統的各個資源(各個服務、各個設備等)。下面阿銘給大家介紹幾個和unit相關的命令:
# systemctl list-units # 列出正在運行(active)的unit #?systemctl?list-units?--all?#?列出所有的unit(包括失敗的、inactive的) #?systemctl?list-units?--all?--state=inactive?#?列出所有inactive的unit #?systemctl?list-units?--all?--type=service?#列出所有狀態的service #?systemctl?list-units?--type=service?#列出狀態為active的service #?systemctl?is-active?crond.service?#查看某個unit是否active關于unit,阿銘不再多解釋,畢竟我們平時在工作中幾乎用不到它。下面再來看另外一個概念——target。target類似于CentOS 6里面的啟動級別,但target支持多個target同時啟動。target其實是多個unit的組合,系統啟動說白了就是啟動多個unit,為了管理方便,就使用target來管理這些unit。查看當前系統的所有 target:
# systemctl list-unit-files --type=target // 注意和前面命令的區分 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查看一個 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因為內容太長,阿銘并沒有全部列出來,你可以在自己的CentOS 8上全部列出來,顯示效果還是很不錯的,它以樹形的方式列出來,一目了然。下面還有幾個關于target的命令:
# systemctl get-default #查看系統默認的target multi-user.target #?systemctl?set-default?multi-user.target? #設置默認的target上面提到的multi-user.target等同于CentOS 6的運行級別3,其實還有其他幾個target對應0~6運行級別,如下表所示。
介紹完了unit和target,阿銘再帶著你一起梳理一下service、unit以及target之間的聯系: (1) 一個service屬于一種unit; (2) 多個unit一起組成了一個target; (3) 一個target里面包含了多個service,你可以查看文件/usr/lib/systemd/system/sshd.service里面[install]部分的內容,它就定義了該service屬于哪一個target。
編輯:黃飛
評論