커널 업데이트 후 디스플레이 드라이버를 다시 컴파일해야 하는 시나리오가 있습니다. Bash 스크립트를 사용하여 시작 시 자동화하려고 합니다. 따라서 내 커널이 변경되었는지 확인하고 새로 실행 중인 커널용 드라이버를 다시 설치하는 방법이 필요합니다.
드라이버를 처음 설치할 때 커널 버전을 파일로 출력하고 파일 내용이 지금 설치된 것과 다른지 항상 스크립트에서 확인할 생각입니다.
이것이 올바른 접근 방식입니까? 마지막으로 드라이버를 설치한 이후 커널이 변경되었는지 확인하는 방법에 대한 조언을 주시면 감사하겠습니다.
- DKMS가 있고 그것이 바로 그 목적이라는 것을 알고 있지만 항상 작동하는 것은 아니므로 다른 방식으로 수행하고 싶습니다.
답변1
간단히 실행하여 uname -mrs
버전이 변경되었는지 확인할 수도 있지만 dpkg --list | grep linux-image
설치된 모든 커널 목록을 확인할 수도 있습니다.
답변2
시작 시 bash 스크립트를 사용하여 자동화
자동화... 예, 하지만 시작 중에는 그렇지 않나요? 커널 업데이트 후에는 재부팅해야 합니다. 전에는 종료하세요. 그러므로 언제 그런 일이 발생하는지 알아야 합니다. 아니면 뭔가 빠졌나요? 이 스크립트를 하나의 명령으로 전환(컴파일)할 수 있도록 준비하십시오. 하지만 새 커널이 처음 부팅할 때는 그렇지 않습니다.
모듈을 처리해야 하는 것처럼(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-Invoke
for와 같은 후크를 사용하는 것이 좋습니다 .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 기반 배포판에서 테스트했습니다.