注:以下学习均在X86架构的CPU下搭建完成的linux系统。
一、linux系统启动流程简介
POST开机自检-->加载BIOS-->读取MBR-->启动Boot Loader/Grub程序-->加载内核-->用户层init依据inittab文件来设定运行等级-->init进程执行rc.sysinit-->启动内核模块-->执行不同运行级别的脚本程序-->执行/etc/rc.d/rc.local-->执行/bin/login程序,进入登录状态
以上就是linux系统启动的详细步骤,具体每块在启动中的步骤的内容这里就不做过多介绍。
二、MBR简介
MBR 是英文Master Boot Record的缩写,中文意为主引导记录。硬盘的0磁道的第一个扇区称为MBR,它的大小是512字节,而这个区域可以分为两个部分。第一部分为pre- boot区(预启动区),占446字节;第二部分是Partition table区(分区表),占66个字节。同时会在MBR的512字节中写入一个叫Boot Loader 的开机载入程序,而其有两种分别为分別是 LILO (LInux LOader) 及 GRUB (GRand Unified Bootloader) ,现在常用的为grub,下面就简单学习grub的使用。
三、grub简介
1、什么是grub
GRUB 是引导装入器(boot loader) -- 它负责装入内核并引导 Linux 系统。GRUB 还可以引导其它操作系统,如 FreeBSD、NetBSD、OpenBSD、GNU HURD 和 DOS,以及 Windows 系统等。尽管引导操作系统看上去是件平凡且琐碎的任务,但它实际上很重要。如果引导装入器不能很好地完成工作或者不具有弹性,那么就可能锁住系统,而无法引导计算机。另外,好的引导装入器可以给您灵活性,让您可以在计算机上安装多个操作系统,而不必处理不必要的麻烦。
2、grub的功能
1)选择要启动的内核或系统;
2)可以进入grub的交互式接口进行相关操作(在系统启动时按e键进入);
3)基于进入grub操作的密码保护,密码保护有两种:第一种启用内核镜像的密码保护,若要进行此此类保护须将生成密码文本放入响应title下,第二种实在进入grub的编辑模式的保护,若要进行此类保护须将生成密码文本放入在全局段中。
3、grub核心文件简介
[root@hpf-linux grub]# ls /boot/grub/ device.map grub.conf minix_stage1_5 stage2 e2fs_stage1_5 iso9660_stage1_5 reiserfs_stage1_5 ufs2_stage1_5 fat_stage1_5 jfs_stage1_5 splash.xpm.gz vstafs_stage1_5 ffs_stage1_5 menu.lst stage1 xfs_stage1_5
stage1: 通常它是被嵌入到 MBR。或者一个分区的引 导扇区之中。因为 PC 的引导扇区是 512 字节,所以 stage1 也是 512 字节。stage1 的作用就是从一个本地磁盘加载 stage 2 或者 stage 1.5 。因为大小的限制,stage1 对 stage2 或者 stage 1.5 的位置进行编码,也就是说,stage1 是无法识别文件系统格式的。
stage 1.5:它们的目的是在 stage1 和 stage2之间搭建一个桥梁,也就是 stage 1 加载 stage 1.5, stage 1.5 加载 stage2。stage1 和 stage 1.5 的 不同之处是 stage1 无法识别文件系统, stage 1.5 可以。因为 Stage2 太大了,无法被嵌入到某个固定的区域,而 Stage1.5可以安装在 MBR 之后的位置。
stage2:这是GRUB的核心引导程序。它几乎做了除启动它本身以外的所有事情,通常它被存放为某一种文件系统下,但并非一定要放在文件系统下。
4、grub配置文件grub.conf 的简介
[root@hpf-linux grub]# cat grub.conf default=0 timeout=5 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS 6 (2.6.32-504.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=ba513d9f-378e-4024-af2e-ca76e97129ea nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-504.el6.x86_64.img
a)default :定义默认引导的操作系统。0 表示第一个操作系统,1表示第2个,依此类推 。
b)timeout :定义多少秒内如果用户没有按下键盘上的某个按键,就自动引导 default 所指定的操作系统。
c)splashp_w_picpath定义GRUB界面背景图片(/boot/grub/splash.xpm.gz 图片文件)。
d) hiddenmenu :用于启动时隐藏菜单,除非在 timeout 之前按下 ESC 才能看到菜单。
e)title:定义引导项目的名称。
f)root:设置GRUB的根设备即内核所在的分区。
Device(磁盘)表示方式:在grub中,统统以hd开头,并紧跟一个数字做各磁盘设备的标记,从0开始
part表示方式:代表分区,从0开始编号。
g)kernel:定义要使用的文件,后面可以附加传递给内核的启动参数。
指定内核文件及传递给内核的参数
参数:ro root=设备文件,quiet 静默模式输出,使用ro只读方式读入,避免更改内核文件。
h)initrd:指定为内核提供额外驱动等功能的ram disk或ram fs文件。
文件:通常为cpio归档,并使用gzip压缩,通常以.img作为文件后缀名
同时也可以对grub进行加密操作:
i)password :用于定义进入 GRUB 命令模式的密码。你还可以为每个操作系统都定义一个密码,方法是把 password 命令放在 title行之后。 而且每个操作系统的引导密码可以不同,也可以和进入命令模式的那个密码不同,最大程度的保证 GRUB 的安全。
备注:一般的情况下对Linux操作系统的启动,要包括四行;title 行;root行;kernel 行;initrd 行;
5、开机进入grub的简介
进入此界面的方法为在linux系统启动后按e键就会进入此界面,下面关于此界面进行简要介绍:
第一行为grub的版本号;
第二行为一个方框显示此操作系统内核的列举;
最后是关于命令的介绍,上下键是选择内核,e键是进入编辑命令、a键是修改内核kernel参数、c键是进入命令行。
下面是按e键进入编辑命令的显示结果:
命令的简介:
上下键是选择要编辑的选项,b键是进入系统,e键编辑所选命令,c键是进入命令行,o键是增加一个空白行,d删除所选行。
通过本节的介绍我们已经学会了如何在grub窗口中的操作,下面介绍一个技巧,在本节的图一中按a键或者图二中选中kernerl选项按e键就会进入内核所在文件通过键入参数就能操作内核,通常键入 1,s、single、S按回车返回图二的界面,在按b键进入单用户模式,在进入单用户模式后就可以更改root账户的密码了。从此可见即使没有用户的root密码别人也能更改root的密码并进入linux系统,所以这样就很危险,解决方法之一就是我们在进入grub时可以设置密码从而达到保护的作用,下节就是介绍如何操作的。
6、给grub设置密码
生成md5加密的密码:
[root@hpf-linux ~]# grub-md5-crypt //密码设置的是linux Password: Retype password: $1$5sblL$wXw/G5LoLG.cbZu/KKRuS. [root@hpf-linux ~]# grub-md5-crypt //密码设置的是redhat Password: Retype password: $1$ryblL$VRy3YKXqLdzii1QPOoC2H1 [root@hpf-linux ~]# cat /etc/grub.conf default=0 timeout=5 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz hiddenmenu password --md5 $1$5sblL$wXw/G5LoLG.cbZu/KKRuS. title CentOS 6 (2.6.32-504.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=ba513d9f-378e-4024-af2e-ca76e97129ea nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-504.el6.x86_64.img password --md5 $1$ryblL$VRy3YKXqLdzii1QPOoC2H1
自己设置了两个MD5加密的密码,分别放在title前后配置文件的最后,由于放的位子不同所带来的意义也不一样。下面重启系统来观察两种位子的不同所带来的差异。
这是放在title前所设置的密码,在键入e后会进入该界面,需要在次键入p键输入密码才能进入grub调试界面。
在进入grub密码后进入内核会显示上图的界面,会增加password这一行信息,键入b键进入系统后会提示需要输入password密码,也就是在grub.conf配置文件中最后定义的密码,在输入密码后才能启动系统,同时若设置了此密码今后在系统启动中不管是否进入grub界面都要输入在grub.conf配置文件所定义的最后一个密码,若不想输入在grub.conf配置文件所定义的最后进入系统的密码,可以在上图中移动光标到password选项键入d键删除,在键入b键就不用输入密码进入系统了,不会更改grub配置文件,由此可得在grub.conf配置文件设置上述两个密码时若想进入系统必须至少键入一次密码才能进入系统。
7、grub配置文件丢失
在日常学习中我们若是不小心把grub配置文件弄丢失或损坏,在不知道情况下重启系统会直接进入grub的命令行界面,下面介绍了如何解决此问题:
在命令行手动将配置文件移至别处:
[root@hpf-linux ~]# mv /boot/grub/grub.conf /boot/grub/grub.conf.bak //手动将配置文件移至别处,此操作会影响系统的正常启动,慎用。 [root@hpf-linux ~]# ls /dev/root -lh //查看root所在磁盘分区位置,今后若忘记只能一个个试了lrwxrwxrwx 1 root root 4 7月 26 02:55 /dev/root -> sda5 [root@hpf-linux ~]# shutdown -r now
在重启系统后由于没有grub的配置文件我们会进入grub的命令行界面,在输入上面的命令后就可以键入boot命令重启系统,这里要注意你的root所在的磁盘分区,以及内核版本必须一致。同时vmlinuz和initramfs两个文件是用tab键带出来的,若不能出来说明你的设置GRUB的根设备输入错误。在重启系统后我们在从新简要的配置grub的配置文件,如下所示:
[root@hpf-linux ~]# cat /boot/grub/grub.conf default=0 timeout=5 title= CentOS 6.6 root (hd0,0) kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/sda5 initrd /initramfs-2.6.32-504.el6.x86_64.img
8、Boot Loader被损坏
[root@hpf-linux ~]# dd if=/dev/zero of=/dev/sda bs=100 count=1 //注意只能破坏前446字节,若将磁盘分区的64字节也破坏则此方法不能修复 记录了1+0 的读入 记录了1+0 的写出 100字节(100 B)已复制,0.00361351 秒,27.7 kB/秒
遇到此情况以后需要使用光盘进入紧急救援模式并进入光盘的shell环境,中间如何进入救援模式这里就不多做介绍了,这里要注意光盘的系统版本一定要与修复系统版本要一致。
通过上面紧急救援模式的操作在重启系统就可以正常进入linux系统了。
9、grub整个目录被删除
[root@hpf-linux ~]# rm -rf /boot/grub/ [root@hpf-linux ~]# shutdown -r now
由于虚拟机进入bios时间较短所以可以用在虚拟机软件上系统启动时直接进入bios的选项:
重启后会出现Error 15 的错误提示。继续装载光盘进入紧急救援模式,记住光盘的系统版本一定要和修复系统的版本一致。
在grub配置文件grub.conf中输入以下内容:
default=0 timeout=5 title= CentOS 6.6 root (hd0,0) kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/sda5 initrd /initramfs-2.6.32-504.el6.x86_64.img
按重启系统键就能进入linux系统了,以上就是关于grub相关知识的学习,虽然我们可以修复grub,但是试验中关于破环grub文件的命令不要乱使用。