本文主要针对Ubuntu系统由于Linux内核版本的不兼容导致的问题,而需要对内核进行升级、降级所需的操作及步骤。
首先,我所遇到的问题可以描述为:在更新了Ubuntu 19.04后,Linux内核升级至了5.0.0-13,而NVIDIA显卡驱动被迫升级至了418以上,导致tensorflow(版本1.13.0)在运行tf.Session()语句时显卡会卡住,无法继续运行,甚至连SSH都会卡住无法操作。经过分析判断为内核版本过高导致,所以需要采取内核降级的方式,将至4.18.0-18。
我是在遇到问题后尝试重新安装CUDA及显卡驱动,遇到了unable to locate kernel source 报错,判断是内核问题。
下面介绍如何对Ubuntu系统的Linux系统进行降级(升级同理)
1·查看可用的Linux内核
命令行输入grep menuentry /boot/grub/grub.cfg
查看可用的内核信息
例如
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-5b5cabf4-e78b-457c-b10f-b662ba4c57d9' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-5b5cabf4-e78b-457c-b10f-b662ba4c57d9' {
menuentry 'Ubuntu, with Linux 5.0.0-13-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.0.0-13-generic-advanced-5b5cabf4-e78b-457c-b10f-b662ba4c57d9' {
menuentry 'Ubuntu, with Linux 5.0.0-13-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.0.0-13-generic-recovery-5b5cabf4-e78b-457c-b10f-b662ba4c57d9' {
menuentry 'Ubuntu, with Linux 4.18.0-18-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-18-generic-advanced-5b5cabf4-e78b-457c-b10f-b662ba4c57d9' {
menuentry 'Ubuntu, with Linux 4.18.0-18-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-18-generic-recovery-5b5cabf4-e78b-457c-b10f-b662ba4c57d9' {
menuentry 'Memory test (memtest86+)' {
menuentry 'Memory test (memtest86+, serial console 115200)' {
可以发现我这里有5.0.0-13以及4.18.0-18两个版本
2·如果未找到想要的内核版本,可以执行
sudo apt-get install linux-headers-x.x.x-x-generic linux-image-x.x.x-x-generic
下载安装对应版本的Linux内核
对于内核升级,下载了安装后 reboot重启即可
3·修改GRUB
编辑/etc/default/grub
文件中的GRUB_DEFAULT
默认为GRUB_DEFAULT=0
降级时如需特定版本的内核
则将上述语句修改为:
GRUB_DEFAULT="Advanced options for Ubuntu > Ubuntu, with Linux 4.18.0-18-generic"
或
GRUB_DEFAULT="gnulinux-advanced-5b5cabf4-e78b-457c-b10f-b662ba4c57d9>gnulinux-4.18.0-18-generic-advanced-5b5cabf4-e78b-457c-b10f-b662ba4c57d9"
我是采用后者成功的,两条语句功能一样,但似乎适用的版本不同,这一点还没搞清楚,不过新一些的系统可以直接尝试第二种方式。引号内的版本信息均可在步骤1的输出内容中找到,只要确认是所需内核版本即可
4·更新GRUB并重启
sudo update-grub
sudo reboot
重启后可用uname -r
查看,内核版本已成功降级。
以上就是Ubuntu系统的Linux内核降级方法,内核降级多见于Ubuntu系统初更新的一段时间,导致驱动、上层框架、应用程序等的兼容性出现异常,或强制升级、适配了高版本驱动等带来了程序运行异常等问题。
针对我所遇到的具体问题,在内核降级后,重新安装CUDA10.0以及对应的显卡驱动(版本410.48)以及对应的CUDNN,就恢复正常了。