Linux之开机启动流程详解

本文详细介绍了电脑启动过程中涉及的关键步骤,包括POST硬件检测、BIOS自检、MBR引导、grub加载内核、systemd启动服务以及运行级别的概念和作用。在CentOS7系统中,服务的开机启动管理由systemd负责,通过systemctl可以管理服务的启动状态。文章还提及了如何查看和管理服务是否开机启动,以及/etc/rc.local和/etc/fstab文件的作用。
摘要由CSDN通过智能技术生成


开机启动流程图

POST——>主板检测基本硬件是否存在————(POST,Power On Self Test)

  • 那电脑里有哪些基本的硬件?————》主板(motherboard)、cpu、内存、磁盘、网卡、显卡、声卡、电源、鼠标、键盘、显示器等

BIOS程序去完成检测————"Basic Input Output System"基本输入输出系统

BIOS是个人电脑启动时加载的第一个软件。
它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。此外,BIOS还向作业系统提供一些系统参数。系统硬件的变化是由BIOS隐藏,程序使用BIOS功能而不是直接控制硬件。现代作业系统会忽略BIOS提供的抽象层并直接控制硬件组件。

rom芯片:read only memory --》只读的存储器
ram芯片:随机存取存储器(random access memory的缩写)–》可读可写 -->停电内存条里的数据都会丢失

CMOS:是一个存储BIOS参数配置的芯片,可以读写,不是只读的。
BIOS是一个程序会读取CMOS芯片里的参数,了解cpu的配置,时间的配置,启动顺序的配置、密码等


进入BIOS程序方式:

台式电脑:
开机按DEL或者delete键进入
笔记本电脑:
不同的产商不同


BIOS程序可以设置密码,这样进入BIOS时会要求输入密码,防止其他人修改配置,如修改启动顺序从而进入系统偷取数据(但密码自己得记得,别太复杂!)

  • 然而,设置密码并非万无一失,一般的主机取下主板电池后,BIOS的数据会清空重置,密码自然就失效了;
  • 再者,还可以通过拆卸硬盘直接窃取数据(所以电脑丢了就真寄了!)

Boot检查启动顺序:

boot:引导、启动
启动顺序:
BIOS–》boot
第1引导顺序:hard drive 硬盘
第2引导顺序:cdrom 光驱 ----》安装系统
第3引导顺序:removable device 可移动设备–》u盘,移动硬盘 --》安装系统
第4引导顺序:Network --》从网络启动–》网络中安装服务器启动 --》安装

在硬盘中的MBR(主引导记录,第0磁道第1扇区,占512字节)读取grup引导程序(grup是Linux里的启动程序)

grup2读取/boot分区里的驱动,加载vmlinuz(内核程序文件)、initramfs(辅助内核的临时根文件系统的镜像文件)到内存 --ram 随机访问存储器

[root@zh-ali ~]# cd /boot
[root@zh-ali boot]# ls
# kdump用于导出内核数据,rescue用于营救模式,正常使用initramfs-3.10.0-1160.el7.x86_64.img
config-3.10.0-1160.83.1.el7.x86_64  initramfs-3.10.0-1160.83.1.el7.x86_64.img       System.map-3.10.0-1160.83.1.el7.x86_64
config-3.10.0-1160.el7.x86_64     initramfs-3.10.0-1160.83.1.el7.x86_64kdump.img  System.map-3.10.0-1160.el7.x86_64
efi                               initramfs-3.10.0-1160.el7.x86_64.img            vmlinuz-0-rescue-f5de8969ed5a461082ecdf253cb84a03
grub                              initramfs-3.10.0-1160.el7.x86_64kdump.img       vmlinuz-3.10.0-1160.83.1.el7.x86_64
grub2                             symvers-3.10.0-1160.83.1.el7.x86_64.gz          vmlinuz-3.10.0-1160.el7.x86_64
initramfs-0-rescue-f5de8969ed5a461082ecdf253cb84a03.img  symvers-3.10.0-1160.el7.x86_64.gz
# 查看内核映像初始化文件,其实本质上就是一个临时的根文件系统,里面包含了很多的目录和文件、程序
[root@server boot]# lsinitrd initramfs-3.10.0-1160.el7.x86_64.img |more

启动systemd

systemd 第一个启动的应用程序

启动对应运行级别的各种服务

运行级别

运行级别: 是比较老的概念–》在centos7里已经淘汰了
不同的级别里会启动不同的程序–》起到一个分类的作用
0 关机 init 0
1 单用户模式
2 多用户模式,不能使用网络里的NFS功能
3 完全多用户模式,能使用网络和同时很多人登录,登录进入系统是字符界面 init 3 -->一般情况下都是运行级别3
4 没有启用
5 图形界面模式 ,能使用网络和同时很多人登录,登录进入系统是图形界面 init 5
6 重启 init 6

