web-dev-qa-db-ja.com

古いsysvinitの習慣をsystemdに移植する

新しくDebian安定システムをインストールして設定することができた一連のスクリプトがあります。プログラムを自動的に起動するには、/etc/rc.localを使用しますが、それ以外の場合は、/etc/inittabファイルを手動で変更する必要がありました。 --noclear行に1:2345:respawn:/sbin/getty --noclear 38400 tty1を追加するなど、他の変更もあります。

シャットダウンプロセスをカスタマイズする必要があったため、最終的に次のようにしました。

l0:0:wait:/etc/rc.halt 0
...
l6:6:wait:/etc/rc.halt 6

そして私の/etc/rc.haltはこのように見えます

#!/bin/sh
#   
# rc.halt
#   
# This script is executed when entering level 6/0 (on halt or reboot)

su - teststand -c "/home/teststand/stop_server.sh"  # my custom command

# making sure the halt/reboot process is resumed
test -n "${1}" && /etc/init.d/rc ${1}

exit 0

今日は、デフォルトのinitシステムとしてsystemdを使用して新しいDebian8をインストールする最初の時間でした。私はそれについて考えていませんでした、そして最初に/etc/inittabファイルが欠落していることに驚きました。

実行中のシステム(@ work&@ home)では、まだsysvinitを使用してシステムを実行しているため、systemdの使用経験はありません。

古いsysvinitに変更できることは知っていますが、systemdとの違いを確認したいと思います。現在、新しいインストールをカスタマイズしていて、それを完了する時間があまりないことに加えて、ドキュメントを見る時間がないのはそのためです。

私の質問:systemdの動作をすばやく変更して--nocleargettyに追加し、/etc/rc.haltを再起動/停止の開始点として使用できるようにする方法はありますか?

基本的に、古いinittabの変更をsystemdにすばやくインポートできますか?

ありがとう

4
Pablo

systemdはSystem5 initと下位互換性がなく、System 5 rcのみと互換性があります。

Linux System 5スタイルのシステム管理は、プロセス#1として実行されるinitと、開始スクリプトと停止スクリプトの実行を担当するrcの2つの部分で構成されます。これらは実際にはDebianの2つの異なるパッケージからのものです。 initsysvinit パッケージからのものです。 rcは通常 sysv-rc パッケージからのものですが、 file-rc または openrc パッケージからのものである可能性があります。

/etc/inittabは、initによって処理される構成ファイルです。 systemdは、このための下位互換性メカニズムを提供していません。 systemdのSystem5下位互換性メカニズムは、/etc/init.d/でプログラムを実行するSystem5 rc専用です。 (さらに、rcの特定のフレーバーのみが対象です。さらに、systemdは、file-rcおよびopenrcの構成メカニズムに対して下位互換性メカニズムを実装していません。)

これはsystemdに固有のものではありません。ほとんどnoの置換init /システムマネージャー(30年に1つの例外を除く)は/etc/inittabを処理します。

Systemdにサービスを組み込むには、サービスが行うサポートするメカニズム、つまり、独自のサービスユニットファイルと(ユニットファイルに自動変換するジェネレーター)/etc/init.d/内のSystem5 rc構成ファイル。

ランレベルを忘れてください。

使用しているランレベルのものはすべて、systemdLinuxオペレーティングシステムでは「廃止」と宣言されています。 入力する実行レベル0または6はありません。それらは、いくつかの互換性シムがなければ存在しません。

シャットダウン時にサービスを実行するための明白な答えは、多くの人から、WantedByshutdown.targetであるサービスユニットを作成することです。ただし、これにはいくつかの微妙な落とし穴があります。より良い、しかしあまり明白ではない答えは、DefaultDependencies=yesを使用して通常のサービスユニットを作成し、シャットダウンターゲットと競合することを確認し、サービスの要点をではなくExecStopに配置することです。 ExecStart

 [Unit] 
 Documentation = https://unix.stackexchange.com/questions/233561/

[Service]
Type = oneshot 
 User = teststand 
 RemainAfterExit = true 
 ExecStart =/bin/true 
 ExecStop =/home/teststand/stop_server.sh 
 
 [インストール] 
 WantedBy = multi-user.target 

シェルスクリプトで自分のPoorMan'sDæmonSupervisorをロールバックしないでください。

そのようなことはいつもひどく書かれています。

