Как узнать, изменен ли ядро?

Вопрос или проблема

У меня есть сценарий, в котором мне нужно перекомпилировать драйверы дисплея после обновлений ядра. Я пытаюсь автоматизировать это с помощью Bash-скриптов во время загрузки. Поэтому мне нужно как-то узнать, что мое ядро изменилось, и переустановить драйверы для нового запущенного ядра.

Я думал во время первой установки драйверов выводить версию ядра в файл и в моем скрипте всегда проверять, отличается ли содержимое этого файла от того, что установлено сейчас.

Правильный ли это способ? Буду признателен за любые предложения о том, как узнать, изменилось ли ядро с момента последней установки моих драйверов.

  • Я знаю, что существует DKMS, и он именно для этого, но это не всегда работает, поэтому я хочу сделать это другим способом.

вы можете просто запустить uname -mrs, чтобы увидеть, изменилась ли версия, но вы также можете dpkg --list | grep linux-image, чтобы проверить список всех установленных ядер.

автоматизировать это с помощью bash-скриптов во время загрузки

автоматизировать… да, но не во время загрузки? После обновления ядра нужно перезагрузиться. И перед этим, выключить. Так что ты должен знать, когда это происходит. Или я что-то упускаю. Подготовь этот скрипт, чтобы сделать этот переход (компиляцию) одной командой, но не когда новое ядро загружается в первый раз.

Так же, как модули должны быть учтены (сделано непосредственно, распределением, откуда также берется новый initrd), если у вас есть что-то такое же специфичное, как ваши драйверы, это должно быть в контрольном списке, а не в загрузочном скрипте. В противном случае слишком большой риск, что это не всегда сработает 🙂

uname -r было упомянуто… но сохранить это в файле и проверить это?

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

# 4.1.0 dispdr=firstone
# 4.2.0 dispdr=second_driver
# 4.4.0  
dispdr=third 
# следующая версия, вероятно, 4.6.0

Это прозрачно и обратимо. Я ничего не знаю об этих драйверах, очевидно.

Что касается общего вопроса: “как сделать что-то в случае изменений ядра”, я согласен с вами и также сделаю что-то вроде:

program=my_system_version_checker
state_file=/var/lib/${program}/version

if [ -r "$state_file" ]; then
  last_version=$( cat "$state_file" )
else
  last_version="unknown"
fi

current_version=$(uname -r) # или, возможно, uname -a или что-то еще, что вы хотите
if [ $? -ne 0 ]; then
  exit 1 # Обработка случая, когда мы не можем получить current_version по какой-либо причине
fi
if [ "$last_version" != "${current_version}"]; then
  make LAST_VERSION="$last_version" CURRENT_VERSION=${current_version} -C /opt/${program} update
fi

[ -d $(dirname $state_file) ] || mkdir -p $(dirname $state_file)
echo "$current_version" > "$state_file"

и поместить это в стартовые скрипты, чтобы запускать при каждой загрузке (с системным файлом юнита или upstart или что-то еще в зависимости от вашей системы и стартового менеджера).

Но что касается перестройки модулей ядра таким образом, я не думаю, что это хорошая идея, так как вы можете сломать что-то с новыми драйверами, и вы узнаете об этом при следующей загрузке, или вы можете добавить логику rmmod/insmod в ваш скрипт, что также может быть небезопасно для выполнения. Поэтому я бы лучше использовал некоторые хуки, подобные DPkg::Post-Invoke для apt, чтобы запускать мой скрипт после обновлений ядра.

Я сравниваю файлы в /boot с uname -r здесь. Это работает для меня уже несколько месяцев:

#!/bin/bash

cd /boot || exit 1
shopt -s nullglob ; for file in config-* ; do kernels+=( "${file#config-}" ) ; done
newest="$(printf '%s\n' "${kernels[@]}" | sort -V -t - -k 1,2 | tail -n1)"
current="$(uname -r)"
[[ $current != $newest ]] && echo "Нужна перезагрузка для нового ядра"

Я тестировал это на дистрибутивах, основанных на Debian и RHEL.

.

Ответ или решение

Для определения изменения версии ядра в Linux можно использовать несколько подходов. Данный вопрос актуален в контексте автоматизации процессов, например, перекомпиляции драйверов дисплея после обновления ядра. Рассмотрим детально, как можно решить эту задачу.

Шаги для обнаружения изменения ядра

1. Использование команды uname:

Команда uname -r позволяет определить текущую версию ядра. Это наиболее простой и быстрый способ получить информацию о загруженном ядре. Вы можете сохранить эту информацию в файл при первой установке драйверов.

Пример использования в сценарии:

current_kernel=$(uname -r)
previous_kernel=$(cat /path/to/kernel_version.txt)

if [ "$current_kernel" != "$previous_kernel" ]; then
    # Команды для перекомпиляции драйверов
    echo "$current_kernel" > /path/to/kernel_version.txt
fi

2. Проверка установленных ядер:

Для проверки списка установленных в системе ядер можно использовать команду:

dpkg --list | grep linux-image

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

Автоматизация через скрипт:

Создание скрипта, который будет проверять изменения и инициировать перекомпиляцию, может быть выполнено следующим образом:

#!/bin/bash

program=my_system_version_checker
state_file=/var/lib/${program}/version

if [ -r "$state_file" ]; then
  last_version=$( cat "$state_file" )
else
  last_version="unknown"
fi

current_version=$(uname -r)
if [ $? -ne 0 ]; then
  exit 1 # Если по каким-то причинам не удалось получить текущую версию
fi

if [ "$last_version" != "$current_version" ]; then
  # Команды для обновления драйверов
  make LAST_VERSION="$last_version" CURRENT_VERSION=${current_version} -C /opt/${program} update
fi

[ -d $(dirname $state_file) ] || mkdir -p $(dirname $state_file)
echo "$current_version" > "$state_file"

Интеграция с системными процессами:

Автоматизация процесса на уровне системы может быть реализована с использованием systemd или аналогичных инструментов, таких как cron:

  • systemd: Можно создать службу systemd, которая будет проверять версию ядра при каждом запуске системы.
  • cron: Можно настроить регулярную проверку по времени.

Риски и рекомендации:

  1. Безопасность данных: Некорректные драйверы могут привести к нестабильной работе системы. Перед применением убедитесь в совместимости драйверов с новой версией ядра.

  2. Тестирование: Рекомендуется сначала протестировать процесс на тестовой системе.

  3. Дублирование: Убедитесь, что скрипт не конфликтует с другими процессами, такими как DKMS, который может самостоятельно управлять модулями ядра.

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

Оцените материал
Добавить комментарий

Капча загружается...