linux系统引导流程

时间:2022-05-01 05:14:00

linux系统引导流程

1.固件:硬件和软件结合。加电自检是我们按下电源会检测硬件像cpu、内存、网卡等信息。(从硬件层次检测硬件是否可用)

  • 固件设置实例:设置时间

软件时间和硬件时间:

[root@VM_0_12_centos ~]# hwclock   #硬件时间
^[[AWed Mar :: PM CST -0.811743 seconds
[root@VM_0_12_centos ~]# date #软件时间
Wed Mar :: CST

hwclock两个重要参数:

 -s, --hctosys        set the system time from the hardware clock
-w, --systohc set the hardware clock from the current system time
 hwclock  --hctosys   #以硬件时钟为标准修改软件时钟

hwclock  --systohc  #以软件时钟为标准修改硬件时钟

加入两个时钟都不正确:

修改软件时钟:

NAME
date - print or set the system date and time SYNOPSIS
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] #修改软件时钟

修改硬件时钟:

hwclocl --set --date="9/22/96 16:45:35"

2.检测完之后跳转到mbr(主引导记录)里面读取一个很重要的数据bootloader(后续的所有工作都是bootloader完成)和partition table、magic number

linux系统引导流程

grub的配置:

[root@VM_0_12_centos ~]# grep kernel -n /boot/grub2/grub.cfg
: linux16 /boot/vmlinuz-3.10.-514.26..el7.x86_64 root=/dev/vda1 ro crash
kernel=auto console=ttyS0 console=tty0 panic= LANG=C
: linux16 /boot/vmlinuz-3.10.-.el7.x86_64 root=UUID=49f819fd-e56d-48a4
-86d3-7ebe0a68ec88 ro crashkernel=auto console=ttyS0 console=tty0 panic=
: linux16 /boot/vmlinuz--rescue-f9d400c5e1e8c3a8209e990d887d4ac1 root=UUI
D=49f819fd-e56d-48a4-86d3-7ebe0a68ec88 ro crashkernel=auto console=ttyS0 console
=tty0 panic=

3. bootloader载入内核:

内核的概念: (linux是一堆源码,在开机的时候会看到booting the kernel,从软件层次检测硬件是否可用)

  主要作用就两个:驱动硬件(所谓驱动就是系统识别硬件,让操作系统认识硬件,从软件识别硬件是否可用)、启动完init进程其任务就完成了。

linux系统引导流程

4.init进程也是linux启动的第一个进程;

init进程的任务:

linux系统引导流程

解释:

  init进程的pid为1,其PPID为0,PPID就是父进程ID,其父进程是内核任务调度器。

  linux是一个实时系统就是将处理时间按时间分配,如果你这次时间没有处理完下次继续给你分配时间的时候再处理,这就需要一个CPU时间调度器,也就是PID为0的内核调度器。

  linux中由一个进程派生出的进程成为子进程。如果一个进程的父进程死了,其子进程也不能存在。linux中父进程死掉子进程存活的进程成为孤儿进程,在linux中不允许孤儿进程的存在。linux扫描到存在孤儿进程的时候会自动将这个孤儿进程的父进程设置为init进程(PID为1的进程)。

  子进程死亡,父进程应该切换和子进程之间的联系,这个子进程成为僵尸进程,J进程,这种进程也不允许存在。

5 读取/etc/inittab文件

linux系统引导流程

inittab定义linux的7个运行级别

0:   关机状态(系统默认运行级别不能设为0,否则不能正常启动)

1:  单用户模式(类似于windows的安全模式),只允许root登录,用于系统维护,禁止远程登陆

2.  多用户模式。只是没有NFS服务(网路文件服务,实现文件共享),

3.  多用户模式,有NFS服务

4.  系统未使用,保留,可以让用户自定义一些启动程序。

5.  X11控制台,登陆后进入图形GUI模式。与3一样是多用户模式,只是有图像界面。

6. 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。

运行级别的切换:

1.查看运行级别:  (如果修改过应该是S   3)

[root@iz2ze46xi6pjjj69ailg9lz ~]# runlevel
N

2.切换运行级别:

init [0123456Ss]   或者  telinit [0123456Ss]

实际上telnet是init的一个软连接:

[root@iz2ze46xi6pjjj69ailg9lz ~]# ll `which init`
lrwxrwxrwx root root Aug /usr/sbin/init -> ../lib/systemd/systemd

例如:

telinit 3  #运行级别切换到3

另外:在centos7中,/etc/inittab现在的内容是:

# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main ta
rgets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#

 如果改变默认的运行级别只需要放开注解就可以。

3.   inittab文件剖析:

在inittab中,所有条目采用如下格式:

id:runlevel:action:process

id:标识符,一般为两位字母或者数字(长度为1-4位即可)

run-levels:指定运行级别,可以指定多个

action:指定运行状态

process:指定要运行的脚本和命令(前面三个是process的铺垫)

action常用取值:

initdefault    指定系统常用级别

sysinit   系统启动执行process中指定的命令

wait:执行process中的指令,并等其他指令结束再运行其他命令

once:执行process中的指令,不等其结束

Ctrlaltdel:按下ctrl+AltDel时执行process的指令。

4.   inittab重要的两个条目:

linux系统引导流程

  rc.sysinit是一个标准的shell脚本,如果我们想开机不管哪个运行级别都执行一段脚本我们可以把脚本或者命令放在/etc/rc.d/rc.sysinit里面。

  inittab记录了默认级别、必须启动的脚本、电源管理、6个终端等信息。

接下来系统会照着inittab指定的运行级别的目录下的脚本:(/etc/rc.d/rc[0-6].d目录分别对应着运行级别的目录):

假入系统的缺省运行级别为3,系统会执行/etc/rc./rc3.d/目录下的脚本;

[root@iz2ze46xi6pjjj69ailg9lz rc3.d]# ll
total
lrwxrwxrwx. root root Aug K50netconsole -> ../init.d/netconsole
lrwxrwxrwx root root Mar : S01acpidtd -> /etc/init.d/acpidtd
lrwxrwxrwx root root Mar : S01wipefs -> /etc/init.d/wipefs
lrwxrwxrwx. root root Aug S10network -> ../init.d/network
lrwxrwxrwx root root Sep S20cloudmonitor -> ../init.d/cloudmonito
r
lrwxrwxrwx root root Sep S50aegis -> ../init.d/aegis
lrwxrwxrwx root root Oct : S80aegis -> /etc/init.d/aegis
lrwxrwxrwx root root Sep S98agentwatch -> ../init.d/agentwatch
lrwxrwxrwx root root Nov : S99tomcat -> ../init.d/tomcat

 /etc/rc./rc3.d/下的脚本命名规则:(我们发现下面的脚本都是软连接,类似于windows的快捷方式)

S99tomcat
  S代表Start,启动的时候执行脚本,开启服务(只有大写S开会启动,小写也不会启动),执行脚本的时候linux会传入一个start参数,
  K代表kill: 关闭服务,执行脚本会传入一个stop参数
    
  99代表启动级别:数字越小越优先启动,如果级别相同的话会按照创建顺序执行
  tomcat:是服务名字,这个不重要

如果我们希望一个脚本开机不启动可以通过删除该运行级别下的脚本或者将脚本重新命名,不以S开头则不会启动。

[root@iz2ze46xi6pjjj69ailg9lz rc3.d]# mv ./S99tomcat s99tomcat #将以S开头的改为以小写s开头,开机也不会启动
[root@iz2ze46xi6pjjj69ailg9lz rc3.d]# ll
total
lrwxrwxrwx. root root Aug K50netconsole -> ../init.d/netconsole
lrwxrwxrwx root root Mar : S01acpidtd -> /etc/init.d/acpidtd
lrwxrwxrwx root root Mar : S01wipefs -> /etc/init.d/wipefs
lrwxrwxrwx. root root Aug S10network -> ../init.d/network
lrwxrwxrwx root root Sep S20cloudmonitor -> ../init.d/cloudmonito
r
lrwxrwxrwx root root Sep S50aegis -> ../init.d/aegis
lrwxrwxrwx root root Oct : S80aegis -> /etc/init.d/aegis
lrwxrwxrwx root root Sep S98agentwatch -> ../init.d/agentwatch
lrwxrwxrwx root root Nov : s99tomcat -> ../init.d/tomcat

注意:     /etc/rc[0-6].d是/etc/rc.d/rc[0-6].d的软连接:    /etc/init.d是/etc/rc.d/init.d的一个软连接

[root@iz2ze46xi6pjjj69ailg9lz etc]# ll | grep rc
-rw-r--r--. root root Nov bashrc
-rw-r--r--. root root Nov csh.cshrc
lrwxrwxrwx root root Aug init.d -> rc.d/init.d
-rw-r--r--. root root Jun inputrc
-rw-r--r-- root root Dec mail.rc
lrwxrwxrwx root root Aug rc0.d -> rc.d/rc0.d
lrwxrwxrwx root root Aug rc1.d -> rc.d/rc1.d
lrwxrwxrwx root root Aug rc2.d -> rc.d/rc2.d
lrwxrwxrwx root root Aug rc3.d -> rc.d/rc3.d
lrwxrwxrwx root root Aug rc4.d -> rc.d/rc4.d
lrwxrwxrwx root root Aug rc5.d -> rc.d/rc5.d
lrwxrwxrwx root root Aug rc6.d -> rc.d/rc6.d
drwxr-xr-x. root root Aug rc.d
lrwxrwxrwx root root Aug rc.local -> rc.d/rc.local
-rw-r--r-- root root Dec vimrc
-rw-r--r-- root root Dec virc
-rw-r--r-- root root Nov wgetrc

 5.如果我们设置一个自启动服务程序:

ln -s

chkconfig命令

ntsysv

6.如果系统出现错误或者服务启动失败,我们如何查看:

(1)查看硬件检测的信息

dmesg

(2)如果是服务启动失败,我们可以查看linux的日志文件。(linux下的所有的日志文件都记录在:/var/log目录下)

[root@VM_0_12_centos log]# pwd
/var/log
[root@VM_0_12_centos log]# ll
total
drwxr-xr-x. root root Apr anaconda
drwxr-x---. root root Mar : audit
-rw-r--r-- root root Mar : boot.log
-rw-------. root utmp Mar : btmp
drwxr-xr-x. chrony chrony Nov chrony
-rw------- root root Mar : cron
-rw-r--r-- root root Mar : dmesg
-rw-r--r-- root root Mar : dmesg.old
-rw------- root root Mar : grubby
drwxr-sr-x root systemd-journal Mar : journal
-rw-r--r--. root root Mar : lastlog
-rw-------. root root Mar : maillog
-rw-------. root root Mar : messages
drwxr-xr-x. ntp ntp Apr ntpstats
drwx------. root root Jun ppp
-rw------- root root Mar : secure
-rw------- root root Mar : secure-
.gz
-rw------- root root Mar : secure-
.gz
-rw-------. root root Mar : spooler
-rw-------. root root Mar : tallylog
drwxr-xr-x. root root Apr tuned
-rw-r--r-- root root Mar : wpa_supplicant.log
-rw-rw-r--. root utmp Mar : wtmp
-rw------- root root Mar : yum.log

总结:

  (1)fireware(固件)开机自检,检验硬件设备是否正常,如果正常则读取硬盘上面存放数据的第一个位置MBR(Master Boot Record)里面的bootloader

  (2)BootLoader里面最重要的是存放了一个自举程序(GRUB)

  (3)GRUB 载入内核(kernel)   驱动硬件、启动init进程

  (4)init进程读取/etc/inittab,

    首先执行脚本:/etc/rc.d/rc.sysinit   (不管任何运行级别都会执行这个脚本)

    然后根据initdefault查到默认的运行级别并且去/etc/rc.d/rcN.d下执行脚本,以S开头的脚本是启动服务的脚本,以K开头是关闭服务的脚本

  (5)最后会建立终端,等待用户登录。显示user、name。