之前一直覺得,systemd只會到/etc/systemd/system讀取配置文件。要enable某個service就是copy service的配置文件到/etc/systemd/system目錄下或者建一個symlinks。shell
昨天,想在啓動時自動執行一個程序,本身寫了個service文件放到/etc/systemd/system,發現沒起做用。ui
看了一下systemd的手冊spa
http://www.freedesktop.org/software/systemd/man/ code
其實下面目錄都是systemd的讀取目錄。讀取的優先次序是從上到下。get
Table 1. Load path when running in system mode (--system). /etc/systemd/system/* /run/systemd/system/* /usr/lib/systemd/system/* Table 2. Load path when running in user mode (--user). $XDG_CONFIG_HOME/systemd/user/* $HOME/.config/systemd/user/* /etc/systemd/user/* /run/systemd/user/* /usr/lib/systemd/user/*
既然上面的目錄都是systemd的讀取目錄,service的enable, disable是怎麼回事呢?/usr/lib/systemd/system/下有全部安裝的軟件的配置,systemd如何來肯定須要運行那個unit呢?it
systemd的啓動項是用unit文件來定義的。首先,每一個unit都有Requires,Wants字段配置unit間的依賴關係。除unit文件定義外,每一個unit都另外能夠有一個配套的.requires/和.wants/ 目錄,放到這兩個目錄裏的unit會被隱式做爲依賴項。class
其次,unit文件裏能夠定義一個install節,描述該單元WantsBy,或RequiresBy哪一個單元。當使用systemctl enable service時,就到WantsBy的單元的.wants目錄建一個symlinks過來。相似的,RequiresBy也是這樣。require
由於/etc/systemd/system優先級最高,/etc/systemd/system目錄下創建一些unit的.requires和.wants目錄,而後systemctl在/etc/systemd/system對應目錄下創建symlinks,就能保證不修改軟件的安裝文件的狀況下,enable service,避免軟件包升級時被覆蓋。軟件
最後,系統啓動時systemd自動讀取default.target這個unit,default.target定義了它的Requires和Wants,而後一路按依賴啓動各項服務。配置