如何跳过内核更新?


25

我在VirtulBox上运行Ubuntu 12.04.1 LTS i686。每次我检查更新时,都会有一个新的Linux内核。如果安装新内核,则必须再次安装Virtulbox Guest Additions,然后重新启动服务器。我不想每周这样做。我知道我可以从更新管理器中手动取消选中内核软件包,但是有没有办法自动跳过内核更新?我在这里找到了答案,但这是针对Ubuntu 10的。谢谢。

Answers:


18

APT(高级打包工具)是Ubuntu用于管理系统上安装的所有软件的系统。它允许您将程序包“固定”到特定版本,以便在运行Update Manager时不会对其进行更新。

要固定内核软件包,首先必须确定内核的版本。一种方法是在系统>管理中打开Synaptic软件包管理器。

在此处输入图片说明

在快速搜索文本字段中输入“ linux-generic”,然后按Enter。

在此处输入图片说明

记下“已安装版本”列中列出的编号。我们将在下一步中使用它。

接下来,我们需要编辑文件/ etc / apt / preferences。通过按Alt + F2打开“运行应用程序”窗口并输入以下内容来打开它:

gksudo gedit /etc/apt/preferences

在此处输入图片说明

这将打开一个gedit窗口。该窗口很可能是空白的,除非您之前曾玩过APT。

在窗口中,键入以下内容,将版本号替换为您在Synaptic软件包管理器中找到的版本号。

Package: linux-generic linux-headers-generic linux-image-generic linux-restricted-modules-generic
Pin: version <insert version here>
Pin-Priority: 1001

在此处输入图片说明

保存文件并关闭gedit。如果打开更新管理器,您应该看到Linux内核更新现在已隐藏!

在此处输入图片说明

资源

使用APT / DPKG阻止程序包

从上面记住内核的软件包名称。

打开一个终端并运行:

sudo -s

并击中enter

输入sudo的密码:

echo kernel_package_name hold | dpkg --set-selections

kernel_package_name您要固定的内核名称替换。

现在运行:

sudo apt-get update && sudo apt-get upgrade

要从Apt / Dpkg中移除大头针:

打开一个终端

sudo -s
echo kernel_package install | dpkg --set-selections

用您要固定的软件包替换kernel_package。

现在运行:

sudo apt-get update &&  sudo apt-get upgrade

资源

您尝试做的事情称为固定。我上面提供给您的资源具有完成手头任务必须做的基本工作。


1
感谢您的回复。似乎我们使用的是其他版本。我在Ubuntu 12.04上没有Synaptic软件包管理器和/ etc / apt / preferences。
garconcn 2012年

2
是的,默认情况下不再安装Synaptic。
ish 2012年

1
@garconcn,您可以安装Synaptic并安装我告诉您的修复程序,或者再次阅读问题,因为我在上面放了更多信息
LnxSlck

2
@LnxSlck,我安装了Synaptic,并按照您的说明进行操作。有用。谢谢。
garconcn 2012年

16

一行是:

echo $(dpkg -l "*$(uname -r)*" | grep image | awk '{print $2}') hold | dpkg --set-selections

这会将内核的映像状态从安装设置保持,因此将阻止更新。


8

克里斯托夫(Christoph)所说的单线未考虑额外的软件包(例如linux-image-extra-3.13.0-45-generic)。宁可使用这个:

对于$(dpkg -l“ * $(uname -r)*” | grep图片| awk'{print $ 2}')中的i;回显$ i保持| dpkg --set-selections; 做完了

4

关于superlexx的建议:该行将缺少“ headers”包:

dpkg -l "*$(uname -r)*" | grep image | awk '{print $2}'
linux-image-3.13.0-48-generic
linux-image-extra-3.13.0-48-generic

那么如何简单地使用以下内容:

dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'
linux-headers-3.13.0-48-generic
linux-image-3.13.0-48-generic
linux-image-extra-3.13.0-48-generic

1
如果没有标记extras / header / etc软件包,是否有问题?或者,您是否建议同时标记它们的完整性?我希望Ubuntu在安装linux-image之前不会尝试安装更新的标头包(标头是映像的依赖项)。我尚未验证。
whitehat101

2
你们可以在一个单一的衬里上进行协作,而不必在另一个上堆叠3个锚。= P Just sayin
cubuspl42 '16

1
这是unnecesary如果您已经使用awk来调用的grep:dpkg -l "*$(uname -r)*" | awk '/kernel/{print $2}'
哈维尔·洛佩斯

1

这将清除启用内核更新的元内核软件包:

sudo apt purge $(apt-cache rdepends -i --installed linux-{headers,image}-$(uname -r)|awk '!/[0-9]/ && /^[ ]/{print $1}')

(如果您刚刚升级了内核,则必须先使用新内核重启,或者找到最新的内核版本并在上面使用它,而不要使用“ $(uname -r)”。)

尽管建议您安装内核更新,因为它们主要是安全更新。


0

在Ubuntu 16.04.1上,以下代码有效

for i in $(dpkg -l "*$(uname -r)*" | grep image | awk '{print $2}'); do echo $i hold | sudo dpkg --set-selections; done

这是对Superlexx代码的改进,sudo添加了

dpkg -l | grep linux-image

你会找到:

linux-image-4.4.0-34-generic ...

linux-image-extra-4.4.0-34-generic ...

请注意,标记现在显示为hi,而不是ii

取下针

for i in $(dpkg -l "*$(uname -r)*" | grep image | awk '{print $2}'); do echo $i install | sudo dpkg --set-selections; done

好的答案,但您sudo在注释中未添加命令...
WinEunuuchs2Unix

0

较短的版本:(用“安装”替换“保持”以删除图钉)

 dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2,"hold"}' | sudo dpkg --set-selections

要查看所有内核映像和标头的状态,请运行:

 dpkg --get-selections | grep "linux-"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.