Systemd為一款init程式,幾乎所有的Linux發行版都使用Systemd來管理系統服務,常用的指令為systemctl
、journalctl
等等。
不過Termux無法使用Systemd。若在Termux的proot-distro或chroot容器環境執行systemctl start
相關指令,會出現錯誤:System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
這是因為容器環境不支援Systemd所致。
這個其實沒有解法,除非Termux開發組學Microsoft WSL想辦法讓Systemd跑起來。不過,我們有一些替代方案可以解決這個問題。
方法1:直接從執行檔路徑啟動程式#
首先要知道Systemd是一個管理系統服務的init程式而已,負責在Linux開機後啟動程式,並讓使用者可以開關程式。不過單純啟動某個程式其實不必依賴systemctl。
- 比如,要在proot Debian啟動SSH服務,用Systemd的方式就是執行以下指令:
sudo systemctl start sshd
- 如果我們找到Systemd的服務檔
/etc/systemd/system/sshd.service
(大部分Systemd服務檔都在這裡),會發現ExecStart=
後面執行的東西就是它真正執行的指令:
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D
- 故SSH服務可以用這個指令直接啟動,並於背景執行:
mkdir -p /run/sshd
/usr/sbin/sshd -D
註解:Termux proot-distro內的程式無法使用1000以下的通訊埠,請在登入proot-distro的時候加入--fix-low-ports
參數將SSH的22通訊埠重新導向到2022。
如果要設定登入proot-distro後自動啟動特定程式,最簡單的方式就是將要執行的指令加入到使用者家目錄的~/.bashrc
。
方法2:改用OpenRC的發行版#
OpenRC和runit是較為傳統的init程式,沒有Systemd那麼複雜,它可以在proot執行並管理服務。不熟OpenRC指令的用戶可以參考下面Systemd與OpenRC指令的對照表。
目前proot-distro使用OpenRC的發行版為Alpine Linux,使用runit的有Artix Linux和Void Linux。
- 安裝Alpine Linux
proot-distro install alpine
proot-distro login alpine
- 安裝OpenRC套件
apk add openrc
- 之後登入proot的時候串這個指令,OpenRC程式便會啟動
proot-distro login alpine --fix-low-ports -- /bin/ash -c "/sbin/openrc default; /bin/ash -l"
- 之後就可以用OpenRC來管理服務了,例如SSH可以用rc-service指令管理,不用打執行檔路徑
sudo rc-service sshd start
- 還可以設定SSH服務在登入proot-distro後自動啟動。
sudo rc-update add sshd
方法3:跑完整Linux系統虛擬機#
最終極的解決方案就是模擬完整Linux系統,讓Systemd得以執行。
不過這方法的缺點就是太慢了,QEMU沒有KVM加速的情況下執行效率極差。