chroot内でsystemdサービスを開始します


38

initスクリプト(またはopenrc)を使用すると、常に別のインストールルートからサービスを実行できます。
しかし、私が走ったとき、私chroot /somepath/to_root /usr/bin/systemctl start someserviceは得た:

Running in chroot, ignoring request.

systemdにサービスを実行させる方法はありますか?

更新:
ホストシステムがinitスクリプトまたはopenrcを実行していることを忘れましたが、systemdを使用したことはありません。また、chrootを使用して、最小シェルを起動できないUnixシステムのトラブルシューティングを行いました。


1
また、サービスをchrootで実行する必要があります。これは常にopenrc2の前に機能していましたが、今では不可能に思われます;
neofutur 14

間違った問題を解決しようとしています。OpenRCを使用している場合、systemdサービスをOpenRCサービスに変換する必要があります。それを回避する方法は本当にありません。
ダニエルB

@DanielB:いいえ!systemrescuecdについて聞いたことがありますか?
user2284570

いいえ。それがあなたの質問にどのように関係しているかもわかりません。
ダニエルB

回答:


29

systemdディストリビューション(Arch Linux、OpenSUSE、Fedora)でよく知られている問題。

Systemdはsysvinitに代わるものであり、これに対して1つの大きな利点を提供します。sysvinitでは、サービスの開始を要求すると、スクリプトを呼び出す人の実行コンテキストを継承します。これには、環境変数、ulimitsなどが含まれます。Systemdはこれとは逆に、デーモンを通知することでこれを改善します。デーモンは、環境が常に同じであるため、サービスのパフォーマンスを予測するのがはるかに容易な、明確に定義された健全な一定の環境でサービスを開始します。

これは、chroot内からsystemctlを呼び出すとき、chroot内にいることは無関係であり、継承される環境は現在のPID 1の環境ではないことを意味します。しかし、これはさらに悪化します。通信ソケットは/ run / systemd内に配置されるため、chroot内のプロセスはinitシステムと通信することさえできません!

それでは、systemdディストリビューションでどのようにchrootしますか?

  1. Linuxコンテナのみが必要な場合は、このArch Wikiページで、Linuxコンテナを30秒以内にセットアップする方法を説明しますsystemd-nspawn

  2. 代わりに本当にchroot環境が必要な場合、この美しく透明なWebページは2つの実用的なソリューションを提供します(2つ目はポイント#1で提供されたものの修正版です)。


探しましsystemd-nspawnたが、実行できません。いいえ、これはコンテナ用ではありません。ホストとターゲットの両方のアーキテクチャでサービスを使用する必要があるからです。
user2284570

2
ホストシステムルートでsystemdを使用しないこと。私の場合、systemdとopenrcを混在させることはできません。
user2284570

1
@TwoDそれは動作しません。systemd-nspawn「systemdシステムで実行されていません」で実行が失敗します。ホストがsystemdも使用している場合を除きます。
hvd

1
@TwoDそして、私にはまったくそのように聞こえないので、私は応答しました。:)「実行できません」は、実行可能ファイルを見つけるのが難しい場合に言うのは奇妙なことです。そのため、問題はコメントに入れたものであると思われます。実行するとエラーメッセージが表示され、有用なことは何もしません。しかし、問題が実際にどこにあるかが判明した場合でもsystemd-nspawn、新しいルートを指定しても役に立ちません。ホストが既にsystemdを実行しているため(ホストがsystemdを実行しているため)、ホストはそれを使用できますが、ホストはそれを保持していませんが、新しいルートのバージョンは機能しません。
hvd

1
systemdで実行することを拒否しますchroot
エルキンアルプGüney17年

4

systemd 「サービス」のみを無視するため、デーモンコマンドを手動で実行するだけです。

の代わりに

service sshd start

私が使う

/usr/sbin/sshd -D &

これはすべてのサービスで機能するわけではありません。Xorgのようなシステムサービススターターの一部として起動する必要があるものもあります。
user2284570

startxのために動作しXorgます。
エルキンアルプGüney17年

@ErkinAlpGüney:chrootではありません…Dbusのためです。
user2284570

4

数年後、ほとんどのSystemdの実用的な問題に対する解決策は1つしかないと認めざるを得ません。エラーはSystemd自体であるため

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

  • RAMが24Mbのみで書き込み可能なストレージがない組み込みシステムであっても、cgroupのサポートを必要とするカーネルの強制(オプションではなく、構成ファイル内でデフォルトで有効化されます)
  • モジュラーであるという主張にもかかわらず、実行時に依存性の地獄はそれを強力な神のオブジェクトにします:単一のreiser4 rootfsでブートしたいですか?多くのプログラムでは、reiser4パーティションからカーネルイメージを同時に読み取ることも、同時にインストールすることもできないパッケージを必要systemd-udevdとする必要がsystemd-initあるため、systemd-bootこれは不可能grub2です。
  • Bluetoothダイヤルアップ経由でインターネットに接続したいですか?samsung java me電話で動作しない場合、以前は手動で動作していたスクリプトとコマンドラインソフトウェアを実行できませんnetworkd
  • 最大の問題は、独自のLinuxディストリビューションを構築および保守する場合です。systemdinitモジュール自体には非常に多くの依存関係があるため、異なるインストールパッケージを使用して他のinitシステムを選択することはできません。
  • システムでchrootできない場合、またはlibdb4.8からアップグレードした場合(少なくとも、最悪の場合、Microsoftにはxml形式のログファイルがあります)、ログを表示するのに幸運です。

唯一の解決策:

Systemdは、ossv4の代わりにalsaのように、問題を解決するために必要以上に複雑です。したがって、systemdを使用するものがある場合は、すべてのデータを消去するだけです。

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

そして、Openrcを使用したGentooのようなSysV Initの問題を解決する際に、まったく使用しないものをインストールします。
私の質問に関して、systemdはWindows®レジストリのようなものを作成します。その一部がめちゃくちゃになったら、それは終わりです。


3
何かのデザインが答えを得るのを本当に妨げることができるので、答えが働くものに切り替えることであることを認識してください。そして、これは本当の答えです。
user2284570

1
私も同じ意見でしたが、今ではもう少しバランスの取れた見方をしています。Systemdには、殺すべきものを本当に殺すことができるという非常に大きな利点があります。これは、カーネルcgroup機能を使用して、フォークされたすべてのサブプロセスを追跡するためです。古いツールではそれができません。さらに、/ etc / init / *。shにあるスクリプトのがらくたを覚えていますか?私もですが、それは今日の私にとって悪い記憶に過ぎません。systemdサービスファイルは明確で、約10行の長い構成です。200行の長いスクリプトではありません。これらの大きな利点にはsystemdがありますが、他のすべての機能は欠点であることに同意します。
ペテルはモニカを

ところで、私はあなたの答えに賛成票を投じました。なぜなら、その利点に加えて、まさにこのタイプの批評家は、まさにこのトーンで、systemd開発が改善するために必要なものだからです。たとえば、chrootでpostgresqlを開始しようとしましたが、それを行うにはルートシステムを作らなければなりませんでした。多くは、多くのくだらない事は、まだそこに右です。
ペテルはモニカを

@peterh:残念ながら、誰もがそれ共有しているわけではありません。投稿を削除するという意味です。これは、Systemdに対するSysVの初期化ではなく、OpenrcやUpstart(短いスタートアップスクリプトと並列サービスの開始を可能にする)などに対するものです。少なくとも1つのことを学びました。DarwinはほとんどがApple™Windowsのᴏꜱであり、MicrosoftはLinuxのisであり、Linuxの設計はほとんどがレッドハットによって運営されています。SysVの初期化は低速ですが、実行時にできることを制限するものではありません。
user2284570

Openrcを使用すると、@ peterh Servicesスクリプトも非常に明確になります。Systemd上のcgroupの問題は、これがSystemdがDarwinやNetBSDのようなものを実行するのを妨げるオプションではないことです。
user2284570

3

いいえ。サービスはsystemctl(pid 1)によって実行され、systemctl(開始要求のみを送信する)ではなくsystemdによって実行されます。systemdはchrootの外部で実行されるため、サービスも実行されます。

技術的には(systemctlに何らかの方法でそのルートをsystemdに渡すことで)これを実装することは可能ですが、完全なコンテナを作成するためのツールがすでにあるため(systemd-nspawn /somepath/to_root)ただし、いつでもメーリングリストに連絡できます。


1
ナイス、しかし、ホストシステムはoepnrcを使用しているため、systemctlを使用する必要があります。私は完全な独立したソリューションたい
user2284570

3
次のように言って、水をさらに濁らせます:Psst!RootDirectory=あなたも非常に危険なほど賛成票が足りないので言及してください。(-:
JdeBP

@JdeBP:変数RootDirectorychrootコマンドの違い(結果に関して)は何ですか?
user2284570

@grawity:それで、pid 1がinitの場合は何を追加しますか?
user2284570

1

chrootからのネットワーク構成を使用してレスキューモードでネットワークを起動しようとすると、この問題に直面していました。最後に、これは私のために働く:

service --skip-redirect <service> restart

または:

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

いいね ただし、レガシーのInit互換サービスでのみ機能します(Fedora rawhideのネットワークでは機能しません)。私の答えで言ったように、本当の解決策はsystemdを使用するものを台無しにすることです。
user2284570

0

ソケットをアクティブにしてinetdスタイルのサービスを起動する場合は、代わりに、chrootとバイナリの両方をinetdスタイルの起動ターゲットとして指定する構成ファイルを使用して、stunnelを起動することを検討してください。

SELINUXの問題がある可能性があることに注意してください。Oracle Linux 7.1システムでは、stunnelが読み取る必要があるすべてのファイルで「chcon -v --type = stunnel_etc_t」を実行する必要がありました。

ソケットのクライアント側でTLS暗号化を使用する必要があります(つまり、構成に「client = yes」が含まれる別のstunnel)。これに関する詳細が必要な場合はお知らせください。


いいえ、d-busのようなものです。ターゲットchrootの問題を診断するために行います。
user2284570

-1

nohupコマンドを使用して、chrootでサービスを開始できます。httpdたとえば、サービスを開始するには、このようにします。

nohup httpd /dev/null &

それを止める pkill httpd


インストールされたバイナリsystemdスクリプトによってのみ開始できるDbusのようなサービスはどうですか?
user2284570

startコマンドを使用して、そのようなサービスをそのディレクトリから開始できます。
-ellooku

systemctlに対するシンボリックリンクです。だからうまくいきません。
user2284570

これは、Androidで実行しているFedoraで常に実行しています。あなたの問題が何か分からないのかもしれません。
-ellooku

結果はこのメッセージです:Running in chroot, ignoring request.。chrootを使用して、常にそれを行うとは思わない。実際、起動スクリプトにはsystemdが必要です。
-user2284570
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.