web-dev-qa-db-ja.com

Debian 9の停止は、新しいバージョンでは実際には電源が​​切れません-なぜですか?

重要:実行すると、停止した古い動作を復元できます:

apt install sysvinit-core  

Plus:古いRed Hatベースのバージョンも停止して電源を切ることができます。

Debian 9でhaltを使用してコンピューターの電源をオフにするべきではない理由を理解しようとしています。その動作はsystemdから削除されます。私は少し怖いですが、論理的な理由があるに違いないと思います。

他のUNIXまたはUnixライクはこれと同じ動作ですか、それともLinuxは別のものに変わりますか?

システムのシャットダウン後にマシンの電源をオフにする場合は、停止する代わりに電源オフを使用する必要があります...

このコマンドが他のUnixライクでどのように解釈されるか知っている人はいますか?

これは重複していません。たとえば、debian7は停止して電源を切ることができるからです。

Debian

Debian(esque)システムでSysVinitを使用する場合、/etc/defaults/haltには、システムがランレベル0への移行の終わりに停止または電源切断を実行するかどうかを定義する変数が含まれます。デフォルト設定はHALT=poweroffです。

SysVinit 2.74より前は、haltを直接実行することは想定されていませんでした。そのバージョンから、現在のランレベルが0または6でない限り、SysVinit haltコマンドはshutdown -hを呼び出すだけです。これについては、halt(8)のマニュアルページ。ランレベル0への移行が終了すると、ランレベルスクリプトは$HALTを実行します。これは、デフォルトではpoweroffと同じです。

RHEL/CentOS

RHEL/CentOS 5はSysVinitを使用する最後のバージョンでした:バージョン6はupstartを使用し、バージョン7はsystemdを使用しました。 RHEL 5.11では、ランレベル0に移行するときに実行される最後のスクリプトは/etc/init.d/haltであり、その最後の行は次のとおりです。

[ "$INIT_HALT" != "HALT" ] && HALTARGS="$HALTARGS -p"

exec $command $HALTARGS

同じスクリプトがランレベル6(再起動)への移行の最後にも実行されるため、実行する実際のコマンドは変数$commandまたは/sbin/haltまたは/sbin/rebootのいずれかで定義されます。 $INIT_HALT変数の値に従って、スクリプトは-pオプションを追加するかどうかを決定します。その変数は/sbin/shutdownによって設定されます。 RHEL 5.11 shutdown(8)のマニュアルページには次のように書かれています。

HALT OR POWEROFF

-Hオプションはinit環境変数INIT_HALTをHALTに設定し、-Pオプションはその変数をPOWEROFFに設定するだけです。シャットダウンシーケンスの最後にhalt(8)を呼び出すシャットダウンスクリプトは、これらの環境変数をチェックし、これらのオプションが実際に効果を発揮するための適切なオプションを指定してhalt(8)を呼び出す必要があります。 Debian 3.1(sarge)はこれをサポートしています。

(はい、RHEL5.11のマニュアルページにはDebian3.1が記載されています!RedHatの誰かがさまざまなソースからRHELにパッチを移植していると思います...)

RedHatが上記のテストを/etc/init.d/haltスクリプトでコーディングすることを決定したようです(シャットダウンの最後に/sbin/halt -pを使用して)電源をオフにするのがデフォルトの停止アクションです:電源をオフにせずに停止する唯一の方法はshutdownコマンドの大文字の-Hオプションを使用して明示的に要求するには、例えばshutdown -hH now

ただし、ここでも、デフォルトのパワーダウンはLinuxディストリビューションによってカスタマイズされたランレベルスクリプトによってトリガーされるため、SysVinit haltコマンドの機能ではありません。

歴史ノート

