Linux 启动流程及相关知识
基础知识
linux系统的组成
内核(kerner)
根文件系统(rootfs)
内核提供操作系统的功能,根文件系统包含常用的一些工具,这些工具。这些工具的运行离不开glibc库文件。
程序:二进制程序文件
库:库是函数的集合,用来实现接口调用等功能。程序的运行依赖这些库文件
Linux内核的功能:文件系统管理、进程管理、网络管理、驱动程序、内存管理等
CentOS 6
CentOS 6 启动流程: 4步
POST--->MBR--->GRUB--->加载内核
POST:Power-On-Self-Test,加电自检。由主板的bios程序完成。
bios:basic input output system。基本出入输出系统
MBR
MBR: 主引导记录(Master Boot Record)。是硬盘的第一个扇区(0磁道0扇区),总共有512个字节,前446个字节存储的是bootloader的阶段一程序(以二进制的形式存放)
bootloader:是用来启动(引导)操作系统的一个程序。(安装操作系统的时候会自动安装)
bootloader这个程序里面定义了操作系统(内核)存放的位置等
windows用的bootloader:ntloader,仅用来启动操作系统的
linux用的bootloader:现在使用的是GRUB,不仅用来启动操作系统,还有多种功能
#早期版本用的是0.97版本,现在用的是2.02版本
grub的启动流程:启动操作系统前加载grub。
阶段1:加电自检完成后,通过bios检测设备驱动。如果是硬盘启动就读取硬盘的第一个扇区(MBR)。并将MBR中的前446字节(bootloader)加载到内存中进行运行 #二进制文件,可以直接访问的
阶段1.5:因为grub的另外一部分是存放在文件系统的/boot目录下的,但是要想解析这个对应的文件,需要识别这个文件系统。所以需要借助文件系统的驱动程序。因为MBR的前446字节存放不下文件系统的驱动,所以文件系统驱动放在了MBR的后续扇区中
阶段2:解析加载文件系统对应目录下grub的配置文件,找到操作系统(linux)。 #非二进制,所以不可以直接访问,而是一个文件系统。需要文件系统的驱动才能访问解析到对应的数据
#阶段1和1.5都是为了阶段2做准备的。
CentOS6 Grub第二阶段的存放位置:/boot/grub
grub.conf:grub的关键配置文件,里面定义了内核存放的相关路径等内容
#配置文件格式
default:表示默认启动那个内核 #例如default=0表示默认第一个内核作为引导
timeout:在启动界面停留的时间
hidenmenu:隐藏的启动菜单,默认看不到的
tiele:启动界面显示的菜单项
root(hd#.#):表示boot分区所在的位置,#hd0.0--hd表示硬盘 0.0表示第一块硬盘的第一个分区
kerner: /PATH/TO/KERNEL_FILE--内核文件所在的位置(/vmlinux表示boot目录下的vmlinux这个文件) root=UUID=xxxx--表示利用内核,要加载的文件系统的根系统,系统硬盘真正的根(比如/dev/sda1这块硬盘挂载到根上面 那么加载的就是这个硬盘)
initrd:系统的一个辅助文件,是一个小型的linux文件系统,内核进入硬盘根的时候会借助它
bootloader是硬件和操作系统之间的一个媒介。硬件通过bootloader才能找到操作系统。
采用硬盘引导进入救援模式的方法
系统无法启动使用光盘的方式进入救援模式:
采用光盘启动(引导),进入rescue模式
#重启系统出现进度条的时候快速按ESC键,然后选择CD-ROM Dirver,然后选择Troubleshooting,选择Rescue a CentOS liux System,然后选择1继续,然后切换到/mnt/sysimage这个目录下操作。因为救援模式默认进入的根不是硬盘系统的根。而是ramdisk里的文件系统,并没有切换到本机硬盘上的“真正”文件系统
#正常启动的系统他不会挂载到/mnt/sysimage这个目录下的
链接:http://t.zoukankan.com/duzhaoqi-p-7327525.html
#chroot /mnt/sysimage #切换到真正的根目录下面
#grub-install /dev/sda #执行秀姑grub的命令
#sync #将缓存中的信息同步到硬盘
#exit #退出重启
#exit
Centos6的Grub修复方法
首先需要使用光盘引导进入救援模式
#grub信息被破坏的修复方法
使用grub-install来修复:grub-install --root-directory=DIR /dev/DISK
grub-install 磁盘名称 #安装grub到硬盘上,会自动找到整个硬盘的第一个扇区MBR的前446个字节。
#无法修复grub的阶段二所对应的配置文件,需要手动编写 /boot/grub/grub.conf这个配置文件
Centos6 修复grub的方法:
方法一: #无法修复/etc/grub/grub.conf这个文件
grub-install命令: grub-install 磁盘名称 #安装grub到硬盘上,会自动找到整个硬盘的第一个扇区MBR的前446个字节。
加载内核
grub加载linux内核后,通过内核加载硬盘的根,启动系统中的第一个进程init。
内核想要进入硬盘的根,需要文件系统驱动。因为根分区有自己的文件系统。
驱动的功能由内核提供,内核的驱动存放位置在/lib目录下,例如ext4的文件系统驱动:ext4.ko.所以要加载文件系统的驱动就需要进入根的文件系统,显然不行。
所以内核此时不是从这里面加载文件系统驱动,而是从GRUB配置文件中的initrd后面指定的文件里面加载的文件系统。(是一个小型的linux文件系统)
init进程启动以后就会通过以下顺序执行相关的配置文件来设置系统
(1)/etc/inittab配置文件:确定系统使用那个运行模式(runlevel)
CentOS的运行模式有7个,对应数字0--6
0:关机
6:重启
1:安全模式
3:字符模式
5:图形界面模式
(2)运行/etc/rc.d/rc.sysinit这个脚本。初始话系统的一些信息。
设置主机名
设置欢迎信息
加载对应的服务配置
设备的挂载
交换空间的准备
系统时钟等信息
(3)根据对应的运行模式执行对应的文件夹下面脚本:/etc/rcX.d/xxx
比如运行模式是3:就执行/etc/rc3.d/ 下的脚本。
/etc/rc3.d/下面的文件都是软链接,指向/sbin/init下面的脚本。
以K开头的文件:开机启动 K##:##运行次序;数字越小,越先运行;
以S开头的文件:开机不启动。S: S##:##运行次序;数字越小,越先运行;
CentOS6的服务管理工具
service:服务的开启和关闭
chkconfig:服务的开机启动等
service
service 服务 start|stop|restart
service --status-all
例如:service network start (networkCentOS8弃用了)
chkconfig
chkconfig 服务 on|off
rc.local文件
是一个开机启动文件,不属于任何运行模式。开机的时候所有的服务脚本都运行完成后才会执行他。
CentOS7以及后面的版本想用这个文件的话,需要手动添加可执行权限才会执行。
ubuntu默认没有这个文件,需要手动创建并更改权限才可以使用。
/etc/rc.local
/etc/rc.d/rc.local
#/etc/rc.local -> rc.d/rc.local rc.local是 rc.d/rc.local的一个软连接
正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向
了/etc/rc.d/rc.local脚本
想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中
/etc/rc.d/rc.local在指定运行级别脚本后运行
CentOS6 启动流程总结:
1.POST,设备加电自检(cpu、内存、硬盘、io设备等检查)
2.MBR引导找到GRUB
3.GRUB执行完成后加载内核,内核加载硬盘的根
4.加载系统第一个进程init,并按顺序执行以下配置文件和脚本。
/etc/inittab
/etc/rc.d/rc.sysinit
/etc/rcX.d/xxx
5.所有服务启动完成后执行rc.local这个脚本里面的内容。
6.终端启动,登录相关的配置和验证。
Linux的/proc和/sys目录
虚拟文件夹概念:
虚拟的文件夹,因为其数据内容是存放在内存中的,不是存放在硬盘中
/proc和/sys都是虚拟的文件夹
/proc
proc是进程(process)的缩写。这个目录文件里面存放的是进程的相关信息,把系统中的进程信息、内核状态放在proc中,是一个虚拟的文件夹,对应的数据信息是内存中的状态。
/proc/sys
这个目录文件里面的信息可以修改,可以通过这些配置来控制内核
sysctl 工具
sysctl:修改系统的内核参数
sysctl修改的参数是临时生效的,通过编写配置文件的方式实现持久化生效
#配置文件
/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf #主要存放在这里面,一般都在这个配置文件里面编写设置。
#格式:
和文件中的格式不一样,使用点(.)来隔开路径。/proc/sys不用写, 因为这个配置文件对应就是管理/proc/sys这个文件夹的
#常用参数:
-w 临时改变某个指定参数的值
-a 显示所有生效的系统参数
-p 从指定的文件加载系统参数
范例
禁止ping通本机:
[root@centos8 ~]#cat /etc/sysctl.d/test.conf
net.ipv4.icmp_echo_ignore_all=1
[root@centos8 ~]#sysctl -p /etc/sysctl.d/test.conf
清除缓存方法
echo 1|2|3 >/proc/sys/vm/drop_caches
/sys
/sys目录文件存放的是和硬件有关的一些信息,也是虚拟文件夹,不是真正的硬盘上的文件夹,对应的也是内存中的数据。
范例
新添加硬盘的识别
echo "- - -" > /sys/class/scsi_host/hostX/scan #X表示数字,从0开始的
内核模块管理
内核的组成部分:
kernel:内核核心,一般为bzImage,通常在/boot目录
kernel object:内核对象,一般放置于/lib/modules/VERSION-RELEASE/
辅助文件:ramdisk
内核版本查看:
uname -r
-r 显示VERSION-RELEASE
内核模块命令
lsmod
modprobe
lsmod:
显示内核已经装载的模块
显示的内容来自于: /proc/modules文件
范例:
[root@centos8 ~]#lsmod
Module Size Used by
uas 28672 0
usb_storage 73728 1 uas
nls_utf8 16384 0
isofs 45056 0 #显示:名称、大小,使用次数,被哪些模块依赖
modprobe:用于装载或者卸载内核模块
装载:modprobe 模块名
卸载: modprobe -r 模块名 # rmmod命令:卸载模块
systemd服务
从CentOS7开始,就使用systemd服务代替init作为系统启动的第一个进程。
systemd的特性:
服务并行启动
可以按照需要启动对应守护进行
自动管理服务的依赖关系
Unit(单元)的概念
使用systemctl管理工具
systemd的核心概念Unit(单元)
systemd把服务都笼统称为Unit(单元),通过配置文件进行标识和配置。
Unit存放的位置:/lib/systemd/system
systemd的Unit类型:
(1)service:类似于Centos6里面的服务脚本。文件扩招名为.service
(2)target:类似于Centos6里面的运行级别。文件扩展名为.target
(3)socket:义进程间通信用的socket文件。文件扩展名为.socket
#socket的理解
socket翻译过来是套接字,原意为插座、插孔。
socket可以理解为:ip地址+端口+协议类型
例如:一台笔记本电脑(server),一个耳机(client),一个u盘(clinet),一个鼠标(client),
socket就可以想象成笔记本电脑上的usb接口、音频接口。
耳机需要连接到电脑听歌,需要用到音频接口,u盘需要链接电脑拷贝资料,需要用到usb接口。
socket就负责帮助这些外接设备找到笔记本电脑中相对应的驱动以便他们完成自己的工作,反之也是这样。
socket就是位于两个层面(传输层和应用层)中间的一个参与者,服务于两方。
http是应用层协议,解决如何包装数据,TCP/IP协议是传输层协议,主要解决数据怎么在网络中传输。
一个网络协议 + 一个ip + 一个端口号,就组成了一个socket
原文链接:https://blog.csdn.net/EJEEMT/article/details/90212312
Unit的配置文件
/usr/lib/systemd/system #每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
/lib/systemd/system #ubutun的对应目录
/run/systemd/system #系统执行过程中所产生的服务脚本,比上面目录优先运行
/etc/systemd/system #管理员建立的执行脚本,类似于/etc/rcN.d/Sxx的功能,比上面目录优先运行
#/etc/systemd/system:系统管理员和用户使用
#/usr/lib/systemd/system:发行版打包者使用
systemd的service
service这种unit类型的Unit文件格式
由三部分组成:
Unit:定义的是这个单元的相关信息
Service:定义的是这个服务的相关信息
Install:定义的是服务启动和关闭的一些选项
Unit段的常用选项
Description:unit的描述信息
After:当前unit在那些unit后面启动,其功能与Before相反
Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
Wants:依赖到的其它units,弱依赖
Conflicts:定义units间的冲突关系
Service段常用选项
Type:定义启动类型
EnvironmentFile:环境配置文件
simple:默认值,后台启动常驻于内存
ExecStart:启动unit要运行命令或脚本的绝对路径
ExecStartPre: ExecStart前运行
ExecStartPost: ExecStart后运行
ExecStop:停止unit要运行的命令或脚本
Restart:当设定Restart=1 时,服务意外终止会再次自动启动
RestartSec: 重启等待时间,默认100ms
PrivateTmp:设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录
Install段常用选项
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖,强依赖
WantedBy:被哪些units所依赖,弱依赖
Also:安装本服务的时候还要安装别的相关服务
daemon-reload
当创建或者更改了硬盘上的unit的相关文件以后,需要使用daemon-reload加载到系统的内存中才会生效。
或者重启系统也能生效
范例: 自定义service的unit文件
[root@centos8 ~]#vim /lib/systemd/system/hello.service
[Unit]
Description=Hello World
[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/bin/kill sh
[Install]
WantedBy=multi-user.target
systemd的target
运行级别:不同的运行级别是不同的服务组合而来的结果。
systemd的target就类似于CentOS6的runlevel
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#graphical.target是基于multi-user.target来的
6 ==> runlevel6.target-> reboot.target #
systemd的管理工具
systemctl是systemd单元(unit)的管理工具
格式:systemctl COMMAND unit_name
start|stop|restart|status
mask:禁用服务
umask:取消禁用的服务
enable:设置开机启动
disable:取消开机启动
is-active:查看unit是否激活
is-enable:查看unit是否开机启动
list-units:查看所有的unit
范例
启动一个服务:
systemctl start unit_name.service #后缀可以省略不屑
设置服务开机重启并立马启动:
systemctl enable unit_name.service --now
查看系统中类型为service的unit
systemctl list-unit --type service --all
service服务的状态
loaded Unit配置文件已处理
active(running) 一次或多次持续处理的运行
active(exited) 成功完成一次性的配置
active(waiting) 运行中,等待一个事件
inactive 不运行
enabled 开机启动
disabled 开机不启动
static 开机不启动,但可被另一个启用的服务激活
indirect 重定向到别处
修改运行级别
通过命令的方式修改
通过开机启动的时候修改
通过命令的方式来进行修改:
systemctl isolate name.target #效果等同于:init X
通过启动界面更改内核的参数修改
启动时,到启动菜单,按e键,找到在linux 开头的行后添加systemd.unit=desired.target
#centos7是linux16开头
例如:systemd.unit=emergency.target
systemd.unit=rescue.target
CentOS7及后续版本的启动流程
1.POST:系统加电自检并找到MBR
2.MBR引导并加载GRUB
3.GRUB引导内核并加载硬盘文件系统上的根系统
4.启动系统的第一个进程systemd进程
5.执行systemd对应的unit(target这种类型的)
破解 CentOS 7和8的 root 密码
方法一:
启动时任意键暂停启动 #进入内核启动的界面
按e键进入编辑模式
将光标移动linux 开始的行,添加内核参数 rd.break #rd.break暂停正常的启动,进入临时的救援模式
按ctrl-x启动
mount –o remount,rw /sysroot #硬盘的根文件系统是以只读的形式挂载到/sysroot上的,使用mount命令可以看。所以需要重新挂载
chroot /sysroot #改变根目录为我们硬盘文件的根目录
passwd root #输入密码
#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
touch /.autorelabel #重新打selinux的标签
exit
reboot
方法二:
启动时任意键暂停启动,出现内核启动的界面
按e键进入编辑模式
将光标移动linux 开始的行,改为 rw init=/sysroot/bin/sh
按ctrl-x启动
chroot /sysroot
passwd root
#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
touch /.autorelabel
exit
reboot
修复 GRUB2的方法
GRUB2:CentOS 7,8及ubuntu1804都使用
GRUB2的主要配置文件:
/boot/grub2/grub.cfg
修复GRUB配置文件的方法:
法一:grub2-mkconfig > /boot/grub2/grub.cfg
法二:grub2-mkconfig -o /boot/grub2/grub.cfg -o:表示他的标准输出
修复grub:
grub2-install /dev/sda #BIOS环境
grub2-install #UEFI环境
Linux 启动流程及相关知识的更多相关文章
- Linux课程---8、Linux启动流程
Linux课程---8.Linux启动流程 一.总结 一句话总结: grub启动引导界面(比如装了多系统,选择系统),找到linux内核 启动init程序,加载各种驱动 1.进入grub界面选择相应的 ...
- Linux启动流程CentOS6和7的区别
目 录 Linux启动流程 I 第1章 CentOS6启动流程 1 1.1 BIOS 1 1.2 MBR 1 1.3 GRUB 1 1.4 kernel(加载内核) ...
- 20、linux启动流程和救援模式
1.Linux启动流程 2.Linux运行级别 1.什么是运行级别,运行级别就是操作系统当前正在运行的功能级别 System V init运行级别 systemd目标名称 作用 0 runlevel0 ...
- 浅析Linux启动流程
Linux系统启动流程 Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程.了解 Linux 的启动过程,有助于了解 Linux 系统的结构,也对系统的排错有很大的帮助 ...
- linux启动流程及自定义gurb
linux 启动流程 POST BIOS(boot sequence) 所选择的启动设备次序的MBR中是否有引导程序, ----> MBR(bootloader) 提供内核列表 -------& ...
- linux启动流程
看了深入理解linux内核一书的最后对linux启动流程的介绍,下面就把我能理解的写一下吧: bios(硬件加电自检POST,寻找第一个启动设备) the boot loader(可以从硬盘启动也可以 ...
- Linux启动流程详解
在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...
- Linux启动流程详解【转载】
在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...
- 记录Linux启动流程的工具bootchart
/********************************************************************* * Author : Samson * Date ...
随机推荐
- Docker系列教程03-Docker私有仓库搭建(registry)
简介 仓库(Repository)是集中存放镜像的地方,又分为公共镜像和私有仓库. 当我们执行docker pull xxx的时候,它实际上是从registry.docker.com这个地址去查找,这 ...
- muduo源码分析之TcpServer模块
这次我们开始muduo源代码的实际编写,首先我们知道muduo是LT模式,Reactor模式,下图为Reactor模式的流程图[来源1] 然后我们来看下muduo的整体架构[来源1] 首先muduo有 ...
- 初始C语言作业一
1.下面哪个不是C语言内置的数据类型:( ) A.char B.double C.struct Stu D.short 解析: C语言中内置类型包括 char //字符数据类型 short //短整型 ...
- Glide源码解析二---into方法
转载请标明出处,维权必究: https://www.cnblogs.com/tangZH/p/12543154.html Glide作为一个强大的图片加载框架,已经被android官方使用,所以,明白 ...
- Android 12(S) 图像显示系统 - GraphicBuffer同步机制 - Fence
必读: Android 12(S) 图像显示系统 - 开篇 一.前言 前面的文章中讲解Android BufferQueue的机制时,有遇到过Fence,但没有具体讲解.这篇文章,就针对Fence这种 ...
- 好客租房3-React的基本使用
2.1React的安装 安装命令:npm i react react-dom react 包是核心,提供创建元素,组件等功能 react-dom包提供DOM相关功能等 2.2React的使用 1引入r ...
- 课堂测试——HDFS操作
要求: 编程实现以下功能,并利用Hadoop提供的Shell命令完成相同任务: 向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件: ...
- 学习Linux须知1.0之Linux相关概念、工具(yum、vim)、防火墙等
温馨提示:重点掌握的前面都标注了 ☆ 一.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应 ...
- 关于Redis的问题探讨(二):Range方法返回的对象是LinkeHashMap以及转换办法
上一篇:关于Redis的问题探讨(一):为何存放集合偏向于转String后存放而非直接存 在上篇中发现了一个问题,明明存的是一个对象的集合,为什么通过range方法返回的却是LinkeHashMap ...
- Vben Admin 源码学习:状态管理-错误日志
0x00 前言 本文将对 Vue-Vben-Admin 的状态管理实现源码进行分析解读,耐心读完,相信您一定会有所收获! 0x01 errorLog.ts 错误日志 文件 src\store\modu ...