unix – chroot 内で systemd サービスを開始する

chroot systemd unix

initスクリプト(またはopenrc)を使えば、常に別のインストールルートからサービスを実行することができましたが、chroot /somepath/to_root /usr/bin/systemctl start someserviceを実行したときには、このようになってしまいました

Running in chroot, ignoring request.

systemdがサービスを強制的に実行する方法はありますか?

更新: 忘れていたのですが、私のホストシステムはinitスクリプトやopenrcを実行していますが、systemdは実行していません

  43  None  2013-12-15


ベストアンサー

systemd distros (Arch Linux, OpenSUSE, Fedora) でよく知られている問題です

Systemd は sysvinit に取って代わるもので、これに比べて大きな利点が一つあります。sysvinit では、サービスの起動を依頼すると、スクリプトを呼び出した人の実行コンテキストを継承し、環境変数や ulimits などを含みます。Systemd はこれとは逆に、デーモンに通知することでこれを改善しています。デーモンは、よく定義された健全で一定の環境でサービスを開始しますが、環境は常に同じなので、当然ながらサービスのパフォーマンスを予測しやすくなります

これは、私が chroot 内から systemctl を呼び出すとき、私が chroot 内にいるかどうかは関係なく、継承される環境は現在の環境ではなく PID 1 の環境のままであることを意味します。通信ソケットは /run/systemd の中に置かれているので、chroot 内のプロセスは init システムと話すことすらできません!

では、systemd distros で chroot をするにはどうすればいいのでしょうか?

  1. Linux コンテナを持ちたいだけなら、this Arch Wiki pagesystemd-nspawn のおかげで 30 秒以内で Linux コンテナをセットアップする方法を教えてくれます

  2. 代わりに本当に chroot 環境が欲しいのであれば、この美しくて透明なウェブページは、2 つの動作するソリューションを提供してくれます (2 つ目はポイント 1 で提供されているものを修正したものです)

39  MariusMatutiae  2013-12-15


数年後、私はほとんどのSystemdの実用的な問題に対して、唯一の解決策があることを認めなければなりません。なぜなら、エラーはSystemdそのものだからです

Upstart や Openrc のようなものでは直面したことのない問題を抱えていたので、Systemd には本当にうんざりしています

  • 24MB の RAM と書き込み可能なストレージを持たない組み込みシステムであっても、カーネルが cgroups のサポートを要求する (オプションにするのではなく、設定ファイルの中でデフォルトで有効にする) ことを強制します。 推進派は、このような場合にそれを使用できないことは、そのような場合のために設計されていないので、望ましい動作であると主張していますが、現実には、他の init システムも気にしていませんが、systemd ではこのような機能は別プロジェクトではなく、kiss.
    に従わないことの結果を再び強調しています
  • モジュール化されているという主張にもかかわらず、実行時には依存関係地獄で強力な神オブジェクトになってしまう : 単一のreiser4 rootfs で起動したい?多くのプログラムは systemd-udevd を必要とし、systemd-init を必要とし、systemd-boot パッケージを必要とし、grub2 よりも同時にインストールできないし、reiser4 パーティションからカーネルイメージを読み込めないので、それは不可能です
  • Bluetoothダイヤルアップ でインターネットに接続したいですか?お使いのsamsung java me phoneで動作しない場合は、networkdのため、今まで手動で動作していたスクリプトやコマンドラインソフトを実行することができません
  • しかし、私が認識している最大の問題は、あなたが自分のLinuxディストリビューションを構築して保守している場合です : systemd initモジュール自体があまりにも多くの依存関係を持っているので、異なるインストールパッケージを介して他のinitシステムを選択することを提案することはできません
  • プライバシーの観点からリゾルバが定義されていない場合、Google dns for systemdのデフォルトの使用
  • 新しいsystemdスコープで簡単な方法がないため、バックグラウンドの非seriveプロセスを起動してログアウトすることができません
  • システムで chroot できない場合や libdb4.8 からアップグレードした場合は、ログを見るために幸運を祈ります (少なくとも、最悪の場合、Microsoft はログファイルを xml 形式にしています)

唯一の解決策は

問題を解決するためには、Systemd は複雑ではありません : ossv4 の代わりに alsa のように。ですから、もしあなたが systemd を使うものを持っているならば、データをすべて消去してください

dd if=/dev/urandom of=/dev/dm−0 bs=1M

OpenrcでGentooのようにSysV Initの問題を解決しながら、SysVを全く使わないものをインストールしています。 私の質問についてですが、systemdはWindows®のレジストリのようなものを作っています

11  community wiki  2020-08-14


systemdは「サービス」を無視するだけなので、デーモンコマンドを手動で実行しているだけです

その代わりに

service sshd start

I use

/usr/sbin/sshd -D &

7  johnP  2015-12-06


サービスは systemctl によって直接実行されるのではなく、systemd (pid 1) によって実行されます (これは起動リクエストを送るだけです)

技術的にはこれを実装することは可能かもしれませんが (systemctl を何らかの方法で systemd にルートを渡すようにすることで)、フルコンテナを作成するツールが既に存在するので (systemd-nspawn /somepath/to_root)、実現する可能性はやや低いでしょう。メーリングリスト に連絡してみてください

3  user1686  2013-12-15


一度この問題に直面し、chrootからネットワーク設定を使ってレスキューモードでネットワークを立ち上げようとしたことがありました。最終的にはこれで解決しました

service --skip-redirect <service> restart

or:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart

1  reddot  2017-12-12


chroot の外部にサービスファイルを定義して、RootDirectory=/path/to/chrootMountAPIVFS=onを組み合わせたオプションで chroot 内のサービスを実行します

chroot の外部から chroot で systemd スクリプトを実行

0  Antonio Orizondo Leyva  2020-09-08


ソケット起動でinetdスタイルのサービスを起動する場合、代わりにchrootとバイナリの両方をinetdスタイルの起動ターゲットとして指定する設定ファイルを使ってstunnelを起動することを検討してください

SELINUXの問題があるかもしれないことに注意してください。Oracle Linux 7.1システムでは、stunnelが読む必要のあるすべてのファイルに対して “chcon -v –type=stunnel_etc_t “を実行しなければならなかった

ソケットのクライアント側で TLS 暗号化を使用する必要があります (例えば、設定で “client=yes” とした別のスタンネル)。これについての詳細が知りたい場合は、私に教えてください

-1  chas  2015-09-14


chroot でサービスを起動するには nohup コマンドを使います。例えば、httpdサービスを起動するには、以下のようにします

nohup httpd /dev/null &

それを止めるために<++1

-1  ellooku  2016-02-26


タイトルとURLをコピーしました