文章目录
关于linux系统启动的一些问答
1.简述linux的启动流程
Centos6
1.POST:通电自检
2.BIOS:BOIS自检,加载硬盘
3.读取MBR,进行MBR引导
4.bootloader:grub引导菜单
5.加载内核 Kernel(ramdisk)
6.启动init进程,依据inittab文件设定运行级别 (inittab用于定义默认运行级别)
7.init进程,执行rc.sysinit文件
8.分别执行/etc/init/rcS.conf、/etc/init/rc.conf、/etc/init/start-ttys.confl来调用命令执行/etc/rc#.d/文件里面定义的是各种服务的启动脚本,可以ls查看,S开头代表开机启动的服务,K开头的是关机要执行的任务。#代表数字,一个数字代表一个运行级别,共7个运行级别,
9.执行/etc/rc.d/rc.local
10.执行/bin/login程序,等待用户登录
Centos7
1.POST:通电自检
2.BIOS:BOIS自检,加载硬盘
3.读取MBR,进行MBR引导
4.bootloader:grub引导菜单
5.加载内核和inintamfs模块
6.内核开始初始化,使用systemd来代替centos6以前的init程序
7.执行initrd.target
包括挂载/etc/fstab文件中的系统,此时挂载后,就可以切换到根目录了
8.从initramfs根文件系统切换到磁盘根目录centos7表面是有“运行级别”这个概念,实际上是为了兼容以前的系统,每个所谓的“运行级别”都有对应的软连接指向,默认的启动级别时/etc/systemd/system/default.target,根据它的指向可以找到系统要进入哪个模式
模式:0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target
9.systemd执行sysinit.target
10.systemd启动multi-user.target下的本机与服务器服务
11.systemd执行multi-user.target下的/etc/rc.d/rc.local
12.Systemd执行multi-user.target下的getty.target及登录服务
getty.target是启动终端的systemd对象。如果到此步骤,系统没有被指定启动图形桌面,到此就可以结束了,如果要启动图形界面,需要在此基础上启动桌面程序
13.systemd执行graphical需要的服务
启动流程:https://blog.csdn.net/weixin_39924535/article/details/82925441
2.grub中的bootloader损坏如何修复,步骤是什么
- 方法一:直接安装grub
(1)先把MBR拷贝一份
dd if=/dev/sda of=/tmp/mbr count=1 bs=512
(2)然后再破坏
dd if=/dev/zero of=/dev/sda count=1 bs=100
sync
(3)重新安装grub程序
grub-install --root-directory=/ /dev/sda
- 方法二:进入救援模式,安装grub
(1)导入一张光盘
(2)进入rescue模式
(3)登入shell程序
(4)切换自己的根
chroot /mnt/sysimage
(5)安装grub程序,退出到救援模式
grub-install --root-directory=/ /dev/sda
exit
(6)reboot
stage损坏:https://blog.csdn.net/jb19900111/article/details/17749749
3.initramfs文件的作用
initrd
initramfs
1.initrd: initial Ram disk
/linuxrc文件,基于ramdisk技术,文件系统(ext2等)镜像文件 ————> cpio格式镜像文件
在内核启动完成后把它复制到/dev/ram块设备中, 作为内核加载真正根文件系统的过渡根文件系统
2.initramfs: initial RAM file system
init文件,cpio格式镜像文件
在内核启动完成后把它复制到rootfs中,作为内核初始的根文件系统,完成挂载系统真正的根文件系统
常见的内存文件系统有:
rootfs,ramfs,ramdisk,tmpfs
1.rootfs:内核启动的初始始根文件系统,大部分linux系统正常运行后都会安装另外的文件系统,然后忽略rootfs
2.ramfs:基于内存的文件系统.ramfs文件系统没有容量大小的限制,它可以根据需要动态增加容量.直接利用了内核的磁盘高速缓存
3.ramdisk:基于ram的块设备,占据一块固定的内存,事先要使用特定的工具比如mke2fs格式化,还需要一个文件系统驱动来读写其上的文件空间固定导致容量有限,要想装入更多的文件需要重新格式化.Linux的块设备缓冲特性, ram disk上的数据被拷贝到page cache(对于文件数据)和dentry cache(对于目录项),导致内存浪费,它可能不停的动态增长直到耗尽系统的全部内存,所以只有root或授权用户允许使用ramfs
4.tmpfs:增加了容量大小的限制 + 允许把数据写入交换分区.由于增加了这两个特性,tmpfs允许普通用户使用
initramfs:https://www.cnblogs.com/CHYI1/p/5551022.html
initrd和initramfs的区别:https://blog.51cto.com/linuxzj/1409882
4.grub的各个阶段功能
分三个阶段stage1/stage1.5/stage2
这些功能都是放在/boot/grub目录下:
1.从上面可以看到,stage1文件的大小正好是512字节,事实上stage1文件其实就是MBR中bootloader的备份,而之所以是bootloader而不是MBR, 是因为这个文件的前446字节才是和MBR是一样的。
2.上面可以看到stage1_5形式的文件有很多,如e2fs_stage1_5、jfs_stage1_5等等,这些都是stage1.5阶段的文件,只是每个都针对不同的文件系统格式,而e2fs_stage1_5是默认的(ext系列的文件系统)。当stage1加载stage1.5之后,就访问文件系统目录,从而可以加载stage2文件。
而stage1.5要执行,是通过stage1加载它
3.平时开机启动的时候看到的Grub选项、信息,还有修改GRUB背景等功能都是stage2提供的,stage2会去读入/boot/grub/grub.conf或者menu.lst等配置文件。
grub的各个阶段功能:https://kodango.com/three-stage-grub-boot
5.grub2的引导过程简述
- 第一阶段:
boot.img
写入主引导记录的前440个字节(扇区0中的MBR),或者写入分区的引导扇区(PBR / VBR)。它diskboot.img
通过64位LBA地址寻址,因此可以从MBR的2 GiB限制之上加载。实际的扇区号由写入grub-install
。 - 第二阶段:
diskboot.img
是第一个扇区core.img
(在Grub Legacy中称为第1.5阶段),其唯一目的是加载core.img
LBA标识的其余部分,也由写入grub-install
。 - 在MBR分区磁盘上:
core.img
存储在MBR和第一个分区之间的空扇区(如果有)中。最近的操作系统建议在此处进行对齐时应留出1 MiB的间隙(2047 * 512字节或255 * 4KiB扇区)。该间隔曾经是62个扇区(31 KiB),这提醒了Bios在1998年之前使用的C / H / S寻址的扇区数限制,因此core.img
设计为小于32 KiB。 - 在GPT分区磁盘上:分区不限于4个,因此
core.img
被写入其自身的微小(1 MiB),无文件系统的BIOS引导分区。 - 第三阶段:
core.img
进入32位保护模式,解压缩自身(grub和文件系统模块的内核到达/ boot / grub),然后/boot/grub//normal.mod
从所配置的分区中加载grub-install
。如果分区索引已更改,则Grub将找不到normal.mod
,并向用户显示Grub Rescue提示,用户可以在其中找到并加载normal.mod
linux内核。 - 该
/boot/grub
目录可以位于任何分区上(Grub可以读取许多文件系统,包括NTFS)。根据安装方式的不同,它可以位于发行版的根分区中,也可以位于单独的*/ boot*分区中。 - 第四阶段:(
normal.mod
相当于Grub Legacy中的第二阶段)解析/boot/grub/grub.cfg
,可以选择加载模块(例如,用于图形UI)并显示菜单
总结
1.加载引导镜像(boot.img),定位并加载下阶段的代码
2.加载core.img,开始执行加载存放下阶段文件的 /boot
文件系统的驱动程序
3.从 /boot/grub2/i386-pc 目录下加载一些内核运行时模块,定位和加载 Linux 内核到内存中
4.normal.mod解析/boot/grub/grub.cfg
grub2详解:https://wenku.baidu.com/view/77c60ac2d4bbfd0a79563c1ec5da50e2524dd153.html
grub2启动:https://en.wikipedia.org/wiki/GNU_GRUB#Version_2_(GRUB_2)
6.grub和grub2的区别
GRUB 的最主要作用都是将内核加载到内存并运行。
1.配置文件的名称改变了。在grub中,配置文件为grub.conf或menu.lst(grub.conf的一个软链接),在grub2中改名为grub.cfg。
2.grub2增添了许多语法,更接近于脚本语言了,例如支持变量、条件判断、循环。
3.grub2中,设备分区名称从1开始,而在grub中是从0开始的。
4.grub2使用img文件,不再使用grub中的stage1、stage1.5和stage2。
5.支持图形界面配置grub,但要安装grub-customizer包,epel源提供该包。
6.在已进入操作系统环境下,不再提供grub命令,也就是不能进入grub交互式界面,只有在开机时才能进入。
7.在grub2中没有了好用的find命令。
7.内核的功能是什么,如果修改内核的参数
- 内核的功能
进程管理
内核负责创建和销毁进程,并处理它们与外部世界的联系(输入和输出)
内存管理
内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间
文件系统
内核在非结构化的硬件之上建立了一个结构化的文件系统, 结果是文件的抽象非常多地在整个系统中应用
设备控制
内核中必须嵌入系统中出现的每个外设的驱动, 从硬盘驱动到键盘和磁带驱动器
网络管理
所有的路由和地址解析问题都在内核中实现.
- 修改内核的参数
在单用户模式下我们进入系统无需提供密码,并且拥有最高权限,可以任意修改任何内容,而我们常规进入单用户的方法就是通过修改内核启动参数实现的。
修改内核参数按时效性来说分为两种,
一种是临时的,一种是永久的,
- 我们进入单用户模式一般就是用的临时的
1.系统启动到GRUB阶段时,中断启动,选择要引导的系统
2.按“a”键进入修改内核引导参数界面,输入系统启动时要引导的内核参数
3.按回车键继续启动系统
如:enforcing参数:selinux控制;enforcing=1可设置强制模式,enforcing=0可设置许可模式
Selinux参数:selinux控制;selinux=0可完全禁用selinux,selinux=1可启用selinux
vga参数:改变字符终端的分辨率,vga=788
vga参数值的意义,这里的值给出的是十进制的,也可以使用十六进制,如vga=0x317
- 永久的
在/boot/grub/grub.conf或/etc/grub.conf文件中将内核参数添加到kernel一行中的rhgb quiet
修改应该在/proc/cmdline文件中可以查看到
Linux内核的功能:https://blog.csdn.net/u010889616/article/details/47868887
Linux修改内核的参数:https://zhuanlan.zhihu.com/p/43341587
8.简述centos7的systemd初始化过程
- 阶段1
systemd执行的第一个目标是/usr/lib/systemd/system/default.target,这个文件链接到当前目录的graphical.target。文件内容如下:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
文件中配置项 Requires=multi-user.target 将控制权交给 multi-user.target (相当于旧概念的运行级别)。
- 阶段2
这个阶段会启动multi-user.target,这个target为多用户支持设定系统环境。会启动如下两个目录中单元。
-
启动本级别对应的服务
-
调用/etc/rc.d/rc.local
-
调用getty.target(开启登录终端)
/etc/systemd/system/multi-user.target.wants/
/usr/lib/systemd/system/multi-user.target.wants/
/usr/lib/systemd/system/multi-user.target文件内容如下:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
multi-user.target会将控制权交给 basic.target。
- 阶段3
basic.target用于启动普通服务,特别是图形管理服务,它通过如下两个目录决定那些单元会被启动。
- 准备操作系统
/etc/systemd/system/basic.target.wants/
/usr/lib/systemd/system/basic.target.wants/
/usr/lib/systemd/system/basic.target文件内容如下:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Basic System
Documentation=man:systemd.special(7)
Requires=sysinit.target
After=sysinit.target
Wants=sockets.target timers.target paths.target slices.target
After=sockets.target paths.target slices.target
basi.target 会将控制权交给 sysinit.target
- 阶段4
sysinit.target会启动重要的系统服务例如系统挂载,内存交换空间和设备,内核补充选项等等。它通过如下两个目录决定那些单元会被启动。
- 初始化系统
/etc/systemd/system/sysinit.target.wants/
/usr/lib/systemd/system/sysinit.target.wants/
/usr/lib/systemd/system/sysinit.target文件内容如下:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=System Initialization
Documentation=man:systemd.special(7)
Conflicts=emergency.service emergency.target
Wants=local-fs.target swap.target
After=local-fs.target swap.target emergency.service emergency.target
sysinit.target在启动过程中会传递给 local-fs.target 和 swap.target。
- 阶段5
local-fs.target 也不能算是阶段5,可能和阶段4一些服务并行启动,这个阶段不会启动用户相关服务,它只处理底层核心服务,这个target会根据/etc/fstab来执行相关磁盘挂载操作。它通过如下一个目录决定那些单元会被启动。
/usr/lib/systemd/system/local-fs.target.wants/
local-fs.target 文件内容如下:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Local File Systems
Documentation=man:systemd.special(7)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs-pre.target
OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly
-
总结:
-
阶段1:systemd执行的第一个目标是/usr/lib/systemd/system/default.target,将控制权交给 multi-user.target(启动本级别对应的服务,调用/etc/rc.d/rc.local,调用getty.target(开启登录终端))
-
阶段2:会启动multi-user.target,这个target为多用户支持设定系统环境,将控制权交给 basic.target(准备操作系统)
-
阶段3:启动普通服务,特别是图形管理服务,将控制权交给 sysinit.target(初始化系统)
-
阶段4:会启动重要的系统服务例如系统挂载**,**内存交换空间和设备,会传递给 local-fs.target 和 swap.target
-
阶段5:只处理底层核心服务,根据/etc/fstab来执行相关磁盘挂载操作
-
- 各个target的功能
1,local-fs.target+swap.target:这两个主要挂载本机/etc/fstab里面与相关内存交换空间;
2,sysinit.target:主要检测硬件,载入所需的内核模块等;
3,basic.target:载入主要的硬件驱动与防火墙相关任务;
4,multi-user.target:载入其他一般系统或网络服务载入;
5,graphical.target:载入图形界面相关服务。
systemd初始化过程:https://blog.csdn.net/vic_qxz/article/details/80336278