每次安装新的Linux内核时,它都会留在grub_config中,从而使引导菜单每次都更长。
我知道我可以手动搜索已安装的软件包并将其删除。
Ubuntu是否提供任何更简便的方法来清理它们或阻止它们显示在引导列表中?
sudo apt-get autoremove
应该在Ubuntu 14.04+上发挥作用
sudo apt-get autoremove --purge
apt-mark
每次安装新的Linux内核时,它都会留在grub_config中,从而使引导菜单每次都更长。
我知道我可以手动搜索已安装的软件包并将其删除。
Ubuntu是否提供任何更简便的方法来清理它们或阻止它们显示在引导列表中?
sudo apt-get autoremove
应该在Ubuntu 14.04+上发挥作用
sudo apt-get autoremove --purge
apt-mark
Answers:
sudo apt autoremove
此命令将删除为解决依赖关系而自动安装的软件包,但现在不再依赖它们。这包括旧版本linux-headers-*
和linux-image-*
。(此过程也很聪明,留下了一个备用的内核版本作为后备!)
Ubuntu中安装的最新版本的Grub2会自动显示最新的内核,并隐藏您可能已安装的旧内核。
如果看不到g头,则请记住Shift在启动时按。
如您所见,仅显示最新内核。
如果选择显示的选项(按Enter),则所有旧内核都将变为可见并可从中启动。
首次引导使用最新的可用内核。
有多种删除旧内核的方法。就我个人而言,我不会接触计算机管理员,因为它被认为会破坏您计算机的建议。
突触的
另一种是Synaptic(sudo apt install synaptic
)
搜索linux-image,右键单击内核并选择完全删除,最后单击“ 应用”按钮删除内核。
重复搜索,但是这次是linux-header-您可以删除先前选择的内核映像的关联头。
Synaptic不会尝试验证要删除的内容……您可能会无意中删除最新的内核,甚至通过此工具删除所有内核,从而导致无法启动的Ubuntu!。
请记住检查您正在使用的内核类型:
uname -r
结果将类似于:
记住结果和编号-确保不要删除相应的图像或标题。
我的建议是保留至少两个或最好三个内核,包括最新的内核。推荐的原因是,至少有一个/两个其他内核可用于启动,无论出于何种原因而无法启动最新的内核或引入了诸如无线中断之类的退化功能。
-y
末尾的开关apt-get
是必需的,否则apt-get只是要求确认,并且由于输入是管道,因此它将中止。因此,结尾应为:| xargs sudo apt-get purge -y
linux-image
并linux-headers
释放4.5GB的空间。
首先,重新启动系统以确保它使用的是最新内核。然后打开终端并检查您当前的内核:
uname -r
不要删除该内核!
接下来,键入以下命令以查看/列出系统上所有已安装的内核。
dpkg --list 'linux-image-*'
查找所有低于当前内核的内核。当您知道要删除的内核时,请继续以下操作将其删除。运行以下命令以删除您选择的内核。
sudo apt-get purge linux-image-x.x.x-x-generic
最后,运行以下命令以更新grub2
sudo update-grub2
重新启动系统。
sudo apt-get purge linux-image-3.2.0-3{0..5}-generic
(删除30,31,..,35)
linux-signed-image
UEFI系统中可能安装的软件包:sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-generic
这将删除12,14和24
uname -r
没有任何signed
字符串。我似乎确实安装了签名图像,该ls
命令的输出为:/boot/vmlinuz-3.19.0-16-generic.efi.signed
。
我的一线删除旧内核(这也释放了磁盘空间)
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
说匹配“某物”(在这种情况下,某物的输出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”),而不提取“ -generic”或类似版本uname -r
多合一版本,用于删除图像和标题(将以上两个版本组合在一起):
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
sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done)
另请参阅我的答案。
dkpg -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 dpkg -P
$ 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
我发现这是最简单,最快的方法。它保留了最新的内核以及另外两个:
sudo apt-get install bikeshed
sudo purge-old-kernels
要更改保留的其他内核数:
sudo purge-old-kernels --keep 3
which purge-old-kernels
。
apt-file search purge-old-kernels
。同意apt-get -y
,我将其删除。
sudo apt-get autoremove
这不会删除14.04中的内核。如果知道答案,请随时使用特定版本更新答案!
从Grub 2中删除条目应该通过编辑或删除/etc/grub.d文件夹中的文件来删除条目。/boot/grub/grub.cfg文件是只读文件,通常不需要编辑。
内核太多?
如果不确定当前使用的内核,请在终端中输入uname -r。
通过APT删除的内核(Synaptic,“ apt-get删除”等)将自动更新grub.cfg,并且不需要用户采取任何措施。
删除内核(和菜单项)的一个很好的工具是Ubuntu-Tweak,它是一个安全且易于使用的GUI应用程序。
安装ubuntu调整
Ubuntu-Tweak将在“应用程序”>“系统工具”下可用。
删除较旧的内核条目
选择左侧的“ Package Cleaner”和右侧面板的“ Clean Kernel”。
按下右下方的“解锁”按钮,输入密码。
从显示的列表中选择要删除的内核映像和标题。没有列出正在使用的内核。
按下右下角的“清理”按钮以删除所选的内核映像和标题。
从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菜单中删除Memtest86 +
sudo chmod -x /etc/grub.d/20_memtest86+
注意: 内核更新后,将在GRUB菜单中添加一个新条目。您可以根据需要删除较旧的条目,但是,大多数有经验的用户会建议您至少保留一个备用条目,以防升级出现问题。需要引导较早的内核版本以进行故障排除。
删除内核条目的另一种方法(低于10.04)
对于GRUB而不是GRUB2
您可以在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
linux-libc-dev:amd64
,不应删除。
awk '{print "linux-image-" $0}'
。
更新:purge-old-kernels
现在不推荐使用。
我编写了一个脚本,即使在棘手的情况下也可以清除内核。它被称为linux-purge
,您可以在这里找到它。
如果您只想清除早于当前使用的内核的内核(以及相关的软件包),则在系统未损坏时,可以使用此脚本。
还有,我关于删除旧内核贡献了Ubuntu的文档页面在这里。
purge-old-kernels
不是Bikeshed的精确版本(1.22)。是否有合理/安全的方法来获取更新的精确车棚?还是只安装脚本会更简单/更安全?我宁愿不过,使用回购,尽管依赖的一长串..
dlocate -lsbin bikeshed
您可以按照使用“无人参与升级”包款的自动安全更新在Ubuntu维基文章来执行此。
您需要在/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 autoremove
到我的日常cron工作中,该工作实际上是进行升级的,因为它并不总是通过内置的update-manager进行。
Ubuntu随附的最快/更简单的方法(至少自12.04起适用)是apt-get
。如果要删除所有未使用的较旧的内核版本,请执行以下操作(除了上一个未使用的内核版本。这是为了确保如果当前的内核版本以某种方式失败,则有一种解决方法)回到先前的状态)。请执行下列操作:
sudo apt-get autoclean
这将消除您可能拥有的所有旧文件(包括内核版本)。请注意,如果您有许多旧版本,则需要一段时间,因为它必须确保删除内核版本没有问题。对我来说,删除最后12个内核版本大约需要2分钟。您还可以执行以下操作:
sudo apt-get clean
这将消除下载并存储在apt的缓存文件夹中的所有内容。最后,您有:
sudo apt-get autoremove
它将检查是否有未使用的软件包,并在必要时将其删除。对于那些不再需要安装任何应用程序的库和依赖程序包,这非常有用。
sudo apt-get autoremove
确实删除了14.04中的旧内核(多个版本)。在升级内核之前和之后,您可能必须运行它。当我在升级前运行时,它仅删除了旧内核的通用版本。然后,在升级内核之后,它也删除了旧内核的低延迟版本。
sudo apt-get autoclean
命令。@tekNorah我安装了几个旧的内核,然后sudo apt-get autoremove
在Ubuntu Studio 14.04中运行。它没有删除任何内核。我只安装了低延迟内核。为什么同时安装了-generic和-lowlatency内核?
Computer Janitor可以清理旧的内核,并且我相信它默认安装在Ubuntu(但不是Kubuntu)中。
如果您使用GRUB 1,则可以选择GRUB 1,/boot/grub/menu.lst
以指定它最多可以显示多少个内核。据我所知,GRUB 2没有。
要弄清楚安装了哪些内核和头文件,请使用
dpkg -l | grep linux-image
dpkg -l | grep linux-headers
然后,您可以将它们一一删除或一起删除,只需确保保持最新状态即可。
还有一些方便的命令和脚本可以自动执行删除操作。
http://ubuntuforums.org/showthread.php?t=1658648
以下要求删除所有未使用的内核和头文件:
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | grep -v hwe | xargs sudo apt-get purge
(用于apt-get -y
毫无疑问地删除)
在18.04.1上运行时,会发生以下情况:
~$ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]
\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | xargs sudo apt-get -y purge
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
linux-headers-4.15.0-33* linux-headers-4.15.0-33-generic* linux-headers-4.15.0-34* linux-headers-4.15.0-34-generic* linux-image-4.15.0-33-generic* linux-image-4.15.0-34-generic*
linux-modules-4.15.0-33-generic* linux-modules-4.15.0-34-generic* linux-modules-extra-4.15.0-33-generic* linux-modules-extra-4.15.0-34-generic*
0 upgraded, 0 newly installed, 10 to remove and 1 not upgraded.
After this operation, 671 MB disk space will be freed.
(Reading database ... 227403 files and directories currently installed.)
Removing linux-headers-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-headers-4.15.0-33 (4.15.0-33.36) ...
Removing linux-headers-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-headers-4.15.0-34 (4.15.0-34.37) ...
Removing linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-image-4.15.0-33-generic (4.15.0-33.36) ...
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-33-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-image-4.15.0-34-generic (4.15.0-34.37) ...
I: /vmlinuz.old is now a symlink to boot/vmlinuz-4.15.0-36-generic
I: /initrd.img.old is now a symlink to boot/initrd.img-4.15.0-36-generic
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-34-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
(Reading database ... 156180 files and directories currently installed.)
Purging configuration files for linux-image-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
dpkg: warning: while removing linux-modules-4.15.0-33-generic, directory '/lib/modules/4.15.0-33-generic' not empty so not removed
Purging configuration files for linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-image-4.15.0-33-generic (4.15.0-33.36) ...
Purging configuration files for linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
~$ uname -r
4.15.0-36-generic
linux-libc-dev
已安装。
linux-libc-dev
的版本号与当前文件的版本号匹配。这里dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'
打印linux-libc-dev:amd64
grep -E "(image|headers)"
。
-y
使用清除标志。
您可以安装ubuntu-tweak,然后转到应用程序->系统工具-> ubuntu tweak并
单击包清洁程序,然后清洁内核。它不会显示当前使用的内核,因此您将永远安全。
就个人而言,我喜欢使用Synaptic
。这使我对正在发生的事情感到更加安全。我使用的唯一可以删除旧内核的应用程序是Ubuntu Tweak。
如何删除不使用的内核:
uname -a
在终端中运行update-grub
是建议。
您可以linux-image-...
使用Synaptic 卸载旧内核(程序包),这将从引导菜单中将其删除。注意不要删除正在运行的内核(可以使用查看其版本uname -r
)。
请记住,如果出现问题,拥有一个或两个较旧的版本可以帮助您进行故障排除。
另外,您可以手动编辑/删除条目(gksu gedit /boot/grub/grub.cfg
),但是当您更新到较新的内核时,它们将重新生成。如果您正在考虑删除recovery mode
选项,那就不要。如果您破坏了阻止启动的功能,它们可以派上用场。
请参阅此页面。
update-grub
它将重写所有这些内核。
这是一个纯命令行解决方案。
首先生成所有已安装内核版本的列表,当前运行的内核除外:
dpkg-query -W -f='${Package}\n' |
grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
grep -v $(uname -r | cut -d- -f1,2))
或者,生成除最后两个之外的所有已安装内核版本的列表:
dpkg-query -W -f='${Package}\n' |
grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
sort -V | head -n -2)
检查列表。确保要保留的内核版本不在列表中。使用命令uname -r
查看当前正在运行的内核的版本。
如果您对结果满意,可以使用apt-get
删除软件包。
首先进行空运行(以第一台发电机为例):
sudo apt-get --dry-run purge $(
dpkg-query -W -f='${Package}\n' |
grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
grep -v $(uname -r | cut -d- -f1,2)))
然后一个真实的运行:
sudo apt-get purge $(
dpkg-query -W -f='${Package}\n' |
grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
grep -v $(uname -r | cut -d- -f1,2)))
如果要自动化该过程,请添加--yes
参数:
sudo apt-get --yes purge $(
...)
sudo apt-get purge -- $(ls -1U /boot/vmlinuz* | cut -d- -f2,3 | sort -uV | head -n -2 | awk -v c=$(uname -r | cut -d- -f1,2) '($0==c){exit} //' | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/')
。dpkg-query
因为apt-get
可以处理正则表达式,所以不需要。请注意我如何转义点,并在正则表达式中添加前缀和后缀。在我自己的答案中使用脚本,您还可以保留一些比当前内核更旧的内核。
该答案的优点是无需安装第三方应用程序即可使用本机Ubuntu Bash。未使用apt
或dpkg
可以更改此bash脚本以适合其需求的自定义内核的用户。该答案基于(如何一次有选择地清除所有旧内核)。
Zenity为终端提供了一个不错的GUI界面,可以处理列表并使用单选按钮选择项目:
如标题所示,启动时使用的当前内核无法删除,也不包含在列表中。报告的大小是将保存在/boot
目录中的大小。由于内核二进制文件也位于其他区域,因此可以节省更多磁盘空间。2017年7月27日注意:目录/usr/src/*kernel_version*
和/lib/modules/*kernel_version*
现在也包括在内。
该修改日期是使用发现stat
命令。在我的系统上,每次使用此方法启动内核时,都会“触及”日期(如何查找特定内核版本的最新启动时间?)cron reboot脚本。但是,该日期在您的系统上将是内核发行日期,而不是您上次启动它的日期。
apt-get purge
给你机会中止您将获得最后的机会来查看将清除的所有内容,并查看将要恢复的总磁盘空间(有些误导):
The following packages will be REMOVED:
linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic*
linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic*
linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic*
linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic*
linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic*
linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic*
linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic*
linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic*
linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic*
linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic*
linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic*
linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic*
0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded.
After this operation, 2,330 MB disk space will be freed.
Do you want to continue? [Y/n]
将此代码复制到名为的可执行文件rm-kernels
中/usr/local/bin
:
#!/bin/bash
# NAME: rm-kernels
# PATH: /usr/local/bin
# DESC: Provide zenity item list of kernels to remove
# DATE: Mar 10, 2017. Modified Jul 28, 2017.
# NOTE: Will not delete current kernel.
# With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
# # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
# First time for `du` 34 seconds.
# Second time for `du` 1 second.
# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
# By default `du` is not used and estimated size is displayed.
# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
zenity --error --text "root access required. Use: sudo rm-kernels"
exit 99
fi
OLDIFS="$IFS"
IFS="|"
choices=()
current_version=$(uname -r)
for f in /boot/vmlinuz*
do
if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
[[ $f =~ vmlinuz-(.*) ]]
v=${BASH_REMATCH[1]} # example: 4.9.21-040921-generic
v_main="${v%-*}" # example: 4.9.21-040921
# Kernel size in /boot/*4.9.21-040921-generic*
s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')
if [[ $# -ne 0 ]] ; then # Was a parameter passed?
if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
# Kernel headers size in /usr/src/*4.9.21-040921*
s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
else
s2="0M" # Linux Headers are not installed
fi
# Kernel image size in /lib/modules/4.9.21-040921-generic*
s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
else
# Estimate sizof of optional headers at 125MB and size of image at 220MB
if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
s2="125M"
else
s2="0M" # Linux Headers are not installed
fi
s3="220M"
fi
# Strip out "M" provided by human readable option of du and add 3 sizes together
s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
t=$(( t + s ))
s=$s" MB"
d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
choices=("${choices[@]}" false "$v" "$d" "$s")
done
# adjust width & height below for your screen 640x480 default for 1920x1080 HD screen
# also adjust font="14" below if blue text is too small or too large
choices=(`zenity \
--title "rm-kernels - Total: $t MB excluding: $current_version" \
--list \
--separator="$IFS" \
--checklist --multiple \
--text '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
--width=640 \
--height=480 \
--column "Select" \
--column "Kernel Version Number" \
--column "Modified Date" \
--column " Size " \
"${choices[@]}"`)
IFS="$OLDIFS"
i=0
list=""
for choice in "${choices[@]}" ; do
if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
((i++))
short_choice=$(echo $choice | cut -f1-2 -d"-")
header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)
# If -lowlatency and -generic are purged at same time the _all header directory
# remains on disk for specific version with no -generic or -lowlatency below.
if [[ $header_count -lt 3 ]]; then
# Remove all w.x.y-zzz headers
list="$list""linux-image-$choice- linux-headers-$short_choice"
else
# Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
list="$list""linux-image-$choice- linux-headers-$choice"
fi
done
if [ "$i" -gt 0 ] ; then
apt-get purge $list
fi
注意:您需要sudo权限才能创建文件,因此请使用:
gksu gedit /usr/local/bin/rm-kernels
使文件可执行使用:
sudo chmod +x /usr/local/bin/rm-kernels
rm-kernels-server
是用于一次选择性删除所有内核的服务器版本。基于GUI的对话框代替了GUI(图形)对话框,而是用于选择要清除的内核。
在运行脚本之前,您需要使用以下命令安装对话框功能:
sudo apt install dialog
对话框位于默认的Ubuntu桌面安装中,而不位于Ubuntu Server中。
rm-kernels-server
bash代码#!/bin/bash
# NAME: rm-kernels-server
# PATH: /usr/local/bin
# DESC: Provide dialog checklist of kernels to remove
# Non-GUI, text based interface for server distro's.
# DATE: Mar 10, 2017. Modified Jul 28, 2017.
# NOTE: Will not delete current kernel.
# With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
# # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
# First time for `du` 34 seconds.
# Second time for `du` 1 second.
# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
# By default `du` is not used and estimated size is displayed.
# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
echo "root access required. Use: sudo rm-kernels-server"
exit 99
fi
# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed. Aborting."; exit 99; }
OLDIFS="$IFS"
IFS="|"
item_list=() # Deviate from rm-kernels here.
current_version=$(uname -r)
i=0
for f in /boot/vmlinuz*
do
if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
[[ $f =~ vmlinuz-(.*) ]]
((i++)) # Item List
v=${BASH_REMATCH[1]} # example: 4.9.21-040921-generic
v_main="${v%-*}" # example: 4.9.21-040921
# Kernel size in /boot/*4.9.21-040921-generic*
s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')
if [[ $# -ne 0 ]] ; then # Was a parameter passed?
if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
# Kernel headers size in /usr/src/*4.9.21-040921*
s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
else
s2="0M" # Linux Headers are not installed
fi
# Kernel image size in /lib/modules/4.9.21-040921-generic*
s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
else
# Estimate sizof of optional headers at 125MB and size of image at 220MB
if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
s2="125M"
else
s2="0M" # Linux Headers are not installed
fi
s3="220M"
fi
# Strip out "M" provided by human readable option of du and add 3 sizes together
s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
t=$(( t + s ))
s=$s" MB"
d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off)
done
cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \
--title "Use space bar to toggle kernel(s) to remove" \
--column-separator "!" \
--separate-output \
--ascii-lines \
--checklist " Kernel Version --------- Modified Date Size" 20 60 15)
selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty)
IFS=$OLDIFS
if [ $? -ne 0 ] ; then
echo cancel selected
exit 1
fi
i=0
choices=()
for select in $selections ; do
((i++))
j=$(( 1 + ($select - 1) * 3 ))
choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!")
done
i=0
list=""
for choice in "${choices[@]}" ; do
if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
((i++))
short_choice=$(echo $choice | cut -f1-2 -d"-")
header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)
# If -lowlatency and -generic are purged at same time the _all header directory
# remains on disk for specific version with no -generic or -lowlatency below.
if [[ $header_count -lt 3 ]]; then
# Remove all w.x.y-zzz headers
list="$list""linux-image-$choice- linux-headers-$short_choice"
else
# Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
list="$list""linux-image-$choice- linux-headers-$choice"
fi
done
if [ "$i" -gt 0 ] ; then
apt-get purge $list
fi
注意:在对dialog
指令的调用中,将绘图框的--ascii-lines
线条绘制扩展字符集(ssh
不喜欢)替换为“ + ----- +”。如果您不喜欢这种外观,则可以使用--no-lines
完全不带框的指令。
从每个内核的计算大小中提取了/boot/*kernel_version*
5个文件,总计约50 MB。公式已更改为在/usr/src/*kernel_version*
和中包含文件/lib/modules/*kernel_version*
。现在,每个内核的计算大小约为400 MB。上面的代码rm-kernels
和rm-kernels-server
已被更新。但是,上面的示例屏幕尚未反映这些更改。
缺省值是估计linux-header的文件大小为125 MB,linux-image的文件大小为220 MB,因为du
除非文件在高速缓存中,否则可能会很慢。要使用来获取实际大小du
,请向脚本传递任何参数。
现在,标题栏中将显示所有内核大小的总和(不包括当前无法删除的当前运行版本)。
该对话框用于显示每个内核的“ 上次访问日期”。在备份或类似操作期间,此日期可能会被所有内核大量覆盖。现在,对话框将显示修改日期。
sed
用来永久删除较旧内核的答案存在一些缺陷,如果在升级内核后未有人重新启动计算机,该命令也将删除较新的内核。
这是一个替代解决方案,将考虑所有情况以仅删除实际的较旧内核:
#!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))
for kernel in "${kernels[@]}"; do
ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
dpkg --compare-versions "$ker_rel" gt "$cur_rel" && echo "Please Restart your computer first" && break
dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done
如果您使用的版本比当前版本新,这将向您发出警告,请先重新启动计算机。另请注意,保留旧内核是有充分的理由的,这是一个很好的理由,如果您以某种方式弄乱了当前内核,使系统不稳定,那么您应该能够启动到任何旧内核中。
sed
解决方案。
grep -Po "^linux-image-[^-]+-[^-]+-generic\b"
用grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"
和grep -Po ".*(?=-[a-z]*$)"
用grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"
和grep -Po "[0-9].*(?=-[a-z]*)"
用替换怎么样grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"
?
我有一个不需要为此花哨的字符串解析的脚本。
删除标题和图像(当前图像除外)以释放空间
sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+
您可以使用ukuu(全部为GUI)来更新和删除旧内核。为我工作!
只要记住保留最后安装的2个,显然是“运行中”的内核即可。
您还可以将ukuu设置为仅显示主版本,甚至RC内核,隐藏点版本。
您可以在Synaptic中找到ukuu,或在此处找到说明:
根据David Kemp先前的回答,以下脚本将清除除最后两个版本以外的所有标题和图像。
#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)
SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | uniq | sed -n 2p)
# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
if [ -n "$SECONDTOLASTVER" ]; then
echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
fi
}
echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get purge
(用于apt-get -y
毫无疑问地删除)
| xargs sudo apt-get -y purge
)。如果它打印出3.13.0-43-lowlatency,则可能您的系统版本比系统上安装的版本高。
这是我所做工作的粗略概述,请小心,因为我不是linux专家,请确保您知道自己在做什么,并且已经备份了要修改的所有文件。
gedit /boot/grub/grub.cfg
然后找到您要保留的条目,我们将突出显示并复制它们
cd /etc/grub.d
ls
您会看到文件列表,例如10_linux和30_os-prober
sudo chmod -x 10_linux
这将停止自动将所有linux条目添加到grub引导菜单的形式。
gksudo gedit 40_custom
打开自定义启动菜单文件,然后返回grub.cfg(仍应在gedit中打开),然后复制要保留的条目...例如
menuentry "My Default Karmic" {
set root=(hd0,1)
search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
initrd /boot/initrd.img-2.6.31-11-generic
}
将其粘贴到中40_custom
,然后保存。
sudo chmod 755 40_custom
使它可执行,然后最后我们更新grub,这将更改grub.cfg文件:
sudo update-grub
现在,请注意,如果您更新内核或操作系统,则引导菜单可能不会更新...您将必须手动执行此操作。但是执行此过程将使您更加自定义引导菜单,例如删除内核版本并仅输入ubuntu名称...即Ubuntu Lucid 10.04等。
希望有人觉得这有帮助,因为我花了一段时间才弄清楚...在任何地方都看不到这个解决方案...
尝试这个。以根用户身份运行。
将该脚本另存为,例如./keep-n-kernels.sh
作为命令行参数,传递要保留的最新内核数。
#!/ bin / bash #将n作为命令行参数传递,它将找到所有已安装的 #内核,仅保留n个最新内核=>卸载所有较旧的内核 #dpkg -l'linux- *'| sed'/ ^ ii /!d; /'“ $(uname -r | sed” s /\(.*\)-\([^ 0-9] \ + \)/ \ 1 /“)”'/ d; s / ^ [^] * [^] * \([^] * \)。* / \ 1 /; / [0-9] /!d' #此命令列出了除最新内核以外的所有软件包的列表。 #来源:https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels n = $ 1 #查找已安装的内核版本: #dpkg-query -W -f ='$ {Version} \ n''linux-image- *'| grep。| 排序-n #给出版本号,每行一个 #dpkg-query -W -f ='$ {Version} \ n''linux-image- *'| grep。| sed's /\...$// g'| grep -v'\ ... $'| 排序-u #仅给出出现在linux-image中的内容 #后缀,例如-generic-pae #引导进入的内核类型 suffix = $(uname -r | sed's:^ [0-9] \。[0-9] \。[0-9] \-[0-9] \ {2 \} :: g') command =“ apt-get purge” $(dpkg-query -W -f ='$ {Version} \ n''linux-image- *'| grep中的版本| sed's /\...$// g'| grep -v' \ ... $'|排序-u |头-n-$ {n}) 做 command = $ {command}“ ^ linux-image-$ {version} $ {suffix}” 完成 $ command
样品用法:
#./keep-n-kernels.sh 4#启动apt-get命令以删除除4个最新内核以外的所有内核
如果要[自己承担风险],则可以在apt-get命令中添加-y(或强制标志),并使它不交互式。
只是为了发出声音,您也可以发出
apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}
以root身份完成工作。