在终端输入下面命令查看显卡状态:
nvidia-smi
结果出现了以下错误:
NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
前一天还用的好好的,重启以后就不行了。
网上搜索一番后,定位到问题的原因是,系统莫名其妙多了一个更高的内核版本,默认的启动(grub)总是启动高版本的,所以安装NVIDIA驱动的内核版本和当前不一致,也就导致了上述问题的出现。
这个内核版本是可以在启动阶段通过grub手动选择的,但是每次都要选很不方便。我们可以通过修改配置文件来更改默认启动项,下面就来看看怎么改这个配置文件。
终端输入以下命令:
dpkg --list | grep linux-image
显示:
ii linux-image-4.15.0-72-generic 4.15.0-72.81~16.04.1 …
ii linux-image-4.8.0-36-generic 4.8.0-36.36~16.04.1 …
ii linux-image-extra-4.8.0-36-generic 4.8.0-36.36~16.04.1 …
ii linux-image-generic-hwe-16.04 4.15.0.72.92 …
后面的...
表示还有信息,不过不关键,所以省略掉了。
那么这里就能看出问题了,正常情况下,如果没有升级过内核版本的话,系统里面只有一个内核版本,现在多出来一个4.15.0,这就带来了问题。
可以用两种方法。
方法一,终端输入命令:
cat /proc/version
显示:
Linux version 4.8.0-36-generic (buildd@lgw01-18) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #36~16.04.1-Ubuntu SMP Sun Feb 5 09:39:57 UTC 2017
上面包含了至少三个关键信息:
我们此时关注的主要是内核版本号。
(注意,现在这个内核版本号是我已经改过grub的了,如果没有改过grub,默认启动高版本的)
方法二,终端输入命令:
uname -a
显示:
Linux 4.8.0-36-generic #36~16.04.1-Ubuntu SMP Sun Feb 5 09:39:57 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
-a表示显示uname的所有信息,上述信息解读如下:
终端输入命令:
cat /boot/grub/grub.cfg
显示:
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
......
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f99e2107-a6d8-4dce-ad90-6d94e30342ad' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
else
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
fi
linux /boot/vmlinuz-4.15.0-72-generic root=UUID=f99e2107-a6d8-4dce-ad90-6d94e30342ad ro quiet splash $vt_handoff
initrd /boot/initrd.img-4.15.0-72-generic
}
submenu 'Ubuntu 高级选项' $menuentry_id_option 'gnulinux-advanced-f99e2107-a6d8-4dce-ad90-6d94e30342ad' {
menuentry 'Ubuntu,Linux 4.15.0-72-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-72-generic-advanced-f99e2107-a6d8-4dce-ad90-6d94e30342ad' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
else
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
fi
echo '载入 Linux 4.15.0-72-generic ...'
linux /boot/vmlinuz-4.15.0-72-generic root=UUID=f99e2107-a6d8-4dce-ad90-6d94e30342ad ro quiet splash $vt_handoff
echo '载入初始化内存盘...'
initrd /boot/initrd.img-4.15.0-72-generic
}
menuentry 'Ubuntu, with Linux 4.15.0-72-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-72-generic-init-upstart-f99e2107-a6d8-4dce-ad90-6d94e30342ad' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
else
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
fi
echo '载入 Linux 4.15.0-72-generic ...'
linux /boot/vmlinuz-4.15.0-72-generic root=UUID=f99e2107-a6d8-4dce-ad90-6d94e30342ad ro quiet splash $vt_handoff init=/sbin/upstart
echo '载入初始化内存盘...'
initrd /boot/initrd.img-4.15.0-72-generic
}
menuentry 'Ubuntu, with Linux 4.15.0-72-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-72-generic-recovery-f99e2107-a6d8-4dce-ad90-6d94e30342ad' {
recordfail
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
else
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
fi
echo '载入 Linux 4.15.0-72-generic ...'
linux /boot/vmlinuz-4.15.0-72-generic root=UUID=f99e2107-a6d8-4dce-ad90-6d94e30342ad ro recovery nomodeset
echo '载入初始化内存盘...'
initrd /boot/initrd.img-4.15.0-72-generic
}
menuentry 'Ubuntu,Linux 4.8.0-36-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.8.0-36-generic-advanced-f99e2107-a6d8-4dce-ad90-6d94e30342ad' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
else
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
fi
echo '载入 Linux 4.8.0-36-generic ...'
linux /boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=f99e2107-a6d8-4dce-ad90-6d94e30342ad ro quiet splash $vt_handoff
echo '载入初始化内存盘...'
initrd /boot/initrd.img-4.8.0-36-generic
}
menuentry 'Ubuntu, with Linux 4.8.0-36-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.8.0-36-generic-init-upstart-f99e2107-a6d8-4dce-ad90-6d94e30342ad' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
else
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
fi
echo '载入 Linux 4.8.0-36-generic ...'
linux /boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=f99e2107-a6d8-4dce-ad90-6d94e30342ad ro quiet splash $vt_handoff init=/sbin/upstart
echo '载入初始化内存盘...'
initrd /boot/initrd.img-4.8.0-36-generic
}
menuentry 'Ubuntu, with Linux 4.8.0-36-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.8.0-36-generic-recovery-f99e2107-a6d8-4dce-ad90-6d94e30342ad' {
recordfail
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
else
search --no-floppy --fs-uuid --set=root f99e2107-a6d8-4dce-ad90-6d94e30342ad
fi
echo '载入 Linux 4.8.0-36-generic ...'
linux /boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=f99e2107-a6d8-4dce-ad90-6d94e30342ad ro recovery nomodeset
echo '载入初始化内存盘...'
initrd /boot/initrd.img-4.8.0-36-generic
}
}
......
不重要的信息掐头去尾,用省略号代替了,下面我们进行解读:
DO NOT EDIT THIS FILE
清楚告诉了大家,不要修改这个文件(我们只是解读,不修改)。menuentry 'Ubuntu'
,menuentry
表示grub启动选项的显示条目,并且该条目到此为止,没有下一级菜单,该条目在开机grub启动界面的显示由单引号部分确定,为Ubuntu
。submenu 'Ubuntu 高级选项'
,submenu
表示该条目有下一级目录。menuentry 'Ubuntu,Linux 4.15.0-72-generic'
,该条目处在submenu 'Ubuntu 高级选项'
的大括号范围内,所以是其下级选项。根据以上解读,如果我们可以进入grub开机启动界面的话,将会看到这样的菜单结构:
上述菜单结构实际上有序号的,序号从0开始计数。我们现在希望开机启动的内核版本是Ubuntu 高级选项
(序号1)下的Ubuntu,Linux 4.8.0-36-generic
(序号3)。
如何设定这个启动项?在另外一个文件中。
开机怎么启动,由/etc/default/grub
文件来确定。该文件可以修改,但是需要root
权限,并且修改后要及时更新。
在终端使用以下命令打开文件进行修改:
sudo gedit /etc/default/grub
修改完后使用以下命令进行更新:
sudo update-grub
下面具体说怎么修改。
打开文件后,内容显示如下:
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
第1行告诉我们,修改完后要及时update。
第6行就是要修改的部分,原本是GRUB_DEFAULT=0
,现在我们修改为GRUB_DEFAULT="1> 3"
,其中"1> 3"
表示在第一级菜单中序号为1的条目,在该条目的第二级菜单中我们选择序号为3的条目。也就是我们上面讲过的Ubuntu 高级选项
(序号1)下的Ubuntu,Linux 4.8.0-36-generic
(序号3)。请注意>
号后面有空格。
修改完成后保存,然后执行sudo update-grub
命令,终端中会出现以下内容:
Generating grub configuration file …
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Found linux image: /boot/vmlinuz-4.15.0-72-generic
Found initrd image: /boot/initrd.img-4.15.0-72-generic
Found linux image: /boot/vmlinuz-4.8.0-36-generic
Found initrd image: /boot/initrd.img-4.8.0-36-generic
Adding boot menu entry for EFI firmware configuration
然后重启就OK了,重启后可以使用uname -a
命令查看内核版本是否已经修改成功。
GRUB_DEFAULT还有一种修改方式为:
GRUB_DEFAULT="Ubuntu 高级选项>Ubuntu,Linux 4.8.0-36-generic"
这种看起来更合理一些,毕竟序号可能随着新的内核版本的安装而改变指向的内容,但是名称不会变。
修改后打开终端输入以下命令:
nvidia-smi
然后就又看到了那个熟悉的信息:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.43 Driver Version: 418.43 CUDA Version: 10.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 208... Off | 00000000:01:00.0 Off | N/A |
| 24% 65C P0 N/A / N/A | 0MiB / 10986MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+