<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 17.2 通過 systemctl 管理服務 基本上, systemd 這個啟動服務的機制,主要是通過一只名為 systemctl 的指令來處理的!跟以前 systemV 需要 service / chkconfig / setup / init 等指令來協助不同, systemd 就是僅有 systemctl 這個指令來處理而已呦!所以全部的行為都得要使用 systemctl 的意思啦!有沒有很難?其實習慣了之后, 鳥哥是覺得 systemctl 還挺好用的! ^_^ ### 17.2.1 通過 systemctl 管理單一服務 (service unit) 的啟動/開機啟動與觀察狀態 在開始這個小節之前,鳥哥要先來跟大家報告一下,那就是:一般來說,服務的啟動有兩個階段,一個是“開機的時候設置要不要啟動這個服務”, 以及“你現在要不要啟動這個服務”,這兩者之間有很大的差異喔!舉個例子來說,假如我們現在要“立刻取消 atd 這個服務”時,正規的方法 (不要用 kill) 要怎么處理? ``` [root@study ~]# systemctl [command] [unit] command 主要有: start :立刻啟動后面接的 unit stop :立刻關閉后面接的 unit restart :立刻關閉后啟動后面接的 unit,亦即執行 stop 再 start 的意思 reload :不關閉后面接的 unit 的情況下,重新載入配置文件,讓設置生效 enable :設置下次開機時,后面接的 unit 會被啟動 disable :設置下次開機時,后面接的 unit 不會被啟動 status :目前后面接的這個 unit 的狀態,會列出有沒有正在執行、開機默認執行否、登錄等信息等! is-active :目前有沒有正在運行中 is-enable :開機時有沒有默認要啟用這個 unit 范例一:看看目前 atd 這個服務的狀態為何? [root@study ~]# systemctl status atd.service atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled) Active: active (running) since Mon 2015-08-10 19:17:09 CST; 5h 42min ago Main PID: 1350 (atd) CGroup: /system.slice/atd.service └─1350 /usr/sbin/atd -f Aug 10 19:17:09 study.centos.vbird systemd[1]: Started Job spooling tools. # 重點在第二、三行喔~ # Loaded:這行在說明,開機的時候這個 unit 會不會啟動,enabled 為開機啟動,disabled 開機不會啟動 # Active:現在這個 unit 的狀態是正在執行 (running) 或沒有執行 (dead) # 后面幾行則是說明這個 unit 程序的 PID 狀態以及最后一行顯示這個服務的登錄文件信息! # 登錄文件信息格式為:“時間” “訊息發送主機” “哪一個服務的訊息” “實際訊息內容” # 所以上面的顯示訊息是:這個 atd 默認開機就啟動,而且現在正在運行的意思! 范例二:正常關閉這個 atd 服務 [root@study ~]# systemctl stop atd.service [root@study ~]# systemctl status atd.service atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled) Active: inactive (dead) since Tue 2015-08-11 01:04:55 CST; 4s ago Process: 1350 ExecStart=/usr/sbin/atd -f $OPTS (code=exited, status=0/SUCCESS) Main PID: 1350 (code=exited, status=0/SUCCESS) Aug 10 19:17:09 study.centos.vbird systemd[1]: Started Job spooling tools. Aug 11 01:04:55 study.centos.vbird systemd[1]: Stopping Job spooling tools... Aug 11 01:04:55 study.centos.vbird systemd[1]: Stopped Job spooling tools. # 目前這個 unit 下次開機還是會啟動,但是現在是沒在運行的狀態中!同時, # 最后兩行為新增加的登錄訊息,告訴我們目前的系統狀態喔! ``` 上面的范例中,我們已經關掉了 atd 啰!這樣作才是對的!不應該使用 kill 的方式來關掉一個正常的服務喔!否則 systemctl 會無法繼續監控該服務的! 那就比較麻煩。而使用 systemtctl status atd 的輸出結果中,第 2, 3 兩行很重要~因為那個是告知我們該 unit 下次開機會不會默認啟動,以及目前啟動的狀態! 相當重要!最下面是這個 unit 的登錄文件~如果你的這個 unit 曾經出錯過,觀察這個地方也是相當重要的! 那么現在問個問題,你的 atd 現在是關閉的,未來重新開機后,這個服務會不會再次的啟動呢?答案是?當然會! 因為上面出現的第二行中,它是 enabled 的啊!這樣理解所謂的“現在的狀態”跟“開機時默認的狀態”兩者的差異了嗎? 好!再回到 systemctl status atd.service 的第三行,不是有個 Active 的 daemon 現在狀態嗎?除了 running 跟 dead 之外, 有沒有其他的狀態呢?有的~基本上有幾個常見的狀態: * active (running):正有一只或多只程序正在系統中執行的意思,舉例來說,正在執行中的 vsftpd 就是這種模式。 * active (exited):僅執行一次就正常結束的服務,目前并沒有任何程序在系統中執行。 舉例來說,開機或者是掛載時才會進行一次的 quotaon 功能,就是這種模式! quotaon 不須一直執行~只須執行一次之后,就交給文件系統去自行處理啰!通常用 bash shell 寫的小型服務,大多是屬于這種類型 (無須常駐內存)。 * active (waiting):正在執行當中,不過還再等待其他的事件才能繼續處理。舉例來說,打印的佇列相關服務就是這種狀態! 雖然正在啟動中,不過,也需要真的有佇列進來 (打印工作) 這樣他才會繼續喚醒打印機服務來進行下一步打印的功能。 * inactive:這個服務目前沒有運行的意思。 既然 daemon 目前的狀態就有這么多種了,那么 daemon 的默認狀態有沒有可能除了 enable/disable 之外,還有其他的情況呢?當然有! * enabled:這個 daemon 將在開機時被執行 * disabled:這個 daemon 在開機時不會被執行 * static:這個 daemon 不可以自己啟動 (enable 不可),不過可能會被其他的 enabled 的服務來喚醒 (相依屬性的服務) * mask:這個 daemon 無論如何都無法被啟動!因為已經被強制注銷 (非刪除)。可通過 systemctl unmask 方式改回原本狀態 * 服務啟動/關閉與觀察的練習 問題:找到系統中名為 chronyd 的服務,觀察此服務的狀態,觀察完畢后,將此服務設置為: 1)開機不會啟動 2)現在狀況是關閉的情況!回答:我們直接使用指令的方式來查詢與設置看看: ``` # 1\. 觀察一下狀態,確認是否為關閉/未啟動呢? [root@study ~]# systemctl status chronyd.service hronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled) Active: active (running) since Mon 2015-08-10 19:17:07 CST; 24h ago .....(下面省略)..... # 2\. 由上面知道目前是啟動的,因此立刻將他關閉,同時開機不會啟動才行! [root@study ~]# systemctl stop chronyd.service [root@study ~]# systemctl disable chronyd.service rm '/etc/systemd/system/multi-user.target.wants/chronyd.service' # 看得很清楚~其實就是從 /etc/systemd/system 下面刪除一條鏈接文件而已~ [root@study ~]# systemctl status chronyd.service chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled) Active: inactive (dead) # 如此則將 chronyd 這個服務完整的關閉了! ``` 上面是一個很簡單的練習,你先不要知道 chronyd 是啥東西,只要知道通過這個方式,可以將一個服務關閉就是了!好!那再來一個練習, 看看有沒有問題呢? 問題:因為我根本沒有打印機安裝在服務器上,目前也沒有網絡打印機,因此我想要將 cups 服務整個關閉,是否可以呢?回答:同樣的,眼見為憑,我們就動手作看看: ``` # 1\. 先看看 cups 的服務是開還是關? [root@study ~]# systemctl status cups.service cups.service - CUPS Printing Service Loaded: loaded (/usr/lib/systemd/system/cups.service; enabled) Active: inactive (dead) since Tue 2015-08-11 19:19:20 CST; 3h 29min ago # 有趣得很!竟然是 enable 但是卻是 inactive 耶!相當特別! # 2\. 那就直接關閉,同時確認沒有啟動喔! [root@study ~]# systemctl stop cups.service [root@study ~]# systemctl disable cups.service rm '/etc/systemd/system/multi-user.target.wants/cups.path' rm '/etc/systemd/system/sockets.target.wants/cups.socket' rm '/etc/systemd/system/printer.target.wants/cups.service' # 也是非常特別!竟然一口氣取消掉三個鏈接文件!也就是說,這三個文件可能是有相依性的問題喔! [root@study ~]# netstat -tlunp &#124; grep cups # 現在應該不會出現任何數據!因為根本沒有 cups 的任務在執行當中~所以不會有 port 產生 # 3\. 嘗試啟動 cups.socket 監聽用戶端的需求喔! [root@study ~]# systemctl start cups.socket [root@study ~]# systemctl status cups.service cups.socket cups.path cups.service - CUPS Printing Service Loaded: loaded (/usr/lib/systemd/system/cups.service; disabled) Active: inactive (dead) since Tue 2015-08-11 22:57:50 CST; 3min 41s ago cups.socket - CUPS Printing Service Sockets Loaded: loaded (/usr/lib/systemd/system/cups.socket; disabled) Active: active (listening) since Tue 2015-08-11 22:56:14 CST; 5min ago cups.path - CUPS Printer Service Spool Loaded: loaded (/usr/lib/systemd/system/cups.path; disabled) Active: inactive (dead) # 確定僅有 cups.socket 在啟動,其他的并沒有啟動的狀態! # 4\. 嘗試使用 lp 這個指令來打印看看? [root@study ~]# echo "testing" &#124; lp lp: Error - no default destination available. # 實際上就是沒有打印機!所以有錯誤也沒關系! [root@study ~]# systemctl status cups.service cups.service - CUPS Printing Service Loaded: loaded (/usr/lib/systemd/system/cups.service; disabled) Active: active (running) since Tue 2015-08-11 23:03:18 CST; 34s ago [root@study ~]# netstat -tlunp &#124; grep cups tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 25881/cupsd tcp6 0 0 ::1:631 :::* LISTEN 25881/cupsd # 見鬼!竟然 cups 自動被啟動了!明明我們都沒有驅動他啊!怎么回事啊? ``` 上面這個范例的練習在讓您了解一下,很多服務彼此之間是有相依性的!cups 是一種打印服務,這個打印服務會啟用 port 631 來提供網絡打印機的打印功能。 但是其實我們無須一直啟動 631 端口吧?因此,多了一個名為 cups.socket 的服務,這個服務可以在“用戶有需要打印時,才會主動喚醒 cups.service ”的意思! 因此,如果你僅是 disable/stop cups.service 而忘記了其他兩個服務的話,那么當有用戶向其他兩個 cups.path, cups.socket 提出要求時, cups.service 就會被喚醒!所以,你關掉也沒用! * 強迫服務注銷 (mask) 的練習 比較正規的作法是,要關閉 cups.service 時,連同其他兩個會喚醒 service 的 cups.socket 與 cups.path 通通關閉,那就沒事了! 比較不正規的作法是,那就強迫 cups.service 注銷吧!通過 mask 的方式來將這個服務注銷看看! ``` # 1\. 保持剛剛的狀態,關閉 cups.service,啟動 cups.socket,然后注銷 cups.servcie [root@study ~]# systemctl stop cups.service [root@study ~]# systemctl mask cups.service ln -s '/dev/null' '/etc/systemd/system/cups.service' # 喔耶~其實這個 mask 注銷的動作,只是讓啟動的腳本變成空的設備而已! [root@study ~]# systemctl status cups.service cups.service Loaded: masked (/dev/null) Active: inactive (dead) since Tue 2015-08-11 23:14:16 CST; 52s ago [root@study ~]# systemctl start cups.service Failed to issue method call: Unit cups.service is masked. # 再也無法喚醒! ``` 上面的范例你可以仔細推敲一下~原來整個啟動的腳本配置文件被鏈接到 /dev/null 這個空設備~因此,無論如何你是再也無法啟動這個 cups.service 了! 通過這個 mask 功能,你就可以不必管其他相依服務可能會啟動到這個想要關閉的服務了!雖然是非正規,不過很有效! ^_^ 那如何取消注銷呢?當然就是 unmask 即可啊! ``` [root@study ~]# systemctl unmask cups.service rm '/etc/systemd/system/cups.service' [root@study ~]# systemctl status cups.service cups.service - CUPS Printing Service Loaded: loaded (/usr/lib/systemd/system/cups.service; disabled) Active: inactive (dead) since Tue 2015-08-11 23:14:16 CST; 4min 35s ago # 好佳在有恢復正常! ``` ### 17.2.2 通過 systemctl 觀察系統上所有的服務 上一小節談到的是單一服務的啟動/關閉/觀察,以及相依服務要注銷的功能。那系統上面有多少的服務存在呢?這個時候就得要通過 list-units 及 list-unit-files 來觀察了! 細部的用法如下: ``` [root@study ~]# systemctl [command] [--type=TYPE] [--all] command: list-units :依據 unit 列出目前有啟動的 unit。若加上 --all 才會列出沒啟動的。 list-unit-files :依據 /usr/lib/systemd/system/ 內的文件,將所有文件列表說明。 --type=TYPE:就是之前提到的 unit type,主要有 service, socket, target 等 范例一:列出系統上面有啟動的 unit [root@study ~]# systemctl UNIT LOAD ACTIVE SUB DESCRIPTION proc-sys-fs-binfmt_mis... loaded active waiting Arbitrary Executable File Formats File System sys-devices-pc...:0:1:... loaded active plugged QEMU_HARDDISK sys-devices-pc...0:1-0... loaded active plugged QEMU_HARDDISK sys-devices-pc...0:0-1... loaded active plugged QEMU_DVD-ROM .....(中間省略)..... vsftpd.service loaded active running Vsftpd ftp daemon .....(中間省略)..... cups.socket loaded failed failed CUPS Printing Service Sockets .....(中間省略)..... LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 141 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'. # 列出的項目中,主要的意義是: # UNIT :項目的名稱,包括各個 unit 的類別 (看擴展名) # LOAD :開機時是否會被載入,默認 systemctl 顯示的是有載入的項目而已喔! # ACTIVE :目前的狀態,須與后續的 SUB 搭配!就是我們用 systemctl status 觀察時,active 的項目! # DESCRIPTION :詳細描述啰 # cups 比較有趣,因為剛剛被我們玩過,所以 ACTIVE 竟然是 failed 的喔!被玩死了! ^_^ # 另外,systemctl 都不加參數,其實默認就是 list-units 的意思! 范例二:列出所有已經安裝的 unit 有哪些? [root@study ~]# systemctl list-unit-files UNIT FILE STATE proc-sys-fs-binfmt_misc.automount static dev-hugepages.mount static dev-mqueue.mount static proc-fs-nfsd.mount static .....(中間省略)..... systemd-tmpfiles-clean.timer static 336 unit files listed. ``` 使用 systemctl list-unit-files 會將系統上所有的服務通通列出來~而不像 list-units 僅以 unit 分類作大致的說明。 至于 STATE 狀態就是前兩個小節談到的開機是否會載入的那個狀態項目啰!主要有 enabled / disabled / mask / static 等等。 假設我不想要知道這么多的 unit 項目,我只想要知道 service 這種類別的 daemon 而已,而且不論是否已經啟動,通通要列出來! 那該如何是好? ``` [root@study ~]# systemctl list-units --type=service --all # 只剩下 *.service 的項目才會出現喔! 范例一:查詢系統上是否有以 cpu 為名的服務? [root@study ~]# systemctl list-units --type=service --all &#124; grep cpu cpupower.service loaded inactive dead Configure CPU power related settings # 確實有喔!可以改變 CPU 電源管理機制的服務哩! ``` ### 17.2.3 通過 systemctl 管理不同的操作環境 (target unit) 通過上個小節我們知道系統上所有的 systemd 的 unit 觀察的方式,那么可否列出跟操作界面比較有關的 target 項目呢? 很簡單啊!就這樣搞一下: ``` [root@study ~]# systemctl list-units --type=target --all UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes emergency.target loaded inactive dead Emergency Mode final.target loaded inactive dead Final Step 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 inactive dead Network is Online network.target loaded active active Network nss-user-lookup.target loaded inactive dead 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 rescue.target loaded inactive dead Rescue Mode shutdown.target loaded inactive dead Shutdown 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 syslog.target not-found inactive dead syslog.target time-sync.target loaded inactive dead System Time Synchronized timers.target loaded active active Timers umount.target loaded inactive dead Unmount All Filesystems LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 26 loaded units listed. To show all installed unit files use 'systemctl list-unit-files'. ``` 喔!在我們的 CentOS 7.1 的默認情況下,就有 26 個 target unit 耶!而跟操作界面相關性比較高的 target 主要有下面幾個: * graphical.target:就是文字加上圖形界面,這個項目已經包含了下面的 multi-user.target 項目! * multi-user.target:純文本模式! * rescue.target:在無法使用 root 登陸的情況下,systemd 在開機時會多加一個額外的暫時系統,與你原本的系統無關。這時你可以取得 root 的權限來維護你的系統。 但是這是額外系統,因此可能需要動到 chroot 的方式來取得你原有的系統喔!再后續的章節我們再來談! * emergency.target:緊急處理系統的錯誤,還是需要使用 root 登陸的情況,在無法使用 rescue.target 時,可以嘗試使用這種模式! * shutdown.target:就是關機的流程。 * getty.target:可以設置你需要幾個 tty 之類的,如果想要降低 tty 的項目,可以修改這個東西的配置文件! 正常的模式是 multi-user.target 以及 graphical.target 兩個,救援方面的模式主要是 rescue.target 以及更嚴重的 emergency.target。 如果要修改可提供登陸的 tty 數量,則修改 getty.target 項目。基本上,我們最常使用的當然就是 multi-user 以及 graphical 啰! 那么我如何知道目前的模式是哪一種?又得要如何修改呢?下面來玩一玩吧! ``` [root@study ~]# systemctl [command] [unit.target] 選項與參數: command: get-default :取得目前的 target set-default :設置后面接的 target 成為默認的操作模式 isolate :切換到后面接的模式 范例一:我們的測試機器默認是圖形界面,先觀察是否真為圖形模式,再將默認模式轉為文字界面 [root@study ~]# systemctl get-default graphical.target # 果然是圖形界面喔! [root@study ~]# systemctl set-default multi-user.target [root@study ~]# systemctl get-default multi-user.target 范例二:在不重新開機的情況下,將目前的操作環境改為純文本模式,關掉圖形界面 [root@study ~]# systemctl isolate multi-user.target 范例三:若需要重新取得圖形界面呢? [root@study ~]# systemctl isolate graphical.target ``` 要注意,改變 graphical.target 以及 multi-user.target 是通過 isolate 來處理的!鳥哥剛剛接觸到 systemd 的時候,在 multi-user.target 環境下轉成 graphical.target 時, 可以通過 systemctl start graphical.target 喔!然后鳥哥就以為關閉圖形界面即可回到 multi-user.target 的!但使用 systemctl stop graphical.target 卻完全不理鳥哥~這才發現錯了...在 service 部份用 start/stop/restart 才對,在 target 項目則請使用 isolate (隔離不同的操作模式) 才對! 在正常的切換情況下,使用上述 isolate 的方式即可。不過為了方便起見, systemd 也提供了數個簡單的指令給我們切換操作模式之用喔! 大致上如下所示: ``` [root@study ~]# systemctl poweroff 系統關機 [root@study ~]# systemctl reboot 重新開機 [root@study ~]# systemctl suspend 進入暫停模式 [root@study ~]# systemctl hibernate 進入休眠模式 [root@study ~]# systemctl rescue 強制進入救援模式 [root@study ~]# systemctl emergency 強制進入緊急救援模式 ``` 關機、重新開機、救援與緊急模式這沒啥問題,那么什么是暫停與休眠模式呢? * suspend:暫停模式會將系統的狀態數據保存到內存中,然后關閉掉大部分的系統硬件,當然,并沒有實際關機喔! 當使用者按下喚醒機器的按鈕,系統數據會重內存中回復,然后重新驅動被大部分關閉的硬件,就開始正常運行!喚醒的速度較快。 * hibernate:休眠模式則是將系統狀態保存到硬盤當中,保存完畢后,將計算機關機。當使用者嘗試喚醒系統時,系統會開始正常運行, 然后將保存在硬盤中的系統狀態恢復回來。因為數據是由硬盤讀出,因此喚醒的性能與你的硬盤速度有關。 ### 17.2.4 通過 systemctl 分析各服務之間的相依性 我們在本章一開始談到 systemd 的時候就有談到相依性的問題克服,那么,如何追蹤某一個 unit 的相依性呢? 舉例來說好了,我們怎么知道 graphical.target 會用到 multi-user.target 呢?那 graphical.target 下面還有哪些東西呢? 下面我們就來談一談: ``` [root@study ~]# systemctl list-dependencies [unit] [--reverse] 選項與參數: --reverse :反向追蹤誰使用這個 unit 的意思! 范例一:列出目前的 target 環境下,用到什么特別的 unit [root@study ~]# systemctl get-default multi-user.target [root@study ~]# systemctl list-dependencies default.target ├─abrt-ccpp.service ├─abrt-oops.service ├─vsftpd.service ├─basic.target │ ├─alsa-restore.service │ ├─alsa-state.service .....(中間省略)..... │ ├─sockets.target │ │ ├─avahi-daemon.socket │ │ ├─dbus.socket .....(中間省略)..... │ ├─sysinit.target │ │ ├─dev-hugepages.mount │ │ ├─dev-mqueue.mount .....(中間省略)..... │ └─timers.target │ └─systemd-tmpfiles-clean.timer ├─getty.target │ └─getty@tty1.service └─remote-fs.target ``` 因為我們前一小節的練習將默認的操作模式變成 multi-user.target 了,因此這邊使用 list-dependencies 時,所列出的 default.target 其實是 multi-user.target 的內容啦!根據線條連線的流程,我們也能夠知道, multi-user.target 其實還會用到 basic.target + getty.target + remote-fs.target 三大項目, 而 basic.target 又用到了 sockets.target + sysinit.target + timers.target... 等一堆~所以啰,從這邊就能夠清楚的查詢到每種 target 模式下面還有的相依模式。 那么如果要查出誰會用到 multi-user.target 呢?就這么作! ``` [root@study ~]# systemctl list-dependencies --reverse default.target └─graphical.target ``` reverse 本來就是反向的意思,所以加上這個選項,代表“誰還會用到我的服務”的意思~所以看得出來, multi-user.target 主要是被 graphical.target 所使用喔! 好~那再來,graphical.target 又使用了多少的服務呢?可以這樣看: ``` [root@study ~]# systemctl list-dependencies graphical.target graphical.target ├─accounts-daemon.service ├─gdm.service ├─network.service ├─rtkit-daemon.service ├─systemd-update-utmp-runlevel.service └─multi-user.target ├─abrt-ccpp.service ├─abrt-oops.service .....(下面省略)..... ``` 所以可以看得出來,graphical.target 就是在 multi-user.target 下面再加上 accounts-daemon, gdm, network, rtkit-deamon, systemd-update-utmp-runlevel 等服務而已! 這樣會看了嗎?了解 daemon 之間的相關性也是很重要的喔!出問題時,可以找到正確的服務相依流程! ### 17.2.5 與 systemd 的 daemon 運行過程相關的目錄簡介 我們在前幾小節曾經談過比較重要的 systemd 啟動腳本配置文件在 /usr/lib/systemd/system/, /etc/systemd/system/ 目錄下,那還有哪些目錄跟系統的 daemon 運行有關呢? 基本上是這樣的: * /usr/lib/systemd/system/: 使用 CentOS 官方提供的軟件安裝后,默認的啟動腳本配置文件都放在這里,這里的數據盡量不要修改~ 要修改時,請到 /etc/systemd/system 下面修改較佳! * /run/systemd/system/: 系統執行過程中所產生的服務腳本,這些腳本的優先序要比 /usr/lib/systemd/system/ 高! * /etc/systemd/system/: 管理員依據主機系統的需求所創建的執行腳本,其實這個目錄有點像以前 /etc/rc.d/rc5.d/Sxx 之類的功能!執行優先序又比 /run/systemd/system/ 高喔! * /etc/sysconfig/*: 幾乎所有的服務都會將初始化的一些選項設置寫入到這個目錄下,舉例來說,mandb 所要更新的 man page 索引中,需要加入的參數就寫入到此目錄下的 man-db 當中喔!而網絡的設置則寫在 /etc/sysconfig/network-scripts/ 這個目錄內。所以,這個目錄內的文件也是挺重要的; * /var/lib/: 一些會產生數據的服務都會將他的數據寫入到 /var/lib/ 目錄中。舉例來說,數據庫管理系統 Mariadb 的數據庫默認就是寫入 /var/lib/mysql/ 這個目錄下啦! * /run/: 放置了好多 daemon 的暫存盤,包括 lock file 以及 PID file 等等。 我們知道 systemd 里頭有很多的本機會用到的 socket 服務,里頭可能會產生很多的 socket file ~那你怎么知道這些 socket file 放置在哪里呢? 很簡單!還是通過 systemctl 來管理! ``` [root@study ~]# systemctl list-sockets LISTEN UNIT ACTIVATES /dev/initctl systemd-initctl.socket systemd-initctl.service /dev/log systemd-journald.socket systemd-journald.service /run/dmeventd-client dm-event.socket dm-event.service /run/dmeventd-server dm-event.socket dm-event.service /run/lvm/lvmetad.socket lvm2-lvmetad.socket lvm2-lvmetad.service /run/systemd/journal/socket systemd-journald.socket systemd-journald.service /run/systemd/journal/stdout systemd-journald.socket systemd-journald.service /run/systemd/shutdownd systemd-shutdownd.socket systemd-shutdownd.service /run/udev/control systemd-udevd-control.socket systemd-udevd.service /var/run/avahi-daemon/socket avahi-daemon.socket avahi-daemon.service /var/run/cups/cups.sock cups.socket cups.service /var/run/dbus/system_bus_socket dbus.socket dbus.service /var/run/rpcbind.sock rpcbind.socket rpcbind.service @ISCSIADM_ABSTRACT_NAMESPACE iscsid.socket iscsid.service @ISCSID_UIP_ABSTRACT_NAMESPACE iscsiuio.socket iscsiuio.service kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service 16 sockets listed. Pass --all to see loaded but inactive sockets, too. ``` 這樣很清楚的就能夠知道正在監聽本機服務需求的 socket file 所在的文件名位置啰! * 網絡服務與端口對應簡介 從[第十六章](../Text/index.html)與前一小節對服務的說明后,你應該要知道的是, 系統所有的功能都是某些程序所提供的,而程序則是通過觸發程序而產生的。同樣的,系統提供的網絡服務當然也是這樣的! 只是由于網絡牽涉到 TCP/IP 的概念,所以顯的比較復雜一些就是了。 玩過網際網絡 (Internet) 的朋友應該知道 IP 這玩意兒,大家都說 IP 就是代表你的主機在網際網絡上面的“門牌號碼”。 但是你的主機總是可以提供非常多的網絡服務而不止一項功能而已,但我們僅有一個 IP 呢!當用戶端連線過來我們的主機時, 我們主機是如何分辨不同的服務要求呢?那就是通過埠號 (port number) 啦!埠號簡單的想像,他就是你家門牌上面的第幾層樓! 這個 IP 與 port 就是網際網絡連線的最重要機制之一啰。我們拿下面的網址來說明: * [http://ftp.ksu.edu.tw/](http://ftp.ksu.edu.tw/) * [ftp://ftp.ksu.edu.tw/](ftp://ftp.ksu.edu.tw/) 有沒有發現,兩個網址都是指向 ftp.ksu.edu.tw 這個昆山科大的 FTP 網站,但是瀏覽器上面顯示的結果卻是不一樣的? 是啊!這是因為我們指向不同的服務嘛!一個是 http 這個 WWW 的服務,一個則是 ftp 這個文件傳輸服務,當然顯示的結果就不同了。 ![port 與 daemon 的對應](https://box.kancloud.cn/2016-05-13_5735737b43dda.gif)圖17.2.1、port 與 daemon 的對應 事實上,為了統一整個網際網絡的埠號對應服務的功能,好讓所有的主機都能夠使用相同的機制來提供服務與要求服務, 所以就有了“通訊協定”這玩意兒。也就是說,有些約定俗成的服務都放置在同一個埠號上面啦!舉例來說, 網址列上面的 http 會讓瀏覽器向 WWW 服務器的 80 埠號進行連線的要求!而 WWW 服務器也會將 httpd 這個軟件啟動在 port 80, 這樣兩者才能夠達成連線的! 嗯!那么想一想,系統上面有沒有什么設置可以讓服務與埠號對應在一起呢?那就是 /etc/services 啦! ``` [root@study ~]# cat /etc/services ....(前面省略).... ftp 21/tcp ftp 21/udp fsp fspd ssh 22/tcp # The Secure Shell (SSH) Protocol ssh 22/udp # The Secure Shell (SSH) Protocol ....(中間省略).... http 80/tcp www www-http # WorldWideWeb HTTP http 80/udp www www-http # HyperText Transfer Protocol ....(下面省略).... # 這個文件的內容是以下面的方式來編排的: # &lt;daemon name&gt; &lt;port/封包協定&gt; &lt;該服務的說明&gt; ``` 像上面說的是,第一欄為 daemon 的名稱、第二欄為該 daemon 所使用的埠號與網絡數據封包協定, 封包協定主要為可靠連線的 TCP 封包以及較快速但為非連線導向的 UDP 封包。 舉個例子說,那個遠端連線機制使用的是 ssh 這個服務,而這個服務的使用的埠號為 22 !就是這樣啊! ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 請特別注意!雖然有的時候你可以借由修改 /etc/services 來更改一個服務的埠號,不過并不建議如此做, 因為很有可能會造成一些協定的錯誤情況!這里特此說明一番呦!(除非你要架設一個地下網站,否則的話,使用 /etc/services 原先的設置就好啦!) ### 17.2.6 關閉網絡服務 當你第一次使用 systemctl 去觀察本機服務器啟動的服務時,不知道有沒有嚇一跳呢?怎么隨隨便便 CentOS 7.x 就給我啟動了幾乎 100 多個以上的 daemon? 會不會有事啊?沒關系啦!因為 systemd 將許多原本不被列為 daemon 的程序都納入到 systemd 自己的管轄監測范圍內,因此就多了很多 daemon 存在! 那些大部分都屬于 Linux 系統基礎運行所需要的環境,沒有什么特別需求的話,最好都不要更動啦!除非你自己知道自己需要什么。 除了本機服務之外,其實你一定要觀察的,反而是網絡服務喔!雖然網絡服務默認有 SELinux 管理,不過,在鳥哥的立場上, 我還是建議非必要的網絡服務就關閉他!那么什么是網絡服務呢?基本上,會產生一個網絡監聽端口 (port) 的程序,你就可以稱他是個網絡服務了! 那么如何觀察網絡端口?就這樣追蹤啊! ``` [root@study ~]# netstat -tlunp Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1340/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2387/master tcp6 0 0 :::555 :::* LISTEN 29113/vsftpd tcp6 0 0 :::22 :::* LISTEN 1340/sshd tcp6 0 0 ::1:25 :::* LISTEN 2387/master udp 0 0 0.0.0.0:5353 0.0.0.0:* 750/avahi-daemon: r udp 0 0 0.0.0.0:36540 0.0.0.0:* 750/avahi-daemon: r ``` 如上表所示,我們的系統上至少開了 22, 25, 555, 5353, 36540 這幾個端口~而其中 5353, 36540 是由 avahi-daemon 這個東西所啟動的! 接下來我們使用 systemctl 去觀察一下,到底有沒有 avahi-daemon 為開頭的服務呢? ``` [root@study ~]# systemctl list-units --all &#124; grep avahi-daemon avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack avahi-daemon.socket loaded active running Avahi mDNS/DNS-SD Stack Activation Socket ``` 通過追查,知道這個 avahi-daemon 的目的是在區域網絡進行類似網芳的搜尋,因此這個服務可以協助你在區網內隨時了解隨插即用的設備! 包括筆記本電腦等,只要連上你的區網,你就能夠知道誰進來了。問題是,你可能不要這個協定啊!所以,那就關閉他吧! ``` [root@study ~]# systemctl stop avahi-daemon.service [root@study ~]# systemctl stop avahi-daemon.socket [root@study ~]# systemctl disable avahi-daemon.service avahi-daemon.socket [root@study ~]# netstat -tlunp Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1340/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2387/master tcp6 0 0 :::555 :::* LISTEN 29113/vsftpd tcp6 0 0 :::22 :::* LISTEN 1340/sshd tcp6 0 0 ::1:25 :::* LISTEN 2387/master ``` 一般來說,你的本機服務器至少需要 25 號端口,而 22 號端口則最好加上防火墻來管理遠端連線登陸比較妥當~因此,上面的端口中, 除了 555 是我們上一章因為測試而產生的之外,這樣的系統能夠被爬墻的機會已經少很多了! ^_^!OK!現在如果你的系統里面有一堆網絡端口在監聽, 而你根本不知道那是干麻用的,鳥哥建議你,現在就通過上面的方式,關閉他吧!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看