Ядро можно модифицировать с помощью загружаемых модулей ядра, поэтому можно также перевести ядро в unknown или unreliable состояние.
Когда это происходит, мы говорим, что ядро в состоянии tainted.
Когда ядро помечает себя как испорченное, чаще всего проблем с его работой не возникает; информация становится актуальной только тогда, когда кто-то хочет расследовать какую-то проблему или ошибку.
На этом этапе сообщество не может гарантировать, что оно будет работать так, как ожидалось.
Статус Taint
Статус taint – это набор флагов для определения конкретных условий, при которых разработчики ядра не могут исследовать проблему ядра
. Например, если проблему вызвал проприетарный модуль ядра, его нельзя надежно отладить, потому что его исходный код недоступен, и его влияние невозможно определить.
Аналогично, если ранее произошел серьезный сбой ядра или аппаратного обеспечения, целостность пространства ядра может быть нарушена, а значит, любые последующие отладочные сообщения, генерируемые ядром, могут быть недостоверными.
Декодирование статуса в ошибках ядра
Каждое сообщение об ошибке ядра, oops или panic включает в себя флаг tainted в верхней части.
BUG: unable to handle kernel paging request at ffffc90012a9c418
Oops: 0000 [#1] SMP
Modules linked in: parport_pc ppdev bnep rfcomm bluetooth libahci ...
CPU: 6 PID: 2925 Comm: ryzom_client Not tainted 3.10.0-031000rc5-generic #201306082135
Hardware name: Gigabyte Technology Co., Ltd.
task: ffff880414908000 ti: ffff880403afc000 task.ti: ffff880403afc000
RIP: 0010:[<ffffffffa03a2ace>] [<ffffffffa03a2ace>] radeon_fence_process+0x8e/0x160 [radeon]
[...]
Мы можем найти “Not tainted:” в строке, начинающейся с “CPU:”, что означает, что ядро не испорчено.
Давайте рассмотрим еще одну ошибку, на этот раз в испорченном ядре:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
Oops: 0002 [#1] SMP PTI
CPU: 0 PID: 4424 Comm: insmod Tainted: P W O 4.20.0-0.rc6.fc30 #1
Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
RIP: 0010:my_oops_init+0x13/0x1000 [kpanic]
[...]
Здесь мы находим “Tainted: P W O”. Символы флага после “Tainted: ” могут быть буквами или пробелами.
С помощью этих букв мы можем расшифровать состояние.
Некоторые из распространенных флагов:
- P: Это означает, что в ядро загружен модуль с лицензией Proprietary. Это может быть модуль, который не лицензируется по GNU General Public License (GPL) или совместимой с ней лицензии.
- G: Все загруженные модули лицензированы по GPL или по лицензии, совместимой с GPL, но что-то еще испортило ядро; об этом будет свидетельствовать другой флаг.
- F: Это модуль, который был загружен с помощью опции Force -f в insmod или modprobe, поэтому информация о версиях не может быть проверена.
- M: Это исключение машинной проверки (MCE), вызванное аппаратным обеспечением, чтобы указать на проблему, связанную с аппаратным обеспечением.
Дополнительные флаги можно найти в документации по ядру.
Декодирование во время выполнения
Мы можем проверить статус нашей системы во время выполнения:
Например, если команда возвращает 0, значит, ядро не испорчено.
Аналогично, если команда возвращает 4609, мы можем расшифровать ее причину.
Для этого существуют скрипты, поставляемые различными инструментами ядра.
Здесь мы предлагаем простой скрипт для декодирования:
Теперь мы можем проверить эти цифры в вышеупомянутых документах, чтобы найти причины.
В нашем случае причины следующие:
- 0: загружен проприетарный модуль
- 9: ядро выдало предупреждение
- 12: был загружен внешний модуль (вне дерева)
Устранение статуса
Давайте посмотрим на отчет об ошибке, как в нашем предыдущем примере, и проверим раздел со строкой, похожей на:
Oops: 0000 [#1] SMP
Это первый Oops с момента загрузки, как показывает #1 между скобками.
Каждый Oops и любая другая проблема, возникающая после этого момента, может быть следствием того первого Oops, даже если они не связаны между собой.
Исключите это, устранив причину первого Oops и воспроизведя проблему после него.
Переконфигурация или обновление ядра также могут помочь в этом случае.
Статус остается постоянным даже после устранения причины статуса taint.
Например, если выгрузить проприетарный модуль ядра или исправить аппаратную ошибку, ядро все равно будет сломано.
Чтобы сбросить флаг, нужно перезагрузить систему.
Кроме того, когда наша система использует программное обеспечение, устанавливающее свои модули ядра, например проприетарный графический драйвер Nvidia, VirtualBox или любые другие внешние источники, ядро само себя сломает.
В этом случае мы обычно временно удаляем модули, прежде чем воссоздать реальную проблему.
Однако если причиной засорения является модуль, находящийся в дереве хранения исходного кода ядра, мы можем сообщить о проблеме, но при этом мы должны быть уверены, что модуль является единственной причиной засорения.
Заключение
Чтобы сообщить о проблеме разработчикам ядра Linux, мы должны сначала устранить ее.
Расшифровка статуса дает нам различные причины испорченного ядра.
Таким образом, статус taint помогает исследовать и устранить проблему, связанную с ядром Linux.
см. также:
- 🐧 Шпаргалка по AppArmor для системных администраторов Linux
- 🐧 Неправильная конфигурация контейнеров Linux
- 🔐 Что такое /dev/random и /dev/urandom на Linux?
- 🐧 3 различных способа применения патчей безопасности ядра Linux
- 🐧 Отображение информации о памяти с помощью Ramfetch на Linux