2017年1月14日 星期六

Linux 筆記: 識別你的 init

(注意!本文不定期更新)

如果您處理過 Linux 開機相關問題(如開機加速,增加/刪減服務),通常會碰上一個困擾:「我用的是 init 是哪個版本?」

init 系統最常見有三種:sysvinit, upstart, systemd,要怎麼判斷手上的 Linux 用的是哪一種?

這裡給出快速識別的方法。假如你寫過類似 if(比對字串A) ... else if(比對字串B) ... else if(比對字串C)... 的程式,就知道要把最長、具備最多特徵的字串擺前面,具備較少特徵、較短的字串擺後面。這邊的列出的 init 系統也是照特徵由多到少排列,照著順序比對,弄錯的機率就很小了。

PS. 列出的發行版沒有包含世界上所有的 Linux 發行版

systemd

發行版:Fedora 15, RHEL 7, OpenSUSE >= 12.2, Ubuntu 15.04

用以下命令識別:
  • ps -e | grep systemd
  • 若上一條命令輸出為空,輸入 strings /sbin/init | grep -i systemd 檢查是否有 "systemd" 的字串:
    • systemd.unit=
    • systemd.log_target=
    • systemd.log_level=
    • ...
是否存在以下檔案?
  • /usr/lib/systemd
  • /etc/systemd
透過 man page 尋找 systemd 字串: man init

upstart

發行版:RHEL6, Fedora 9-14, Ubuntu 6-14.10, OpenSUSE 11.3-12.1

輸入 strings /sbin/init | grep -i upstart 檢查是否有 "upstart" 的字串:
    • upstart-devel@lists.ubuntu.com
    • UPSTART_CONFDIR
    • UPSTART_NO_SESSIONS
    • ...
/etc/init 目錄內有檔案 *.conf

透過 man page 尋找 upstart 字串: man init

sysvinit

x86 Linux 已經很少看到 sysvinit 了,但嵌入式系統上仍然可以看到蹤影。

發行版:Debian 7

輸入 strings /sbin/init | grep -i sysvinit 檢查是否有 "sysvinit" 的字串:
  • INIT_VERSION=sysvinit-2.88
  • init.sysvinit
  • ...
檔案 /etc/inittab 是否存在?

BusyBox

這也是 Embedded Linux 上才會碰到。假如你用 strings /sbin/init | grep -i (systemd|upstart|sysvinit) 都找不到可判別的資訊,可以試著由 /proc/1 找看看,因為 init PID 固定為 1:


如上圖得知 init process 為 busybox,另外觀察 /sbin/init 也會看到 symbolic link 指向 busybox。

另外使用 BusyBox 作為 init 系統的 Linux 上也會看到 /etc/inittab,但 BusyBox 不支援 runlevel。

procd

此為 OpenWrt 後期使用的 init 系統,MediaTek LinkIt 7688 也是使用 procd 作為 init 系統

以 ps | grep procd 查看:

也有 /etc/inittab

如下圖所示,你會發現 /etc/init.d/ 下沒有 rcS 這個 script file。如果您手邊有 BeagleBone Black,您會發現  /etc/init.d/rcS 是一個 script file。

這個原因是 Changeset 37002 決定把 rcS 實作到 procd 內部。同 BusyBox,procd 也不支援 runlevel。

沒有留言:

張貼留言