# 查看当前的运行级别
[root@server opt]# runlevel
N 3
# N 表示之前没有其他运行级别,3 表示当前的运行级别

CentOS7保留了多用户和图形界面两种模式:

# 在/etc/inittab文件进行了说明
[root@server system]# cat /etc/inittab
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
---
# 可以通过命令查看当前所使用的运行级别和设置默认运行级别
[root@zh-ali boot]# systemctl get-default
multi-user.target
[root@zh-ali boot]# systemctl set-default graphical.target

所谓、多用户运行级别、图形运行级别都只是一些软链接的集合
设置默认运行级别时也只是修改其指向的模式目录:

[root@zh-ali boot]# ll /etc/systemd/system/
total 56
-rw-r--r--  1 root root  265 May  3 20:57 aegis.service
-rw-r--r--  1 root root  492 Apr 11 20:20 aliyun.service
-rw-r--r--  1 root root  214 Apr 11 20:20 AssistDaemon.service
drwxr-xr-x. 2 root root 4096 Feb  8 10:16 basic.target.wants
drwxr-xr-x  2 root root 4096 Feb  8 10:35 cloud-init.target.wants
lrwxrwxrwx. 1 root root   37 Feb  8 10:18 default.target -> /lib/systemd/system/multi-user.target # 默认运行级别指向多用户模式
drwxr-xr-x. 2 root root 4096 Feb  8 10:15 default.target.wants
drwxr-xr-x. 2 root root 4096 Feb  8 10:15 getty.target.wants
drwxr-xr-x  2 root root 4096 May  3 20:57 graphical.target.wants
drwxr-xr-x. 2 root root 4096 Feb  8 10:15 local-fs.target.wants
drwxr-xr-x. 2 root root 4096 May  3 20:57 multi-user.target.wants
drwxr-xr-x  2 root root 4096 Feb  8 10:26 remote-fs.target.wants
drwxr-xr-x  2 root root 4096 Feb  8 10:26 sockets.target.wants
drwxr-xr-x. 2 root root 4096 Feb  8 10:15 sysinit.target.wants
drwxr-xr-x. 2 root root 4096 Feb  8 10:15 system-update.target.wants

当最小化安装时,没有图形化界面的运行级别,也就没有graphical.target.wants目录

多用户运行级别目录中也只是一些软链接,当启动该运行级别时,会启动该目录下的所有服务:

[root@zh-ali system]# ll multi-user.target.wants/
total 0
lrwxrwxrwx  1 root root 33 May  3 20:57 aegis.service -> /etc/systemd/system/aegis.service
lrwxrwxrwx  1 root root 34 Feb  8 10:35 aliyun.service -> /etc/systemd/system/aliyun.service
lrwxrwxrwx  1 root root 40 Apr 11 20:20 AssistDaemon.service -> /etc/systemd/system/AssistDaemon.service
lrwxrwxrwx  1 root root 35 Feb  8 10:24 atd.service -> /usr/lib/systemd/system/atd.service
lrwxrwxrwx. 1 root root 38 Feb  8 10:16 auditd.service -> /usr/lib/systemd/system/auditd.service
lrwxrwxrwx. 1 root root 39 Feb  8 10:16 chronyd.service -> /usr/lib/systemd/system/chronyd.service
lrwxrwxrwx. 1 root root 37 Feb  8 10:15 crond.service -> /usr/lib/systemd/system/crond.service
lrwxrwxrwx  1 root root 38 Feb  8 10:35 ecs_mq.service -> /usr/lib/systemd/system/ecs_mq.service
lrwxrwxrwx  1 root root 41 Feb  8 10:26 nfs-client.target -> /usr/lib/systemd/system/nfs-client.target
lrwxrwxrwx. 1 root root 39 Feb  8 10:16 postfix.service -> /usr/lib/systemd/system/postfix.service
lrwxrwxrwx. 1 root root 40 Feb  8 10:15 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target
lrwxrwxrwx. 1 root root 46 Feb  8 10:15 rhel-configure.service -> /usr/lib/systemd/system/rhel-configure.service
lrwxrwxrwx  1 root root 39 Feb  8 10:26 rpcbind.service -> /usr/lib/systemd/system/rpcbind.service
lrwxrwxrwx. 1 root root 39 Feb  8 10:16 rsyslog.service -> /usr/lib/systemd/system/rsyslog.service
lrwxrwxrwx. 1 root root 36 Feb  8 10:16 sshd.service -> /usr/lib/systemd/system/sshd.service
lrwxrwxrwx  1 root root 39 Feb  8 10:20 sysstat.service -> /usr/lib/systemd/system/sysstat.service
lrwxrwxrwx. 1 root root 37 Feb  8 10:16 tuned.service -> /usr/lib/systemd/system/tuned.service

