メインコンテンツへスキップ

Termux prootでsystemctlコマンドが使えない場合の解決策

·
カテゴリー スマートフォン Termuxチュートリアル
タグ Systemd Proot-Distro Chroot OpenRC Runit
目次

Systemdはinitプログラムの一種です。ほぼすべてのLinuxディストリビューションがSystemdを使ってシステムサービスを管理しており、よく使うコマンドにはsystemctljournalctlなどがあります。

しかし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に依存する必要はありません。

  1. たとえばproot DebianでSSHサービスを起動する場合、Systemd流では以下のコマンドを実行します。
sudo systemctl start sshd
  1. Systemdのサービスファイル/etc/systemd/system/sshd.service(大半のSystemdサービスファイルはここにあります)を探すと、ExecStart=の後ろにあるものが実際に実行されるコマンドだと分かります。
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D
  1. したがって、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があります。

  1. Alpine Linuxをインストールします。
proot-distro install alpine
proot-distro login alpine
  1. OpenRCパッケージをインストールします。
apk add openrc
  1. 以後prootへログインするときにこのコマンドをつなげると、OpenRCプログラムが起動します。
proot-distro login alpine --fix-low-ports -- /bin/ash -c "/sbin/openrc default; /bin/ash -l"
  1. 以後はOpenRCでサービスを管理できます。たとえばSSHはrc-serviceコマンドで管理でき、実行ファイルのパスを打つ必要はありません。
sudo rc-service sshd start
  1. SSHサービスをproot-distroへのログイン後に自動起動するよう設定することもできます。
sudo rc-update add sshd

方法3:完全なLinuxシステムの仮想マシンを動かす
#

最終的な解決策は、完全なLinuxシステムをエミュレートしてSystemdを実行できるようにすることです。

TermuxにQEMUをインストールしてUbuntu仮想マシンを動かすを参照してください。

ただしこの方法の欠点は、とにかく遅いことです。KVMアクセラレーションがない場合、QEMUの実行効率は非常に悪くなります。

参考資料
#

関連記事


最後までお読みいただきありがとうございます。本サイトでは公開コメント欄を設けていません。私はソーシャルな反応やアクセス数を追い求めるためではなく、自分の考えを誠実に探求するために文章を書いています。記事を丁寧にお読みいただいたうえで、ご感想やご意見をお寄せいただければ幸いです。誤字・誤り・技術的な問題などを見つけた場合、またはフィードバックを共有したい場合は、Aboutページに記載しているメールアドレスまでお気軽にご連絡ください。