古いSysVinitを使用するシステム(Linuxと非Linuxの両方)には、直接使用するためではなく、適切なシャットダウン/再起動スクリプトの一部としてのみ使用するコマンドがいくつかありました。 SysVinit 2.74より前は、オプションのない/sbin/haltコマンドは、最新のSysVinitのhalt -fと同じように実行されていました。つまり、サービスを停止したりファイルシステムをアンマウントしたりすることなく、残忍な即時カーネルシャットダウンを実行していました。

同じ理由で、Linux killallコマンドに慣れていると、他のUnixでは危険な場合があります。そのmanページにもこの不吉な警告があります:

Killall名を入力しても、Linux以外のシステムでは望ましい効果が得られない場合があることに注意してください(特に特権ユーザーが実行した場合)。

これは、従来のSystemV killallが、シャットダウンスクリプトの一部としてのみ使用されるように設計されたコマンドの1つであったためです。 SysVinitを使用するLinuxディストリビューションでは、コマンドのクラシックバージョンはkillall5として見つかる場合があります。カーネルスレッドとそれ自体のセッション内のプロセスを除くすべてのallプロセスを文字通り強制終了します。その使用目的は、すべてのサービスをシャットダウンした後、マウントを解除する直前のシャットダウンスクリプトです。ローカルファイルシステム。アンマウントを遅延または防止する可能性のある他のプロセスを強制終了します。

(私はこれをどのように知っていますか?そうですね、私はかつてSolaris 2.6システムでルートとしてkillall <something>を実行するという間違いを犯しました。非常に効果的な学習体験です。)

5
telcoM

この質問は、複数の虚偽に基づいています。

haltを使用してコンピューターの電源を切ることはありませんでした。これはsystemdで変更されていません。

halt a.k.a .haltsysはシャットダウンして停止します。 poweroffは、シャットダウンして電源を切る新しいコマンドです。 ( https://unix.stackexchange.com/a/196471/5132 質問はLinuxオペレーティングシステムに関するものであるため、ここで説明する微妙な点について説明します。この回答は焦点を当てています。宇宙のAT&T System 5 UNIX側だけです。)

https://superuser.com/a/900205/38062 で説明したように、コンピュータは必ずしも電源を入れることができませんソフトウェア制御下でオフ。 haltsysおよびhaltコマンドのアクションは、従来、マシンをシャットダウンして停止することでした。次のアクションは、物理的なリセットボタンまたは電源スイッチを使用するオペレーターです。

haltは、-p/--poweroffオプションを取得してpoweroffと同等にしましたが、これは、これらのコマンドのオーバーラップするオプションと自己矛盾するオプションの一般的な増加の兆候です。目撃者 Debian7のUpstarthaltコマンドのマニュアルページ 。そこにhalt --poweroffがあります。 Debian7のvanSmoorenburg haltコマンドのマニュアルページ 同様にhalt -pがあります。

しかし、これはsystemdで変更されたものではありません。 systemdは同じものを提供します。 systemd haltコマンドまたには--poweroffがあります。さらに、--rebootおよび(適切な測定のために)--haltオプションがあります。

互換性のために、 noshツールセットのhalt/haltsysコマンド でも同じことをしなければなりませんでした。

コンピュータの電源がオフになっていると単純に古いhaltと誤って考える可能性があります。しかし、それはUpstartにとっては明らかに間違っていました。また、バグが発生した場合は、onlyがvan Smoorenburgツールセットに当てはまります。

今年だけ最終的に修正されたバグは、van Smoorenburghaltコマンドが-pオプションの有無を単に無視し、代わりに設定の値に従って停止するか電源を切るかを決定することでした。 /etc/default/haltで。その設定がたまたま電源オフに設定されている場合、-pオプションが指定されていなくても、haltは常に電源オフになります。逆に、その設定を停止に設定した場合、-pオプションが指定されていても、haltは常に停止します。

しかしこれはバグであり、文書化された、または意図された動作ではなく、Debianで利用可能なすべてのhaltコマンドの動作ではなく、一般にhaltコマンド。

参考文献

3
JdeBP