カーネルが変更されたかどうかはどうすればわかりますか?

カーネルが変更されたかどうかはどうすればわかりますか?

カーネルの更新後にディスプレイドライバを再コンパイルする必要があるシナリオがあります。 Bashスクリプトを使用して起動時に自動化しようとしています。したがって、私のカーネルが変更されたことを確認し、新しく実行されているカーネル用のドライバを再インストールする方法が必要です。

ドライバを初めてインストールするときは、カーネルバージョンをファイルに出力し、ファイルの内容が現在インストールされているものと異なるかどうかを常にスクリプトで確認します。

これは正しいアプローチですか?最後に、ドライバのインストール後にカーネルが変更されたかどうかを確認する方法についてアドバイスをいただきありがとうございます。

  • 私はDKMSがあり、それがまさにその目的であることを知っていますが、常に動作するわけではないので、別の方法でやりたいと思います。

答え1

単に実行してuname -mrsバージョンが変更されたことを確認することもできますが、インストールされているすべてのdpkg --list | grep linux-imageカーネルのリストを確認することもできます。

答え2

起動時にbashスクリプトを使用した自動化

オートメーション...はい、しかし起動中はそうではありませんか?カーネルを更新したら、再起動する必要があります。前に終了してください。したがって、いつそのようなことが起こるのかを知る必要があります。それとも何か抜けましたか?このスクリプトを1つのコマンドに変換(コンパイル)できるように準備します。ただし、新しいカーネルが初めて起動するときはそうではありません。

モジュールを処理する必要があるように(make directを通じて、新しいinitrdを得ることができるdistroを介して)ドライバ固有のカーネルバージョンがある場合は、起動スクリプトではなくマニフェストに属します。それ以外の場合、nawは危険すぎます(=常に動作するわけではありません:-)

uname -r言及したが…ファイルとして保存して確認するって?

情報とカーネルバージョンのドライバ制御を保存する場所は起動スクリプトです。数ヶ月が経過するとこうなるかもしれません。

# 4.1.0 dispdr=firstone
# 4.2.0 dispdr=second_driver
# 4.4.0  
dispdr=third 
# next version probably 4.6.0

これは透明で可逆的です。明らかに、私はこのドライバについて何も知りません。

答え3

一般的な質問:「カーネルを変更するときに作業を実行する方法」については同意します。同様のことをしましょう。

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) # or may be uname -a or anything else you'd like
if [ $? -ne 0 ]; then
  exit 1 # Handle case when we can't get current_version for some reason
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-Invokeforなどのフックを使用することをお勧めします。apt

答え4

/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 "Reboot needed for new kernel"

DebianとRHELベースのディストリビューションでテストしました。

関連情報