Tainted в сообщениях ядра: что это значит при разборе сбоя
Метка означает, что в ядре произошло или загружено нечто, лишающее его состояние гарантий: сторонний модуль, прежняя ошибка, принудительно выгруженный модуль. Сама метка не сбой, но при разборе она говорит, насколько можно доверять остальным сообщениям.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Загружен сторонний модуль
Драйверы вне основного ядра ставят метку. При разборе падений это первый подозреваемый.
-
Метка появилась после прежней ошибки ядра
Первая ошибка ставит метку. Всё, что происходит дальше, может быть её следствием.
-
Метку принимают за причину сбоя
Метка есть почти на любой машине со сторонними драйверами и ни о чём сама не говорит.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Числовое значение метки: каждый бит имеет своё значение.
cat /proc/sys/kernel/taintedПервые ошибки ядра за загрузку.
journalctl -k -b --no-pager | grep -inE "BUG:|WARNING:|Oops" | headРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Драйверы вне основного ядра ставят метку. При разборе падений это первый подозреваемый.
- Как проверить
-
Посмотрите значение метки и сторонние модули.
cat /proc/sys/kernel/tainted grep -E "^[a-z]" /proc/modules | awk '{print $1}' | head -20
- Как исправить
- При падениях попробуйте воспроизвести их без стороннего модуля. Расшифровка битов метки есть в документации ядра.
- Почему происходит
- Первая ошибка ставит метку. Всё, что происходит дальше, может быть её следствием.
- Как проверить
-
Найдите первое сообщение об ошибке ядра за загрузку.
journalctl -k -b --no-pager | grep -inE "BUG:|WARNING:|Oops" | head -5
- Как исправить
- Разбирайте первое сообщение, а не последующие. После первой ошибки состояние ядра непредсказуемо.
- Почему происходит
- Метка есть почти на любой машине со сторонними драйверами и ни о чём сама не говорит.
- Как проверить
-
Посмотрите, какие именно биты выставлены.
cat /proc/sys/kernel/tainted
- Как исправить
- Разбирайте сбой по существу: метка лишь уточняет степень доверия к сообщениям.
Пример вывода
Метка выставлена загруженным сторонним модулем. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
kernel: INFO: task kworker/1:2:412 blocked for more than 120 seconds.
kernel: Tainted: P OE 6.8.0-139-generic #139-Ubuntu
$ cat /proc/sys/kernel/tainted
12801
Связанные ошибки
- task blocked for more than 120 seconds Ядро сообщает о процессе, зависшем в ожидании ввода-вывода дольше двух минут. Служба при этом не отвечает и не убивается.
- Hardware Error / EDAC: ошибки памяти в журнале Ядро сообщает об ошибках памяти. Что считать безобидным, а что поводом менять модуль.
- Invalid argument в журнале службы Ошибка 22: недопустимый аргумент системного вызова. Как сузить поиск, когда сообщение ничего не уточняет.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
- Failed to start … — что делать с общим сообщением Строка Failed to start сообщает только факт. Порядок разбора: найти настоящую причину выше по журналу.
- Function not implemented в контейнере Ошибка 38 при системном вызове: вызов запрещён фильтром или отсутствует в окружении. Разбор для контейнеров.
- I/O error, dev sda, sector N: ошибка носителя Ядро сообщает об ошибке чтения или записи на устройстве. Что делать со службой и данными.
- Job for myapp.service failed: с чего начинать разбор Сообщение systemctl при неудачном запуске: что в нём есть, чего в нём нет и какие три команды дают ответ.
Источники
- Документация ядра: метка tainted
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Взято с машины со сторонним драйвером.