linux启动和grub修复

CentOS 5和6的启动流程

linux组成

  • linux:是有kernel和+rootfs (linux内核加应用程序)
    • kernel :进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
    • rootfs: 程序和glibc(库)
    • 库:函数计划,function,调用接口(头文件负责描述)
      • 过程调用: procedure,无返回值
      • 函数调用: function(一堆命令的集合)
    • 程序:二进制执行文件
  • 内核设计流派
    • 单内核(monolithic kernel);linux
      • 把系统最重要的东西放在一个单一的文件中
      • 把所有功能集成于同一个程序
      • 当某个功能出现问题则导致其它功能可能也无法使用
    • 微内核(micro kernel):Windows ,solaris
      • 每种功能使用一个单独子系统实现
      • 当某一个功能出现问题则对其它功能不好产生太坏的影响

linux内核特点

  • 支持模块化:.ko (内核对象),每一个ko文件对应的都是一个功能模块。如文件系统,硬件驱动,网络协议等。
  • 支持内核模块的动态装载和卸载,就是会自动根据设备的类型装载驱动,如当我们插入u盘时内核会自动加载u盘驱动模块,当我们拔掉u盘则自动的卸载u盘驱动模块
    • 当然管理员手动装载和卸载也是可以的
      • modprobe - r 卸载模块
  • 模块文件存放路径
    • /lib/modules/[内核版本]/

组成部分

linux最核心的文件

  • 核心文件:/boot/vmlinuz- VERSION -release(linux kernel)
[root@centos6 boot]# ls vmlinuz-2.6.32-696.el6.x86_64 
vmlinuz-2.6.32-696.el6.x86_64
  • ramdisk : 辅助的伪根系统,和linux 内核有关联,里面存放着必要的驱动模块,如果这里文件破坏,也会造成系统无法启动
    • CentOS 5: /boot/initrd- VERSION -release.img
    • CentOS 6,7: /boot/initramfs- VERSION -release.img
  • 模块文件 :/bin/modules/VERSION-release

驱动模块存放在哪里

  1. 最核心最重要的在linux内核文件中存放vmlinuz- VERSION-release
  2. 有一小部分重要的在initramfs- VERSION -release.img中存放的是和启动相关的驱动模块
  3. 还有一些在/bin/modules/VERSION-release,绝大部分的驱动模块在这里

CentOS6,5启动流程


1. 首先POST加电自检,主要是检查计算机硬件是否存在,或者损坏
2. MBR引导,第1块磁盘的第0个扇区中前446个字节中,存放着于计算机启动的相关程序,在centos6中叫GRUB,GRUB的一部分就是存放在446个字节中,还有一部分在别的地方
3. GRUB在加载启动完后
4. 加载内核,就是boot下的vmlinuz-版本号

[root@centos6 boot]# ls vmlinuz-2.6.32-696.el6.x86_64 
vmlinuz-2.6.32-696.el6.x86_64
  1. 内核加载完后就启动系统的第一个进程,init进程,centos7是systemctl
  2. init进程启动后会读取它的核心配置文件就是/etc/inittab文件,/etc/init/*.conf文件
    7.使用/etc/rc.d/rc/sysinit初始化脚本
  3. 执行/etc/rc.d/rc 脚本
    • 会加载/etc/rc#,#为默认级别要启动的服务
  4. 执行/etc/rc.d/rc.local脚本(管理员想要某个服务在那个级别开机启动时放进就会开机启动,最后一个加载)

10. 执行/bin/login程序,进入登录状态

  1. 加载BIOS的硬件信息,获取第一个启动设备
  2. 读取第一个启动设备MBR的引导加载程序(grub)的启动信息
  3. 加载核心操作系统的核心信息,核心开始加压缩,并尝试驱动所有的硬件设备
  4. 核心执行init程序,并获取默认的运行信息
  5. init程序执行/etc/rc.d/rc.sysyinit文件
  6. 启动核心的外挂模块
  7. init执行运行的各个批处理文件(脚本文件)
  8. init执行/etc/rc.d/rc.local
  9. init执行/etc/login程序,等待用户信息
  10. 登录之后开始以shell控制主机

启动流程详细过程描述

post

  • power-on-self-test,加电自检,是BIOS功能的一个主要部分。负责完成对cpu、主板、内存、硬盘子系统显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况检查
  • ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入出程序,系统信息设置、开机加电自检程序和系统启动自举程序等
  • RAM:CMOS互补金属氧化物半导体,保存各项参数的设定
  • 按次序查找引导设备,第一个有引导程序的设备为本次启动设备

bootloader:引导加载器,引导程序

  • Windows:ntloader ,仅启动OS,不可以启动linux
  • linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核,可以启动Windows
    • LILO:linux loader 很早以前centos5开始不使用
    • GRUB : grand unified bootloader
    • grub 0.x :grub legacy,grub2
      • centos 5 和6 都是0.97版本
      • centos 7 是2.02版

MBR

  • 446字节:bootloader,64字节:分区,2字节:55aa结束位
    • 当系统启动时会加载bootloader

GRUB

  • GRUB 分为3个阶段
    • 1阶段是MBR的446个字节中
      • 当我们执行完1阶段后,不属于文件,就是以二进制存放
    • 1.5阶段是集成了必要的驱动模块,当我们执行完一阶段后,会执行1.5阶段,因为1.5阶段所对应的文件是/boot/initramfs文件,这是一个压缩文件,是一个伪根系统,因为系统要访问文件必须要有文件系统才可以,在我们第一阶段只有446个字节不可能存放着文件系统,如果这样就无法进入到根下,也无法启动系统,但是intramfs这个文件是伪根系统,而访问系统是不需要文件系统的,这样就可以执行

kernel 加载内核

  • 自身初始化
    • 探测可识别到的所有硬件设备
    • 加载硬件驱动程序(借助ramdisk加载驱动)
    • 以只读方式挂载根文件系统
    • 运行用户空间的一个应用程序:/sbin/init

ramdisk :

  • 内核中的特性之一:使用缓冲和缓冲来加速对磁盘上的文件访问,并加载相应的硬件驱动
    • ramdisk —> ramfs 提高速度
    • centos 5 :initrd
      • 工具程序:mkinitrd
    • centos 6,7 :initramfs
      • 工具程序:mkinitrd ,dracut(用于修复的命令)

系统初始化

  • POST—> bootsequence(BIOS)—> Bootloader(MBR)—> Kelner(加载内核)—> rootfs(只读) –> init(systemd)

如果把initramfs 文件删除如何修复,没有重启机器情况下

[root@centos6 boot]# rm initramfs-2.6.32-696.el6.x86_64.img 
rm: remove regular file `initramfs-2.6.32-696.el6.x86_64.img'? yes
[root@centos6 boot]# ls initramfs-2.6.32-696.el6.x86_64.img   
ls: cannot access initramfs-2.6.32-696.el6.x86_64.img: No such file or directory
[root@centos6 boot]# mkinitrd initramfd-`uname -r`.img `uname -r` (后面跟的是内核版本号)
[root@centos6 boot]# ls initramfd-2.6.32-696.el6.x86_64.img 
initramfd-2.6.32-696.el6.x86_64.img

把initramfd 删除后重启修复

  • 当我们把initramfs 这个文件删除也就是1.5阶段的grub然后重启
  • 重启后会会出现这样的画面
  • 机器起不来,重启用光盘进入救援模式
  • 都选择默认的选项回车,由于这个不需要配置网络所有就 不配网络了
  • 进入命令行后首先要确认那个是boot目录,由于根和boot目录是在一个分区上所以先找到根分区用df命令
  • 我们可以看到/mnt/sysimage这个分区是根分区,用chroot命令切换到根分区中
  • 在用mkinitrd /boot/initramfs-uname -r.img uname -r执行这条命令修复grub文件
  • 修复完后不要急着重启,需要等待几分钟让数据写入磁盘中,然后重启
  • 在重启会比以前重启慢一些是正常的

  • 这样系统就正常启动了

启动系统的第一个进程

  • post–mbr—grub—kernel—init
  • init程序的类型
    • sysV:init,Centos 5之前的版本
      • 配置文件:/etc/inittab
    • upstart:init,Centos 6
      • 配置文件:/etc/inittab,/etc/init/*.conf
    • sysytemd:sysytemd,centos 7
      • 配置文件:/usr/lib/systemd/system
      • /etc/sysytemd/sysytem

/sbin/init Centos6之前

  • 运行级别:为系统运行或维护等目的而设定;0-6;7个级别
    • 0 : 关机
    • 1 :单用户模式(root自动登录),single,维护模式
    • 2 :多用户模式,启动网络功能,但不会启动NFs;维护模式
    • 3 :多用户模式,正常模式,文本界面
    • 4 :预留级别;可同3级别
    • 5 : 多用户模式,正常模式;图形界面
    • 6 :重启
  • 默认级别是:3,5
  • 切换级别 : init #
  • 查看级别 : runlevel ;who -r

init 初始化

init读取其初始化文件;/etc/inittab
1. 初始运行级别(RUN)
2. 系统初始化脚本
3. 对应运行级别的脚本目录
4. 捕获某个关键字顺序
5. 定义UPS电源终端/恢复脚本
6. 在虚拟控制台生产getty
7. 在运行级别5初始化X

CentOS 5的/etc/inittab文件

  • 配置文件: /etc/inittab
  • 每一行定义一种action以及与之对应的process
    • id : runlevel:action:process (启动时默认运行级别)
    • action
      • wait:切换至此级别运行一次
      • respawn:此process终止,就重新启动之
      • initdefault :设定默认运行级别;process省略
      • sysinit:设定系统初始化方式,此处一般为指定 /etc/rc.d/rc.sysinit
      • ca::ctrlaltdel:/sbin/shtdown -t3
    • id:3:initdefault:
    • si::sysinit:/etc/rc.d/rc.sysinit
    • lO:O:wait:/etc/rc.d/rc 0
    • l1:1:wait:/etc/rc.d/rc 1 (这里表示1级别所要开机启动的服务进程和关闭的服务进程)
      .
      .
    • l6:6:wait:/etc/rc.d/rc 6
  • 这里的每个级别对应着每个rc文件,里面存放着开机启动时要运行和要停止的服务,它们都是软连接/etc/init.d目录中,以K开头的都是stop要停止的,而已S开头的都是要系统启动时要运行。这告诉我们如果你想要某个服务在某个模式下启动就在那个模式的/etc/rc.d/rc#.d 目录中把这个服务以S命名。而这些字母后面的数字是服务启动时安装一定顺序启动,不是按数字排序,是安装字符大小。而这些定义都是在/etc/rc.d/rc脚本文件定义的

ntsysv 查看当前模式下开机所启动的服务

  • 如果要看其它模式开机启动服务有哪些 ntsysv –level=#
  • 如果要看某个服务在哪些模式下启动 chkconfig –list 服务名
[root@centos6 ~]# chkconfig --list atd
atd             0:off   1:off   2:on    3:on    4:on    5:on    6:off
  • 也可以定义某个服务在那几个模式下开启或者关闭
    • chkconfig –level 35 atd off # 表示在模式3和5下服务atd关闭
[root@centos6 ~]# chkconfig --level 35 atd off
[root@centos6 ~]# chkconfig --list atd        
atd             0:off   1:off   2:on    3:off   4:on    5:off   6:off
  • 当这些服务变成off后/etc/rc.d/rc3.d 对应的文件也会改变变成以K开头的
  • 如果我们不加那个模式则是2345模式 chkconfig atd on 表示2.3.4.5模式都是on

编写一个开机启动的服务

  • 这个和写脚本一样,但是还是有些区别,要注意的一下几点
 #!/bin/bash #chkconfig: 35 99 00 这表示在3.5模式下开机启动,99表示在/etc/rc.d/rc3.d和rc5.d中的文件已s开头的编号,值越大越最后启动,00 表示以K开头的文件在关机中越小越最早关闭 #description:描述 这三行必须要写不然会出错,这是服务脚本格式 用 chkconfig --add 服务名,将某个服务添加系统 
  
  • 计算机启动时要加载很多进程和服务,版本5是按顺序执行的,当一个进程结束后才能运行,这样影响效率,在6的时候有依赖关系的是顺序执行的,没有依赖关系的则并行启动centos7 是所有的都是并行启动
  • etc/inittab 文件内容
    • 指定启动时默认模式
      • 0 关机
      • 1 单用户
      • 2 多用户(NFS)
      • 3 多用户字符界面
      • 4 未使用
      • 5 图形界面
      • 6 重启
[root@centos6 ~]# cat /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:
这里是设置默认启动时几模式,不要设置06
  • 如果设置了0或者6如果修复,在启动时按任意键进入内核选择,选择内核按a键
  • 在后面输入要以哪个模式启动
  • 这样系统就会以哪个模式启动
  • 这是centos 6的文件,我们研究一下centos5的因为centos5都是放在一个文件,centos6的配置文件是分开的

centos 6的/etc/inittab

  • 当系统启动完后会启动第一个脚本路径/etc/rc.d/rc.sysinit是初始化脚本
  • /etc/inittab
    • 设置系统默认的运行级别
       
      id:3:initdefault:

  • 示列:
    • 破解centos5和centos6的root口令
  • /etc/init/control-alt-delete.conf
    • 这个文件可以设定是否启用Ctrl+alt+delete 功能键是否启用,按着三个键是重启计算机,当然也可以自己定义其它动作
[root@centos6 ~]# cat /etc/init/control-alt-delete.conf 
# control-alt-delete - emergency keypress handling
#
# This task is run whenever the Control-Alt-Delete key combination is
# pressed.  Usually used to shut down the machine.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file control-alt-delete.override and put your changes there.

start on control-alt-delete

exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
  • /etc/init/tty.conf
    • 这是守护这些终端,如果被杀死则会启动终端
  • /etc/init/start-ttys.conf
  • /etc/init/rc.conf
    • 系统启动的第一个脚本文件,系统初始化脚本
  • /etc/init/prefdm.conf

/etc/rc.d/rc.sysinit:系统初始化脚本

  1. 设置主机名
  2. 设置欢迎信息
  3. 激活udev和seLinux
  4. 挂载/etc/fstab文件中定义的文件系统
  5. 检测根文件系统,并以读写方式重新挂载根文件系统
  6. 设置系统文件
  7. 激活swap分区
  8. 根据/etc/sysctl.conf文件设置内核参数
  9. 激活lvm及software raid 设备
  10. 加载额外设备的驱动程序
  11. 清理操作
    • 说明:rc N —> 意味读取/etc/rc.d/rcN.d/
    • K* : K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
    • S* : S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
for srv in /etc/rc.d/rcN.d/K*; do
    $srv stop
done
for srv in /etc/rc.d/rcN.d/S*; do
    $srv start
done
  • 注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向/etc/rc.d/rc.local脚本
  • 不便或不需要写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置/etc/rc.d/rc.local文件中
    • /etc/rc.d/rc.local 在指定运行级别脚本后运行
    • 可以根据情况,自定义修改

chkconfig 命令

  • chkconfig 命令
  • 查看服务在所有级别的启动或关闭设定情形
[root@centos6 ~]# chkconfig   //默认不添加--list 和服务名是列出系统中所有的服务
NetworkManager  0:off   1:off   2:on    3:off   4:on    5:on    6:off
abrt-ccpp       0:off   1:off   2:off   3:on    4:off   5:on    6:off
abrtd           0:off   1:off   2:off   3:on    4:off   5:on    6:off
acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
atd             0:off   1:off   2:on    3:off   4:on    5:off   6:off
auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
autofs          0:off   1:off   2:off   3:on    4:on    5:on    6:off
blk-availability        0:off   1:on    2:on    3:on    4:on    5:on    6:off
bluetooth       0:off   1:off   2:off   3:on    4:on    5:on    6:off
certmonger      0:off   1:off   2:off   3:on    4:on    5:on    6:off
cpuspeed        0:off   1:on    2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
cups            0:off   1:off   2:on    3:on    4:on    5:on    6:off
dnsmasq         0:off   1:off   2:off   3:off   4:off   5:off   6:off
firstboot       0:off   1:off   2:off   3:off   4:off   5:off   6:off
haldaemon       0:off   1:off   2:off   3:on    4:on    5:on    6:off
htcacheclean    0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@centos6 ~]# chkconfig --list httpd   //查看单独的某个服务
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
  • 添加自己编写的服务脚本到系统中
  • SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
chkconfig --add name
#!/bin/bash
#LLLL 表示初始在哪个级别下启动,-表示都不启动
# chkconfig: LLLL nn nn
  • 删除
    • chkconfig –del name
  • 修改指定的链接类型
chkconfig [--level levels] name 
            --level LLLL: 指定要设置的级别;省略时表示2345
[root@centos6 ~]# chkconfig --list httpd
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@centos6 ~]# chkconfig --level 345 httpd on
[root@centos6 ~]# chkconfig --list httpd        
httpd           0:off   1:off   2:off   3:on    4:on    5:on    6:off
  • 图形命令 ntsysv命令

xinetd管理的服务

  • service 命令:手动管理服务
    • service 服务 start|stop|restart
    • service – status-all
[root@centos6 ~]# service httpd stop  //停止httpd服务
Stopping httpd:                                            [  OK  ]
[root@centos6 ~]# service httpd start //启动httpd服务
[root@centos6 ~]# service httpd restart //重启httpd服务
[root@centos6 ~]# service --status-all  //显示系统中的全部状态信息
  • 瞬态(Transient) 服务被xinetd进程所管理,就是将很少用,有时候还要用的服务由xinetd进程来管理,当不用时候停止服务,当有用户访问时则开启服务。这样可以节省资源,只有xinetd进程来监管
  • 进入的请求首先被xinetd代理
  • 配置文件:/etc/xinetd.conf、/etc/xinetd.d/ 与libwrap.so文件链接
  • 用chkconfig控制服务:
    • chkconfig tftp on

/etc/inittab 文件详情

  • 设置登录终端
1:2345:respawn:/usr/sbin/mingetty tty1
2:2345:respawn:/usr/sbin/mingetty tty2
...
6:2345:respawn:/usr/sbin/mingetty tty6
mingetty会自动调用login程序
x:5:respawn:/etc/X11/prefdm -nodaemon

启动过程总结

  • 总结
    • /sbin/init–>(/etc/inittab)–>设置默认运行级别–> 运行系统初始化脚本、完成系统初始化–(关闭对应级别下需要关闭的服务)启动需要启动的服务–> 设置登录终端
  • centos6 init程序为:upstart ,其配置文件
    • /etc/inittab,/etc/init/*.cong,配置文件的语法遵循upstart配置文件语法格式,和centos不同

grub legacy

  • centos 6 启动流程
    POST --> boot sequence(BIOS) --> boot loader --> kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init --> (/etc/inittab,/etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本rc.sysinit --> 关闭或启动对应级别的服务 --> 启动终端 
  • grub : GRand Unified Bootloader
    • grub 0.97 : grub legacy (centos 6)
    • grub 2.x : grub2 (centos 7)
    • grub legacy :
      • stage1:mbr
      • stage1.5 : mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
      • stage2:磁盘上分区(/boot/grub/)

grub 0.97中分为三个阶段

  • 第一阶段就是mbr中
[root@centos6 ~]# hexdump -C -n 512 /dev/sda
00000000  eb 48 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.H..............|
00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 03 02  |.........|...t..|
00000040  80 00 00 80 68 13 05 00  00 08 fa 90 90 f6 c2 80  |....h...........|
00000050  75 02 b2 80 ea 59 7c 00  00 31 c0 8e d8 8e d0 bc  |u....Y|..1......|
00000060  00 20 fb a0 40 7c 3c ff  74 02 88 c2 52 f6 c2 80  |. ..@|<.t...R...|
00000070  74 54 b4 41 bb aa 55 cd  13 5a 52 72 49 81 fb 55  |tT.A..U..ZRrI..U|
00000080  aa 75 43 a0 41 7c 84 c0  75 05 83 e1 01 74 37 66  |.uC.A|..u....t7f|
00000090  8b 4c 10 be 05 7c c6 44  ff 01 66 8b 1e 44 7c c7  |.L...|.D..f..D|.|
000000a0  04 10 00 c7 44 02 01 00  66 89 5c 08 c7 44 06 00  |....D...f.\..D..|
000000b0  70 66 31 c0 89 44 04 66  89 44 0c b4 42 cd 13 72  |pf1..D.f.D..B..r|
000000c0  05 bb 00 70 eb 7d b4 08  cd 13 73 0a f6 c2 80 0f  |...p.}....s.....|
000000d0  84 f0 00 e9 8d 00 be 05  7c c6 44 ff 00 66 31 c0  |........|.D..f1.|
000000e0  88 f0 40 66 89 44 04 31  d2 88 ca c1 e2 02 88 e8  |[email protected].1........|
000000f0  88 f4 40 89 44 08 31 c0  88 d0 c0 e8 02 66 89 04  |[email protected].1......f..|
00000100  66 a1 44 7c 66 31 d2 66  f7 34 88 54 0a 66 31 d2  |f.D|f1.f.4.T.f1.|
00000110  66 f7 74 04 88 54 0b 89  44 0c 3b 44 08 7d 3c 8a  |f.t..T..D.;D.}<.|
00000120  54 0d c0 e2 06 8a 4c 0a  fe c1 08 d1 8a 6c 0c 5a  |T.....L......l.Z|
00000130  8a 74 0b bb 00 70 8e c3  31 db b8 01 02 cd 13 72  |.t...p..1......r|
00000140  2a 8c c3 8e 06 48 7c 60  1e b9 00 01 8e db 31 f6  |*....H|`......1.|
00000150  31 ff fc f3 a5 1f 61 ff  26 42 7c be 7f 7d e8 40  |1.....a.&B|..}.@|
00000160  00 eb 0e be 84 7d e8 38  00 eb 06 be 8e 7d e8 30  |.....}.8.....}.0|
00000170  00 be 93 7d e8 2a 00 eb  fe 47 52 55 42 20 00 47  |...}.*...GRUB .G|
00000180  65 6f 6d 00 48 61 72 64  20 44 69 73 6b 00 52 65  |eom.Hard Disk.Re|
00000190  61 64 00 20 45 72 72 6f  72 00 bb 01 00 b4 0e cd  |ad. Error.......|
000001a0  10 ac 3c 00 75 f4 c3 00  00 00 00 00 00 00 00 00  |..<.u...........|
000001b0  00 00 00 00 00 00 00 00  36 4e 0d 00 00 00 80 20  |........6N..... |
000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa  |!...(....... ...|
000001d0  29 82 83 fe ff ff 00 08  20 00 00 80 1a 06 00 fe  |)....... .......|
000001e0  ff ff 83 fe ff ff 00 88  3a 06 00 00 71 02 00 fe  |........:...q...|
000001f0  ff ff 05 fe ff ff 00 88  ab 08 00 78 54 10 55 aa  |...........xT.U.|
00000200
  • 在mbr中的446个字节是启动引导,还有64字节是存放分区表信息的,还有2字节的55a
  • 因为只有446个字节不能存放太多的东西,而系统启动要进入/boot下要进入boot下就要能识别分区系统,但是446个字节不可能存放分区系统驱动,在启动中并不是先找根,而是先找/BOOT/内核 在进根分区
  • 而/boot的文件系统驱动放在1.5阶段,就mbr之后的扇区中。当加载完1.5阶段之后就可以加载对应的驱动,就可以进入boot中加载kernel,加载内核之后就加载initramfs-内核版本号.img ,就可以找到挂载根了
  • 而挂载根就要知道根分区在哪,存放根就在/boot/grub/grub.conf
00000200
[root@centos6 ~]# vim /boot/grub/grub.conf 
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
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=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_L
VM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb
 quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img
  • root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 这个就是根分区UUID
  • 在/boot/grub/ 这个文件是grub2阶段中要加载的,但是我们看到里面有很多1阶段,1.5阶段的文件,如果我们把这些文件都移走,只留下grub.conf文件
[root@centos6 grub]# ls
device.map     ffs_stage1_5      jfs_stage1_5    reiserfs_stage1_5  stage2           xfs_stage1_5
e2fs_stage1_5  grub.conf         menu.lst        splash.xpm.gz      ufs2_stage1_5
fat_stage1_5   iso9660_stage1_5  minix_stage1_5  stage1             vstafs_stage1_5
  • 把这些都移到别的地方,只留下grub.conf然后重启,发现系统可以正常启动,所有默认这里的文件都不会起作用的,只有grub.conf文件起作用

grub安装

  • grub安装
    1. grub-install
      • 安装grub stage1和stage1_5到/dev/disk磁盘上,并复制grub相关文件到dir/boot目录下
      • grub-install –root-directory=DIR /dev/disk
      • 这个命令可以修复grub1/1.5/2阶段的grub
      • 这种是非交互式安装,–root这一个选项是指定/boot目录的上一级目录,如果是根可以不写,默认是根. /dev/disk这是硬盘,不是分区,因为mbr是不属于任何分区的
    2. grub 交互式安装
       
      grub> root (hd#,#)
      grub> setup (hd#)
  • 配置文件:/etc/grub/grub.conf.con <– /etc/grub.conf
  • stage2及内核的那个通常放置于一个基本磁盘分区中
  • 功能
    1. 提供启动菜单、并提供交互式接口
      • a:内核参数
      • e:编辑 模式
      • c:命令模式
    2. 加载用户选择的内核或操作系统
      • 允许传递参数给内核
      • 可以隐藏启动菜单
    3. 为菜单提供保护机制
      • 为编辑启动菜单进行认证
      • 为启动内核或者操作系统进行认证
  • grub的命令行接口
    • help:获取帮助列表
    • help KEYWORD :详细帮助信息
    • find(hd#,#)/PATH/TO/SOMEFILE:
    • root (hd#,#)
    • kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可添加许多内核支持使用的cmdline参数
      • 例如:max_loop=100 selinux=0 init=/path/to/init
    • initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk
    • boot: 引导启动选定的内核
  • cat /proc/cmdline 内核参数
  • 内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt
  • 识别硬盘设备
    • (hd#,#)
    • hd#:磁盘编号,用数字表示;从0开始编号
    • #:分区编号,用数字表示;从0开始编号
    • (hd0,0)第一块硬盘,第一个分区
  • 手动在grub命令行接口启动系统
grub> root (hd#,#)
grub> kernel /vimlinuxz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot

配置文件:/boot/grub/grub.conf

  • default=#: 设定默认启动的菜单项;落单项(title)编号从0开始
  • timeout=#:指定菜单项等待选项选择的时长
  • splashimage=(hd#,#)/PATH/XPM_FILE:菜单背景图片文件路径
  • password [–md5] STRING: 启动菜单编辑认证
  • hiddenmenu:隐藏菜单
  • title TITLE:定义菜单项“标题”, 可出现多次
  • root (hd#,#):查找stage2及kernel文件所在设备分区;为grub的根
  • kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
  • initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件
  • password [–md5|–encrypted ] STRING: 启动选定的内核或操作系统时进行认证

kernel这一段的信息含义

 root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_L
VM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
         initrd /initramfs-2.6.32-696.el6.x86_64.img
  • root (hd0,0)这是指boot挂载点第一个硬盘的第一个分区
  • kernel /vmlinuz-2.6.32-696.el6.x86_64 内核名称和版本号 /这里的根是boot下
  • ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 在启动时以只读方式挂载
    操作系统的根
  • d_NO_LUKS rd_NO_L
    VM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet 内核的一些参数,是否支持逻辑卷,加密。rhgb是启动时图形界面,不写也不会影响启动。quiet是在启动过程中不显示内核参数,如果不写则会显示启动参数
  • initrd /initramfs-2.6.32-696.el6.x86_64.img 是磁盘虚拟的磁盘文件系统,这里面是一个小型linux可以加载必要的驱动模块,如果这个文件丢失则无法挂载根文件系统

- grub不是内核,是告诉内核在哪

操作一下吧rhgb和quiet删掉
-
- 然后启动

- 在绿色ok之前的都是启动内核参数,而其是以字符方式启动的,并没有用图形状态启动
- /proc/cmdline是存放内核参数的内容

[root@centos6 ~]# cat /proc/cmdline 
ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16   KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM 
  • 添加内核参数是直接在grub.conf文件中kernel段最后面添加,内核参数生效是在启动时才会生效

把grub文件全部删除然后修复

  • 删除grub目录中的文件全部删除,然后重启
[root@centos6 ~]# rm -f /boot/grub/*
[root@centos6 ~]# ls /boot/grub/
[root@centos6 ~]# 
[root@centos6 ~]# reboot
  • 错误15代码,如图
  • 进入光盘救援模式
  • 这里修复分为2部分
    • 第一步用grub-install 修复grub1,1.5,2阶段文件,
    • grub-install只能修复grub文件但是有一个grub.conf文件是无法修复,可以用网络将相同主版本的系统是上的/boot/grub/grub.conf文件复制一份,进行修改。也可以手写一份
  • 首先修复grub文件
  • 如果报这种警告也不影响
  • 查看一下grub目录里的文件是否存在
  • 第一步就修复完成了,发现grub.conf文件没有,这需要我们手动创建,也可以从网上复制模本,或者从相同的系统机器中cp一份,现在如何从别的机器上复制一份
    • 首先给机器设置一个ip,并且可以ping通对方的机器
    • 用scp命令复制一份文件,由于没有相同的机器,所以那其它文件代替,当把文件复制到本地时需要修改rootuuid
    • 然后就是修改了
  • 由于没有相同版本的系统型号,所以我们手写一份
  • 文件名一定是grub.conf文件
  • 这样就启动成功了,root推荐用UUID写,也可以用上图所写的

grub加密

  • grub-md5-crypt
  • grub-crypt sha512加密

破解root口令:

  • 启动系统时,设置其运行级别1
    • 进入单用户模式:
  • 编辑grub菜单(选定要编辑的title,而后使用e命令)
  • 在选定的kernel后附加
    • 1, s, S或single都可以
  • 在kernel所在行,键入“b”命令

实验

修复grub1阶段就是mbr中的446个字节
- 首先用dd命令破坏系统中的446个字节
1. 交互式修复

[root@centos6 grub]# dd if=/dev/zero of=/dev/sda bs=1 count=446  
446+0 records in
446+0 records out
446 bytes (446 B) copied, 0.000677783 s, 658 kB/s
[root@centos6 grub]# 
  • 如果重启就不会有任何问题,因为系统已经加载到内存中了,现在重启
[root@centos6 grub]# reboot
  • 就会出现这种错误
  • 现在用光盘进入救援模式,选项都默认进入shell中
  • 首先要切根,因为grub-install 命令会读取根下的文件内容,如果不切的话会报错无法运行
  • 用chroot切根
  • 然后在运行grub-install命令
  • 在用hexdump 这个命令查看2进制的来查看一下512字节是否恢复了
  • 这样我们用grub-install 命令就把grub第一阶段修复完成了
  • 重启计算机

  • 主意
    1. 在这里要注意grub-install 这个命令必须要在系统根上运行,进入光盘时是在光盘目录上,要用chroot切根
    2. grub-install 在上面命令我们没有用–root-directory= 这个选项,这里=号后面要跟/boot目录的上一级目录,如果是在根上默认可以不写。
    3. 运行完成后不要急着去重启等待一会,因为可能系统没有把缓冲的数据写入磁盘中,而导致出错

4. 把selinux 关闭

  1. 交互式命令修改grub1
    • 删除446字节
[root@centos6 ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446
446+0 records in
446+0 records out
446 bytes (446 B) copied, 0.000546253 s, 816 kB/s
  • 刚刚我们知道/grub目录中除了gurb.conf这个文件有用其它是没有用的,我们把它移到别的地方
[root@centos6 app]# mv /boot/grub/* .
[root@centos6 app]# ls
device.map     ffs_stage1_5      jfs_stage1_5  menu.lst           splash.xpm.gz  ufs2_stage1_5    xfs_stage1_5
e2fs_stage1_5  grub.conf         lost+found    minix_stage1_5     stage1         vstafs_stage1_5
fat_stage1_5   iso9660_stage1_5  lv0           reiserfs_stage1_5  stage2 
  • 在运行grub命令交互式完成
[root@centos6 app]# grub
Probing devices to guess BIOS drives. This may take a long time.
Unknown partition table signature

grub> root (hd0,0)   //hd 后面跟第块硬盘,和扇区
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
 grub> setup (hd0) 
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no   //这里报错了需要/boot/grub/stage1这个文件
 Checking if "/grub/stage1" exists... no

Error 15t: File not found
  • 所有/grub/里面的文件是用于grub修复用的,我们在移动回来
[root@centos6 app]# grub
Probing devices to guess BIOS drives. This may take a long time.
Unknown partition table signature


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> root (hd0,0)
root (hd0,0)    
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
succeeded //这里说明了1.5阶段所在的位置,就是0扇区后的27个扇区,是存放/boot文件驱动的
 Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded 
Done.
grub> quit
  • 这样就成功了
    删除1.5阶段然后恢复
  • 不删除前512个字,删除0个扇区之后到27个扇区
[root@centos6 app]# dd if=/dev/zero of=/dev/sda bs=1 count=5120 skip=512 seek=512
5120+0 records in
5120+0 records out
5120 bytes (5.1 kB) copied, 0.00458081 s, 1.1 MB/s
  • 重启计算机
  • 这里什么也没有卡着不动,并不向1阶段哪些,当插入光盘后会自动拿光盘引导,因为这里的1阶段启动成功了,但是进入1.5阶段加载失败,导致卡着不动,也无法进入2阶段,就无法显示菜单
  • 光盘启动进入救援模式,切根,用grub-install修复

  • 修复完成,重启计算机

gurb 2阶段的配置文件/boot/grub/grub.conf

  • 配置文件:/boot/grub/grub.conf <– /etc/grub.conf
  • 详细介绍
#boot=/dev/sda
default=0
timeout=5 
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)  //这个title 后面跟的就是启动菜单名
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_ //grub 眼里boot才是根
LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rh 
gb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img  //grub 眼里boot才是根
  • grub 眼里boot才是根
  • root (hd0,0) 这个可以不写,着相当于一个变量,告诉root根在哪, 不写的话可以直接这样写
kernel  (hd0,0)/vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_
  • 我们可以加一个菜单 只需要在添加一个title 名字
default=0   //如果有多个系统,默认是0第一个title系统启动
timeout=5   //菜单超时时间
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)  //这个title 后面跟的就是启动菜单名
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_ //grub 眼里boot才是根
LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rh 
gb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img  //grub 眼里boot才是根
title centos10  //这是我们刚刚添加
root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_ //grub 眼里boot才是根
LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rh 
gb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img  //grub 眼里boot才是根
  • 重启一下看看菜单

  • 如果我们要把initrd 放在kernel 前会导致系统启动不了
#boot=/dev/sda
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)
        initrd /initramfs-2.6.32-696.el6.x86_64.img
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_
LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rh
gb quiet
  • 重启后出现19的错误
  • 解决方法
    1. a任意键进菜单中
    2. 按e进入内核选项
      • 在按o添加一个新行进行编辑,进行添加编辑,一定要在kernel下面
    3. 在按e编辑这个空行
    4. 把initrd 重新写一边,可以用tab键补全
    5. 在按b启动
    6. 这里只是临时修改,文件里并没有更改,所有进去系统后要把文件改掉

centos6 破解root口令

  • 重启机器
  • 进入菜单选项 输入a键
  • 在这个后面输入1 ,这里是进入单用户模式 或者输入S 或 single ,进入单用户是不用密码的
  • 进入单用户在重新设置密码
  • 重启就可以了

如何将菜单设置密码

  • 需要在/etc/grub/grub.conf文件中添加一个新行password
  • 这里是明文口令当然可以加密的 需要在–md5 后面跟加密的密码, 生成md5加密口令 grub-md5-crypt
  • 如果要用512sha加密算法 –encrypted 加密后的密码 ; 生成sha512密码口令 grub-crypt
  • 重新启动
  • 进入菜单后发现按什么键都进入不了内核,单是可以按P输入刚刚的密码
  • 这样就可以了

在/boot/grub/文件夹里除了grub.conf配置文件在启动时有效,其它的文件都是在启动中没有起到任何作用,因为我们之前把除了grub.conf文件留下,但是系统还是可以正常启动。有一种特殊的方式会导致grub目录里的文件都生效

  • 现在把/boot/grub目录中除了grub.conf文件都删掉
[root@centos6 grub]# ls
grub.conf
  • 现在重启,将启动不了报错误15如下图
  • 出现这种情况说明grub目录中除了grub.conf文件外其它文件都生效了,如果是一个干净系统没有做过grub修复的系统是不会生效这些文件,由于之前我们做了大量的破坏修复了grub,所有现在的系统不是干净的,我们在删除grub目录中的其它文件会导致系统无法重启,解决就是之前的修修复grub
    用光盘引导进入救援模式。在修复之前grub2阶段是在磁盘的某个位置上,但是修改grub之后grub2阶段就在grub目录中。
  • 这样grub文件就有了,修复成功等待一会然后重启
  • 启动成功
  • 但是在启动过程中会有一个错误提示但是不影响启动
[root@centos6 ~]# ls /app/
device.map     ffs_stage1_5      lost+found  minix_stage1_5     stage1   ufs2_stage1_5    xfs_stage1_5
e2fs_stage1_5  iso9660_stage1_5  lv0         reiserfs_stage1_5  stage2   vstafs_stage1_5
fat_stage1_5   jfs_stage1_5      menu.lst    splash.xpm.gz     www
[root@centos6 ~]# ls /boot/grub/
device.map     fat_stage1_5  grub.conf         jfs_stage1_5    reiserfs_stage1_5  stage2         vstafs_stage1_5
e2fs_stage1_5  ffs_stage1_5  iso9660_stage1_5  minix_stage1_5  stage1             ufs2_stage1_5  xfs_stage1_5
[root@centos6 ~]# 
  • 少了一个叫splash.xpm.gz文件这是一个菜单背景图片,在grub.conf里面有定义
  • 是一个黑色的背景

把boot文件清空后修复

  • 把boot目录删除,因为boot是挂载点所以无法删除但是里面的内容已经空了
[root@centos6 ~]# rm -fr /boot/
rm: cannot remove `/boot': Device or resource busy
[root@centos6 ~]# ls /boot/    
[root@centos6 ~]# 
  • 进入光盘救援模式,然后用chroot切根,然后将光盘挂载到一个目录中
  • 在用rpm 安装kernel包,如果不加–force强制安装选项 会显示kernel已经安装,所以必须用这个选项,但是我们只删除了boot中部分内核文件,所以系统认为我们已经安装了kernel
  • 安装完成后,boot下除了grub目录没有其它都生成了。在用grub-install命令修复grub
  • 现在看一下grub和kernel文件都有了,但是在grub目录中没有grub.conf配置文件,我们可以手写,也可以不写,重启机器,当我们用grub-install 修复好文件后一定要等待几分钟,让缓冲里的内容写到磁盘中,如果立即重启很可能会报错。
  • 我们不写grub.conf文件重启机器
  • 这就是不写grub.conf启动的界面。我们可以直接在这上面写grub.conf的内容直接从内核段开始写
  • boot重启
  • 这种只是临时的,下次启动还是要这样,所有我们要进系统后把grub.conf文件创建并写好

把boot删掉,和/etc/fstab文件也删除修复

  • 删除/boot文件和/etc/fasta文件
[root@centos6 ~]# rm -rf /boot
rm: cannot remove `/boot': Device or resource busy
[root@centos6 ~]# ls /boot/
[root@centos6 ~]# rm -f /etc/fstab 
[root@centos6 ~]# cat /etc/fstab
cat: /etc/fstab: No such file or directory
[root@centos6 ~]# 
  1. 进入光盘救援模式,这里会出现挂载不上根
    • 这显示数要把根挂载到/mnt/sysimage上,我们回车
    • 按OK,出现一个新的shell
    • 进入shell后用df命令查看挂载点,发现没有挂载到根,这样我们就无法修复grub文件,我们先要修复fstab文件
    • 要修复fstab文件就要知道根在哪,所有我们要把这几个分区都挂一下看里面的内容是什么来判断哪个是根
    • 刚刚排除了两个,现在我们可以根据大小或里面的内容来判断,创建一个目录把这些文件都挂载上去
    • 把根挂到目录上,然后创建fstab文件
    • 这里一定要写全路径然后用vi写,不支持vim,也可以用cat命令写
    • 然后重启,必须让救援模式自己挂载根
    • 这样救援模式就重新挂载了
    • 然后就是之前的操作了
  2. 先切根然后创建一个目录挂载光盘
  3. 安装kernel
  4. 修复grub目录
  5. 修复grub.conf文件
  6. 重新启动,就可以了,在修复fstab时一定要把路径写全,和把有的分区都挂载上去

init进程被删除如何修复

  • init是系统中第一个进程,上帝进程,如果把init删掉也是无法启动系统
  • 删除init文件
[root@centos6 ~]# which init
/sbin/init
[root@centos6 ~]# 
[root@centos6 ~]# rm -f /sbin/init
[root@centos6 ~]# ls /sbin/init
ls: cannot access /sbin/init: No such file or directory
  • 重新启动后系统会卡在这
  • 修复步骤
    1. 在启动时进入菜单按e选择内核,按e进入编辑模式
  • 在这后面输入 init=/bin/bash 我们用bash来代替init进程
  • linux启动和grub修复_第1张图片
  • 按按回车会返回到内核中,在按b进入引导启动,启动后是这样的画面
  • 现在我们就可以输入命令,我们把光盘挂载一下,把init包安装一下
  • 由于现在的根是只读模式,所有要重新挂载一下

    1. 挂载光盘

    1. 用rpm安装init包, 包名是upstart,要加–force选项,强制安装

逻辑卷的破坏和修复

  • 把/etc/fstab和boot目录清空
  • 重启后会出现这样的错误

    1. 进入救援模式
  • 这里也会找不到根,求援模式无法挂载到根
  • 首先也是找到根是哪个逻辑卷分区用lvs查看

    1. 创建一个文件夹挂载root这个逻辑卷
  • 但是会报错,而且用teb键是补不全的,也找不到逻辑卷,我们用lvdisplay查看逻辑卷,发现这两个都不是活动状态
  • 故障状态逻辑卷是不会被激活的,用vgchange -ay 激活所有卷组
  • 然后在重新挂载一下逻辑卷,挂载成功

    1. 修复fstab文件
  • 用mount查看当前挂载情况
  • 因为我们把根挂载到/mntroot上了,所有也可把boot挂载到其它目录上,然后取最后2行到/mntroot/etc/fstab中。当然也可以手写,只是觉得设备名记不住所以这样
  • 现在开始修改fstab配置文件
  • 这里的swap文件写不写都可以不影响启动,也可以进入系统在写
    1. 现在重新启动进入救援模式自动挂载根然后修复kernel和grub文件
  • 切根挂载光盘
  • 用rpm安装内核
  • 修复grub文件
  • 修复/boot/grub/grub.conf文件
  • 重启
  • 成功

你可能感兴趣的:(linux,启动,内核)