删除旧内核似乎删除了图形驱动程序,重新启动是否安全?
在执行例程时sudo apt upgrade
,我收到一个No space left on device
错误。事实证明,内核不断累积/boot/
,分区空间不足。
自动清除旧内核不起作用。
$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
所以我过滤了标题和图像列表。
$ dpkg --list | grep -E 'linux-image|linux-headers|linux-modules' | awk '{ print $2 }'
linux-headers-5.10.0-20-amd64
linux-headers-5.10.0-20-common
linux-headers-5.10.0-21-amd64
linux-headers-5.10.0-21-common
linux-headers-5.10.0-22-amd64
linux-headers-5.10.0-22-common
linux-headers-5.10.0-23-amd64
linux-headers-5.10.0-23-common
linux-headers-5.10.0-24-amd64
linux-headers-5.10.0-24-common
linux-headers-5.10.0-25-amd64
linux-headers-5.10.0-25-common
linux-headers-amd64
linux-image-5.10.0-18-amd64
linux-image-5.10.0-19-amd64
linux-image-5.10.0-20-amd64
linux-image-5.10.0-21-amd64
linux-image-5.10.0-22-amd64
linux-image-5.10.0-23-amd64
linux-image-5.10.0-24-amd64
linux-image-5.10.0-25-amd64
linux-image-amd64
5.10.0-18
我清除了从到 的所有标题和图像5.10.0-23
。然而,在清除图像时,我看到了意想不到的消息:
Removing linux-image-5.10.0-23-amd64 (5.10.179-3) ...
/etc/kernel/prerm.d/dkms:
dkms: removing: nvidia 535.98 (5.10.0-23-amd64) (x86_64)
-------- Uninstall Beginning --------
Module: nvidia
Version: 535.98
Kernel: 5.10.0-23-amd64 (x86_64)
-------------------------------------
Status: Before uninstall, this module version was ACTIVE on this kernel.
nvidia.ko:
- Uninstallation
- Deleting from: /lib/modules/5.10.0-23-amd64/kernel/drivers/video/
- Original module
- No original module was found for this module on this kernel.
- Use the dkms install command to reinstall any previous module version.
nvidia-uvm.ko:
- Uninstallation
- Deleting from: /lib/modules/5.10.0-23-amd64/kernel/drivers/video/
- Original module
- No original module was found for this module on this kernel.
- Use the dkms install command to reinstall any previous module version.
nvidia-modeset.ko:
- Uninstallation
- Deleting from: /lib/modules/5.10.0-23-amd64/kernel/drivers/video/
- Original module
- No original module was found for this module on this kernel.
- Use the dkms install command to reinstall any previous module version.
nvidia-drm.ko:
- Uninstallation
- Deleting from: /lib/modules/5.10.0-23-amd64/kernel/drivers/video/
- Original module
- No original module was found for this module on this kernel.
- Use the dkms install command to reinstall any previous module version.
nvidia-peermem.ko:
- Uninstallation
- Deleting from: /lib/modules/5.10.0-23-amd64/kernel/drivers/video/
- Original module
- No original module was found for this module on this kernel.
- Use the dkms install command to reinstall any previous module version.
depmod...
DKMS: uninstall completed.
dkms: removing: v4l2loopback 0.12.5 (5.10.0-23-amd64) (x86_64)
-------- Uninstall Beginning --------
Module: v4l2loopback
Version: 0.12.5
Kernel: 5.10.0-23-amd64 (x86_64)
-------------------------------------
Status: Before uninstall, this module version was ACTIVE on this kernel.
v4l2loopback.ko:
- Uninstallation
- Deleting from: /lib/modules/5.10.0-23-amd64/updates/dkms/
- Original module
- No original module was found for this module on this kernel.
- Use the dkms install command to reinstall any previous module version.
depmod...
DKMS: uninstall completed.
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-5.10.0-23-amd64
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-5.10.0-25-amd64
Found initrd image: /boot/initrd.img-5.10.0-25-amd64
Found linux image: /boot/vmlinuz-5.10.0-24-amd64
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
Adding boot menu entry for UEFI Firmware Settings ...
done
$ dpkg --list | grep -E 'linux-image|linux-headers|linux-modules' | awk '{ print $2 }'
linux-headers-5.10.0-24-amd64
linux-headers-5.10.0-24-common
linux-headers-5.10.0-25-amd64
linux-headers-5.10.0-25-common
linux-headers-amd64
linux-image-5.10.0-24-amd64
linux-image-5.10.0-25-amd64
linux-image-amd64
我是否不小心删除了显卡驱动程序?还是因为驱动程序也存在于更新的内核中就可以了?
以防万一我手动initrd
为剩下的两个内核重新生成图像。
$ sudo rm /boot/initrd.img*
$ sudo update-initramfs -c -k all
update-initramfs: Generating /boot/initrd.img-5.10.0-24-amd64
update-initramfs: Generating /boot/initrd.img-5.10.0-25-amd64
$ ls /boot/
config-5.10.0-24-amd64 grub lost+found vmlinuz-5.10.0-24-amd64
config-5.10.0-25-amd64 initrd.img-5.10.0-24-amd64 System.map-5.10.0-24-amd64 vmlinuz-5.10.0-25-amd64
efi initrd.img-5.10.0-25-amd64 System.map-5.10.0-25-amd64
$ uname -r
5.10.0-24-amd64
重新启动后我的电脑应该启动到5.10.0-25
.重新启动系统是否安全,或者是否需要进行更多配置,例如通知 GRUB 有关已清除的内核以确保我不会损坏系统?
答案1
当编译的 dkms 模块被编译的内核映像被删除时,编译的 dkms 模块也会被删除,这是完全正常的。
如果您运行,dkms status
您可能会看到仍然为您未清除的内核映像包安装了模块(即linux-image-5.10.0-24-amd64
和linux-image-5.10.0-25-amd64
)。
如果您没有看到该信息,那么您可能nvidia-kernel-dkms
也意外地卸载了该软件包 - 解决方案是重新安装它。
在相关说明中,我强烈建议使用和apt-mark hold
软件包 ,并且仅手动安装升级的内核软件包,例如使用类似的东西(作为 root,从 root shell 或使用):linux-image-amd64
linux-headers-amd64
sudo
apt-get -u install linux-image-amd64 linux-headers-amd64 ; \
apt-mark hold linux-image-amd64 linux-headers-amd64
为什么?由于 dkms 软件包有时与较新的内核不兼容,因此在升级内核之前需要等待 dkms 软件包的更新版本。 (顺便说一句,有时更新的软件包很快就会到达,有时您必须等待几天、几周甚至更长时间。请耐心等待,这是不值得破坏你的系统只是为了获得最闪亮的最新东西,特别是当闪亮和新的东西并不自动意味着更好或“添加一些你实际上有用的东西”需要”)。
出于同样的原因,您应该保留与 nvidia 相关的软件包。我在我的系统上使用以下脚本(称为list-nvidia.sh
)(至少,那些仍然具有 nvidia GPU 的系统,我正在逐渐将它们转移到 radeon 卡):
#!/bin/bash
#
# script: list-nvidia.sh
# author: Craig Sanders <[email protected]>
# license: Public Domain (this script is too trivial to be anything else)
# options:
# default/none list the packages, one per line
# -v verbose (dpkg -l) list the packages
# -h hold the packages with apt-mark
# -u unhold the packages with apt-mark
# build an array of currently-installed nvidia packages.
PKGS=( $(dpkg -l '*nvidia*' '*cuda*' '*vdpau*' 2>/dev/null| awk '/^[hi][^n]/ && ! /mesa/ {print $2}') )
if [ "$1" == "-v" ] ; then
dpkg -l "${PKGS[@]}" | cat
elif [ "$1" == "-h" ] ; then
apt-mark hold "${PKGS[@]}"
elif [ "$1" == "-u" ] ; then
apt-mark unhold "${PKGS[@]}"
else
printf "%s\n" "${PKGS[@]}"
fi
我运行list-nvidia.sh -h
以保存所有与 nvidia 相关的软件包,然后,当我想升级 nvidia 驱动程序时,我运行:
apt-get install $(list-nvidia.sh) ; \
list-nvidia.sh -h
我有一个类似的list-zfs.sh
ZFS dkms 模块脚本:
#! /bin/bash
#
# script: list-zfs.sh
# author: Craig Sanders <[email protected]>
# license: Public Domain (this script is too trivial to be anything else)
# options:
# default/none list the packages, one per line
# -v verbose (dpkg -l) list the packages
# -h hold the packages with apt-mark
# -u unhold the packages with apt-mark
# build an array of currently-installed zfs packages.
PKGS=( $(dpkg -l '*libnvpair*linux' '*libuutil*linux*' '*zfs*' '*zpool*' 'spl' 'spl-dkms' 'spl-kernel-modules' 'zfs-kernel-modules' 2>/dev/null | awk '/^[hi][^n]/ && ! /zfsnap|libvirt/ {print $2}') )
if [ "$1" == "-v" ] ; then
dpkg -l "${PKGS[@]}" | cat
elif [ "$1" == "-h" ] ; then
apt-mark hold "${PKGS[@]}"
elif [ "$1" == "-u" ] ; then
apt-mark unhold "${PKGS[@]}"
else
printf "%s\n" "${PKGS[@]}"
fi
我可能也有一个list-kernels.sh
脚本(并且修改上面的其中一个脚本来做到这一点并不难),但我已经有了dlocate -k
和 的大部分脚本dlocate -K
。我对此的用途之一是将所有内核映像和 dkms 模块标记为手动安装apt-mark manual $(dlocate -k)
,这样它们只会在我想要的时候被删除/清除。
grep
最后,如果您也使用awk
awk 可以完成 grep 可以做的所有事情,甚至更多,那么您几乎永远不需要使用。例如你的命令:
dpkg --list | grep -E 'linux-image|linux-headers|linux-modules' |
awk '{ print $2 }'
可以缩短为:
dpkg -l | awk '/linux-image|linux-headers|linux-modules/ { print $2 }'
或者,更好的是,仅匹配dpkg -l
输出的第二个字段:
dpkg -l | awk '$2 ~ /^linux-(image|headers|modules)/ { print $2 }'
您还可以利用 awk 将特定字段上的正则表达式模式匹配与布尔表达式相结合的能力。例如:
dpkg -l | awk '$2 ~ /^linux-(image|headers|modules)/ &&
$3 ~ /^5\.10\.(1[89]|2[0-3])-/ { print $2 }'
这将为您提供可以附加到命令的包列表apt-get purge
(可能通过命令替换,如apt-get install
上面的示例所示)。每当我需要清除旧安装的内核时,我都会经常使用类似的东西。