如何在Debian上使用systemd管理系統?
譯文【51CTO精選譯文】過不了多久,幾乎沒有一個Linux用戶能夠擺脫Init Wars的越來越甚的控制,除非他們手動選擇退出。近來,systemd帶來的技術、情緒和社會方面的問題比其他任何一款軟件都要多。這主要逐漸體現在又叫“Init Wars”的激烈討論中:數月來,Debian開發者當中出現了這番討論。雖然Debian技術委員會最終決定將systemd納入到Debian 8“Jessie”,但有人竭力想取代總決議(General Resolution)作出的這個決定,甚至有人聲稱不利于贊成systemd的開發人員的健康。
這恰恰表明了systemd嚴重妨礙了處理Linux系統的方式:在很大程度上,這種處理方式自Unix時代起就強加給我們。“一種工具適合某項任務”之類的理論已被新的理論所取代。除了取代sysvinit作為init系統外,systemd深挖系統管理。眼下,你習慣使用的許多命令都可以繼續使用,這歸功于程序包systemd-sysv提供的兼容層。一旦systemd 214上傳到Debian,定于在穩定分支版中隨Debian 8“Jessie”一同發布。在此基礎上,用戶需要充分使用systemd隨帶的用于管理服務、進程、切換運行級別和查詢日志系統的新命令。一個變通辦法就是在.bashrc中設置命令別名。
所以,不妨看一下systemd會如何改變你我管理計算機的習慣,以及相關的優缺點。在改用systemd之前,保存舊的sysvinit,以便萬一systemd出現故障,仍能夠啟動,這是良好的安全做法。只要systemd-sysv還沒有安裝,舊的sysvinit就能發揮作用,只要運行這個命令,就很容易獲得sysvinit:
- # cp -av /sbin/init /sbin/init.sysvinit
因而作好了準備,萬一出現什么緊急情況,只要將
- init=/sbin/init.sysvinit
附加到內核引導時間參數的末尾。
systemctl的基本用法
systemctl是取代原有“/etc/init.d/foo start/stop”的命令,但它具有的功能要多得多,你可以查閱參考手冊頁。
一些基本用法如下:
•systemctl – 列出所有已加載的單元及其狀態(單元是任務/服務的術語)
•systemctl list-units – 列出所有單元
•systemctl start [NAME...] –啟動(激活)一個或多個單元
•systemctl stop [NAME...] – 停止(停用)一個或多個單元
•systemctl disable [NAME...] – 禁用一個或多個單元文件
•systemctl list-unit-files – 顯示所有已安裝的單元文件及其狀態
•systemctl --failed – 顯示啟動過程中哪些單元出現故障
•systemctl --type=mount – 類型過濾器;類型可能是:服務、掛載點、設備、套接字和啟動目標
•systemctl enable debug-shell.service – 啟動TTY 9上的根外殼,用于調試
如果想更方便地處理單元,還有程序包systemd-ui,它可以由用戶用systemadm命令來啟動。
切換運行級別、重啟和關閉也由systemctl來處理:
•systemctl isolate graphical.target – 切換到運行級別5,X服務器在運行級別5運行
•systemctl isolate multi-user.target – 切換到運行級別3和TTY,不帶X圖形界面
•systemctl reboot – 關閉和重啟系統
•systemctl poweroff – 關閉系統
除了用于切換運行級別的命令外,所有這些命令都可以由普通用戶來執行。
journalctl的基本用法
systemd不僅啟動機器的速度比原來的init系統要快,啟動日志功能的速度也要快得多,包括來自內核初始化階段、初始內存磁盤、早期啟動邏輯和主系統運行時的消息。所以,這種日子基本上一去不復返了:你需要使用攝像頭,提供內核錯誤或出現其他故障的系統的輸出,以便用于調試。
就systemd而言,日志聚集在系統日志(journal)中,系統日志位于/var/log/。為了能夠充分利用系統日志,我們需要先設置系統日志,因為Debian之前沒有為你設置好它:
- # addgroup --system systemd-journal
- # mkdir -p /var/log/journal
- # chown root:systemd-journal /var/log/journal
- # gpasswd -a $user systemd-journal
這會設置好系統日志,那樣你可以作為普通用戶來查詢它。使用journalctl查詢系統日志比syslog的工作方式更具有一些優勢:
•journalctl --all – 顯示系統的完整日志及其所有用戶
•journalctl -f – 顯示系統日志的實時視圖(相當于“tail -f /var/log/messages”)
•journalctl -b – 顯示上一次啟動以來的日志
•journalctl -k -b -1 – 顯示來自上一次啟動前(-b -1)的所有內核日志
•journalctl -b -p err – 顯示上一次啟動的日志,僅限于優先級“ERROR”
•journalctl --since=yesterday – 由于Linux用戶通常不經常重啟,這比-b更加限制了大小
•journalctl -u cron.service --since='2014-07-06 07:00' --until='2014-07-06 08:23' – 顯示了計劃任務(cron)在指定時間段的日志
•journalctl -p 2 --since=today – 顯示優先級2的日志,這包括emerg(***的緊急程度狀態)、alert(緊急狀態)和crit(重要信息);酷似syslog優先級emerg(0)、alert(1)、crit(2)、err(3)、warning(4)、notice(5)、info(6)和debug(7)。
•journalctl > yourlog.log – 將二進制格式的系統日志作為文本拷貝到你的當前目錄
系統日志和syslog可以一塊使用。另一方面,一旦你對系統日志的工作方式感到滿意,可以清除任何syslog程序包,比如rsyslog或syslog-ng。
想獲得非常詳細的輸出,將“systemd.log_level=debug”添加到內核引導時間參數列表的末尾,然后運行這個命令:
- # journalctl -alb
日志級別也可以在/etc/systemd/system.conf中加以編輯
使用systemd分析引導過程
Systemd讓你可以高效地分析和優化引導過程:
•systemd-analyze – 顯示內核和用戶空間上一次引導花了多長時間
•systemd-analyze blame – 顯示每個服務啟動用了多長時間方面的詳細信息
•systemd-analyze critical-chain – 打印對時間要求嚴格的單元鏈的樹結構
•systemd-analyze dot | dot -Tsvg > systemd.svg – 列出引導過程的矢量圖(需要graphviz程序包)
•systemd-analyze plot > bootplot.svg – 生成引導過程的圖形化時間圖
就一個歷史很短、正在大力開發中的項目而言,systemd的說明文檔編寫相當翔實。首先,有Lennart Poettering 編寫的0pointer系列:http://0pointer.de/blog/projects/systemd.html。該系列技術性很強,相當冗長詳細,含有大量信息。另一個不錯的來源是與發行版無關的Freedesktop信息頁面:http://www.freedesktop.org/wiki/Software/systemd/,上面列有數量最多的鏈接,涉及systemd資源、針對特定發行版的頁面、軟件缺陷追蹤器(bugtracker)和說明文檔。瞄一眼:
- # man systemd.index
大致列出了所有的systemd參考手冊頁。不同發行版的systemd命令結構基本上一樣,區別主要出現在封裝上。
英文:http://xmodulo.com/2014/07/use-systemd-system-administration-debian.html