「サービス」が単に「stop_server.sh」という名前のコマンドの実行である場合、これは、手作業で作成されたシェルスクリプトサービス管理システムの下でサーバーを停止するスクリプトであると推測されます。

これは、これらのひどく書かれた、厄介で、信頼性が低く、危険な災害のためのものです: stop_server.shstop_server.shstop_server.sh = stop_server.shstop_server.shstop_server.sh

systemd.を利用し、適切なサービス管理メカニズムを使用して、ここで実行されているサービスを実行します。 actual サービスをDefaultDependencies=trueを使用してsystemd経由でとして実行可能にすると、この奇妙なExecStopのみのサービスはまったく必要ありません。 /] systemdは、シャットダウン時にサービスのシャットダウンを処理します。

1つのサービスを「管理」するシェルスクリプトでPoorMan'sDæmonSupervisorを取得し、それをsystemdサービスユニットでラップして2番目のサービスを作成し、目的が最初のサービスを管理するシステムが停止または電源オフになったときにシャットダウンすることは、systemdのHouse ofHorrorに入る良い方法です。

世界はあなたにあなたのスクリーンをきれいにすることを望んでいます。

Greg Wooledgeや他の人たちが発見したように、 not がログオフとその後のログオンの間に仮想端末をクリアすることを望んでいることは、非常に流れに逆らっています。ログオフ後に残っている特権ユーザーまたはボスからの機密出力の存在は、1970年代以降、Unices(および実際には他のタイムシェアリングリモートアクセスオペレーティングシステム)のセキュリティ問題であり、すべてを元に戻すには多大な労力が必要です。この問題を回避するために人々が投入したもの。

  • 多くのシステムでは、シェルログアウトスクリプトにclear_consoleコマンドが標準で含まれています。 (これは、カーネル仮想端末#1で実行されているグラフィカルプログラムではうまく機能せず、仮想または実数の他の種類の端末では機能しないため、それ自体で問題があります。)

    このコマンドは削除する必要があります。

  • mingettyなどの仮想端末を対象としたgettyプログラムのデフォルトは、端末をクリアすることです。 (これはログオン前に行われます。つまり、TTYログインサービスが停止した場合でも端末出力は消去されないままになります。皮肉なことに、この機能はloginに配置したほうがよいでしょう。これは、PAMの必要性のおかげでまだ残っています。ログオフ時に実行されます。)

    これを無効にするには、--noclearオプションを展開する必要があります。これには、1つ以上のユニットファイルオーバーライドファイルの書き込み、ExecStart設定の変更、または単に[email protected]を自分で考案したローカルユニットファイルに向けることが含まれます。

  • systemdが提供する[email protected]テンプレートサービスユニットセットTTYVTDisallocate=yesは、systemdにカーネル仮想端末をクリアするように指示します。 (これも、名前に部分的に反映されているように、ユーザースペースの仮想端末でさえも、他の種類の端末では機能しません。)

    これも、オーバーライドまたは[email protected]が指す別のサービステンプレートを使用して削除する必要があります。

参考文献

11
JdeBP

私はCentOS7で作業していますが、セットアップが異なる場合があります。ただし、私にとっては、gettyの呼び出しはサービスファイル/usr/lib/systemd/system/[email protected]によって制御されます。 (@はテンプレート用です。[email protected]として開始され、文字列tty1がファイルに渡され、実行されるTTYを制御します。)このファイル内には、最初の行があります。 ExecStart=、コマンドラインを指定します。オプションはここに追加されます。 (システムのアップグレードによって上書きされる可能性があるため、/usrの下のファイルを直接編集しないことをお勧めします。最初に/etcの下のどこかに、おそらく/etc/systemd/systemの下にコピーする必要があります。ベンダー提供のファイル。)

シャットダウン/再起動時に必要なものは、シャットダウン/再起動プロセスを直接調整するのではなく、サービスシャットダウンアクションのリストにアクションを追加することによって最適に処理されるように見えます。これは、systemdが自動的に実行します。システムの停止または再起動(またはsystemctlを使用してサービスを手動でオフにした場合)。これを行う簡単な方法は、スクリプトをシステムサービスコマンドのExecStop行に変換することです。設定方法によっては、全体を管理するユーザーサービスファイルを作成し、そこにExecStopを配置することもできます。

2
Tom Hunt