问题描述
每次安装新的Linux内核时,它都会留在grub_config中,从而使引导菜单每次都更长。
我知道我可以手动搜索已安装的软件包并将其删除。
Ubuntu是否提供任何更简便的方法来清理它们或阻止它们显示在引导列表中?
最佳思路
16.04和更高版本的Ubuntu
sudo apt autoremove
此命令将删除已自动安装以解决依赖性的软件包,但现在不再依赖它们。这包括linux-headers-*
和linux-image-*
的旧版本。 (此过程也很聪明,留下了一个备用的内核版本作为后备!)
11.10和更高版本的Ubuntu
GRUB2及其所有内核的显示
Ubuntu中安装的最新版本的Grub2会自动显示最新的内核,并隐藏您可能已安装的旧内核。
如果看不到g头,则在启动时请记住按Shift
。
如您所见,仅显示最新内核。
如果选择显示的选项(按Enter
),则所有旧内核都将变为可见并可从中启动。
如何永久删除旧内核
首次引导使用最新的可用内核。
有多种删除旧内核的方法。就我个人而言,我不会接触计算机管理员,因为它被认为会破坏您计算机的建议。
突触的
另一种是突触(sudo apt install synaptic
)
在内核中搜索linux-image,right-click,然后选择完全删除,最后单击“应用”按钮删除内核。
重复搜索,但是这次是linux-header-您可以删除先前选择的内核映像的关联头。
Synaptic不会尝试验证要删除的内容……您可能会无意中删除最新的内核-甚至通过此工具删除所有内核,从而使您无法启动Ubuntu!
请记住检查您正在使用的内核类型:
uname -r
结果将类似于:
记住结果和编号-确保不要删除相应的图像或标题。
Recommendation
我的建议是保留至少两个或最好三个内核,包括最新的内核。推荐这样做的原因是,如果出于what-ever的原因而无法启动最新的内核,或者引入了退化的功能(例如损坏的无线功能),则至少要有一个/两个其他内核可以启动。
次佳思路
首先,重新启动系统以确保它使用的是最新内核。然后打开终端并检查您当前的内核:
uname -r
不要删除该内核!
接下来,在下面键入命令以查看/列出系统上所有已安装的内核。
dpkg --list '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
-
;
是命令分隔符,因此/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″),而没有从uname -r
中提取”-generic”或类似版本
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文件是只读文件,通常不需要编辑。
内核太多?
-
如果不确定当前使用的内核,请在终端中输入uname -r。
-
通过APT删除的内核(Synaptic,“ apt-get删除”等)将自动更新grub.cfg,并且不需要用户采取任何措施。
-
Ubuntu-Tweak是删除内核(和菜单项)的绝佳工具,它是安全的easy-to-use GUI应用程序。
-
安装ubuntu调整
-
Ubuntu-Tweak将在“应用程序>系统工具。
删除较旧的内核条目
-
在左侧选择”Package Cleaner”,在右侧面板中选择”Clean Kernel”。
-
按右下角的”Unlock”按钮,输入密码。
-
从显示的列表中选择要删除的内核映像和标题。没有列出正在使用的内核。
-
按下右下方的”Cleanup”按钮以删除所选的内核映像和标题。
从Grub菜单中删除操作系统
-
一旦以root用户身份运行”update-grub”,从计算机中删除的其他操作系统也将从菜单中删除。
-
菜单项通过脚本放置在Grub2菜单上。如果您不想在菜单中输入其他操作系统,请禁用/etc/grub.d/30_osprober
-
运行此命令以停止脚本运行
sudo chmod -x /etc/grub.d/30_os-prober
-
/etc /default /grub中的DISABLE_30_OS-PROBER = ‘true’
从Grub菜单sudo chmod -x /etc/grub.d/20_memtest86+
删除Memtest86 +
-
运行update-grub命令以允许将更改合并到grub.cfg中
注意:内核更新后,将在GRUB菜单中添加一个新条目。您可以根据需要删除较旧的条目,但是,有经验的用户会建议您至少保留一个备用条目,以防升级出现问题。需要引导较早的内核版本以进行故障排除。
删除内核条目的另一种方法(低于10.04)
对于GRUB不是GRUB2
startupmanager
您可以在System>> Administration>>下找到它。您可以在第二个屏幕截图中看到,您可以选择显示多少个内核?我通常将其保持为1,但是当我进行内核升级时,我总是将其更改为2,然后再重新启动,因此如果新内核遇到硬件问题,则可以选择较旧的内核。知道新内核运行良好后,将其更改回1。
第六种思路
纯粹是命令行,这将除去当前和第二高的电流(通过下面的head命令中的”-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。
关于删除旧内核here,我也提供了一个Ubuntu文档页面。
第八种思路
您可以按照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”部分中。
第九种思路
Ubuntu随附的最快/更简单的方法(至少自12.04起适用)是apt-get
。如果要删除所有未使用的较旧的内核版本,请执行以下操作(除了上一个未使用的内核版本。这是为了确保如果当前的内核版本以某种方式失败,则有一种解决方法)回到先前的状态)。请执行下列操作:
sudo apt-get autoclean
这将消除您可能拥有的所有旧文件(包括内核版本)。请注意,如果您有许多旧版本,则需要一段时间,因为它必须确保删除内核版本没有问题。对我来说,删除最后12个内核版本大约需要2分钟。您还可以执行以下操作:
sudo apt-get clean
这将消除下载并存储在apt的缓存文件夹中的所有内容。最后,您有:
sudo apt-get autoremove
它将检查是否有未使用的软件包,并在必要时将其删除。对于那些不再需要安装任何应用程序的库和依赖程序包,这非常有用。
第十种思路
10.04 GUI方法
Computer Janitor可以清理旧的内核,并且我相信它默认安装在Ubuntu中(但不是Kubuntu)。
如果使用GRUB 1,则在/boot/grub/menu.lst
中有一个选项可以指定最大显示多少个内核。据我所知,GRUB 2没有。