Как делает завершение работы системы работы ядра Linux внутренне?

DRBD доступен в ELRepo.

Для установки в RHEL 5 выполните следующее:

rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://elrepo.org/elrepo-release-5-3.el5.elrepo.noarch.rpm
yum update
yum search drbd

29
01.04.2014, 15:11
2 ответа

Это лишь частичный ответ, и я обязательно предлагаю другой ответ, который может быть более исчерпывающим и ясным.

Содержание этого ответа взято из файла kernel / reboot.c ядра Linux 3.13 (что может быть не первым предположением, так как имя не shutdown.c, а reboot.c)

В любом случае у нас есть в основном три функции, которые набрасывают процесс выключения системы

  • void kernel_halt (void) // который завершается остановкой системы
  • void kernel_power_off (void) // что завершается отключением системы
  • void kernel_restart (char * cmd) // что завершает работу системы, но перезапускает ее

Эти функции очень краткие и поэтому могут быть вставлены сюда полностью. Их код лучше всего показывает, какие шаги предпринимаются для завершения работы ядра. (комментарии принадлежат мне и могут быть не на 100% идеальными и правильными, убедитесь в этом сами. Это просто попытка.

void kernel_halt (void)

void kernel_halt(void)
{
    // 1st step does:
    // a) call functions/callback registered to run at reboot/shutdown
    // b) set system_sate to SYSTEM_HALT
    // c) stop the userspacetool interaction
    // d) call device_shutdown() function
    kernel_shutdown_prepare(SYSTEM_HALT);

    // 2nd step: I think this is mostly a necessity for multi-cpu systems
    migrate_to_reboot_cpu();

    // 3rd step:
    // syscore_shutdown - Execute all the registered system core shutdown callbacks 
    syscore_shutdown();

    // 4th messages
    pr_emerg("System halted\n");
    kmsg_dump(KMSG_DUMP_HALT);

    // 5th call arch specific cpu-halt-code
    machine_halt();
}

все это инициируется с помощью sys_reboot системный вызов, который, учитывая, что он не только перезагружается, но и завершает работу, в любом случае не является прямым средством связи с процессом завершения работы.

2
27.01.2020, 19:38

Основные ресурсы для понимания того, как работает ядро ​​Linux:

  1. Документация .
  2. Еженедельные новости Linux .
  3. Источник. Это сложный зверь, которого немного легче понять с помощью LXR , перекрестной ссылки Linux. Вариант LXR, работающий на lxr.linux.no , лучше других, но часто не работает.

В этом случае я не могу найти что-либо актуальное в документации или на LWN, так что это LXR.

Последнее, что делает код пользовательского пространства, это вызывает системный вызов reboot . Требуется 4 аргумента, поэтому ищите SYSCALL_DEFINE4 (перезагрузка на LXR, что приводит к kernel / reboot.c .После проверки прав и аргументов вызывающего абонента точка входа системного вызова вызывает одну из нескольких функций: kernel_restart для перезагрузки, kernel_halt для остановки в замкнутом цикле, kernel_poweroff чтобы выключить систему, с kernel_kexec по замените ядро ​​новым (если оно скомпилировано) или спящий режим , чтобы сохранить память на диск перед выключением .

kernel_restart , kernel_halt и kernel_power_off довольно похожи:

  1. Выполните reboot_notifier_list , который представляет собой список ловушки, которые компоненты ядра могут зарегистрировать для выполнения кода при выключении питания. На этом этапе только несколько драйверов должны выполнять код, в основном это сторожевые таймеры.
  2. Установить переменную system_state .
  3. Отключите usermode-helper , чтобы гарантировать, что никакой пользовательский код больше не будет запускаться. (На этом этапе все еще могут существовать процессы.)
  4. Вызов device_shutdown , чтобы разблокировать или выключить все устройства в системе. Многие водители подключаются к этому этапу.
    Обратите внимание, что все файловые системы, которые все еще смонтированы на этом этапе, эффективно размонтируются принудительно. Вызывающий системный вызов берет на себя ответственность за любое чистое размонтирование.
  5. Только для отключения питания, если ACPI сконфигурирован, возможно, выполнить код для подготовки к переходу в состояние ACPI S5 (мягкое отключение питания).
  6. В многопроцессорной машине код может выполняться на любом процессоре, независимо от того, какой из них вызвал системный вызов. migrate_to_reboot_cpu заботится о переключении на один конкретный ЦП и предотвращении отправки кода планировщиком на другие ЦП. После этого работает только один ЦП.
  7. syscore_shutdown вызывает метод shutdown для зарегистрированных операций системного ядра . Я думаю, что в основном речь идет об отключении прерываний; несколько хуков имеют метод выключения .
  8. Записать информационное сообщение - лебединую песню.
  9. Наконец, переходим к отдыху каким-либо машинно-зависимым способом, вызывая machine_restart , machine_halt или machine_power_off .

Код гибернации проходит через следующие этапы:

  1. Итерация через крючки управления питанием .
  2. Синхронизация файловых систем.
  3. Заморозить весь код пользователя .
  4. Предотвращение горячего подключения устройства .
  5. Выгрузить состояние системы в область подкачки.
  6. Если все прошло успешно, перевести оборудование в спящий режим . Это может включать вызов kernel_restart , kernel_halt или kernel_power_off , либо какой-либо метод гибернации для конкретной платформы.

Другой способ выключить систему - machine_emergency_restart . Это вызывается волшебным ключом SysRq B . Клавиша O работает иначе: вызывает kernel_power_off .

Система также может отключиться из-за паники , то есть неисправимой ошибки. Паника пытается зарегистрировать сообщение, а затем перезагрузить систему (либо через аппаратный сторожевой таймер, либо через экстренный перезапуск).

27
27.01.2020, 19:38

Теги

Похожие вопросы