Linux系统的启动引导程序有LiLo和grub,但由于LILO的缺陷——只能识别0-1023范围内的柱面构成的分区中的内核文件,因此目前已逐渐被grub所取代,本篇主要围绕grub legacy开展描述。
grub全称为Grand Unified Bootloader,grub的版本经过多年的发展,其现有版本分为grub 0.X(grub legacy) 和grub 1.X(grub 2)。其中目前Centos 7已经采用grub2位启动引导程序,Centos6和Centos5 普遍沿用grub legacy版本。
grub引导程序分为三个阶段:
1、stage1:用于启动Boot loader来加载stage2的内容至内存中;
2、stage1_5:其能够识别内核和stage2所在的分区的文件系统格式类型,帮助引导stage2.
3、stage2:读取grub.conf 配置文件,并实现引导功能的扩展;
在Linux系统中,与系统启动相关的文件均存储在/boot目录下,如grub、vmlinuz、initramfs等等。
与grub相关的配置文件包括:/etc/grub.conf和/boot/grub/grub.conf,其实/etc/grub.conf是指向/boot/grub/grub.conf的软链接,grub程序在引导启动时会读取这个配置文件并按照该文件的配置参数引导启动系统。
通常其内容为:
default=0 :表示有多个grub引导菜单时,选择哪一个作为默认启动引导菜单,default=0表示默认使用第一个title菜单中的配置;
timeout=5 :在grub选择菜单中,5秒内,如果用户没有选择任何一个title,则使用default中指定的titile菜单中的配置进行启动。
splashimage :指定引导菜单中的背景图片的路径;
titile :指定title菜单到的名称;
root :表示kernel和initrd文件所在的分区路径,而不是“根分区”;其设置格式为:root (hd#,#),硬盘均会被识别为hd,第一个#表示第几个硬盘,从0开始;地第二个#表示同一个硬盘上的不同分区,也使用数字标识,从0开始;
kernel :通常用于指定要运行的内核文件路径,如:/vmlinuz-2.6.32-642.el6.x86_64;另外也可在其后设置相关的内核参数,如:ro表示只读,root表示指定根分区所在路径,关闭selinux等等;
initrd :为内核运行指定其可用的ramdisk文件,其版本须与内核版本相一致;
1、提供引导菜单,并提供交互式的命令行接口;在菜单界面,按e可进入编辑模式,用于编辑菜单,按c可以进入命令模式;
2、加载用户选择的内核或 *** 作系统,并允许传递相应的内核参数给内核;可选择隐藏此菜单;
3、为菜单提供保护机制,可为编辑菜单设置认证或为启用内核或 *** 作系统进行认证;
在系统开机启动过程中,有几秒的过渡页面,此时按任意键可进入到菜单页面中:
进入到菜单页面后,如果存在着多个内核,此时可按上下键选择需要启动的内核,或者按e进入内核编辑模式,按c可进入grub的命令行模式。
在菜单页面按c即可进入命令行接口,在此命令行接口, 我们可以配置相关的grub设置,如指定root 路径、kernel文件的路径等等。grub命令行接口的常用指令有:
grub程序提供了相关的认证机制用于系统保护,如防止恶意用户随意通过单用户模式修改root密码或启动其他内核。
设置认证的方法为:在相应的grub.conf配置文件中,添加passwd -md5 STRING。
如下图为提供grub菜单的编辑认证:
下述为为对应的内核启动提供密码认证:
1、使用grub-install命令
DEVICE:安装的目标磁盘;
--root-directory=DIR:指grub映像文件的存放位置,默认为当前系统根目录。grub-install会在指定的目录下创建boot/grub/的层级目录,并生成相关的grub文件生成在DIR/boot/grub/下。
2、在grub命令行下安装grub
输入命令grub进入grub命令行:
在grub程序出现损坏时,我们还可以利用上述方法对其进行修复:
也可以通grub命令行来修复grub程序:
方法一:利用安装光进入救援模式进行grub修复
插入光盘,进入救援模式。
在完成相关的硬件检测及引导程序,依次设置语言、键盘及是否启动网络,接着系统会查找根分区,随后选择continue以读写的方式挂载根文件系统。
点击OK,最后选择start shell。
至此grub已修复完成,系统应能正常启动。
方法二:将损坏的硬盘拆卸挂载到其他Linux系统上进行修复
修复完成后,将对应硬盘拆卸挂载回原来的系统,再启动验证即可。
补充:如何在Linux系统不重启下添加或移除硬盘。
添加命令为:
移除命令为:
这两个命令的成功与否在于对应的数字ID是否正确,其格式为:
1、grub 命令行接口(一次性设置)
系统启动过程中按 c 键可进入grub 命令行界面,就可以自定义grub 启动参数了。常用命令有:
help ##查询帮助
help COMMAND ##查询命令帮助
ls : 显示系统磁盘及分区情况
root (hd#,#) :将hd#的第#号分区设置为根分区(CentOS 6)
kernel /PATH/TO/KERNEL_FILE : 设定本次启动用到的内核文件(CentoS 6)
set root=(hd#,msdos#) : 将第#块硬盘的第#个分区设置为根分区(CentOS 7)
linux /PATH/TO/KERNEL_FILE : 设定本次启动用到的内核文件(CentoS 7)
r oot=/dev/mapper/cl-root ro init=/bin/sh : 指明根分区路径;以ro/rw格式挂载第一个运行的程序是bash
initrd /PATH/TO/INITRAMFS_FILE_FILE : 为选定的内核提供额外的ramdisk
CentOS 7:
然后boot 重启,将会出现以下定制的系统了:
CentOS 6:
2、grub 配置文件: 永久配置是要在grub 的配置文件中配置的;
CentOS 6 : /boot/grub/grub.cfg
default=0 : 设置默认启动菜单项;编号从0开始
timeout=5 : 设置菜单项等待被选择的时长
title CentOS Express ##定义内核菜单选项
root (hd0,0)
kernel /vmlinuz-VERSION-release ro [selinux=0] root=/dev/mapper/vg0-root (根据系统设置)
initrd /initramfs-VERSION-release.img
CenOS 7 : /boot/grub2/grub.cfg (/etc/grub2.cfg ), 不要直接修改
grub2-mkconfig会调用/etc/grub.d中的脚本去搜集/etc/default/grub 中的配置参数,生成/etc/grub2.cfg
/etc/default/grub中的参数被修改,就可以使用grub2-mkconfig重新生成/etc/grub2.cfg
#grub2-mkconfig –o /boot/grub2/grub.cfg
3、给Grub 添加保护
CentOS 6:
配置项:
default=0
timeout=5
password [--md5] STRING : 菜单编辑认证
title TITLE :
root (hd#,#) :
kernel /PATH/TO/VMLINUXZ_FILE [PARAMETERS]
initrd /PATH/TO/INITRAMFS_FILE
password [--md5] STRING : 启动选定的内核或 *** 作系统时需要进行认证
CentOS 7:
a.添加grub菜单和命令行的密码认证:
>>>grub2-setpassword ##输入密码两次生成/boot/grub2/user.cfg 文件
>>>cat /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.CC6F56BFCFB90C49E6E16DC7234.....
>>>grub2-mkconfig -o /boot/grub2/grub.cfg ##重新生成配置文件
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-f9725b0c842348ce9e0bc81968cf7181
Found initrd image: /boot/initramfs-0-rescue-f9725b0c842348ce9e0bc81968cf7181.img
done
>>>shutdown -r now
再次键入e 或 c ,系统都会要求输入用户名和密码的
rel: https://www.thegeekdiary.com/centos-rhel-7-how-to-password-protect-grub2-menu-entries/
b. 删除grub 密码保护(删除掉user.cfg,重新生成配置文件即可)
>>>rm -rf /boot/grub2/user.cfg
>>>grub2-mkconfig -o /boot/grub2/grub.cfg
>>>reboot
什么是GRUB
GNU GRUB 是一个多重 *** 作 系统 启动管理器。GNU GRUB 是由GRUB(GRand Unified Bootloader) 派生而来。GRUB 最初由Erich Stefan Boleyn 设计和应用;
系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载、传输控制到 *** 作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成;
Linux 中GRUB的配置文件
grub的配置文件位于/boot/grub/grub.conf其内容如下。
default=0 //默认启动的内核或者说默认启动的 *** 作系统,0表示的是第一个内核或者 *** 作系统,依次往后排(title所指定的那一项,第一个title是0,第二个是1,依次)
timeout=5 //默认的超时时间,这里定义的是5秒,如果5秒没有选择,默认启动第一个内核或者说是第一个 *** 作系统
splashimage=(hd0,0)/grub/splash.xpm.gz //指定grub的背景图片,因为grub是系统开机后,运行系统所必须运行的第一个程序,所以,系统所自带的文件系统还没有被挂载,好在grub可以直接访问磁盘文件,grub所识别的硬盘跟linux系统的不太一样,grub认为,所有的磁盘都是hd的,而系统则不是。所以这里是(hd0,0),第一个0表示的是第一块硬盘,第二个0表示的是第一个分区。如果要引用磁盘设备,要用括号括起来,所以这里有一个括号。
hiddenmenu //隐藏grub菜单,如果有这一项,我们将看不到grub的菜单,只能看到grub的背景图片,然后上面出现了一个 please any key to enter the menu 下面是 Booting <default=0指定的,默认是第一个title的内容>in <timeout=N 超时时间设置>... 这样子。具体的看下面的图
![]( http://upload-images.jianshu.io/upload_images/4958474-d753926ca3df5492.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
然后可以通过按任意键,进入grub的菜单。如果有多个内核的话,我们可以选择启动哪一个内核。下图是grub的菜单
![]( http://upload-images.jianshu.io/upload_images/4958474-3b21dfedd7290e30.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
下面的英文内容,相信大家也看得懂。我就不多说了。通过编辑这里的grub菜单,我们可以直接进入单用户模式,然后修改密码。忘记密码的时候,可以试下这个方法。
title Red Hat Enterprise Linux Server (2.6.18-164.el5) //这就是一个标题,就是Grub菜单上所显示的内容,title关键字后面的内核,可以随便写,为了方便识别,建议还是写一些可以从字面意义看出是什么 *** 作系统或者内核的文字描述。
root (hd0,0) //把hd0,0设置为根目录,方便访问.设置文件访问的起始点,这里设置的根,是grub的根。
kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet //指定内核文件,在内核后面跟的root,指的是 *** 作系统的根目录在哪儿. rhgb是redhat的一个小工具,显示各种输出的信息,包括硬件的初始化,quit表示是静默模式,不输出信息.启动系统的时候会卡一下,然后出现redhat就是因为没有显示rhgb小程序的输出信息.
initrd /initrd-2.6.18-164.el5.img //可以认为这是一个驱动程序,系统刚开机的时候,Grub第一个启动,要挂载文件系统,就要从文件系统里面读取驱动,如果驱动在内核里面还好,如果不在内核里面了,那不就……所以,这个可以认为是一个驱动。其实,他是一个微小的linux系统,这个系统里面,只包含了驱动程序,没有其它文件。可以先把它重命令为.gz的,然后解压,解压后再用cpio解压,就可以看到其内容了。目录结构跟你的linux系统是一样的,只不过没有文件,只有驱动程序而已。
刚才说过,可以直接通过这里改密码,这样是很不安全的。也就是说,如果别人能接触到我们的物理服务器,他就可以直接更改我们系统的密码,所以,我们可以给grub 加密 码,加密码的方法就是直接在grub.conf中指定,可以用关键字password 后面跟密码来实现,但是这样的密码是明文的,也不安全,所以我们可以用password --md5 通过grub的md5加密工具来加密,然后写到password --md5的后面。grub的md5加密工具是grub-md5-crypt ,直接使用这个命令,输出密码,然后会生成一段MD5加密后的值,写到关键字后面就可以实现md5加密grub了。
写的位置的不同,加密的效果也就不一样,我们可以写到一个title里面,只对指定的内核或者说 *** 作系统来加密,当启动该内核或者系统的时候,会要求用户输入grub的密码。当写在所有的title外面的时候,编译grub菜单的时候,会要求输入密码,这时候密码先按p键输入密码,然后再按e键,才能编辑。
手动安装GRUB
安装grub有两种方法可以使用。下面进入详细的介绍,如果某些地方说的不太准确,希望大家能够提出,TKS
第一
可以使用grub-install命令来进行安装,具体方法是
grub-install --root-directory=/要安装到哪个目录 /要安装的设备
例:我这里用 虚拟机 演示一下,新加了一块磁盘,然后分区格式化(该 *** 作不演示),然后挂载,然后用命令安装,如下图
x
注意:这里挂载点一定是boot目录,可以不是/mnt,但最后挂载的目录名字,一字叫boot,不然会出问题的。还有安装的时候--root-directory=一定不要指定到boot目录,要指定到boot所在的目录,因为grub安装的时候,会去找boot目录,如果找不到,会报错的。当我们把盘挂载到boot之后,可以认为,该盘的名字就叫boot,所以,它会在该盘内写入bootloader,以引导系统,如果我们安装的时候指定到了boot,那么就是把bootloader的内容写到了文件里面,而不是硬盘的MBR。切记切记。我做了好多次都没做出来,就是犯了这个错。
安装完成后,我们新建一个虚拟机,创建磁盘的时候,使用已有磁盘,找到我们安装过grub的磁盘,然后使用之即可。开机之后,会惊喜的发现,出现了grub的提示符。
![]( http://upload-images.jianshu.io/upload_images/4958474-a6b446eee903d400.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
第二种方法(有点儿麻烦):
首先把 /usr/share/grub/i386-redhat/里的所有文件,拷贝到grub目录
注意:这里同上,一定要挂载到boot目录下,无论boot目录在哪
![]( http://upload-images.jianshu.io/upload_images/4958474-5bc61b8664d71e60.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
然后开始grub的安装,直接使用命令grub
![]( http://upload-images.jianshu.io/upload_images/4958474-83d9432c7ef95f52.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
root (hd2,0) 表示grub要安装到第三块硬盘第1个分区上
setup (hd2) 指定要安装的设备,设备为第二块硬盘,安装完成后quit命令退出就可以了,至于图片,我就不上了,绝对是可以的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)