Ubuntu修改默认启动的内核版本(grub)

文章目录

  • 问题引子
  • 查看系统已经安装的所有内核版本
  • 查看当前启动的内核版本
  • 解析grub.cfg
  • 更改grub默认启动项
  • 后记

问题引子

在终端输入下面命令查看显卡状态:

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

上面包含了至少三个关键信息:

  • 内核版本号:Linux version 4.8.0-36-generic (注意这里Linux version有些迷惑人,实际上就是内核版本号)
  • gcc版本号:gcc version 5.4.0 20160609
  • Ubuntu版本号:16.04.1-Ubuntu

我们此时关注的主要是内核版本号。
(注意,现在这个内核版本号是我已经改过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的所有信息,上述信息解读如下:

  • Linux:系统名称
  • 4.8.0-36-generic:内核版本名
  • 16.04.1-Ubuntu:Ubuntu版本号
  • x86_64:64位系统

解析grub.cfg

终端输入命令:

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
	}
}
......

不重要的信息掐头去尾,用省略号代替了,下面我们进行解读:

  • 第2行的DO NOT EDIT THIS FILE清楚告诉了大家,不要修改这个文件(我们只是解读,不修改)。
  • 10行,开头是menuentry 'Ubuntu'menuentry表示grub启动选项的显示条目,并且该条目到此为止,没有下一级菜单,该条目在开机grub启动界面的显示由单引号部分确定,为Ubuntu
  • 26行,开头是submenu 'Ubuntu 高级选项'submenu表示该条目有下一级目录。
  • 27行,开头是menuentry 'Ubuntu,Linux 4.15.0-72-generic',该条目处在submenu 'Ubuntu 高级选项'的大括号范围内,所以是其下级选项。
  • 其余都与27行类似

根据以上解读,如果我们可以进入grub开机启动界面的话,将会看到这样的菜单结构:

  • Ubuntu
  • Ubuntu 高级选项
    • Ubuntu,Linux 4.15.0-72-generic
    • Ubuntu, with Linux 4.15.0-72-generic (upstart)
    • Ubuntu, with Linux 4.15.0-72-generic (recovery mode)
    • Ubuntu,Linux 4.8.0-36-generic
    • Ubuntu, with Linux 4.8.0-36-generic (upstart)
    • Ubuntu, with Linux 4.8.0-36-generic (recovery mode)

上述菜单结构实际上有序号的,序号从0开始计数。我们现在希望开机启动的内核版本是Ubuntu 高级选项(序号1)下的Ubuntu,Linux 4.8.0-36-generic(序号3)。
如何设定这个启动项?在另外一个文件中。

更改grub默认启动项

开机怎么启动,由/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                                                 |
+-----------------------------------------------------------------------------+

你可能感兴趣的:(配置)