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