init是kernel第一個跑的userspace程式(PID=1),並且也負責啟動所有userspace的service和程式。
Buildroot裡面提供了三個主要的init系統,像是『sysvinit』,『Busybox』和『systemd』,這三個init都可以在設定組態時挑選,路徑在『System configuration --> Init system』,簡介如下:
BusyBox
像之前的章節介紹過的,Busybox是許多程式的集合體,當然其中也會有init程式,而這支init程式也可以用在大部分的嵌入式系統上。如果要使用BusyBox來當你的init程式的話,就必須啟動選項『BR2_INIT_BUSYBOX』,這樣buildroot就會幫你建置並安裝這個程式。
因為Busybox的輕量化,所以當然Buildroot本身就是使用它來當預設的init程式,在開機時,Busybox會讀取『/etc/inittab』,這個檔案裡頭定義了許多開機時的行為,像是該開啟哪個service,該開啟哪個daemon之類的,格式和語法的話就請參考(http://git.busybox.net/busybox/tree/examples/inittab),這邊要特別注意的是,BusyBox的inittab語法是比較特殊的,所以不要在網路上找個不知道是哪個系統的inittab文件就拿來用。
Buildroot預設的inittab是存在路徑『buildroot/system/skeleton/etc/inittab』,預設的inittab主要的工作就是啟動shell script去一一執行『/etc/init.d/rcS』底下所有定義的服務,和啟動getty程式,這樣你才可以開始登入並操作作業系統。
systemV
這個機制其實已經有點過時了,所以建議可以不要用,主要是使用『sysvinit』這個套件,你可以在『buildroot/package/sysvinit』找到它。之前曾經是大部分Linux桌面系統的init機制,但是到近幾年來已經快完全被『Upstart』,『Systemd』所取代了。sysvinit跟Busybox一樣都是使用inittab的機制,但是語法會有點不一樣,所以使用上要特別小心。
如果想要看一下這個套件預設的inittab的話,可以在路徑『buildroot/package/sysvinit/inittab』底下找到。
systemd
systemd是目前Linux上最新的一套init系統,它跟傳統的sysvinit比較,它多了很多像是:
- 內建新的journald日誌管理系統。
- 使用Linux control groups來追蹤行程的狀態。
- 更進階的平行化能力。
- 使用socket和D-Bus來啟動服務,隨時都可以啟動和關閉daemon。
- 支援snapshot,隨時都可以記錄和回復系統狀態。
對於比較富複雜的嵌入式系統來說,像是服務之間會用到D-Bus來溝通的架構,systemd就非常的有用,雖說如果使用systemd的話,會需要很多相依性的套件,像是dbus,udev等等,或是像是上圖所看到的需要glibc的tool chain和kernel header需要3.10以上。但是相對而言,如果你沒有要用到這麼複雜的架構的話,官方是建議使用BusyBox就好,其他細節請參考『http://www.freedesktop.org/wiki/Software/systemd』。
Init scripts, systemd unit files
如果你想要在系統init時,就啟動你的程式的話,你就必須要安裝/設置 startup script(sysvinit/Busybox)或是systemd service file。
這兩個部份可借由變數『 <pkg>_INSTALL_INIT_SYSV』和『<pkg>_INSTALL_INIT_SYSTEMD』來達成。
底下是一個bind.mk的例子
可以看到依照兩個系統的慣例,如果是選用sysvinit的話就會將script安裝到『/etc/init.d/』底下,如果是選用systemd的話就是『/usr/lib/systemd/system/』底下。