- Вопрос или проблема
- /proc/sys/kernel/panic
- Ответ или решение
- Как настроить перезагрузку ядра Linux при панике
- 1. Параметр "panic" на командной строке ядра
- 2. Использование файла /proc/sys/kernel/panic
- 3. Конфигурация через sysctl
- 4. Конфигурация CONFIG_PANIC_TIMEOUT в .config
- 5. Использование CONFIG_CMDLINE_BOOL
- 6. Системы с аппаратным таймером
- Заключение
Вопрос или проблема
Вы можете добавить “panic=N” в командной строке ядра, чтобы система перезагрузилась через N секунд после паники.
Но есть ли опция конфигурации для указания этого (кроме параметра командной строки ядра по умолчанию) еще до того, как загрузчик начнет работу? Может быть, какая-то опция ядра?
Согласно man proc
:
/proc/sys/kernel/panic
Этот файл предоставляет доступ к переменной ядра panic_timeout для чтения и записи. Если это значение равно нулю, ядро будет зациклено в состоянии паники; если оно ненулевое, это означает, что ядро должно перезагрузиться через это количество секунд. При использовании программного драйвера устройства watchdog рекомендуется устанавливать значение 60.
Конфигурационный файл – это файл конфигурации загрузчика (grub) сам по себе, так как это параметр, выполняемый во время загрузки, и grub не может ожидать, что будет читать из какого-либо другого конфигурационного файла, пока файловая система не смонтирована.
Тем не менее, поскольку это инициализированный параметр, его время выполнения также можно изменить с помощью sysctl
. Таким образом, обновление /etc/sysctl.conf
с параметром kernel.panic = 3
является обновлением конфигурации.
kernel.panic
– это sysctl. Существует много способов конфигурирования этих параметров, например, через sysctl.d.
В ядре Linux (я видел в версиях 3 и выше) есть опция в .config
. CONFIG_PANIC_TIMEOUT
– это параметр, который по умолчанию равен 0
. В этих версиях ядра Linux ответ Лекенстейна также будет работать. Но эта переменная берется только из .config
.
int panic_timeout = CONFIG_PANIC_TIMEOUT;
Кажется, такой опции конфигурации не существует. Значение по умолчанию равно 0, что согласно http://www.mjmwired.net/kernel/Documentation/kernel-parameters.txt#1898 означает “ждать вечно”.
Опция определена в kernel/panic.c, вы можете написать патч, который устанавливает начальное значение на что-то другое.
Чтобы закодировать перезагрузку через 3 секунды, измените:
int panic_timeout;
на:
int panic_timeout = 3;
Ядро Linux поддерживает CONFIG_CMDLINE_BOOL
Позволяет задавать аргументы загрузки ядра во время сборки. На некоторых системах (например, встроенных) необходимо или удобно предоставить некоторые или все аргументы загрузки ядра вместе с самим ядром (то есть не полагаться на загрузчик для их предоставления).
Есть несколько примеров даже на этом “портале”, например.
Вы можете использовать этот патч, который добавляет параметр конфигурации.
Сначала подведите итоги информации в других ответах. Значение определено в kernel/panic.c и доступно для чтения и записи через sysctl. Его можно передать как командную строку загрузки.
Более того, я собираюсь сказать, что командную строку загрузки можно установить со значением по умолчанию во время компиляции.
Если вы хотите сделать это до загрузчика, вам понадобится аппаратный таймер watchdog. Многие встроенные операционные системы имеют такие таймеры, и вы настраиваете их в аппаратной конфигурации системы (или в настройках BIOS, если это обычный ПК).
Они перезагрузят систему, если watchdog не был “щекочен” в течение заданного количества секунд, что перестает происходить после паники ядра или даже после нельзя восстановить аппаратной ошибки, такой как поврежденная оперативная память, которая полностью зависает машину.
Обратите внимание, что с такими аппаратными таймерами watchdog вы должны убедиться, что заданный таймаут длиннее, чем время, необходимое для загрузки в Linux и загрузки драйвера watchdog, чтобы начать “щекотать” watchdog. В противном случае система будет сбрасываться каждый раз, когда истекает время, даже если все работает нормально, и просто требуется много времени для загрузки ядра.
После того, как я увидел множество ответов, которые не отвечают на вопрос, я добавляю свой собственный:
Вы можете нажать e, когда GRUB отображает меню загрузки, чтобы войти в Режим редактирования.
Там вы увидите обычные параметры загрузки ядра, и вы можете удалить, отредактировать или добавить параметры.
Когда закончите, нажмите Ctrl+X, чтобы загрузить отредактированную запись.
Я думаю, что это именно то, о чем спрашивали.
Для современных систем строка с использованием linuxefi
вероятно, та строка, которую вы хотите изменить.
Ответ или решение
Как настроить перезагрузку ядра Linux при панике
Если вы являетесь системным администратором или специалистом в области ИТ, настройка параметров ядра Linux для перезагрузки системы после возникновения паники может оказаться важным шагом в управлении стабильностью и доступностью ваших серверов. В этой статье мы детально рассмотрим, как это сделать еще до того, как загрузчик системы вступит в силу, а также на уровне конфигурации ядра.
1. Параметр "panic" на командной строке ядра
Один из самых простых способов настроить перезагрузку системы — добавить параметр panic=N
в командную строку ядра. Например, указание �panic=5
позволит системе перезагружаться через 5 секунд после возникновения паники. Это можно сделать через конфигурацию загрузчика, например, GRUB. Однако, если вам нужно установить это значение еще до загрузки, существуют и другие подходы.
2. Использование файла /proc/sys/kernel/panic
В файловой системе proc есть файл panic
, который можно использовать для управления поведением ядра после паники. Если значение в этом файле равно нулю, ядро будет зацикливаться в случае паники. Ненулевое значение указывает на количество секунд, после которых система автоматически перезагрузится. Однако это изменение будет действовать только после загрузки системы и не является предварительной настройкой.
3. Конфигурация через sysctl
Для управления значениями в системных переменных, вы можете использовать команду sysctl
. Например, чтобы установить значение kernel.panic
, можно добавить строку kernel.panic = 3
в файл /etc/sysctl.conf
. Таким образом, после загрузки системы значение параметра будет применено.
4. Конфигурация CONFIG_PANIC_TIMEOUT
в .config
Если вы разрабатываете свое ядро или работаете с исходным кодом, обратите внимание на параметр CONFIG_PANIC_TIMEOUT
в конфигурационном файле ядра (.config
). По умолчанию, это значение равно нулю, что означает «ждать всегда». Вы можете изменить этот параметр, добавив строку:
CONFIG_PANIC_TIMEOUT=3
Тем самым, вы жестко устанавливаете время ожидания перед перезагрузкой на 3 секунды.
5. Использование CONFIG_CMDLINE_BOOL
Доступность параметра CONFIG_CMDLINE_BOOL
в конфигурации ядра позволяет задавать аргументы загрузки непосредственно во время компиляции. Это даёт возможность жестко указать параметры, такие как panic
, работающие на уровне ядра без зависимости от загрузчика. Таким образом, конфигурация может выглядеть следующим образом:
CONFIG_CMDLINE="panic=3"
Это обеспечит загрузку с нужными аргументами, не полагаясь на загрузчик.
6. Системы с аппаратным таймером
Если вы хотите реализовать перезагрузку системы непосредственно до загрузки операционной системы, можно использовать аппаратный таймер. Эта функция присутствует в большинстве встроенных операционных систем и может быть настроена через системную настройку аппаратного обеспечения или BIOS. Аппаратный таймер будет перезагружать систему, если он не будет "подаваться" в течение установленного времени.
Однако следует быть осторожным с настройкой периода таймера. Убедитесь, что таймер установлен на более длительный срок, чем время, необходимое для полной загрузки системы и инициализации драйвера таймера, чтобы избежать преждевременной перезагрузки.
Заключение
Управление параметром перезагрузки ядра после паники — это важный элемент обеспечения стабильности систем Linux. Используя комбинацию различных методов, таких как изменение параметров в конфигурации ядра, использование sysctl
, и даже настройка аппаратного обеспечения, вы можете добиться необходимого уровня контроля над поведением системы в критических ситуациях. Настоятельно рекомендуется тестировать изменения в безопасной среде, прежде чем внедрять их в производственные системы.