Linux で Ctrl+Alt+Del で実行されるコマンドと意味は何ですか?

Linux で Ctrl+Alt+Del で実行されるコマンドと意味は何ですか?

Ubuntu 12.04 の gnome GUI デスクトップでは、再起動する代わりにログアウトしますCtrlAltDelete

しかし、私はこう言われました

テキストベースの仮想コンソールに切り替えて、Ctrl + Alt + Delete を押すと、マシンが再起動します。正常にシャットダウンして再起動するので、Alt + SysRq + REISUB よりもはるかに優れています。

では、上記の ++Ctrlの2 つの異なる意味は正しいのでしょうか?AltDelete

これら 2 つのケースでは、どのコマンドCtrl+ Alt+Deleteがバインドされますか?

答え1

Ctrl++AltDelete、実際には IBM PC 互換ハードウェア アーキテクチャの「魔法の」キーストロークであり、BIOS リセットを呼び出します。

このようなことは Linux のようなシステムでは危険なので、これらのキーストロークをフックして、代わりに何か他のことを実行するという決定が下されました。これは によって制御されinit、 を見るとそれが何を行うかがわかります/etc/inittab

私の Debian Squeeze システムの場合:

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

CtrlWindows NT も後にこれに追随し、セキュア キー入力モード* を導入しましAltた。Delete

X の場合も同様にキーストロークをフックしますが、単にkillディスプレイ サーバーになります (ディスプレイ マネージャーを使用している場合は自動的に再起動します)。

一部のシステム (おそらくすべてですが、しばらく試していません)では、OS がロードされる前にCtrl+ Alt+ を押して BIOS リセットをトリガーできます。Delete


*実際に何と呼ばれているのかはわかりません。

答え2

Linuxカーネルは、Ctrl + Alt + Delでハードリブートするか、initプロセスにSIGINTを送信することができます。

Linux カーネル自体は、Ctrl-Alt-Del から 2 つの動作を許可します。

  • すぐに再起動する
  • initプロセスにSIGINTを送信する

どちらの動作を使用するかは、次のいずれかで選択できます。

  • rebootシステムコールについては、man 2 reboot
  • /proc/sys/kernel/ctrl-alt-del

したがって、SIGINT 動作が有効になっている場合、Ctrl + Alt + Del の結果は、init が持つ SIGINT ハンドラーに完全に依存します。

たとえば、BusyBox 1.28.3 init は/etc/inittab次のように指定された任意のコマンドを実行します。

::ctrlaltdel:/sbin/reboot

以下は uclibc の最小限の興味深い C の例です。

#define _XOPEN_SOURCE 700
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/reboot.h>
#include <unistd.h>

void signal_handler(int sig) {
    write(STDOUT_FILENO, "cad\n", 4);
    signal(sig, signal_handler);
}

int main(void) {
    int i = 0;
    /* Disable the forced reboot, enable sending SIGINT to init. */
    reboot(RB_DISABLE_CAD);
    signal(SIGINT, signal_handler);
    while (1) {
        sleep(1);
        printf("%d\n", i);
        i++;
    }
    return EXIT_SUCCESS;
}

ここはこれを試すための簡単なセットアップ

答え3

最近の Linux ディストリビューションでは、systemdSysV init の代わりに を使用します。ctrl-alt-delete コンボの動作は、ctrl-alt-del.target によって処理されます。これは、デフォルトでは reboot.target にリンクされていますが、他のターゲットに設定することもできます。

利用可能なターゲットのリスト:

systemctl list-unit-files -t target

ターゲットの切り替え

2 秒以内にコンボを 7 回以上押すと (長押しなど)、デフォルトで即時再起動が強制されます (または で指定されたアクションが実行されますCtrlAltDelBurstAction)。

便利な もありますkbrequest.targetが、これはデフォルトでは有効になっていません。

関連情報