admin管理员组

文章数量:1644015

文章目录

  • 系统启动过程
    • 系统启动流程
    • grub(内核)的作用
      • 临时修改内核参数
      • 救援模式rescue
      • emergency模式:
    • 重置root密码
    • 进入安全模式(grbu)加密:
    • 强制进入安全模式:
  • 系统修复
    • 系统缺失启动文件无法开机-修复
    • 当/boot里缺失文件时如何修复

系统启动过程

系统启动流程

分区都有文件系统
不同的操作系统(内核不一样),文件系统是不一样的:
linux:ext2,ext3,ext4,xfs
windows:fat,ntfs
不同的操作系统一般般不识别其他的文件系统
是否能识别文件系统,是由内核来决定的,不同的内核使用不同的文件系统如果没有内核,则识别不来文件系统,所以当我们的系统要启动的试试,首先要把内核加载到内存里开始初始化。

当我们按下开机键的时候,首先BIOS加载自检,检测到各种硬件没有问题的话,则会激活硬盘的MBR(把引导权交给硬盘的MBR)

这个BootLoader主要作用就是把系统引导起来,实际上就是加载内核,所谓内核就是用c语言写的一个软件而已,不管系统启动不启动,他总是存储在某个分区里,假设就存储在sda1里。
每个分区都是有fs(操作系统)的,只有内核运行的时候,才能识别fs
BootLoader要加载内核,必须要能访问sda1,要能访问sda1则需要识别xfs,要识别xfs前提是内核必须已经运行了。
BootLoader实际上是从grup力量stage1这段代码反汇编出来的,作用就是用来加载第二个扇区。
第二个扇区里是有grub里stage1.5反汇编出来的一段代码,作用就是记载第3个~n个扇区。

第3~n个扇区里存储的是 极精简的fs(操作系统),但是可以让我们读懂fs了
请问:内核在哪里?以什么样的参数来初始化内核?
都有配置文件来决定;/boot/grub2/grub.cfg

所以要修改内核参数就需要编辑 :/boot/grub2/grub.cfg,但打开之后会说不要修改这个文件,下面会提示应该修改:/etc/default/grub ,所以最终要修改内核参数需要编辑的文件是:/etc/default/grub

比如我们修改图中参数:vi /etc/default/grub:

编辑完成后需要执行:grub2-mkconfig -o /boot/grub2/grub.cfg

该命令的作用是把/etc/default/grub中的文件应用到/boot/grub2/grub.cfg中。
为什么不直接在/boot/grub2/grub.cfg中更改原因是:假设你对boot/grub2/brub.cfg做了很多修改,如果某天这个文件丢失了,或者你更新了内核导致这个文件内容被覆盖,再或者,你更新内核之后,新的内核就识别不了原来的这些参数! 如果在/etc/default/grub中修改的作用就是修改完毕后执行grup2-mkconfig -o /boot/grub2/grub.cfg 会自动生成新的/boot/gurb2/grub.cfg文件,即使旧文件丢失了重新执行grup2-mkconfig -o /boot/grub2/grub.cfg就会重新生成新的/boot。。。文件。 更新内核后,重新执行grup2-mkconfig -o /boot/grub2/grub.cfg就会重新生成新的合适当前内核的/boot。。。文件。 而且 每一次修改/default/grub中文件重启后开机的时候内核都会多一个,比如刚开始是2条内核,修改并重启后多一条3条,4条…

grub(内核)的作用

GRand Unified Bootloader的缩写,更准确地讲,它是GNU项目的启动引导程序.GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统.GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数

下图中 这里有两个内核,第一个从0开始,第二个则是从1开始,默认选择的是第一个(0)

修改参数:

GRUB_TIMEOUT=30 :设置的倒计时(倒计时自动选择第一个内核启动),默认时间是5
GRUB_DEFAULT=1:设置默认从1号内核引导,默认是SAVED

