Что означает и какая команда выполняется при нажатии Ctrl+Alt+Del в Linux?

Что означает и какая команда выполняется при нажатии Ctrl+Alt+Del в Linux?

В моем рабочем столе с графическим интерфейсом GNOME в Ubuntu 12.04 Ctrl++ приводит к выходу из Altсистемы Deleteвместо перезагрузки.

Но мне сказали, что

Переключение на текстовую виртуальную консоль и нажатие Ctrl+Alt+Delete перезагрузит машину. Она выключится чисто и перезагрузится, что намного лучше, чем Alt+SysRq+REISUB.

Поэтому мне интересно , верны ли два приведенных выше разных значения Ctrl+ Alt+ ?Delete

К каким командам Ctrl+ Alt+ Deleteпривязано в этих двух случаях?

решение1

Ctrl+ Alt+ Deleteна самом деле является «волшебной» комбинацией клавиш для аппаратной архитектуры, совместимой с IBM PC, которая вызывает сброс BIOS.

Поскольку подобные вещи опасны для такой системы, как Linux, было принято решение перехватить эти нажатия клавиш и сделать что-то другое. Это контролируется initи вы можете увидеть, что это делает, заглянув в /etc/inittab.

На моей системе Debian Squeeze:

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

Позднее Windows NT последовала этому примеру и превратила Ctrl+ Alt+ Deleteв режим безопасного ввода ключа*.

В случае X он аналогичным образом перехватывает нажатия клавиш, но это просто killсервер отображения (который автоматически возродится, если вы используете менеджер отображения).

На некоторых системах (возможно, на всех, я давно не пробовал) можно нажать Ctrl+ Alt+ Deleteдо загрузки ОС, чтобы выполнить сброс BIOS.


*Я не уверен, как это на самом деле называется.

решение2

Ядро Linux может либо жестко перезагрузиться, либо отправить сигнал SIGINT процессу инициализации при нажатии Ctrl + Alt + Del

Само ядро ​​Linux допускает два возможных варианта поведения сочетания клавиш Ctrl-Alt-Del:

  • перезагрузите немедленно
  • отправить SIGINT в процесс init

Выбор используемого поведения можно осуществить одним из следующих способов:

  • rebootсистемный вызов, см.man 2 reboot
  • /proc/sys/kernel/ctrl-alt-del

Таким образом, если поведение SIGINT включено, то результат нажатия Ctrl + Alt + Del полностью зависит от обработчика SIGINT, имеющегося в вашем init.

Например, BusyBox 1.28.3 init выполняет произвольную команду, заданную /etc/inittabкак:

::ctrlaltdel:/sbin/reboot

А вот минимальный интересный пример на языке C для uclibc:

#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 используют systemdвместо SysV init. Поведение комбинации ctrl-alt-delete обрабатывается ctrl-alt-del.target, которая по умолчанию связана с reboot.target, но может быть установлена ​​на любую другую.

Список доступных целей:

systemctl list-unit-files -t target

Переключение цели

Нажатие комбинации 7 и более раз в течение 2 секунд (например, нажатие и удержание) по умолчанию приведет к немедленной перезагрузке (или действию, указанному в CtrlAltDelBurstAction).

Также есть полезная функция kbrequest.target, но она не включена по умолчанию.

Связанный контент