问题描述
每次我安装一个新的Linux内核时,它都会留在grub_config中,每次都会使启动菜单变长。
我知道我可以手动搜索已安装的软件包并将其删除。
Ubuntu是否提供了更简单的方法来清除它们或使它们不显示在引导列表中?
最佳解决思路
16.04和更新版本的Ubuntu
sudo apt-get autoremove
该命令将删除自动安装的软件包以解析依赖关系,但现在不再依赖它。这包括旧版本的linux-headers-*
和linux-image-*
。 (这个过程也很聪明,留下一个备用版本的内核作为后备!)
11.10和更新版本的Ubuntu
GRUB2及其所有内核的显示
在Ubuntu中安装的最新版本的Grub2会自动显示最新的内核,并隐藏您可能已安装的旧内核。
如果你没有看到你的grub – 那么记得在启动时按Shift
。
如您所见,只显示最新的内核。
如果您选择显示的选项(按Enter
),则所有旧的内核都变得可见并可用于从中启动。
如何永久删除旧的内核
首先用最新的可用内核启动。
有许多方法可以删除旧的内核。就个人而言,我不会触摸计算机管理员,因为这是承认打破你的计算机的建议。
突触
替代方案是新立得(sudo apt-get install synaptic
)
搜索linux-image,right-click一个内核并选择完全删除,最后单击Apply按钮删除内核。
重复搜索,但这次是linux-header – 您可以删除先前选择的内核映像的关联标头。
尽管突触不会尝试验证你想要删除的内容,但是你可能会无意中删除最新的内核 – 或者甚至通过这个工具删除所有内核,从而导致无法启动的Ubuntu!
请记住检查您正在使用的内核类型:
uname -r
结果将类似于:
记住结果和编号 – 确保不要删除相应的图像或标题。
Ubuntu-tweak
恕我直言,最好的GUI工具是Ubuntu-Tweak
它不能从标准存储库中获得。要在13.10或更旧版本中安装,您需要使用作者的PPA:
sudo add-apt-repository ppa:tualatrix/ppa
sudo apt-get update
sudo apt-get install ubuntu-tweak
在Ubuntu 14.04+中,您必须从official website下载.deb文件并使用软件中心或手动进行安装。
选择箭头所示的选项。
选择具有相同版本号的标题和图像。
由于当前的内核没有显示,因此它不允许删除当前正在启动的内核。
Recommendation
我的建议是保留至少两个或最好三个内核,包括最新的内核。建议的原因是,如果what-ever导致无法启动的最新内核或者引入退化的功能(如无线连接断开),您将至少有一个/两个其他内核可以启动。
次佳解决思路
打开终端并检查你的当前内核:
uname -r
不要删除这个内核!
接下来,输入以下命令以查看/列出系统上已安装的所有内核。
dpkg --list | grep linux-image
找到所有比当前内核低的内核。当您知道要删除哪个内核时,请继续在下面将其删除。运行以下命令删除您选择的内核。
sudo apt-get purge linux-image-x.x.x-x-generic
最后,运行下面的命令更新grub2
sudo update-grub2
重新启动您的系统。
第三种解决思路
我的one-liner删除旧的内核(这也释放了磁盘空间)
dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge
解释(记住,|
使用前一个命令的输出作为下一个输入)
-
dpkg --list
列出了所有已安装的软件包 -
grep linux-image
查找已安装的Linux映像 -
awk '{ print $2 }'
只输出第二列(这是包名称) -
sort -V
按版本号排列项目 -
sed -n '/'`uname -r`'/q;p'
在当前内核之前打印行 -
xargs sudo apt-get -y purge
清除找到的内核
解除sed
调用:
-
-n
告诉sed
保持安静 -
`uname -r`
输出当前安装的内核版本 – 我们将它包含在反引号中,以便输出包含在命令中(您也可以将其视为$(uname -r)
-
/something/q
在匹配’something’时说停止(在这种情况下,输出的是uname -r
) –/
环绕正则表达式 -
p
是打印 -
;
是命令separtor,所以/something/q;p
在匹配某个内容时说退出,否则打印
总而言之,sed -n '/'`uname -r`'/q;p'
将打印行,直到它与当前内核名称匹配。
如果你偏执狂(像我一样),你可以将最后一部分xargs echo sudo apt-get -y purge
打印出来,以便清除旧内核的命令被打印出来,然后你可以在运行之前检查没有意外的东西。
删除标题的修改版本:
dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
注意:sed
调用已被修改。 "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"
仅提取版本(例如”3.2.0-44″),而不提供”-generic”或与uname -r
相似
All-in-one版本删除图像和标题(结合以上两个版本):
echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge
第四种思路
Ubuntu 16.04+:
$ sudo apt autoremove
...
The following packages will be REMOVED:
linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic
Ubuntu 15.10及以下版本:
我觉得这是最简单和最快捷的方式。它保留最新的内核以及另外两个:
sudo apt-get install bikeshed
sudo purge-old-kernels
要更改保留的其他内核的数量:
sudo purge-old-kernels --keep 3
第五种思路
从Grub 2中删除条目应通过编辑或删除/etc/grub.d文件夹中的文件来删除条目。 /boot/grub/grub.cfg文件是read-only,通常不需要编辑。
太多的内核?
-
如果您不确定您当前使用的内核,则在终端类型uname -r中。
-
通过APT(Synaptic,“apt-get remove”等)移除的内核将自动更新grub.cfg,并且不需要用户操作。
-
一个用于删除内核(和菜单条目)的好工具是Ubuntu-Tweak,一个安全的easy-to-use GUI应用程序。
-
安装ubuntu tweak
-
Ubuntu-Tweak将在应用程序>下提供。系统工具。
删除旧的内核条目
-
选择左侧的”Package Cleaner”,右侧的面板选择”Clean Kernel”。
-
按下右下角的”Unlock”按钮,输入您的密码。
-
从显示的列表中选择您想要删除的内核映像和标题。正在使用的内核未列出。
-
按下右下角的”Cleanup”按钮以删除选定的内核映像和标题。
从Grub菜单中删除操作系统
-
一旦”update-grub”以root用户身份运行,其他已从计算机中删除的操作系统也将从菜单中删除。
-
菜单项通过脚本放置在Grub2菜单上。如果您不希望在菜单中输入其他操作系统,请禁用/etc/grub.d/30_osprober
-
运行此命令停止脚本运行
sudo chmod -x /etc/grub.d/30_os-prober
-
/etc /default /grub中的DISABLE_30_OS-PROBER = ‘true’
从Grub菜单中删除Memtest86 + sudo chmod -x /etc/grub.d/20_memtest86+
-
运行update-grub命令以允许将更改合并到grub.cfg中
注意:在内核更新之后,一个新条目将被添加到GRUB菜单中。如果需要,您可以删除旧条目。但是,大多数有经验的用户会建议您至少保留一个备用条目,以防升级出现问题,并且您需要引导一个较旧的内核版本进行故障排除。
备用方法删除内核条目(在10.04之前)
对于GRUB而不是GRUB2
startupmanager
您可以在系统>>管理>>下找到它。您可以在第二个屏幕截图中看到可以选择显示多少个内核?我通常只保留它1,但是当我得到内核升级时,我总是将其更改为2,然后重新启动,以便在新内核出现硬件问题时选择较旧的内核。一旦我知道新内核运行良好,我将其更改回1。
第六种思路
纯粹的命令行,这将除去当前和第二个最新的(通过下面的头部命令中的”-2″):
OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge
第七种思路
更新:purge-old-kernels
现在是deprecated。
我做了一个脚本,即使在棘手的情况下也可以清除内核。它被称为linux-purge
,你可以找到它here。
如果您只想清除比当前使用的内核早的内核(以及相关的软件包),那么当系统没有损坏时,可以使用this script。
还有一个Ubuntu文档页面,我已经对删除旧内核here做出了贡献。
第八种思路
您可以按照使用Ubuntu Wiki上Automatic Security Updates文章的”unattended-upgrades”包部分执行此操作。
您需要更改/etc/apt/apt.conf.d/50unattended-upgrades文件中的以下行;
//Unattended-Upgrade::Remove-Unused-Dependencies "false";
同
Unattended-Upgrade::Remove-Unused-Dependencies "true";
自动删除旧的软件包,包括内核。
也删除或注释该行
"^linux-image.*";
在文件/etc/apt/apt.conf.d/01autoremove的”NeverAutoRemove”部分。
第九种思路
apt-get
的最快速/更简单的方法(至少自12.04起可用)可能已经与Ubuntu一起提供。如果您希望删除所有未使用的旧内核版本,请执行以下操作(除了上一个不使用的版本之外),这是为了确保如果当前内核版本以某种方式失败,您还有一段路要走回到先前的状态)。请执行下列操作:
sudo apt-get autoclean
这将消除您可能拥有的任何旧文件(包括内核版本)。请注意,如果您有许多旧版本,则需要一段时间,因为它必须确保删除内核版本没有问题。对我来说,删除最后的12个内核版本花了大约2分钟。您还可以执行以下操作:
sudo apt-get clean
这将消除下载并存储在apt的缓存文件夹中的所有内容。最后你有:
sudo apt-get autoremove
这将检查任何未使用的软件包并在必要时删除它们。这对于安装任何应用程序时不再需要的那些库和依赖项包来说非常好。
第十种思路
10.04 GUI方法
计算机看门人可以清理旧的内核,我相信默认安装在Ubuntu(但不是Kubuntu)。
如果您使用的是GRUB 1,那么在/boot/grub/menu.lst
中有一个选项来指定它应该最多显示的内核数量。据我所知,GRUB 2没有。