GRUB_CMDLINE_LINUX=… 内核参数(修改此处为永久修改,重启后生效)
快捷查看内核参数:cat /proc/cmdline
修改内核参数,分2步:
第一步:编辑文件:vi /etc/dafault/grub 在里面定义参数即可。
第二步:执行grup2-mkconfig -o /boot/grub2/grub.cfg,作用是把/etc/default/grub中编辑的文件应用到/boot/grub2/grub.cfg中(重启后永久生效)

内核参数定义规则:
Linux内核在启动的时候,能接收某些命令行选项或启动时参数。当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值,可以通过这种方式手动将这些参数传递给内核。
如果不使用启动管理器,比如直接从BIOS或者把内核文件用“cp zImage /dev/fd0”等方法直接从设备启动,就不能给内核传递参数或选项--这也许是我们使用引导管理器比如LILO的好处之一吧。
Linux的内核参数是以空格分开的一个字符串列表,通常具有如下形式:
代码如下:
name[=value_1][,value_2]…[,value_10]
“name”是关键字,内核用它来识别应该把“关键字”后面的值传递给谁,也就是如何处理这个值,是传递给处理例程还是作为环境变量或者抛给“init”。值的个数限制为10,你可以通过再次使用该关键字使用超过10个的参数。首先,内核检查关键字是不是 root='',nfsroot=’’,nfsaddrs='',ro’’, rw'',debug’‘或`init’’,然后内核在bootsetups数组里搜索于该关键字相关联的已注册的处理函数,如果找到相关的已注册的处理函数,则调用这些函数并把关键字后面的值作为参数传递给这些函数。比如你在启动时设置参数name=a,b,c,d,内核搜索bootsetups数组,如果发现“name”已注册,则调用“name”的设置函数如name_setup(),并把a,b,c,d传递给name_setup()执行。 所有型如“name=value”参数,如果没有被上面所述的设置函数接收,将被解释为系统启动后的环境变量,比如“TERM=vt100”就会被作为一个启动时参数。
所有没有被内核设置函数接收也没又被设置成环境变量的参数都将留给init进程处理,比如“single”。
【常用的设备无关启动时参数】
1、init=…
设置内核执行的初始化进程名,如果该项没有设置,内核会按顺序尝试/etc/init,
/bin/init,/sbin/init, /bin/sh,如果所有的都没找到,内核会抛出 kernel panic:的错误。
2、nfsaddrs=…
设置从网络启动时NFS的启动地址,已字符串的形式给出。
3、nfsroot=…
设置网络启动时的NFS根名字,如果该字符串不是以 “/”、","、"."开始,默认指向“/tftp-boot”。
以上2、3在无盘站中很有用处。
4、no387
该选项仅当定义了CONFIG_BUGi386时才能用,某些i387协处理器芯片使用32位的保护模式时会有BUG,比如一些浮点运算,使用这个参数可以让内核忽略387协处理器。
5、no-hlt
该选项仅当定义了CONFIG_BUGi386时才能用,一些早期的i486DX-100芯片在处理“hlt”指令时会有问题,执行该指令后不能可靠的返回操作系统,使用该选项,可以让Linux系统在CPU空闲的时候不要挂起CPU。
6、root=…
该参数告诉内核启动时使用哪个设备作为根文件系统。比如可以指定根文件为hda8:root=/dev/hda8。
7、ro和rw
ro参数告诉内核以只读方式加载根文件系统,以便进行文件系统完整性检查,比如运行fsck;rw参数告诉内核以读写方式加载根文件系统,这是默认值。
8、reserve=…
保留端口号。格式:reserve=iobase,extent[,iobase,extent]…,用来保护一定区域的I/O端口不被设备驱动程序自动探测。在某些机器上,自动探测会失败,或者设备探测错误或者不想让内核初始化设备时会用到该参数;比如: reserve=0x300,32device=0x300,除device=0x300外所有设备驱动不探测 0x300-0x31f范围的I/O端口。
9、mem=…
限制内核使用的内存数量。早期BIOS设计为只能识别64M以下的内存,如果你的内存数量大于64M,你可以指明,如果你指明的数量超过了实际安装的内存数量,系统崩溃是迟早的事情。如:mem=0x1000000意味着有16M内存,如果是mem=0x6000000,就是96M内存了。注意:很多机型把部分内存作为BIOS的映射,所以你在指定内存大小的时候一定要预留空间。你也可以在 pentium或者更新的CPU上使用mem=nopentium关闭4M的页表,这要在内核配置时申明。
10、panic=N
默认情况,内核崩溃--kernel panic 后会宕机而不会重启,你可以设置宕机多少秒之后重启机器;也可以在/proc/sys/kernel/panic文件里设置。
11、reboot=[warm|cold][,[bios|hard]]
该选项仅当定义了CONFIG_BUGi386时才能用。2.0.22的内核重启默认为cool reboot,warm reboot 更快,使用"reboot=bios"可以继承bios的设置。
12、nosmp 和 maxcpus=N
仅当定义了 SMP,该选项才可用。可以用来禁用多CPU或者指明最多支持的CPU个数。

临时修改内核参数

临时修改内核参数方法,启动系统选择内核时按字母 c 即可:

按 c 选择指定内核 然后 再 按 e 即可进入编辑界面 ,在当前界面,上下左右 箭头可切换光标 编辑完成之后ctrl+x 保存 后即可 以定义的参数开机(仅限本次有效,重启后变不再生效了)。

一般在维护或者修复系统的时候,我们才会在这里修改内核的参数。
系统的几种模式:

救援模式rescue

假设系统正常启动需要20个必须服务,如果某个必须服务出了问题就会导致系统没法启动,假设救援模式只有个必须服务,我们进入到救援模式的时候,出问题的服务不再救援模式的必须服务之内,此时系统就可以启动起来。
但是 需要root密码
类似于windows下的“安全模式”
进入该模式的方法:就是临时编辑内核参数的方法,启动界面c(选择内核)——e进入编辑界面,找到内核列 在最后写上参数保存即可;

这里写s,single,1都可以,按ctrl+x

在该模式下可以查看启动日志,查找系统无法正常启动的原因。

emergency模式:

假设系统正常启动需要20个必须服务,如果某个必须服务出问题了就会导致系统无法启动,假设emergency模式只有6个必须服务,我们进入到emergency模式的时候,出问题的服务不再emergency模式的必须服务内,此时系统可以启动起来。
但是 需要root密码
也类似于windows下的“安全模式”
进入该模式的方法:就是临时编辑内核参数的方法,启动界面c(选择内核)——e进入编辑界面,找到内核列 在最后写上参数保存即可;

ctrl+x后:

重置root密码

如果你使用的是RHEL7.0的话,记住要删除rhgb quiet这两个参数。7.1及以上就不需要删除
进入该模式的方法:就是临时编辑内核参数的方法,启动界面c(选择内核)——e进入编辑界面,找到内核列 在最后写上参数保存即可;

ctrl+x后就会直接进入到无密码界面:

需要注意的时,以这种方式进入的系统是 只读的,不能直接修改密码,所以需要先把系统文件以读写的方式重新挂载再修改密码即可:

密码修改完成以后,需要重置selinux标签:touch /.autorelabel ,然后重启:exec /sbin/init

如果使用的是vmware做实验的话,这当中会重启2次(等待即可),kvm没这个问题。
启动完毕后直接使用更改的密码登陆即可:

进入安全模式(grbu)加密:

如果在没做什么操作的情况下 谁都能修改root密码 ,显然这是不安全的,所以,我们可以编辑文件,让别人无法直接通过上述进入安全模式的方法修改root密码:
编辑文件:vi /etc/grub2.d/00_header

在文件最下面新建以下格式,指定超级用户,并保存,保存以后需要执行:grub2-mkconfig -o /boot/grub2/grub.cfg :

上诉方法是密码以明文的方式呈现,下面说一下密码不以明文方式呈现,首先要先 生成秘钥(秘钥是pbkdf2格式):执行grub2-mkpasswd-pbkdf2-输入该用户的密码,如上图中的密码是:ccx123 :

秘钥生成以后,再次编辑文件:vi /etc/grub2.d/00_header ,在文件最下面新建以下格式,指定超级用户,并保存,保存以后需要执行:grub2-mkconfig -o /boot/grub2/grub.cfg :

更新数据以后reboot重启:

进入编辑模式以后,现在要提示输入用户名和密码:这个用户名就是之前文件定义的超级用户和密码:

用户密码输入错误会直接回到开机启动界面,又得重新按e进入该界面:

密码输入正确以后 才会进入到编辑界面,在该界面定义好内核文件后,ctrl+x即可正常启动:

强制进入安全模式:

该方法用于:1、grub被加密了,且不知道密码是什么 2、root密码也忘记了(就无法更改(grub)指定用户的密码了) ,这时候就需要用到另外一种救援模式:
这里以vmware为例,首先必须先挂载系统镜像,注:系统镜像版本必须和当前系统版本一致:

挂载好以后重启系统,并在刚开机时的界面按esc键(速度要快)调出启动菜单(可能版本不同有些系统并不是esc调出启动菜单,如果esc不行自行百度查看快捷键):

调出启动菜单后选择第三个cd启动:

然后选择第三项回车:

然后选择第二项回车,进入到救援模式(和前面的救援模式有区别,该处是光盘救援模式):

Continue回车:

回车以后继续回车,注:这儿提示了进系统后需要执行该命令才能从光盘根目录切换到 系统根目录:

再次按回车键:

现在就进入到了系统光盘中的救援模式:

输入进入时界面提示的命令切换到我们系统的根目录:chroot /mnt/sysimage/ ,进入到系统根目录以后就可以做任何操作了:

输入2次exit即可保存操作并重启系统:

系统修复

系统缺失启动文件无法开机-修复

当grup丢失的时候如何修复系统
因为grup是存储在第一个盘的前446b中,所以现在先把grup文件覆盖(损坏):
dd if=/dev/zero of=/dev/vda bs=1 count=446 (在 /dev/zero 中提取446大小的空文件写入到dev/vda磁盘中)

此时重启就会发现如下情况:

操作步骤:
参考前面强制进入安全模式的步骤:挂镜像-在刚开机时的界面按esc键(速度要快)调出启动菜单… 输入命令进入系统根目录:

到这一步以后重新把grub2重新安装到系统磁盘(lsblk查看)即可:grub2-install /dev/vda,安装完毕后重启即可:

重启后正常读取内核,成功:

当/boot里缺失文件时如何修复

先删除/boot的全部内容,注意是/boot:rm -rf /boot/*

删除后重启就是下图界面 ,grub可以正常引导(说明grub文件是正常的),但找不到/boot/grbu2。。。。

解决方法:
同样参考前面强制进入安全模式的步骤:挂镜像-在刚开机时的界面按esc键(速度要快)调出启动菜单… 输入命令进入系统根目录:

输入chroot /mnt/sysinage/进入系统根目录后 查看boot发现为空,因为boot内核文件是基于kernel的,所以只需要重新安装kernel,boot里的内核文件即可自动生成:挂载镜像,rpm -ivh /mnt/Packages/kernel(tab一下即可自动补全包名)

安装完kernel服务后,内核文件已经有了,但还缺少配置文件,配置文件是放在 /boot/grub2中的,所以我们需要手动创建该文件夹:mkdir /boot/grub2,然后执行:grub2-mkconfig -o /boot/grub2/grub.cfg ,即可自动生成配置文件:

配置文件生成好以后,需要成长grub2服务装到系统磁盘中:

grub2装完后查看/boot/grub2/中又多了许多配置文件,做完此步骤即完成修复,exit系统目录,重启即可:

重启后正常读取内核,成功:

本文标签: 内核系统启动过程系统Linux