Что такое испорченное ядро ​​в Linux?

99

При определенных условиях ядро ​​Linux может стать испорченным . Например, загрузка проприетарного видеодрайвера в ядро ​​портит ядро. Это условие может быть видно в системных журналах, сообщениях об ошибках ядра (упс и паника), а также с помощью таких инструментов, как lsmodи остается до перезагрузки системы.

Что это значит? Влияет ли это на мою способность использовать систему и как это может повлиять на мои варианты поддержки?

bwDraco
источник
Возможные дубликаты выходных
Жиль
@ Жиль, я думаю, что вопрос, с которым ты связан, должен быть объединен с этим. Кроме того, не очевидно, что один вопрос является дубликатом другого.
bwDraco
1
Я надеюсь сделать это канонической версией вопроса; см. последнее изменение к вопросу.
bwDraco
9
@MichaelMrozek: 1) Я не видел существующий вопрос, так как это не было очевидно , что пользователь спрашивает «что означает„испорченный“означает», и 2) вопрос , как сформулирован достаточно специфично для одной команды lsmod. Я написал этот вопрос и ответ, чтобы сделать его более общим, чтобы кто-то, спрашивающий «что означает« испорченный »означает), мог легко его найти.
bwDraco
1
Они могли бы использовать слово, которое было бы немного более нейтральным, чем «испорченное».
Роджер Даль

Ответы:

126

Когда ядро ​​испорчено, это означает, что оно находится в состоянии, которое не поддерживается сообществом . Большинство разработчиков ядра игнорируют сообщения об ошибках, связанных с испорченными ядрами, и члены сообщества могут попросить вас исправить условие заражения, прежде чем они смогут приступить к диагностике проблем, связанных с ядром. Кроме того, некоторые функции отладки и вызовы API могут быть отключены, когда ядро ​​испорчено.

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

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

Ядро может стать испорченным по любой из нескольких причин , включая (но не ограничиваясь) следующее:

  • Использование проприетарного (или не совместимого с GPL) модуля ядра - это наиболее распространенная причина появления испорченных ядер, которая обычно возникает в результате загрузки проприетарных видеодрайверов NVIDIA или AMD
  • Использование промежуточных драйверов, которые являются частью исходного кода ядра, но не полностью протестированы
  • Использование модулей вне дерева , которые не включены в исходный код ядра Linux
  • Принудительная загрузка или выгрузка модуля ядра (например, принудительная вставка модуля, не созданного для текущей версии ядра)
  • Использование SMP (многопроцессорного) ядра на некоторых неподдерживаемых однопроцессорных процессорах, в первую очередь на старых процессорах AMD Athlon
  • Перекрытие из ACPI DSDT, иногда требуется для исправления ошибок управления питанием (см здесь для более подробной информации)
  • Определенные критические ошибки, такие как исключения проверки компьютера и ошибки ядра
  • Некоторые серьёзные ошибки в системной прошивке (BIOS, UEFI), которые должны устраняться ядром

Каждое из этих условий представлено определенным флагом в ядре. Некоторые поставщики Linux, такие как SUSE, добавляют дополнительные флаги заражения, чтобы указать такие условия, как загрузка модуля, который не поддерживается поставщиком.

Более подробная информация доступна в документации ядра . Имеющиеся флаги загрязнения (с _ заменой 'пусто')

  • G | P : G, если все загруженные модули имеют GPL или совместимую лицензию, в противном случае был загружен собственный модуль. Модули без MODULE_LICENSE или с MODULE_LICENSE, которые не распознаются insmod как совместимые с GPL, считаются проприетарными.
  • F | _ : если какой-либо модуль был принудительно загружен "insmod -f", иначе, если все модули были загружены нормально.
  • S | _ : если произошла ошибка в ядре SMP, работающем на оборудовании, которое не было сертифицировано как безопасное для работы многопроцессорной системы. В настоящее время это происходит только на различных атлонах, которые не поддерживают SMP.
  • R | _ : если модуль был принудительно выгружен rmmod -f, иначе, если все модули были выгружены нормально.
  • M | _ : если какой-либо процессор сообщил об исключении проверки компьютера , в противном случае исключений проверки компьютера не произошло.
  • B | _ : если функция выпуска страницы обнаружила неверную ссылку на страницу или некоторые неожиданные флаги страницы.
  • U | _ : если пользователь или пользовательское приложение специально запросили, чтобы был установлен флаг Tainted.
  • D | _ : если ядро ​​недавно умерло, т.е. произошел OOPS или BUG.
  • A | _ : если таблица ACPI была переопределена.
  • W | _ : если ядром ранее было выдано предупреждение (хотя некоторые предупреждения могут устанавливать более конкретные флаги заражения.)
  • C | _ : если загружен промежуточный драйвер.
  • I | _ : если ядро ​​работает с серьезной ошибкой в ​​прошивке платформы (BIOS или аналогичная).
  • O | _ : если был загружен внешний модуль («вне дерева»).
  • E | _ : если неподписанный модуль был загружен в ядро, поддерживающее сигнатуру модуля.
  • L | _ : если в системе ранее произошла мягкая блокировка.
  • K | _ : если ядро ​​было исправлено.
bwDraco
источник
В этом ответе отсутствует много информации из дупла, который сместил этот вопрос.
2
Я бы добавил, по крайней мере, одну важную возможность сценария «неподписанный модуль» - в ядро ​​был загружен руткит ядра или только что был выполнен эксплойт ядра.
Кравец