Как проверить наличие флага загрязнения ядра в Linux

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь проверять статус загрязнения (taint status) Linux-ядра. Мы рассмотрим, как определить, работает ли ядро в потенциально неподдерживаемом или модифицированном состоянии, изучив файл /proc/sys/kernel/tainted.

После первоначальной проверки вы научитесь проверять конкретные причины загрязнения ядра, просматривая буфер сообщений ядра с помощью команды dmesg. Наконец, вы узнаете, как просматривать символы ядра с использованием файла /proc/kallsyms, что может помочь понять состояние ядра и загруженные модули.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/cat -.-> lab-558725{{"Как проверить наличие флага загрязнения ядра в Linux"}} linux/grep -.-> lab-558725{{"Как проверить наличие флага загрязнения ядра в Linux"}} end

Проверка статуса загрязнения (taint status) с помощью команды cat /proc/sys/kernel/tainted

На этом этапе мы научимся проверять статус "загрязнения" (taint status) Linux-ядра. Ядро может стать "загрязненным", если загружены модули, не соответствующие лицензии GPL (General Public License), или если произошли определенные события, которые могут указывать на проблему или нестандартную конфигурацию. Проверка статуса загрязнения - это быстрый способ узнать, работает ли ваше ядро в потенциально неподдерживаемом или модифицированном состоянии.

Мы можем проверить статус загрязнения ядра, прочитав содержимое специального файла в файловой системе /proc. Файловая система /proc - это виртуальная файловая система, которая предоставляет информацию о процессах и другой системной информации.

Если терминал еще не открыт, откройте его. Для этого нажмите на значок Xfce Terminal слева на рабочем столе.

Теперь используйте команду cat для отображения содержимого файла /proc/sys/kernel/tainted. Команда cat используется для объединения и отображения содержимого файлов.

Введите следующую команду и нажмите Enter:

cat /proc/sys/kernel/tainted

Результатом будет одно число.

0
  • Значение 0 означает, что ядро не загрязнено.
  • Любое ненулевое значение указывает на то, что ядро загрязнено. Конкретное число представляет собой битовую маску, где каждый бит представляет разную причину загрязнения.

Например, если результат был 1, это означало бы, что был загружен проприетарный модуль. Если результат был 4, это могло бы означать, что произошло предупреждение ядра.

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

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

Нажмите Продолжить, чтобы перейти к следующему шагу.

Проверка деталей загрязнения ядра с помощью команды dmesg

На предыдущем этапе мы проверили статус загрязнения ядра с использованием файла /proc/sys/kernel/tainted. Этот файл дает нам числовой код, указывающий, загрязнено ли ядро, но не говорит нам, почему оно загрязнено. Для получения более подробной информации о сообщениях ядра, включая причины загрязнения, мы можем использовать команду dmesg.

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

Если терминал еще не открыт, откройте его.

Теперь введите следующую команду и нажмите Enter:

dmesg

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

Для поиска конкретной информации, связанной с загрязнением, мы можем объединить dmesg с командой grep. grep - это мощный инструмент для поиска текстовых шаблонов. Мы будем искать строки, содержащие слово "taint".

Введите следующую команду и нажмите Enter:

dmesg | grep taint

Символ | называется пайпом (pipe). Он берет вывод команды слева (dmesg) и передает его в качестве входных данных команде справа (grep). Таким образом, эта команда сначала получает все сообщения ядра, а затем фильтрует их, чтобы показать только строки, содержащие слово "taint".

Если ваше ядро не загрязнено (как и ожидается в этой среде), эта команда может не вывести ничего. Это нормально и означает, что не было записано никаких событий загрязнения.

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

[  ... ] kernel: Linux version ... (tainted: G)
[  ... ] kernel: Disabling lock debugging due to kernel taint

Часть (tainted: G) указывает, что ядро загрязнено, и буква G конкретно означает, что был загружен проприетарный модуль. Другие буквы обозначают разные причины загрязнения (например, P - проприетарный модуль, F - принудительная загрузка модуля, R - модуль с ограниченной лицензией и т.д.).

Использование команды dmesg | grep taint является важным этапом в диагностике проблем с ядром, когда файл /proc/sys/kernel/tainted показывает ненулевое значение.

Нажмите Продолжить, чтобы перейти к следующему этапу.

Просмотр символов ядра с помощью команды cat /proc/kallsyms

На этом этапе мы рассмотрим другой важный файл в файловой системе /proc: /proc/kallsyms. Этот файл содержит адреса и имена всех символов ядра (функций и переменных), которые не явно помечены как static. Это важный инструмент для отладки ядра и понимания внутреннего устройства ядра.

В файле /proc/kallsyms перечислены все символы ядра с указанием их памяти адреса, типа и имени. Формат каждой строки обычно выглядит так:

<address> <type> <symbol_name>
  • <address>: Адрес в памяти, где расположен символ.
  • <type>: Одна буква, указывающая тип символа (например, t или T для текста/кода, d или D для данных, b или B для BSS, r или R для только для чтения данных, w или W для слабого символа, U для неопределенного символа). Строчная буква означает локальный символ, заглавная - глобальный символ.
  • <symbol_name>: Имя функции или переменной ядра.

Если терминал еще не открыт, откройте его.

Теперь давайте посмотрим на содержимое файла /proc/kallsyms с помощью команды cat. Имейте в виду, что этот файл очень большой, поэтому вывод будет быстро прокручиваться.

Введите следующую команду и нажмите Enter:

cat /proc/kallsyms

Вы увидите длинный список строк, каждая из которых представляет символ ядра.

...
ffffffff... T sys_read
ffffffff... T sys_write
ffffffff... D jiffies
...

Для того чтобы управлять этим выводом и найти конкретные символы, мы снова можем использовать grep. Например, давайте найдем символы, связанные с "schedule", которая является центральной функцией ядра для управления процессами.

Введите следующую команду и нажмите Enter:

cat /proc/kallsyms | grep schedule

Это отфильтрует вывод, чтобы показать только строки, содержащие слово "schedule".

ffffffff... T schedule
ffffffff... T schedule_timeout
ffffffff... T schedule_hrtimeout_range
...

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

Исследование файла /proc/kallsyms дает ценную информацию о структуре ядра и доступных функциях. Это фундаментальный ресурс для любого разработчика ядра или специалиста по продвинутой отладке.

Теперь вы узнали, как проверить статус загрязнения ядра и просмотреть символы ядра с использованием файловой системы /proc и базовых команд Linux.

Нажмите Продолжить, чтобы завершить этот практический урок.

Резюме

В этом практическом уроке мы научились проверять статус загрязнения ядра Linux. Сначала мы использовали команду cat /proc/sys/kernel/tainted, чтобы быстро определить, загрязнено ли ядро. Мы узнали, что значение 0 означает, что ядро чистое, а любое ненулевое значение указывает на загрязненное ядро, причем конкретное число представляет собой битовую маску причин загрязнения.

Затем мы проверили детали любого загрязнения, просмотрев буфер сообщений ядра с помощью команды dmesg. Это позволяет нам увидеть конкретные сообщения, связанные с событиями, которые привели к загрязнению ядра, и получить больше контекста, чем только числовой код. Наконец, мы рассмотрели, как просматривать символы ядра с помощью команды cat /proc/kallsyms, что может быть полезно для продвинутой отладки и понимания внутреннего состояния ядра, хотя этот этап не был полностью раскрыт в предоставленном материале.