验证正在运行的内核与 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

相关内容