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を実行できるようにすることです。
TermuxにQEMUをインストールしてUbuntu仮想マシンを動かすを参照してください。
ただしこの方法の欠点は、とにかく遅いことです。KVMアクセラレーションがない場合、QEMUの実行効率は非常に悪くなります。


