Вопрос или проблема
У меня есть сценарий, в котором мне нужно перекомпилировать драйверы дисплея после обновлений ядра. Я пытаюсь автоматизировать это с помощью 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
: Можно настроить регулярную проверку по времени.
Риски и рекомендации:
-
Безопасность данных: Некорректные драйверы могут привести к нестабильной работе системы. Перед применением убедитесь в совместимости драйверов с новой версией ядра.
-
Тестирование: Рекомендуется сначала протестировать процесс на тестовой системе.
-
Дублирование: Убедитесь, что скрипт не конфликтует с другими процессами, такими как DKMS, который может самостоятельно управлять модулями ядра.
Этот подход позволяет надежно и автоматически отслеживать изменения ядра и применять необходимые обновления к драйверам, минимизируя ручной труд и предотвращая возможные сбои при некорректной работе устройств.