gentoo in docker with systemd

想在 docker 建一個 gentoo 的 LAMP 測試環境,但安裝完 apache, mysql, php-fpm, … 後,卻卡關了。

原因在於 gentoo 預設的 init 系統是 openrc,而 openrc 不支援 docker 環境。

所以,無法以

service apache2 start

/etc/init.d/apache2 start

這樣的方式來啟動 LAMP 相關 daemon 。

但是,為什麼 Debian 的 docker image 就可以呢?

於是我比對了一下 Debian 的狀況,發現 Debian 的 /usr/sbin/service ,還有 /etc/init.d/ 下的 init script 實作中有考慮到 virtual machine 的環境,因此可以在 docker 下執行。

而 gentoo 的 /etc/init.d/ 下的 init script 則是都綁定 openrc ,但 openrc 不支援在 docker 裡使用。而如果在 gentoo 裡不使用 openrc 的話,就相當於要自己弄所有 daemon ( apache/mysql/php/sshd/… ) 的 init script。這代價太大了,而且即使今天硬幹成功了,未來也不易維護跟重複使用。

後來,想到的另一條路是,將 openrc 換掉,改成 systemd 試試看。現在大部份的 daemon 套件都有附 for systemd 的 init script。所以,就改往 systemd 的方向來 survey。

改用 systemd 的好處是,可以接軌各大 Linux distro 的主流趨勢。( 註: 根據 https://zh.wikipedia.org/wiki/Init 的描述,至2015年,大部分Linux發行版都已採用新的systemd )

不過,另一方面的顧慮是,systemd 目前不符合 Gentoo Linux / Funtoo Linux 的預設設定。而且, Gentoo Linux / Funtoo Linux 的創始人,也公開宣示過不支援 systemd。( 註: http://www.funtoo.org/Funtoo_Linux_FAQ  的 “Do you support systemd?” 一節 )

這個狀況至今仍是僵持在那邊。

撇開上述的討論,繼續原本的安裝 system 的步驟。一開始想說,只要安裝 systemd 之後,再切換成啟動 systemd 即可,然而,事情沒這麼簡單。因為 systemd 的啟動過程中,會用到 /sys/fs/cgroup/systemd 目錄,但作為 host OS 的 Gentoo Linux 並沒有這個目錄 ( 因為 Gentoo Linux 預設不使用 systemd ,自然也沒有 /sys/fs/cgroup/systemd )

所以,必須要自行手動作 workaround 如下:

mkdir -p /sys/fs/cgroup/systemd
mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
mkdir -p /sys/fs/cgroup/systemd/user
echo $$ > /sys/fs/cgroup/systemd/user/cgroup.procs

另外,啟動 gentoo with systemd 的指令也要加上選項參數如下:

opts=""
opts="$opts -d "
opts="$opts -v /sys/fs/cgroup:/sys/fs/cgroup:ro "
opts="$opts --privileged "
opts="$opts --cap-add SYS_ADMIN "
docker run $opts <image id> /usr/lib/systemd/systemd

這樣子就可以啟動一個有 systemd 的 Gentoo Linux instance 了。

為了方便日後 Recycle 使用,我另外設置了 autobuild 的 docker repository 放在 docker hub 跟 github 上

https://hub.docker.com/r/matlinuxer2/docker-gentoo-systemd/

https://github.com/matlinuxer2/docker-gentoo-systemd

歡迎有興趣的人自行取用。

Leave a Reply

Your email address will not be published. Required fields are marked *