실행 중인 커널이 Ubuntu에 설치된 최신 커널과 일치하는지 확인하십시오.

실행 중인 커널이 Ubuntu에 설치된 최신 커널과 일치하는지 확인하십시오.

unattended-upgrades커널을 포함한 Ubuntu 보안 업데이트는 자동으로 설치되지만 자동 재부팅은 없습니다(괜찮습니다. 자동 재부팅이 필요하지 않거나 원하지 않습니다).

다음과 같은 경우 어떻게 알 수 있나요 the running kernel = the latest installed kernel?

다음을 사용하여 현재 커널 버전을 얻을 수 있습니다.

$ uname -r
5.4.0-104-generic

최신 설치된 커널은 다음을 통해 찾을 수 있습니다.

$ dpkg -s linux-image-generic | awk '/Version:/{print $2}'
5.4.0.104.108

이 둘은 일치하지 않습니다. bash 마법을 사용하여 두 문자열을 비교할 수 있지만( .108계속해야 하는 이유는 무엇입니까?) 표준 항목을 사용하는 것을 선호합니다.

답변1

아래는 내가 사용하는 것과 다른 배포판에서 작동해야 하는 것입니다.

#!/usr/bin/env bash

HIGHEST_KERNEL=`find /boot/vmlinuz-* | sort -V | tail -n 1 | sed 's|.*vmlinuz-||'`
RUNNING_KERNEL=`uname -r`
echo "Highest Kernel: $HIGHEST_KERNEL | Running Kernel: $RUNNING_KERNEL"
if [ "$HIGHEST_KERNEL" != "$RUNNING_KERNEL" ]; then
  echo "** Reboot Required **"
  exit 1
fi

답변2

이 경우 시스템이 항상 최신 커널을 부팅한다고 가정하면 부팅 시간을 커널 이미지의 타임스탬프와 비교하겠습니다. 가장 쉬운 방법은 /proc/1프록시를 사용하는 것입니다.

find /boot -newer /proc/1 -name vmlinuz\*

목록에 항목이 있으면 시스템을 재부팅해야 합니다(적절한 시스템을 사용하여 수행할 수 있음 -exec).

패키지된 커널만 사용하는 경우 해당 커널이 있는지 확인할 수도 있습니다. /run/reboot-required존재하는 경우 재부팅해야 합니다. /run/reboot-required.pkgs다시 시작을 요청하는 패키지가 나열됩니다.

needrestart동일한 이름의 패키지를 사용할 수도 있습니다 .

needrestart -k

답변3

어떤 이유로 Ubuntu에서는 엄청나게 어렵게 만듭니다. 아래 답변은 (!) Ubuntu 20.04 LTS에만 적용되며 다른 버전에서는 작동할 수도 있고 작동하지 않을 수도 있습니다.

따라서 질문에서 언급한 것처럼 다음을 통해 최신 설치된 커널을 얻을 수 있습니다.

$ version_installed=`dpkg -s linux-image-generic | awk '/Version:/{print $2}'`
$ echo "$version_installed"
5.4.0.104.108

마지막 숫자는 #108관련성이 없어 보이므로 잘라내겠습니다.

$ version_installed=`dpkg -s linux-image-generic | awk '/Version:/{print $2}'` | awk -F . '{print $1"."$2"."$3"."$4}'` # this can be improved but I'm too lazy
$ echo "$version_installed"
5.4.0.104

uname -r불필요한 비트가 포함된 버전이 제공됩니다: 5.4.0-104-generic. 문제를 해결해 봅시다:

$ version_running=`uname -r | sed 's/-generic//;s/-/\./;` # could be simplified as well
$ echo "$version_running"
5.4.0.104

이제 우리는 할 수 있다

#! /bin/bash

version_installed=`dpkg -s linux-image-generic | awk '/Version:/{print $2}' | awk -F . '{print $1"."$2"."$3"."$4}'`
version_running=`uname -r | sed 's/-generic//;s/-/\./'`

if [ "$version_installed"  = "$version_running" ]; then
    echo "All Good"
else
    echo "Life is a misery"
fi

관련 정보