🚀 Ядро Linux в режиме tainted |

🚀 Ядро Linux в режиме tainted

Мануал

Ядро можно модифицировать с помощью загружаемых модулей ядра, поэтому можно также перевести ядро в 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), вызванное аппаратным обеспечением, чтобы указать на проблему, связанную с аппаратным обеспечением.

Дополнительные флаги можно найти в документации по ядру.

Декодирование во время выполнения

Мы можем проверить статус нашей системы во время выполнения:

cat /proc/sys/kernel/tainted

Например, если команда возвращает 0, значит, ядро не испорчено.

Аналогично, если команда возвращает 4609, мы можем расшифровать ее причину.

Для этого существуют скрипты, поставляемые различными инструментами ядра.

Здесь мы предлагаем простой скрипт для декодирования:

for i in $(seq 18); do echo $(($i-1)) $((4609>>($i-1)&1));done
0 1
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 1
10 0
11 0
12 1
13 0
14 0
15 0
16 0
17 0

Теперь мы можем проверить эти цифры в вышеупомянутых документах, чтобы найти причины.

В нашем случае причины следующие:

  • 0: загружен проприетарный модуль
  • 9: ядро выдало предупреждение
  • 12: был загружен внешний модуль (вне дерева)

Устранение статуса

Давайте посмотрим на отчет об ошибке, как в нашем предыдущем примере, и проверим раздел со строкой, похожей на:

Oops: 0000 [#1] SMP

Это первый Oops с момента загрузки, как показывает #1 между скобками.

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

Исключите это, устранив причину первого Oops и воспроизведя проблему после него.

Переконфигурация или обновление ядра также могут помочь в этом случае.

Статус остается постоянным даже после устранения причины статуса taint.

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

Чтобы сбросить флаг, нужно перезагрузить систему.

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

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

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

Заключение

Чтобы сообщить о проблеме разработчикам ядра Linux, мы должны сначала устранить ее.

Расшифровка статуса дает нам различные причины испорченного ядра.

Таким образом, статус taint помогает исследовать и устранить проблему, связанную с ядром Linux.

см. также:

 

 

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий