linux启动和grub修复

xiaoxiao2021-02-28  12

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.imgCentOS 6,7: /boot/initramfs- VERSION -release.img模块文件 :/bin/modules/VERSION-release

驱动模块存放在哪里

最核心最重要的在linux内核文件中存放vmlinuz- VERSION-release有一小部分重要的在initramfs- VERSION -release.img中存放的是和启动相关的驱动模块还有一些在/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 内核加载完后就启动系统的第一个进程,init进程,centos7是systemctlinit进程启动后会读取它的核心配置文件就是/etc/inittab文件,/etc/init/*.conf文件 7.使用/etc/rc.d/rc/sysinit初始化脚本执行/etc/rc.d/rc 脚本 会加载/etc/rc#,#为默认级别要启动的服务执行/etc/rc.d/rc.local脚本(管理员想要某个服务在那个级别开机启动时放进就会开机启动,最后一个加载)

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

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

启动流程详细过程描述

post

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

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

Windows:ntloader ,仅启动OS,不可以启动linuxlinux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核,可以启动Windows LILO:linux loader 很早以前centos5开始不使用GRUB : grand unified bootloadergrub 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 工具程序:mkinitrdcentos 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—initinit程序的类型 sysV:init,Centos 5之前的版本 配置文件:/etc/inittabupstart:init,Centos 6 配置文件:/etc/inittab,/etc/init/*.confsysytemd: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.sysinitca::ctrlaltdel:/sbin/shtdown -t3 id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitlO:O:wait:/etc/rc.d/rc 0l1: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:系统初始化脚本

设置主机名设置欢迎信息激活udev和seLinux挂载/etc/fstab文件中定义的文件系统检测根文件系统,并以读写方式重新挂载根文件系统设置系统文件激活swap分区根据/etc/sysctl.conf文件设置内核参数激活lvm及software raid 设备加载额外设备的驱动程序清理操作 说明: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|restartservice – 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:mbrstage1.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安装 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是不属于任何分区的grub 交互式安装 grub> root (hd#,#) grub> setup (hd#) 配置文件:/etc/grub/grub.conf.con <– /etc/grub.confstage2及内核的那个通常放置于一个基本磁盘分区中功能 提供启动菜单、并提供交互式接口 a:内核参数e:编辑 模式c:命令模式加载用户选择的内核或操作系统 允许传递参数给内核可以隐藏启动菜单为菜单提供保护机制 为编辑启动菜单进行认证为启动内核或者操作系统进行认证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/initinitrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdiskboot: 引导启动选定的内核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-cryptgrub-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第一阶段修复完成了重启计算机 主意 在这里要注意grub-install 这个命令必须要在系统根上运行,进入光盘时是在光盘目录上,要用chroot切根grub-install 在上面命令我们没有用–root-directory= 这个选项,这里=号后面要跟/boot目录的上一级目录,如果是在根上默认可以不写。运行完成后不要急着去重启等待一会,因为可能系统没有把缓冲的数据写入磁盘中,而导致出错

4. 把selinux 关闭

交互式命令修改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的错误解决方法 a任意键进菜单中 按e进入内核选项 在按o添加一个新行进行编辑,进行添加编辑,一定要在kernel下面在按e编辑这个空行 把initrd 重新写一边,可以用tab键补全 在按b启动 这里只是临时修改,文件里并没有更改,所有进去系统后要把文件改掉

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 ~]# 进入光盘救援模式,这里会出现挂载不上根 这显示数要把根挂载到/mnt/sysimage上,我们回车按OK,出现一个新的shell进入shell后用df命令查看挂载点,发现没有挂载到根,这样我们就无法修复grub文件,我们先要修复fstab文件要修复fstab文件就要知道根在哪,所有我们要把这几个分区都挂一下看里面的内容是什么来判断哪个是根刚刚排除了两个,现在我们可以根据大小或里面的内容来判断,创建一个目录把这些文件都挂载上去把根挂到目录上,然后创建fstab文件这里一定要写全路径然后用vi写,不支持vim,也可以用cat命令写然后重启,必须让救援模式自己挂载根这样救援模式就重新挂载了然后就是之前的操作了先切根然后创建一个目录挂载光盘 安装kernel 修复grub目录 修复grub.conf文件 重新启动,就可以了,在修复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 重新启动后系统会卡在这修复步骤 在启动时进入菜单按e选择内核,按e进入编辑模式在这后面输入 init=/bin/bash 我们用bash来代替init进程按按回车会返回到内核中,在按b进入引导启动,启动后是这样的画面现在我们就可以输入命令,我们把光盘挂载一下,把init包安装一下由于现在的根是只读模式,所有要重新挂载一下 挂载光盘 用rpm安装init包, 包名是upstart,要加–force选项,强制安装

逻辑卷的破坏和修复

把/etc/fstab和boot目录清空重启后会出现这样的错误 进入救援模式这里也会找不到根,求援模式无法挂载到根首先也是找到根是哪个逻辑卷分区用lvs查看 创建一个文件夹挂载root这个逻辑卷但是会报错,而且用teb键是补不全的,也找不到逻辑卷,我们用lvdisplay查看逻辑卷,发现这两个都不是活动状态故障状态逻辑卷是不会被激活的,用vgchange -ay 激活所有卷组然后在重新挂载一下逻辑卷,挂载成功 修复fstab文件用mount查看当前挂载情况因为我们把根挂载到/mntroot上了,所有也可把boot挂载到其它目录上,然后取最后2行到/mntroot/etc/fstab中。当然也可以手写,只是觉得设备名记不住所以这样现在开始修改fstab配置文件这里的swap文件写不写都可以不影响启动,也可以进入系统在写 现在重新启动进入救援模式自动挂载根然后修复kernel和grub文件切根挂载光盘用rpm安装内核修复grub文件修复/boot/grub/grub.conf文件重启成功
转载请注明原文地址: https://www.6miu.com/read-1250192.html

最新回复(0)