GRUB 2简介
GRUB
GRUB是linux系统默认的引导加载程序。linux加载一个系统前,它必须有一个引导加载程序中特定指令(比如MBR记录)去引导系统。这个程序一般是位于系统的主硬盘驱动器或其他介质驱动器上。
linux安装程序允许用户快速、方便地配置引导加载程序,将其存放在主硬盘驱动的主引导记录中来引导操作系统。
GUN GRUB是一个将引导加载程序安装到主引导记录的程序,主引导记录是位于一个硬盘开始的扇区。它允许位于主引导记录区中特定的指令来加载一个GRUB菜单或是GRUB的命令环境。这使得用户能够开始操作系统的选择,在内核引导时传递特定指令给内核,或是在内核引导前确定一些系统参数(如可以的RAM大小)
GRUB支持直接和链式加载的引导方法。GRUB能用户几乎所有操作系统、绝大多数流行的文件系统以及几乎所有的系统BIOS所能识别的硬盘。
GRUB 2
GRUB 2是GRUB的升级版,它实现了以下一些GRUB中所不具备的功能
- 图形接口
- 使用模块机制,通过动态加载需要的模块来扩展功能。
- 支持脚本语言,比如条件判断、循环、变量和函数
- 支持救援模式,可以用于系统无法引导的情况。
- 国际化语言。包括支持非ASCII额字符集和类似gettext的消息分类、字体、图形控制台等。
- 有一个灵活的命令行接口。如更不存在配置文件,GRUB 2会自动进入命令模式。
- 针对文件系统、文件、设备、驱动、终端、命令、分区表、系统加载的模块化、层次化、基于对象的框架。
- 支持多种文件系统格式。
- 可以访问以及安装设备上的数据。
- 支持自动解压。
GRUB 2中设备和分区命名规则
GRUB 2同样以fd表示软盘,hd表示硬盘(包括IDE和SCSI硬盘)设备是从0开始编号、分区则是从1开始,主分区为1~4,逻辑驱动器从5开始。下面介绍设备和分区的使用方法:
- (fd0):表示第一个软盘
- (hd0):表示第一个硬盘(大多数U盘与USB接口的移动硬盘以及SD卡也都被当作硬盘看待)
- (hd0,msdos1):表示第一个硬盘的第一个分区
- (hd0,msdos1)/boot/vmlinuz-3.10.0-327.e17.x86_64:表示第一个硬盘的第一个分区下的boot目录下的vmlinuz-3.10.0-327.e17.x86_64文件
- (hd1,msdos1):表示第二硬盘的第一个分区
- (cd):启动光盘(仅在从光盘启动GRUB时可用)
- (cd0):第一个光盘
GRUB 2主配置文件
- /boot/grub2/grub.cfg文件(/etc/grub2.cfg文件是/boot/grub2/grub.cfg文件的软链接)
- /etc/grub.d目录
- /etc/default/grub文件(/etc/sysconfig/grub文件是/etc/default/grub文件的软链接)
它们之间的关系是:/bot/grub2/grub.cfg文件里面通过"####BEGIN####"这种格式安装顺序调用/etc/grub.d目录中的脚本实现不同的功能。/etc/grub.d目录中有很多数字开头的脚本,按照从小到大的顺序执行。以00_header为例,它又会调用/etc/default/grub配置文件来实现最基本的开机界面配置。
比如在/boot/grub2/grub.cfg文件里面调用/etc/grub.d/10_linux来配置不同的内核,这里面有两个menuentry(菜单项),所以开机的时候会看见两个默认选项,一个是普通模式,一个是救援模式。
需要注意的是,最好不要直接去修改/boot/grub2/grub.cfg文件,这个是因为后期升级内核,所有 的配置都会失效。如更需要自定义这个文件,可以修改/etc/grub.d目录中对应的脚本或者/etc/default/grub文件,然后通过使用grub2-mkconfig命令重新生成/boot/grub22/grub.cfg文件。
- /etc/grub.d目录
定义每个菜单项的所有脚本都存放在/etc/grub.d目录中,这些脚本的名称必须有两位的数字前缀,其目的是构建GRUB 2菜单时定义脚本的执行顺序以及相应菜单项的顺序,比如00_header文件首先被读取。
在使用grub2-mkconfig命令生成配置文件时,需要加载/etc/grub.d目录。该文件描述如下
文件 | 描述 |
---|---|
00_header | 设置grub默认参数 |
10_linux | 系统中存在多个linux版本 |
20_ppc_terminfo | 设置tty控制台 |
30_os_prober | 设置其他分区中的系统(硬盘中有多个操作系统时设置) |
40_custom和41_custom | 用户自定义的配置 |
- /etc/default/grub是一个文本文件,可以在该文件中设置通用配置变量和GRUB2菜单的其他特性。在更改/etc/default/grub文件后,需要使用grub2-mkconfig命令更新GRUR2配置文件才能使更改生效。
/etc/sysconfig/grub文件是根据/etc/default/grub文件生成的软链接文件,两者文件内容是一样的。
[root@localhost ~]# ls -l /etc/sysconfig/grub lrwxrwxrwx. 1 root root 15 Jun 9 14:17 /etc/sysconfig/grub -> ../default/grub [root@localhost ~]# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet" GRUB_DISABLE_RECOVERY="true"
(一)GRUB_TIMEOUT=5 该参数用于设置进入默认启动项的等待实际,默认值5秒。可以设置为-1,这样就无限等待。
(二)GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" 该参数由GRUB 的发布者设置它们的标识名。这用于产生更具信息量的菜单项名称。
(三)GRUB_DEFAULT=saved 该参数用于设置默认启动项。比如要默认从第1个菜单项启动设置为0;要默认从第2个菜单项启动,设置为1;如果设置为saved,则默认为上次启动项。
(四)GRUB_TERMINAL_OUTPUT="console" 该参数用于选择终端输出设备。在这可能可以选择多个设备,以空格分开。有效的终端输出名依赖于平台,不过可能包括console(PC BIOS及EFI控制台)、serial(串行终端)、gfxterm(图形模式输出)、ofconsole(开放固件控制台)或vga_text(VGA文本输出,主要用在Coreboot)
(五)GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet" 该参数用于手动添加内核启动参数。
(六)GRUB_DISABLE_RECOVERY="true" 该参数用于设置是否启用修复模式。
(七)GRUB_DISABLE_LINUX_RECOVERY="true" 该参数用于设置是否创建修复模式菜单项。
(八)GRUB_HIDDEN_TIMEOUT=0 该参数不显示菜单,但会显示空白界面,设置实际内按任意键出现菜单。
(九)GRUB_HIDDEN_TIMEOUT_QUIET=true 该参数用于显示空白界面时是否不出现倒计时。
(十)GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 该参数用于添加默认内核启动参数
(十一)GRUB_TERMINAL=console 该参数用于设置使用终端还是图形界面来引导。
(十二)GRUB_GFXMODE=640x480 该参数用于设置图形界面分辨率。只能使用显卡支持的分辨率,具体可以在grub模式下输入vbeinfo查看。
(十三)GRUB_DISABLE_LINUX_UUID=true 该参数用于设置是否使用UUID引导,即使用root=/dev/sdax h还是root=UUDI=XXX
(十四)GRUB_INIT_TUNE="480 440 1" 该参数用于在GRUB启动时,调整扬声器的音量。
设置GRUB 2加密
由于GRUB 2负责引导linux系统,其作为系统中的第一道屏障的安全性非常重要,对GRUB 2进行加密可以实现安全性。
在默认情况下,GRUB 2对所有可以在物理上进入控制台的人都是可访问的。任何人都可以选择并编辑任意菜单项,并且可以直接访问GRUB命令行。要启用认真支持,必须将环境变量超级用户设置为一组用户名(可以使用空格、逗号、分号作为分隔符)这样就只允许超级用户使用GRUB命令行、编辑菜单项以及执行任意菜单项。
GRUB 2密码支持以下两种格式
- 明文密码:密码数据没有经过加密,安全性差
- PBKDF2加密密码:密码经过PBKDF2哈希算法进行加密,在文件中存储的是加密后的密码数据,安全性较高。
设置GRUB 2PBKDF2加密口令
先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令,然后在/etc/grub.d/00_header文件中添加超级用户和PBKDF2加密口令,最后使用grub2-mkconfig命令生成grub配置文件。
在/etc/grub.d/00_header文件中添加用户和PBKDF2加密口令的格式如下。
cat << EOF set superusers="用户" password_pbkdf2 用户 加密密码 EOF
- 生成加密口令
[root@localhost ~]# grub2-mkpasswd-pbkdf2
- 编辑/etc/grub.d/00_header文件
- 生成GRUB 2配置文件
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
设置GRUB 2明文密码
- 修改/etc/grub.d/00_header文件在文件末尾添加以下内容
cat << EOF set superusers="zhangsan" password zhangsan redhatlinux EOF
- 生成GRUB 2配置文件 使用以下命令生成GRUB 2配置文件/boot/grub2/grub.cfg
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
GRUB 2解锁
- 重启linux系统,按e键编辑启动菜单项,此时提示输入"Enter username",输入上面加密的zhangsan用户和密码,解锁成功。
- 才可以进入启动菜单项的编辑界面。
GRUB 2配置案例
一.破解root用户密码
centos7
方法一:
- 在启动linux系统时按e键开始编辑GRUB 2配置文件。
- 将"ro crashkernel=auto rhgb quiet"可读属性更改为可写模式"rw crashkernel=auto rhgb quiet",并在其后加上"rd.break enforcing=0";按住Ctrl+x键进入命令行模式。
- 显示命令行模式"switch_root:/#"
- 重新挂载文件系统
switch_root:/# mount -o remount, rw /sysroot
改变根目录
switch_root:/# chroot /sysroot
会发现命令提示符变成
sh-4.2#
就可以使用命令更改root密码了
sh-4.2# passwd
按提示输入两遍,提示
passwd:all authentication tokens updated successfully.
说明root密码已经更改成功。 为了使selinux生效,必须执行/.autorelabel命令
sh-4.2# /.autorelabel
最后重启即可。
sh-4.2# exec /sbin/reboot
方法二
- 同上1
- 将"ro crashkernel=auto rhgb quiet"可读属性更改为可写模式"rw crashkernel=auto rhgb quiet",并在其后加上"init=/bin/sh";按住Ctrl+x键进入命令行模式。(注意必须在quiet后空格且在同一行增加)
- 显示命令行模式"sh-4.2#"
- 重新挂载文件系统
sh-4.2# mount -o remount, rw /
更改root密码
sh-4.2# passwd root sh-4.2# touch /.autorelabel
按提示输入两遍密码,提示成功。为了使selinux生效,必须执行touch /.autorelabel命令,输入exec /sbin/init或者exec /sbin/reboot重启即可。
sh-4.2# exec /sbin/init
二. 修改网卡名称
- 修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX中添加net.ifnames=0 biosdevname=0。如下图
[root@localhost ~]# vi /etc/default/grub [root@localhost ~]# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0" GRUB_DISABLE_RECOVERY="true"
- 生成GRUB 2配置文件
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-957.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-957.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-7ad525c9157940e3847220b1bdb8be06 Found initrd image: /boot/initramfs-0-rescue-7ad525c9157940e3847220b1bdb8be06.img
- 查看网卡名称(先重启再查看)
[root@localhost ~]# ip addr list 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:11:59:7c brd ff:ff:ff:ff:ff:ff inet 192.168.64.148/24 brd 192.168.64.255 scope global noprefixroute dynamic eth0 valid_lft 1599sec preferred_lft 1599sec inet6 fe80::93e0:500f:62fc:c2a0/64 scope link noprefixroute valid_lft forever preferred_lft forever
centos7 运行ifconfig提示命令不存在,而又想使用该命令时
- 查看ifconfig命令是否存在 说明命令存在
[root@localhost ~]# ls /sbin/ifconfig /sbin/ifconfig
如果ifconfig命令存在,查看环境变量设置
[root@localhost ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/sbin
如果环境变量中没有包含ifconfig命令的路径 临时修改环境变量:在shell中输入
[root@localhost ~]# $export PATH=$PATH:/sbin
然后再输入ifconfig命令即可,但是这只是临时更改了shell中的PATH,如果关闭shell,则修改消失,下次还需要重复如上操作
永久修改PATH变量使之包含/sbin路径:
打开/etc/profile文件,在其中输入export PATH=$PATH:/sbin,保存并重启即可,这样一来,PATH路径永久修改成功,以后任何时候只输入ifconfig命令即可
- 如果命令不存在
[root@localhost ~]# ifconfig -bash: /usr/sbin/ifconfig: No such file or directory [root@localhost ~]# yum install net-tools [root@localhost ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.64.148 netmask 255.255.255.0 broadcast 192.168.64.255 inet6 fe80::93e0:500f:62fc:c2a0 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:11:59:7c txqueuelen 1000 (Ethernet) RX packets 87945 bytes 127182988 (121.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8930 bytes 1058671 (1.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
摘自:《Linux实用教程》人民邮电出版社出版发行 於岳编著