“uname” 会告诉我正在运行的内核的版本。我如何知道它是否与已安装的内核(即下次重启时将加载的内核)不同?
理想情况下,我想编写一个可以输出“需要重新启动”或“正在运行和安装的内核匹配”的脚本。
答案1
使用freebsd-version -k
! 从其手动的:
-k 打印已安装内核的版本和补丁级别。与 uname(1) 不同,如果已安装新内核但系统尚未重新启动,freebsd-version 将打印新内核的版本和补丁级别。
您应该比较freebsd-version -k
和的输出uname -r
,如果不同,您应该reboot
。
另一种选择是使用strings
(想法取自/bin/freebsd-version
):
strings /boot/kernel/kernel | sed -n "s,^@(#)FreeBSD \([^ ]*\).*,\1,p"
答案2
简单但可能不可靠的方法:比较启动时间(从sysctl kern.boottime
)和内核安装时间(stat -f '%c' $(sysctl -n kern.bootfile)
)。要使此方法有效,时间应始终同步(通过 ntp)。
更好的方法是比较正在运行的内核和已安装的内核文件的版本字符串。
可以通过运行内核获得sysctl -n kern.version | head -1
(此字符串也显示在 uname -v 中,但只显示一行而不是两行)。然后您可以fgrep
在内核文件中找到此字符串(kern.bootfile
)- 如果找到 - 运行和安装的内核版本应该匹配。我不喜欢在这里使用 grep,但它应该足够好用。从内核文件中提取版本字符串的更正确方法是使用一些程序version
从内核 ELF 数据中提取变量(例如使用 libelf)。