(注意!本文不定期更新)
這裡給出快速識別的方法。假如你寫過類似 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。
另外使用 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。
沒有留言:
張貼留言