启动流程、grub配置及修复、initramfs修复
目录:
- centos启动流程
- grup配置及修复
2.1 grub配置
2.2 grub命令启动
2.3 grub修复
- initramfs修复
- boot破坏修复
1.centos启动流程
在centos5和6中启动流程如下:
(1).POST加电自检
硬件加电自检程序(安装在CMOS中的BIOS程序)BIOS负责检测硬件设备是否正常运行,如cpu、内存、硬盘、外接设备等是否正常,在生产中服务器内存较大,由多条内存组成较大内存的服务器,因此对内存的安装顺序等要严格的控制,不同品牌服务器要根据各自厂家的设计及要求进行安装。
BIOS初始化硬件后会关联硬盘分区格式, 如:新购PC机自带Windows10(GPT分区)系统修改为Windows7(MBR)系统时,将BOIS中boot菜单的boot mode默认格式UEFI修改为Legacy Support。因为不同的硬盘分区格式,需要不同的硬件启动程序支持。
(2).MBR主引导分区
在BIOS初始化硬件后,调动INT13硬件读取MBR信息,其中MBR在硬盘的第一个扇区,一个扇区大小为512byte,前446byte存储bootloader,64byte存储硬盘分区表,2byte存储硬盘标志位。但446byte不足以启动系统,因此会在MBR后面的扇区存储1.5阶段的引导启动程序,其中1.5阶段主要负责读取boot分区(存储内核、虚拟文件系统和grup的配置文件),真正的分区一般从第63个扇区开始进行分区。
系统引导分为三个阶段:
第1阶段:在MBR分区中,主要作用加载boot loader,进入1.5阶段;
第1.5阶段:主要作用加载/boot分区的文件系统驱动,进入文件系统;
第2阶段:主要作用通过/boot/grub/grub.conf配置文件进行加载内核等,其中在/boot/grub/*下只有grub.conf配置文件生效,其他都是第1阶段和1.5阶段的备份文件。
(3).Kernel、initrd/initramfs
在系统通过Boot loader引导进入boot分区后,先是通过grub.conf中的参数root (hd0,0)从第一块磁盘中的第一个分区进行读取数据,参数kernel/vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2读取内核数据及真正加载根的为,参数initrd /initramfs-2.6.32-696.el6.x86_64.img读取初始化虚拟根系统(注意:一定要先读取内核,然后再读取虚根系统,因为只有加载内核后才能),然后加载启动过程中所定义的内核模块,最后释放虚根,切换为真实的根文件系统。
(4).init
当系统切换为真正的根后,系统从内核空间转到用户空间,执行第一个初始化程序/sbin/init,通过init初始化程序将用户空间预定义的启动级别进行执行/etc/rc.d/rc#.d/S*.sh脚本启动相关服务。
2.grub配置及修复
grub配置文件存储位置为/boot/grub/*,其中在此目录下能够看到关于启动第1阶段、第1.5阶段、第2阶段的备份文件和grub的配置文件grub.conf
2.1 grub配置文件
grub配置文件通过参数的配置控制默认启动的菜单、菜单超时时间、单用户模式登录的密码、菜单的背景图片设置、引导boot的磁盘如hd0,0(第一块磁盘的第一分区),kernel的指定、initrd的指定等相关
[[email protected] grub]# grub-crypt #对密码进行256位加密算法计算 Password: Retype password: $6$7KtGRwtyOq5ves0w$ujUp94VFUA0m8oeXN1/kF/mgzi5l0UPfdqox8fs0PeSIe0EfyyNJBkogOCSWI1P2XqVgTbH1hE2nJQRABJQFN0 [[email protected] grub]# vim /boot/grub/grub.conf default=0 #默认 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz password --encrypted $6$7KtGRwtyOq5ves0w$ujUp94VFUA0m8oeXN1/kF/mgzi5l0UPfdqox8fs0PeSIe0EfyyNJBkogOCSWI1P2XqVgTbH1hE2nJQRABJQFN0 #经过加密后的密码,此密码是进入防止单用户的密码 hiddenmenu 有次密码,普通用户就无法进入单用户模式破解密码 title CentOS 6 (2.6.32-696.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=/dev/sda2 rhgb quiet #rhgb是开机转圈的动作 initrd /initramfs-2.6.32-696.el6.x86_64.img #quiet内核启动隐藏显示 title CentOS 6 (4.6.32-696.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=/dev/sda2 quiet initrd /initramfs-2.6.32-696.el6.x86_64.img password root0987 #此密码是引导加载内核的密码也就是系统启动密码 |
2.2 grub命令启动
在开机启动进入菜单后,按c命令进入grub提示符,在grub命令提示符下即可输入相关启动命令,启动系统只需4条指令root、kernel、initrd、boot,分别加载boot分区位置、内核位置、虚根位置,最后重新启动虚拟机即可完成通过命令加载系统,进入系统之后再选择编辑/boot/grub/grub.conf的文件
第一步:输入"root (hd" 然后按两次 TAB 键出现磁盘块,选中需启动的磁盘,再按两次TAB键出现磁盘分区编号,选中boot分区所在的磁盘分区;
第二步:输入"kernel /vm"然后按两次TAB键出现内核,再选中要选择启动的正根root=/dev/sda2
第三步:输入"initrd /init"然后按两次TAB键出现虚根系统
第四步:输入boot启动系统,完成加载系统
GUN GRUB version 0.97 (635K lower /1046400K upper memory) grub>kernel /boot/vmlinuz-2.6.15-26-386 ro grub>initrd grub>root (hd0,0) #启动boot的位置 grub>boot (具体也可参考http://man.linuxde.net/grub) |
2.3 grub修复
grub修改有两种方法:
第一种方法:重构grub引导程序
在误删grub的第一阶段(446byte字节)、第1.5阶段或第三阶段的数据导致系统无法正常启动时,通过万能的方法重新构建新的grub引导程序,但是如若分区表64tyte删除则无法恢复,具体恢复如下令:
#!/bin/bash sh-4.1# grub-install /dev/sda #安装grub程序到/dev/sda这块磁盘 sh-4.1#reboot #################################重启后指定引导配置文件进入系统#################################### GUN GRUB version 0.97 (635K lower /1046400K upper memory) grub>kernel /boot/vmlinuz-2.6.15-26-386 ro grub>initrd grub>root (hd0,0) #启动boot的位置 grub>boot ##################################登录系统重构配置文件############################################## [[email protected] grub]# vim /boot/grub/grub.conf default=0 #默认 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS 6 (2.6.32-696.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=/dev/sda2 rhgb quiet initrd /initramfs-2.6.32-696.el6.x86_64.img |
第二种方法:利用备份文件恢复
利用/boot/grub/*第1阶段的备份文件和第1.5的备份文件进行恢复,此种方法有效率相对较高无需进入救援模式
GUN GRUB version 0.97 (635K lower /1046400K upper memory) grub>setup (hd0) #利用备份文件恢复 grub>kernel /boot/vmlinuz-2.6.15-26-386 ro grub>initrd grub>root (hd0,0) #启动boot的位置 grub>boot |
3.initramfs修复
initramfs虚根系统是安装系统时,系统利用自身的命令生成相关的文件系统,如若此文件系统可以利用mkinitrd
##################################生成虚拟文件系统################################################## [[email protected] bak]#mkinitrd /boot/initramfs-$(name -r).img $(name -r) |