因此所谓不同运行级别就是开机启动的服务有所不同罢了

当禁用一个服务开机自启时,其实也就是去除了该目录中对应服务的软链接:

[root@zh-ali system]# systemctl disable sshd
Removed symlink /etc/systemd/system/multi-user.target.wants/sshd.service. # 可以看出只是去除了多用户模式目录下的sshd服务的软链接
[root@zh-ali system]# systemctl enable sshd
Created symlink from /etc/systemd/system/multi-user.target.wants/sshd.service to /usr/lib/systemd/system/sshd.service.

systemctl

systemctl就是给systemd传参的

.service文件是做什么使用的?

其实就是告诉systemd这个服务是干什么的,如何启动,如何停止,如何重启

[root@zh-ali multi-user.target.wants]# cat sshd.service 
[Unit] 			# --》对sshd这个服务的介绍   一个服务就是一个单元
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]      	# --》对这个服务如何启动,如何停止,如何重启等进行了定义
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

一般通过yum安装的程序都带有.service文件,可以直接通过systemctl进行操作
但是编译安装的程序,没有service文件,需要我们自己手工的去新建一个service文件,存放到multi-user.target.wants目录下,就可以使用systemctl start 方式启动

如何知道一个服务开机是否会启动?

# 方法一
[root@zh-ali multi-user.target.wants]# systemctl list-unit-files
UNIT FILE                                     STATE   
proc-sys-fs-binfmt_misc.automount             static  
dev-hugepages.mount                           static  
dev-mqueue.mount                              static  
proc-fs-nfsd.mount                            static  
proc-sys-fs-binfmt_misc.mount                 static  
sys-fs-fuse-connections.mount                 static  
sys-kernel-config.mount                       static  
sys-kernel-debug.mount                        static  
tmp.mount                                     disabled
var-lib-nfs-rpc_pipefs.mount                  static  
brandbot.path                                 disabled	# 表示不会自启
systemd-ask-password-console.path             static  	# 表示被其它服务依赖
systemd-ask-password-plymouth.path            static  
systemd-ask-password-wall.path                static  
session-4789.scope                            static  
aegis.service                                 enabled 	# enable表示开机自启
aliyun.service                                enabled 
……
# 方法二
[root@zh-ali multi-user.target.wants]# service sshd status
Redirecting to /bin/systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)	# 这里显示为enable即开机自启
   Active: active (running) since Wed 2023-05-03 20:57:50 CST; 3 weeks 6 days ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 1108 (sshd)
   CGroup: /system.slice/sshd.service
           └─1108 /usr/sbin/sshd -D

加载/etc/rc.local和/etc/fstab文件

rc.local开机自动执行其中的命令,通过chmod +x /etc/rc.d/rc.local生效

fstab开机自动挂载相应分区,/etc/fstab文件是告诉linux系统,挂载磁盘里的其他分区,这样用户可以使用这个磁盘的所有分区的数据了,读取文件

fstab加载真正的根文件系统,initramfs是临时文件系统

加载login程序

根据/etc/passwd和/etc/shadow文件检测用户名和密码是否正确

登录终端

登录的时候,linux系统给我们提供了6个登录终端

[root@server ~]# w
 16:40:23 up 18:36,  4 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      145月23 47.00s  0.27s  0.27s -bash
root     pts/1    192.168.223.1    14:59    7.00s  0.50s  0.00s w
root     tty2                      16:39   23.00s  0.02s  0.02s -bash
root     tty3                      16:40   15.00s  0.01s  0.01s -bash
[root@server ~]#

# TTY 表示用户从哪里登录的,使用的终端的类型
# 	terminate type -->  TTY
# 直接可以使用的终端有6个
# 本地通过 ctrl+alt+F1~F6 来切换终端
tty1  # 直接登录linux系统的第1个终端  ctrl+alt+F1
tty2  # ctrl+alt+F2,linux系统里自带的终端,最正宗的
……
tty6

# pts 是模拟器模拟出来的终端(伪终端),例如:xshell 远程登录工具模拟出来的
pts/0
pts/1
pts/2

运行用户家目录下的环境变量初始化文件

~/.bashrc ~/.bash_profile /etc/bashrc /etc/profile等文件的加载,这里涉及到bash的初始化,这里就不详细展开了,只简单说明一下它们的作用,感兴趣的小伙伴可以自行查阅资料

/etc/profile:配置全局环境变量,影响所有用户
~/.bash_profile :配置个人环境,影响一个用户

/etc/bashrc :配置全局的别名或者shell选项,影响所有用户
~/.bashrc :配置个人别名或者shell选项,影响一个用户

出现提示符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值