Kernel
- 1 year ago
- 0
- 0
Kernel panic (с англ. — «тревога, сбой в ядре», дословно паника ядра ) — сообщение о критической ошибке ядра операционной системы , после которой операционная система не может продолжать дальнейшую работу .
Обычно этот термин применяется в среде операционных систем типа
UNIX
. Её имя связано с текстом ошибки вида «
Kernel panic: …
» и именем функции ядра
panic()
из оригинальной ОС UNIX
.
Kernel panic возможен на Android , который базируется на ядре Linux , и в самих Linux-системах. Поскольку Mac OS X и iOS базируются на Darwin , являющейся подсемейством UNIX-систем, они также подвержены kernel panic. .
История Kernel panic тесно связана с историей операционной системы UNIX , которая была разработана в конце 1960-х годов сотрудниками Bell Labs , — в первую очередь Кеном Томпсоном , Деннисом Ритчи и Дугласом Макилроем .
Сообщение Kernel panic было введено в ранних версиях UNIX и представляло собой важное отличие в философии этой операционной системы от Multics — главного конкурента на то время и предшественника UNIX. Multics был разработан для работы на 36-битном мейнфрейме , в то время как UNIX разрабатывался для гораздо менее мощного 18-битного мини-компьютера PDP-7 и по этой причине UNIX было доступно меньше ресурсов, что привело к необходимости их экономии, в том числе и при обработке ошибок. Разработчик Multics Том ван Влек так описывает это изменение в дискуссии с разработчиком UNIX Деннисом Ритчи :
Я сказал Деннису, что примерно половина кода, который я написал для Multics, была кодом обработки ошибок. Он ответил: «Мы всё это отбросили. Если произошла ошибка, у нас есть процедура под названием panic , и если она вызвана, компьютер зависает и вы кричите: „Эй, перезапустите его!“».
Оригинальный текст (англ.)I remarked to Dennis that easily half the code I was writing in Multics was error recovery code. He said, «We left all that stuff out. If there’s an error, we have this routine called panic, and when it is called, the machine crashes, and you holler down the hall, ‘Hey, reboot it.’
Изначальная функция
panic()
принципиально не менялась от UNIX V5 до базирующихся на
VAX
систем 32V и выводила только сообщение об ошибке без дополнительной информации, после чего система переводилась в
бесконечный пустой цикл
. Позже — в процессе развития UNIX — функция
panic()
была доработана и стала выводить на
терминал
разнообразную информацию, необходимую для отладки.
Подобный принцип обработки критических ошибок был перенят большинством более поздних операционных систем, например Mac OS или Microsoft Windows .
Одной из самых распространённых причин kernel panic является невозможность найти и смонтировать корневую файловую систему. Часто это ошибка конфигурации, которая может быть исправлена при перезагрузке ядра вручную .
В Linux возникновению паники ядра зачастую предшествует состояние под названием « oops ». В ряде случаев «oops» может приводить к такому же неработоспособному состоянию системы, как и паника ядра .
В большинстве остальных случаев причиной Kernel panic является критическая аппаратная ошибка (отказ оперативной памяти , ошибка процессора , материнской платы , видеокарты или иного критически важного устройства) или ошибка в самом ядре ОС (например, попытка обращения к неверному или запрещённому адресу в памяти). Также причиной для Kernel panic могут быть ошибки в драйверах аппаратных (в частности периферийных) устройств или ошибки в файловой системе . Во время финальной стадии инициализации пространства пользователя kernel panic обычно возникает тогда, когда не удаётся запустить init , так как, несмотря на запущенное и работоспособное ядро, сама система все ещё остаётся в нерабочем состоянии .
Kernel panic может быть вызван и прикладной программой, если та некорректно работает с ядром. Так в 2012 году ошибка в Google Chrome вызывала Kernel panic в Mac OS X .
Исходный код функции panic() в UNIX V6 :
char *panicstr;
/*
* Panic is called on unresolvable
* fatal errors.
* It syncs, prints "panic: mesg" and
* then loops.
*/
panic(s)
char *s;
{
panicstr = s;
update();
printf("panic:%s\n", s);
for(;;)
idle();
}
В нормальном случае при возникновении Kernel panic происходит аварийная остановка (авост) работы операционной системы с выдачей сообщений об ошибках на экран, после чего система ожидает выключения или перезагрузки компьютера . Однако такой механизм обработки этого события неприемлем тогда, когда простой компьютера крайне нежелателен или человека нет рядом (например, на удалённых серверах или в нерабочее время) .
В современных ОС (в частности в GNU/Linux , FreeBSD или Solaris ) существует возможность изменить стандартное поведение функции panic() и производить перезагрузку компьютера автоматически. В GNU/Linux данная настройка осуществляется при помощи procfs :
echo 5 > /proc/sys/kernel/panic
Чтобы изменения действовали в
GNU/Linux
и после перезагрузки, необходимо добавить в файл
/etc/sysctl.d/99-sysctl.conf
строку:
kernel.panic=5
Значение параметра kernel.panic — количество секунд, после которых произойдёт перезагрузка. При установке отрицательного или равного 0 значения этого параметра автоматической перезагрузка не произойдёт .
Также в
BSD
-системах есть специальная опция в ядре. Цитата из файла
/usr/src/sys/conf/NOTES
:
# Set the amount of time (in seconds) the system will wait before
# rebooting automatically when a kernel panic occurs. If set to (-1),
# the system will wait indefinitely until a key is pressed on the
# console.
options PANIC_REBOOT_WAIT_TIME=16
В Solaris автоматическая перезагрузка после Kernel panic является стандартным поведением системы .
Перезагрузка после Kernel panic имеет и очень серьёзный недостаток, особенно если это изменение не пропадает после первой перезагрузки . В случае, если перезагрузка не устраняет ошибку, вызывавшую Kernel panic, система будет останавливаться и перезапускаться вновь и вновь, что может привести к аппаратным ошибкам или потерям данных . В случае если такая ситуация возникла после сборки нового ядра, решением проблемы может стать загрузка сохранённой копии старого работающего ядра. Как правило, для этого достаточно вручную указать при загрузке путь к работоспособной копии ядра .
Для изучения причины паники ядра Linux может пригодиться файл System.map .
Изначально сообщение о Kernel panic ограничивалось коротким текстом о необходимости перезагрузки системы. В современных системах обычно выдается больше дополнительной информации.
В то время как термин Kernel panic употребляется в основном для UNIX -совместимых операционных систем, в других операционных системах обработка критических ошибок методом остановки системы тоже прижилась и получила следующие названия: