linux启动和grub修复

飞塔CVE-2022-40684复现 admin 无密码直接回车(会提示修改密码) 阅读详情

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

启动系统的第一个进程

  • 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
      mark
  • 这里的每个级别对应着每个rc文件,里面存放着开机启动时要运行和要停止的服务,它们都是软连接/etc/init.d目录中,以K开头的都是stop要停止的,而已S开头的都是要系统启动时要运行。这告诉我们如果你想要某个服务在某个模式下启动就在那个模式的/etc/rc.d/rc#.d 目录中把这个服务以S命名。而这些字母后面的数字是服务启动时安装一定顺序启动,不是按数字排序,是安装字符大小。而这些定义都是在/etc/rc.d/rc脚本文件定义的
    mark

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:
这里是设置默认启动时几模式,不要设置0和6
  • 如果设置了0或者6如果修复,在启动时按任意键进入内核选择,选择内核按a键
    mark
  • 在后面输入要以哪个模式启动
    mark
  • 这样系统就会以哪个模式启动
  • 这是centos 6的文件,我们研究一下centos5的因为centos5都是放在一个文件,centos6的配置文件是分开的

centos 6的/etc/inittab

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

      mark
  • 示列:
    • 破解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 <on|off|reset>
            --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  |..@f.D.1........|
000000f0  88 f4 40 89 44 08 31 c0  88 d0 c0 e8 02 66 89 04  |..@.D.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这一段的信息含义

  • mark
 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删掉
- mark
- 然后启动
mark
- 在绿色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代码,如图
  • mark
  • 进入光盘救援模式
  • 这里修复分为2部分
    • 第一步用grub-install 修复grub1,1.5,2阶段文件,
    • grub-install只能修复grub文件但是有一个grub.conf文件是无法修复,可以用网络将相同主版本的系统是上的/boot/grub/grub.conf文件复制一份,进行修改。也可以手写一份
  • 首先修复grub文件
  • mark
  • 如果报这种警告也不影响
  • mark
  • 查看一下grub目录里的文件是否存在
  • mark
  • 第一步就修复完成了,发现grub.conf文件没有,这需要我们手动创建,也可以从网上复制模本,或者从相同的系统机器中cp一份,现在如何从别的机器上复制一份
    • 首先给机器设置一个ip,并且可以ping通对方的机器
    • mark
    • 用scp命令复制一份文件,由于没有相同的机器,所以那其它文件代替,当把文件复制到本地时需要修改rootuuid
    • mark
    • 然后就是修改了
  • 由于没有相同版本的系统型号,所以我们手写一份
  • mark
  • 文件名一定是grub.conf文件
  • mark
  • 这样就启动成功了,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
  • 就会出现这种错误
  • mark
  • mark
  • 现在用光盘进入救援模式,选项都默认进入shell中
  • 首先要切根,因为grub-install 命令会读取根下的文件内容,如果不切的话会报错无法运行
  • mark
  • 用chroot切根
  • mark
  • 然后在运行grub-install命令
  • mark
  • 在用hexdump 这个命令查看2进制的来查看一下512字节是否恢复了
  • mark
  • 这样我们用grub-install 命令就把grub第一阶段修复完成了
  • 重启计算机
  • mark
    主意
    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
  • 重启计算机
  • mark
  • 这里什么也没有卡着不动,并不向1阶段哪些,当插入光盘后会自动拿光盘引导,因为这里的1阶段启动成功了,但是进入1.5阶段加载失败,导致卡着不动,也无法进入2阶段,就无法显示菜单
  • 光盘启动进入救援模式,切根,用grub-install修复
    mark
    mark
  • 修复完成,重启计算机

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才是根
  • 重启一下看看菜单
  • mark
    如果我们要把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的错误
  • mark
  • 解决方法
    1. a任意键进菜单中
      • mark
    2. 按e进入内核选项
      • mark
      • 在按o添加一个新行进行编辑,进行添加编辑,一定要在kernel下面
      • mark
    3. 在按e编辑这个空行
      • mark
    4. 把initrd 重新写一边,可以用tab键补全
      • mark
      • mark
    5. 在按b启动
      • mark
    6. 这里只是临时修改,文件里并没有更改,所有进去系统后要把文件改掉

centos6 破解root口令

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

如何将菜单设置密码

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

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

  • 现在把/boot/grub目录中除了grub.conf文件都删掉
[root@centos6 grub]# ls
grub.conf
  • 现在重启,将启动不了报错误15如下图
  • mark
  • 出现这种情况说明grub目录中除了grub.conf文件外其它文件都生效了,如果是一个干净系统没有做过grub修复的系统是不会生效这些文件,由于之前我们做了大量的破坏修复了grub,所有现在的系统不是干净的,我们在删除grub目录中的其它文件会导致系统无法重启,解决就是之前的修修复grub
    用光盘引导进入救援模式。在修复之前grub2阶段是在磁盘的某个位置上,但是修改grub之后grub2阶段就在grub目录中。
  • mark
  • 这样grub文件就有了,修复成功等待一会然后重启
  • mark
  • 启动成功mark
  • 但是在启动过程中会有一个错误提示但是不影响启动
[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里面有定义
  • mark
  • 是一个黑色的背景

把boot文件清空后修复

  • 把boot目录删除,因为boot是挂载点所以无法删除但是里面的内容已经空了
[root@centos6 ~]# rm -fr /boot/
rm: cannot remove `/boot': Device or resource busy
[root@centos6 ~]# ls /boot/    
[root@centos6 ~]# 
  • mark
  • 进入光盘救援模式,然后用chroot切根,然后将光盘挂载到一个目录中
  • mark
  • 在用rpm 安装kernel包,如果不加–force强制安装选项 会显示kernel已经安装,所以必须用这个选项,但是我们只删除了boot中部分内核文件,所以系统认为我们已经安装了kernel
  • mark
  • mark
  • 安装完成后,boot下除了grub目录没有其它都生成了。在用grub-install命令修复grub
  • mark
  • 现在看一下grub和kernel文件都有了,但是在grub目录中没有grub.conf配置文件,我们可以手写,也可以不写,重启机器,当我们用grub-install 修复好文件后一定要等待几分钟,让缓冲里的内容写到磁盘中,如果立即重启很可能会报错。
  • 我们不写grub.conf文件重启机器
  • mark
  • 这就是不写grub.conf启动的界面。我们可以直接在这上面写grub.conf的内容直接从内核段开始写
  • mark
  • boot重启
  • mark
  • 这种只是临时的,下次启动还是要这样,所有我们要进系统后把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. 进入光盘救援模式,这里会出现挂载不上根
    • mark
    • 这显示数要把根挂载到/mnt/sysimage上,我们回车
    • mark
    • 按OK,出现一个新的shell
    • mark
    • 进入shell后用df命令查看挂载点,发现没有挂载到根,这样我们就无法修复grub文件,我们先要修复fstab文件
    • mark
    • 要修复fstab文件就要知道根在哪,所有我们要把这几个分区都挂一下看里面的内容是什么来判断哪个是根
    • mark
    • 刚刚排除了两个,现在我们可以根据大小或里面的内容来判断,创建一个目录把这些文件都挂载上去
    • mark
    • 把根挂到目录上,然后创建fstab文件
    • 这里一定要写全路径然后用vi写,不支持vim,也可以用cat命令写
    • mark
    • 然后重启,必须让救援模式自己挂载根
    • 这样救援模式就重新挂载了
    • mark
    • 然后就是之前的操作了
  2. 先切根然后创建一个目录挂载光盘
    • mark
  3. 安装kernel
    • mark
  4. 修复grub目录
    • mark
  5. 修复grub.conf文件
    • mark
  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
  • 重新启动后系统会卡在这
  • mark
  • 修复步骤
    1. 在启动时进入菜单按e选择内核,按e进入编辑模式
  • mark
  • mark
  • 在这后面输入 init=/bin/bash 我们用bash来代替init进程
  • 这里写图片描述
  • 按按回车会返回到内核中,在按b进入引导启动,启动后是这样的画面
  • mark
  • 现在我们就可以输入命令,我们把光盘挂载一下,把init包安装一下
  • 由于现在的根是只读模式,所有要重新挂载一下
  • mark
    1. 挂载光盘
  • mark
    1. 用rpm安装init包, 包名是upstart,要加–force选项,强制安装
  • mark
  • mark

逻辑卷的破坏和修复

  • 把/etc/fstab和boot目录清空
  • mark
  • 重启后会出现这样的错误
  • mark
    1. 进入救援模式
  • 这里也会找不到根,求援模式无法挂载到根
  • 首先也是找到根是哪个逻辑卷分区用lvs查看
  • mark
    1. 创建一个文件夹挂载root这个逻辑卷
  • mark
  • 但是会报错,而且用teb键是补不全的,也找不到逻辑卷,我们用lvdisplay查看逻辑卷,发现这两个都不是活动状态
  • mark
  • 故障状态逻辑卷是不会被激活的,用vgchange -ay 激活所有卷组
  • mark
  • mark
  • 然后在重新挂载一下逻辑卷,挂载成功
  • mark
    1. 修复fstab文件
  • 用mount查看当前挂载情况
  • mark
  • 因为我们把根挂载到/mntroot上了,所有也可把boot挂载到其它目录上,然后取最后2行到/mntroot/etc/fstab中。当然也可以手写,只是觉得设备名记不住所以这样
  • mark
  • mark
  • 现在开始修改fstab配置文件
  • mark
  • 这里的swap文件写不写都可以不影响启动,也可以进入系统在写
    1. 现在重新启动进入救援模式自动挂载根然后修复kernel和grub文件
  • mark
  • 切根挂载光盘
  • mark
  • 用rpm安装内核
  • mark
  • 修复grub文件
  • mark
  • 修复/boot/grub/grub.conf文件
  • mark
  • 重启
  • 成功
大模型工作流Dify面试题及参考答案 设计一个基于 Dify 的智能摘要与重点提取 Agent,需结合Prompt 工程、模型能力配置和工作流优化,确保对长文本的高效解析和关键信息提炼。1. 明确任务需求与输入输出输入:长文本内容(如文章、报告、会议记录)或文本 URL输出摘要:简洁概括原文核心内容,控制在原文长度的 10%-20%重点列表:分点列出关键数据、结论、行动项等可选:关键词提取、情感倾向分析示例场景输入:一篇 5000 字的行业报告。 阅读详情

相关推荐

新年美食鉴赏——基于注意力机制CBAM的美食101分类

新年美食鉴赏——基于注意力机制CBAM的美食101分类一、数据预处理1.数据集介绍2.读取标签3.统一命名4.整理图片路径5.划分训练集与验证集6.定义美食数据集二、注意力机制1.简介2.卷积块注意力网络——CBAM通道注意力模块CAM空间注意力模块SAM3.将通道、空间注意力模块合并三、基于卷积块注意力模块的ResNet-CBAM1.代码实现2.模型测试3.查看网络结构4.模型训练5.模型预测四、总结与升华个人简介 春节是一年当中最隆重、最盛大的节日,吃得最好的一餐可能就是年夜饭了,想想就很激动呢!随着新

zbp_12138的博客 1万+

Ubuntu修改grub和grub.cfg文件不起作用

Ubuntu修改grub和grub.cfg文件不起作用问题:解决办法:如何知道你的系统是legacy还是UEFI启动关于启动模式legacy和UEFI的区别(/etc/default/grub)开机引导文件说明grub.cfg使用说明 问题: 为了修改Ubuntu默认启动,我修改/boot/grub/grub.cfg 和 /etc/default/grub 文件都不生效。启动界面依然不变。各种参数也不生效,比如timeout之类的,我设置0 或者10 ,启动界面的默认等待时间还是10秒,我也使用了sudo

Kunaly 1万+

E5071C 网络分析仪使用指南

E5071C 网络分析仪是 Keysight(原 Agilent)推出的一款高性能矢量网络分析仪,广泛应用于射频(RF)和微波(MW)电路设计、天线测试、滤波器优化等领域。它以高精度、宽频率范围(9 kHz–20 GHz)、出色的动态范围和灵活的测量功能著称。本文将详细介绍 E5071C 的基本操作方法,帮助用户快速上手并高效使用该设备。

2501_90901792的博客 4189

linux系统修改启动引导时间,通过Grub调整提高Linux系统启动速度的方法

Linux操作系统速度非常快,但是由于Grub引导加载程序,所有内容都需要花费大量时间才能启动,因此,如果要加速Linux系统的引导,则必须修改Grub引导加载程序中的默认启动设置,以使Linux的引导速度不会太慢。获取root访问权限和备份Grub配置文件对Grub配置文件进行更改(无论多小)都很危险,任何错误都可能严重破坏你的系统并可能搞砸它,因此,在向你展示如何加快Linux上的启动时间之前...

weixin_31585653的博客 2984

[PayPal报错]为遵守国际法规,这笔交易已被拒绝。

PayPal报错解决:为遵守国际法规,这笔交易已被拒绝。

qq_39906413的博客 1万+

OpenWRT端口转发与NAT环回冲突的排查与解决

本文详细解析了OpenWRT路由器中端口转发与NAT环回功能冲突导致的内网访问故障。通过生活化类比阐明两者工作原理,提供从基础诊断到内核参数调整、LuCI选项配置及手动编写iptables规则的多套解决方案,并给出进阶排查思路,帮助用户彻底解决内网无法通过公网地址访问服务的常见问题。

weixin_29243279的博客 507

Linux-GRUB引导程序故障解决方案 | 超级无敌详细小白教程 | 看了不后悔,不看更后悔

GRUB引导程序故障解决方案(一) 第一步:检查硬盘,并新建分区 第二步:格式化,并修改类型 第三步:在根目录创建挂载目录,并挂载,并把grub主引导程序备份到/dev/sdb1上,并模拟grub主引导程序损坏 第四步:重启,进入紧急模式,选择红色标记的内容,进入到“sh-4.2#”提示符的 Bash Shell 环境 第五步:创建目录,并挂载/dev/sdb1,把挂载目录带有备份文件的分区写进/dev/sda,并exit退出紧急模式 第六步:系统界面恢复 GRUB引导程序故障解决方案(二)

Dark_Tk的博客 1543

赛灵思Xilinx 7系列FPGA硬件设计知识总结

本文讲述了赛灵思7系列FPGA硬件设计的关键点,为使用该系列FPGA提供硬件设计参考。

csdn_dsw的博客 3621

Ubuntu16.04开机出现grub的解决方法

意外停电Ubuntu16.04 开机出现grub小车意外掉电,Ubuntu16.04无法正常启动,提示grub错误 小车意外掉电,Ubuntu16.04无法正常启动,提示grub错误 解决方法: ls #查看分区 set #查看grub路径设置 本小车使用系统对应的grub路径在(hd0,msdos3)/boot/grub,对应修改指令如下 set root=hd0,msdos3 set pre...

weixin_39407977的博客 1万+

智能合约监控告警:提示工程架构师用AI Prompt实现精准预警

当AI大模型(尤其是代码理解模型如CodeLlama、GPT-4 Code)与区块链数据结合,智能合约监控迎来范式革新。AI模型如何精准理解智能合约的业务特殊性?如何避免"AI幻觉"导致的误报?如何让模型学会区分"正常异常"与"攻击前兆"?答案藏在"提示工程"(Prompt Engineering)中。理解特定智能合约的业务逻辑(如DeFi协议的清算机制、NFT的铸造规则)识别复杂的攻击模式(如重入攻击的调用链特征、闪电贷的套利路径)结合链上链下数据进行多维度推理(如关联价格波动与异常交易)

AI架构全栈开发实战笔记 1011

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程BACnet MS/TP BACnet IP调试说明

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程mstp,bacnet ip调试说明

shufawangzhang的博客 2222

ubuntu强制关机造成grub损坏,开机黑屏进入grub自负界面修复

1.进入live CD模式 先进入ubuntu  liveCD模式,也就是安装盘的试用ubuntu,打开终端,为了方便,先来个$sudo -i 2.挂载分区 比如我ubuntu分区方式为...  /boot为sda6  /为sda7  别的分区不重要,这俩就行了. #mount /dev/sda7 /mnt #mount /dev/sda6 /mnt/boot 这个操作,每做一次

chulins的博客 5200

FPGA纯Verilog实现I²C主机控制器与EEPROM读写

I²C是一种广泛应用的同步串行总线协议,用于连接微控制器与EEPROM、传感器等低速外设。其核心原理包括开漏结构、主从通信机制、START/STOP时序及ACK/NACK应答流程。技术价值在于硬件资源占用少、布线简洁、支持多从机扩展,特别适合FPGA嵌入式系统中轻量级外设控制。典型应用场景涵盖工业数据存储、配置参数持久化及实时传感器接口。本文基于Xilinx Spartan-6 FPGA,采用纯Verilog HDL实现参数化I²C主机控制器与AT24C02 EEPROM读写验证,深入解析状态机设计、SDA

weixin_33557333的博客 119

修复grub启动 因调整分区导致linux无法启动解决过程

linux调整分区后,开机重启时会出现 error : unknow filesystem grub rescue> 我是windows11 + archlinux双系统使用。这段时间用下来,感觉使用linux更多一些。就想把windows的分区中扣出一点的空间给linux使用。把windows的D盘调整了大小,并增加了一个分区。 因为我的linux分区是在硬盘的最后一个分区,前面增加了一个分区就导致分区索引变了。然后就无法启动了。 原本D盘是200GB,现在D盘由一个单独的分区,拆分成两个100G

lxyoucan的博客 4650

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux开机启动遇到grub启动_修复linux下的grub(即启动管理程序)

修复linux下的grub(即启动管理程序)对于多操作系统来说,如果我们先安装Windows,然后在安装linux则,linux的启动管理程序,boot manager会自动覆盖硬盘上的主引导记录,即硬盘上的第0主面,0磁道,0扇区的512个字节,在这个主引导扇区中,一般存放的硬盘的分区情况,以及 一些跳转指令,用来使计算机跳转到相应操作系统的执行代码上。然而,假如我们重新安装了Windows操作...

weixin_30118919的博客 1341

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux Windows 双启动 Grub 修复

出处:http://hotthing.blog.163.com/blog/static/29670309200971974412760/ Linux Windows 双启动 Grub 修复 重新安装 windows 后, linux的启动选项会丢失, 可以通过如下方式找回. 如果grub也丢失, 应先安装grub,可以安装Wingrub,比较方便.  1 在windows

曾健生的专栏 1390

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux操作系统下GRUB启动菜单的修复方法

Linux操作系统下GRUB启动菜单的修复方法ZDNet 软件频道    更新时间:2007-10-06作者:kid    来源:赛迪网本文关键词:   修复  GRUB  操作系统  Linux   1.把安装盘的第一张放到光驱,然后重新启动机器,在BIOS中把系统用光驱来引导。 2.等安装界面出来后,按[F4]键(Fedora的话请选择Rescue System),也就是进

jiangxinyu的专栏 1749

Linux usb live修复Linux grub启动

参考: 先装了Linux,之后安装win10导致linux启动不了,想用usb live拯救,通过下面的方法可以。 1、挂在分区 先将你的linux所有分区挂载, 挂载根分区:sudo mount /dev/sdxN/mnt 如果给boot和home独立分区,也挂载上来(很重要)。 挂载home:sudo mount /dev/s...

G_Crisis的博客 1203

Linux启动阶段Grub损坏修复

一、GRUB试验(试验环境:VMware-Centos6) (试验一)破坏GRUB第1阶段,系统无法正常启动,修复之! GRUB第1阶段在硬盘512字节MBR的前446字节的BootLoader 总结步骤: 1.进入救援模式 2.grub命令进行修复 3.重启 试验步骤如下: 1.破坏grub stage1 [root@CentOS6 ~]#dd if=/dev/zero of=/dev/sd...

抽象空间的博客 4168

Linux开机GRUB终极解决方法:一键修复启动故障

Linux开机GRUB终极解决方法:一键修复启动故障 【下载地址】Linux开机GRUB终极解决方法 这份详尽的指南专为解决Linux开机时常见的GRUB问题而设计,帮助用户彻底摆脱启动故障。无论你是遇到GRUB无法加载系统、启动项丢失,还是系统无法启动的困扰,本指南都能提供经过实测验证的可靠解决方案。通过清晰的步骤,用...

gitblog_06778的博客 411

改变linux分区后grub修复,更改磁盘分区后修复GRUB启动

更改磁盘分区后修复GRUB启动上次为了通过硬盘引导安装Linux(见上一篇文章 ),专门分了一个1GB的FAT32分区。今天回到Win7中,用磁盘管理工具把这个分区撤销且合并后,重启后就进入了grub rescue终端,并且提示:error:unknown filesystemgrub rescue>还好有了解决方案(见 )。原来,在合并分区之前,我的Linux分区被标识为/dev/sda8...

weixin_33958871的博客 416

centos7光盘修复 grub_Linux 系统启动故障排查和修复技巧

我发现Linux系统在启动过程中会出现一些故障,导致系统无法正常启动,我在这里写了几个应用单用户模式、GRUB命令操作、Linux救援模式的故障修复案例帮助大家了解此类问题的解决。(一)单用户模式Linux系统提供了单用户模式(类似Windows安全模式),可以在最小环境中进行系统维护。在单用户模式(运行级别1)中,Linux引导进入根shell,网络被禁用,只有少数进程运行。单用户模式可以用来修...

weixin_39900023的博客 354

windows安装覆盖了linux的启动菜单,如何修复grub

其中mnt_partition_path是你当前已经mount的linux分区所在的路径。安装windows后,linux启动菜单消失,无法进入linux。

1281

【linux不能启动的修复方法】(GRub修复MBR)

【linux不能启动的修复方法】(GRub修复MBR) 1.把安装盘的第一张放到光驱,然后重新启动机器,在BOIS中设置为首先以光驱来启动。 2.等安装界面出来后,按[F5]键,也就是linuxrescue模式。 3.一系列键盘以及几项简单的配制,过后就[继续]了。。。这个过程,我不说了,比较简单。 4.然后会出现这样的字符  sh# 5.敲入命令grub,会出...

weixin_34062329的博客 219

linux开机启动grub rescue,Ubuntu 开机出现 grub rescue 的模式下修复

由于在Windows下面对分区修改,导致grub所在分区由sda3变成了sda2了,这样一来找不到grub了,Ubuntu开机就出现了grub rescue >在此情况下,可以如下解决,并不用重新安装系统第一步,找出你的Linux盘在那个分区以及grub目录在什么位置。如果你还记得最好,忘了也无所谓,使用下面命令逐个试探即可:grub rescue>ls回车后,ls命令会列出所有磁盘分...

weixin_42228796的博客 3486

Linux 系统启动过程及相关实验(破解密码;明文密文加密;修复grub2目录和boot目录)

摘要:本文详细介绍了Linux系统的启动过程,包括从开机自检到进入登录界面的完整流程,并解释了系统运行级别的概念及其配置方法。重点提供了三个实用实验:1)破解root密码的步骤;2)GRUB2引导程序的明文/密文加密方法;3)GRUB2及/boot目录损坏的修复方案。每个实验均包含详细的操作步骤和命令说明,涵盖了常见的系统维护场景,如修改GRUB2超时时间、进入救援模式等实用技巧,为Linux系统管理和故障排除提供了实用指导。

t_suifeng的博客 921
上一篇: shell-脚本-eval命令
下一篇: 定制linux和linux内核编译
ITlinuxP
博客等级 码龄9年 56粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值