Вопрос или проблема
Есть ли способ узнать, была ли ядро скомпилировано с определенной включенной опцией (например, CONFIG_PROC_EVENTS=y
) без необходимости извлекать пакет исходников ядра и смотреть в файл конфигурации?
Если вы посмотрите в ваш каталог /boot
, вы заметите следующие файлы:
$ ls -l /boot/|grep config
-rw-r--r-- 1 root root 109919 Oct 21 2011 config-2.6.35.14-100.fc14.x86_64
-rw-r--r-- 1 root root 109919 Oct 27 2011 config-2.6.35.14-103.fc14.x86_64
-rw-r--r-- 1 root root 109919 Nov 23 2011 config-2.6.35.14-106.fc14.x86_64
Обратите внимание, какую версию ядра вы используете:
$ uname -r
2.6.35.14-106.fc14.x86_64
Если вы используете команду grep
по соответствующему файлу “config-uname -r
“, вы можете увидеть, с какими опциями ядро было собрано:
$ grep CONFIG_PROC_EVENTS= /boot/config-`uname -r`
CONFIG_PROC_EVENTS=y
Ссылки
Опции ядра можно найти в /proc/config.gz
.
zgrep CONFIG_PROC_EVENTS= /proc/config.gz
если ядро было скомпилировано с CONFIG_IKCONFIG_PROC=y
. Если ядро было скомпилировано с CONFIG_IKCONFIG_PROC=m
, тогда может понадобиться сначала выполнить modprobe configs
.
Если ваше ядро было собрано с CONFIG_IKCONFIG_PROC
, вы можете найти конфигурацию в файле /proc/config.gz
zless /proc/config.gz
Пакеты ядра, основанные на Debian и Redhat, как правило, устанавливают файл config-$version
в /boot
,
less /boot/config-$(uname -r)
В Debian вы также можете найти опции по умолчанию в kernel-package
в ./kernel/Config/config
, а также варианты конфигурации, специфичные для архитектуры, в ./kernel/Config/
.
mkdir /tmp/k
cd /tmp/k
apt-get source kernel-package
find . -path '*/kernel/Config/*' -type f
sudo find / -xdev -name .config
(-xdev ограничивает поиск одним файловым системам)
Обычно он будет находиться в /usr/src/some-specific-kernel-header-version/.config
Просто прочитайте его как любой текст, выполните поиск с помощью grep или, чтобы увидеть, чем отличаются две версии, используйте diff -y -suppress-common-lines /path/linux2.6-r3/.config /path/linux2.6-r4/.config
Это сработало для меня
cat /boot/config-$(uname -r) | grep -v '#'
Ответ или решение
Для решения задачи определения, с какими опциями был скомпилирован ядро Linux, не требуется загрузка исходных текстов ядра. Все необходимые сведения можно найти в конфигурационных файлах, которые содержат опции компиляции ядра. Исследуем, как можно воспользоваться этими файлами для получения необходимой информации.
Теория
Когда ядро Linux компилируется, порядок сборки и настройки определяются множеством опций, находящихся в конфигурационных файлах. Эти конфигурационные файлы могут быть сохранены в разных местах, в зависимости от конфигурации системы и используемого дистрибутива.
Основные места хранения конфигураций ядра:
-
/boot/config-\<версия ядра>: В Debian и Redhat-базированных системах файл конфигурации ядра часто сохраняется в каталоге
/boot
, с именем, включающим версию ядра. Этот файл предоставляет удобный способ увидеть все опции, с которыми было собрано текущее или ранее установленное ядро. -
/proc/config.gz: При условии, что ядро скомпилировано с опцией
CONFIG_IKCONFIG_PROC=y
, конфигурации ядра можно найти сжатым в файле/proc/config.gz
. Это файл-файловая система, доступная для чтения через такие команды, какzgrep
. -
/usr/src/\<версия ядра>/.config: Директория с исходными кодами ядра, если она установлена, также содержит
.config
файл, где определены все конфигурационные параметры сборки.
Пример
Если ваша задача — узнать, поддерживает ли работающая версия ядра Linux конфигурационную опцию, например, CONFIG_PROC_EVENTS
, можно воспользоваться следующим подходом:
- Узнать текущую версию ядра:
$ uname -r
- Проверить наличие требуемой опции в файле конфигурации в
/boot
:
$ grep CONFIG_PROC_EVENTS= /boot/config-$(uname -r)
Это вернет строку с y
или n
, показывая, включена или нет данная опция при сборке.
- Проверить в /proc/config.gz (при условии, что ядро собрано с
CONFIG_IKCONFIG_PROC=y
или модульconfigs
загружен):
$ zgrep CONFIG_PROC_EVENTS= /proc/config.gz
- Искать в исходных кодах, если они установлены:
$ sudo find /usr/src -name .config
$ grep CONFIG_PROC_EVENTS= /usr/src/`uname -r`/.config
Применение
Знание, как диагностировать параметры текущей сборки ядра, может быть критически важным для администраторов, разработчиков и инженеров DevOps, которые работают с кастомными решениями, требующими наличия определенных возможностей ядра. Контроль над параметрами конфигурации ядра позволяет не только отладить сложные ситуации, но и обеспечить стабильную работу критически важных приложений, полагающихся на специфичные функции ядра.
Кроме того, использование конфигурационных файлов позволяет оценивать различия между версиями ядра, что может быть полезно при подготовке к обновлениям системы. Например, перед миграцией на новую версию ядра можно сравнить файлы конфигурации:
$ diff -y --suppress-common-lines /boot/config-old-version /boot/config-new-version
Этот подход позволит поддерживать консистентность конфигураций и сохранить все необходимые функциональности в новом окружении.
Таким образом, грамотное управление конфигурацией ядра Linux становится неизменной практикой для обеспечения надежной и эффективной работы серверных систем. Это позволяет оставаться в курсе всех возможных изменений и всегда быть готовым к диагностике и решению возникающих проблем.