linux运维零基础学习教程:Linux系统启动原理及故障排除

全套学习资料移步至公众号【学神来啦】

本节所讲内容:

17.1  centos6系统启动过程及相关配置文件

17.2  centos8系统启动过程及相关配置文件

17.1  centos6系统启动过程及相关配置文件

17.1.1  centos6系统启动过程(了解)

1. 加载 BIOS(传统BIOS) 的硬件信息,根据设定取得第一个可开机引导设置,如:光驱,硬盘,网络,USB。(shift++调整顺序)

2. 如果是硬盘为第一引导设备,读取硬盘中 MBR 主引导扇区中的 boot Loader 就是 grub引导

GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。

MBR的硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。

为什么MBR分区表,只能分4个主分区?  

注:磁盘默认一个扇区大小为:512字节。MBR由以下3部分组成:

第一部分是:主引导程序(boot loader)占446个字节。主引导程序,它负责从活动分区中装载,并运行系统引导程序。

第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。每个分区表项长16个字节,16个字节来记录一个分区的信息,16*4=64字节。为分区项1、分区项2、分区项3、分区项4。64个字节,4个分区表项,每个表项占用16个字节,(这就是为什么MBR分区体系只能分成4个区【我们平时看到的分区一般可以从26个字母中选取任意多个当做分区标识(多于4个),这是因为那些分区是逻辑分区,这里的4个分区指的是主分区和扩展分区的数目,而逻辑分区是在扩展分区中划分出来的,也叫做二级、三级扩展分区。】

第三部分是MBR有效标识位,占2个字节,固定为55AA。如果这个标志位0x55AA,就认为这个是MBR。55AA作为可引导扇区的结束标志位。

所以:16*4+446+2=512

[root@xuegod63 ~]# dd if=/dev/sda of=mbr bs=1 count=512

[root@xuegod63 ~]# hexdump -C mbr   

#hexdump主要用来查看二进制文件的16进制编码

    -C:输出规范的十六进制和ASCII码

3. 依据 主引导程序(grub) 的设定加载 Kernel到内存中运行 ,Kernel 会开始侦测硬件并加载驱动程序;  grub主引导加载Kernel后,就会自动退出,把硬件的控制权交给Kernel

4. 在硬件驱动成功后,Kernel 会主动执行 init 进程,而 init进程会读取/etc/inittab配置取得 运行级别(runlevel) 信息;

5.init 执行 /etc/rc.d/rc.sysinit脚本文件来准备软件执行的作业环境 (如网络、时区等、初始化环境);

6.init 执行 run-level 下各个服务并启动 (script 方式);

7. init 执行开机后自动运行脚本 /etc/rc.d/rc.local 文件; 

8. init 执行虚拟终端机控制程序 mingetty 来启动 login 程序,最后就等待用户登入啦;

如图:

17.1.2  centos6启动相关的配置文件

[root@xuegod64 Desktop]# vim /boot/grub/grub.conf

default=0    设定默认启动菜单项,当系统中有多个内核时,0表示默认加载第1个,1表示第2个内核

timeout=5    菜单项等待选项时间为5秒

splashimage=(hd0,0)/grub/splash.xpm.gz  指明菜单背景图片路径

hiddenmenu        隐藏菜单

title CentOS (2.6.32-358.6.1.el6.x86_64)  定义菜单项

    root (hd0,0)  

#(hd0,0)grub 查找 kernel 文件所在设备分区,grub 的根

kernel /vmlinuz-2.6.32-358.6.1.el6.x86_64 ro root=/dev/vg_have/lv_root rd_NO_LUKS LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 crashkernel=auto rhgb quiet      启动的内核

initrd /initramfs-2.6.32-358.6.1.el6.x86_64.img      内核匹配的ramfs文件

修改系统启动级别:

[root@xuegod64 Desktop]#vim /etc/inittab

# Default runlevel. The runlevels used are:

#   0 - halt (Do NOT set initdefault to this)

#   1 - Single user mode

#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)

#   3 - Full multiuser mode

#   4 - unused

#   5 - X11

#   6 - reboot (Do NOT set initdefault to this)

#

id:3:initdefault:    #这里决定系统默认启动的级别

/etc/rc.d/rc.sysinit  shell脚本 作用:系统初始化: 像:主机名 和/etc/fstab 都在这里指定了,完成了包括mount分区 激活swap 加载modules等重要的工作. 准备软件执行的作业环境 (如网络、时区等、初始化环境); 

启动对应级别下的服务如: init 3 级别

/etc/rc.d/rc3.d/(这里的程序/服务S开头的全部开机执行;K开头的表示开机不执行,表明了关机时顺序)

rcn.d (n为1到6) 是对应于不同的runlevel下起不同的服务. 这些目录下都是一些符号连接, 连接到/etc/rc.d/init.d下的一些文件.以S开头的软连接表示on 启动, 以K开头的表示为off关闭.

第一个字母后面的数值是一个优先级.

[root@centos6 ~]# ls /etc/rc.d

init.d  rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local  rc.sysinit

init.d 里面放的是脚本

[root@centos6 ~]# ls /etc/rc.d/rc5.d

rc5.d 图形模式

[root@centos6 ~]# ls /etc/rc.d/rc0.d

rc0.d就是关机模式,里面只启动2个软连接

[root@centos6 ~]# ls /etc/rc.d/rc0.d

rc6.d 重启模式,只启动2个软连接

[root@xuegod63 ~]# ll /etc/rc.d/rc5.d/ | grep network

lrwxrwxrwx. 1 root root 17 Dec 18  2012 S10network -> ../init.d/network   #表示network是第10个启动的服务。 所以init是顺序启动系统,需要一个一个服务启动成功,再执行下一步操作,启动系统比较慢。而centos8中的systemd第一个启动,然后systemd可以并行启动多个服务,启动比较快。

例:

[root@xuegod63 rc3.d]# vim /etc/rc.d/init.d/network

#! /bin/bash

#

# network       Bring up/down networking

#

# chkconfig: 2345 10 90

看有chkconfig的那一行, 2345表示在runlevel 2 3 4 5下被启动, 10是为此服务的启动顺序, 90为关机时关闭此服务的顺序。

[root@centos6 ~]# ll /etc/rc.d/rc2.d | grep network

[root@centos6 ~]# ll /etc/rc.d/rc3.d | grep network

[root@centos6 ~]# ll /etc/rc.d/rc4.d | grep network

[root@centos6 ~]# ll /etc/rc.d/rc5.d | grep network

[root@centos6 ~]# ll /etc/rc.d/rc0.d | grep network

centos6下默认使用chkconfig查看服务在那个级别启动

[root@xuegod63 ~]# chkconfig --list

[root@xuegod63 ~]# chkconfig --list  | grep network

network        0:off1:off2:on3:on4:on5:on6:off

[root@xuegod63 ~]# ll /etc/rc.d/rc3.d/ | grep network

lrwxrwxrwx. 1 root root 17 Dec 18  2012 S10network -> ../init.d/network  #开机顺序

[root@xuegod63 ~]#chkconfig network off

[root@xuegod63 ~]# ll /etc/rc.d/rc3.d/ | grep network

lrwxrwxrwx  1 root root 17 May 23 21:17K90network -> ../init.d/network

#只显示K90关机顺序了

[root@xuegod64 rc3.d]# chkconfig --list network

network         0:off 1:off 2:off 3:off 4:off 5:off 6:off

代表开机也不启动

所有服务都运行成功后,设置开机自动执行某个命令: /etc/rc.local

[root@xuegod64 rc3.d]# vim /etc/rc.local

[root@xuegod64 rc3.d]# ll !$

ll /etc/rc.local

lrwxrwxrwx. 1 root root 13 Dec 18  2012 /etc/rc.local -> rc.d/rc.local

[root@xuegod64 rc3.d]# ll /etc/rc.d/rc.local

-rwxr-xr-x. 1 root root 240 Feb  5 21:17 /etc/rc.d/rc.local

可以通过ctl +alt +F2来切终端,就是靠mingetty 来调用的tty2,3,4,5,6 字符设备文件

17.2  centos8系统启动过程及相关配置文件

17.2.1  centos8系统启动过程

Centos8启动流程:

1.在按下电源之后,BIOS会加载硬件信息并对硬件进行自检。

2.在自检完成之后,会读取由BIOS设置的第一个可启动设备,此时可以读入MBR引导记录中的主引导程序(boot loader)。Boot Loader 就是在操作系统内核运行之前运行的一段程序,GRUB是其中一种的引导程序的名称。

3.主引导程序可以指定哪个内核(Kernel)文件来进行启动,并将被指定的内核加载到内存当中运行。

4.在系统启动完成之后Linux才会调用外部程序开始准备软件执行的环境。并加载所有操作系统运行所需要的软件程序。

系统启动流程如果简单看的话就是以上这些步骤了,但是“简单的”学习并不是我们的目的,所以…

1.加载BIOS或UEFI初始化,开机自检

2. 选择启动设备

3. 引导装载程序,centos6是 grub,centos7和8是grub2

4. 加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg

5. 加载内核选项

6.加载initramfs初始化伪文件系统

7. 内核初始化,centos8使用systemd代替init

8. 执行initrd.target 所有单元,包括挂载 /etc/fstab

9. 从initramfs根文件系统切换到磁盘根目录

10. systemd执行默认target配置,配置文件/etc/systemd/system/default.target

11. systemd执行sysinit.target初始化系统及basic.target准备操作系统

12. systemd启动mulit-user.target下的本机与服务器服务

13. systemd执行multi-user.target下的/etc/rc.d/rc.local

14. systemd执行multi-user.target下的getty.target及登录服务

15. systemd执行graphical需要的服务

centos7/8启动过程:

ll -h /boot/grub2/i386-pc/core.imgimg 称为镜像文件

[root@xuegod83 ~]# find /boot -name *img*

/boot/grub2/i386-pc/core.img

/boot/grub2/i386-pc/boot.img

17.2.2  Systemd运行原理-了解一下

Systemd概述:systemd即为system daemon[ˈdi:mən] 守护进程,是linux下的一种init软件,开发目标是系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V与BSD风格init程序。

与多数发行版使用的System V风格init相比,systemd采用了以下新技术: (1) 采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能; (2) 用Cgroups(资源调优和分配后面讲docker会讲到)代替PID来追踪进程,以此即使是两次fork(分叉)之后生成的守护进程也不会脱离systemd的控制。(fork进程生成子进程,子进程又生成子进程)

unit对象:unit表示不同类型的systemd对象(就是服务器启动脚本),通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket(套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象名,一个ip和一个端口就是一个套接字)、保存的系统快照以及其它与init相关的信息

Systemd配置文件:

•/usr/lib/systemd/system/  #这个目录存储每个服务的启动脚本,类似于之前6系统的/etc/init.d/

ls /usr/lib/systemd/system/*Network*

•/run/systemd/system/   #系统执行过程中所产生的服务脚本,比上面目录优先运行

•/etc/systemd/system/   #管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行

注意: 对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启

[root@xuegod63 ~]# systemctl daemon-reload

重新加载,意为重读,有些服务的配置修改了,但是你不想重启服务,那么用这个就可以。

总结:centos5-6-7 3个系统版本启动过程:

CentOS 5: SysV init  ;     CentOS 6: Upstart   ;       CentOS 7/8: Systemd

17.2.3  管理系统服务

命令: systemctl COMMAND  name.service

CentOS7/8

启动:systemctl start name.service

停止:systemctl stop name.service

重启:systemctl restart name.service

状态:systemctl status name.service

重新加载配置文件:systemctl reload或restart name.service

CentOS6

启动:service name start

停止:service name stop

重启:service name restart

状态:service name status

CentOS6

设定某服务开机自启      chkconfig name on

设定某服务开机禁止启动    chkconfig name off

查看所有服务的开机自启状态    chkconfig --list

用来列出该服务在哪些运行级别下启用和禁用 chkconfig sshd --list

chkconfig命令的对应关系

CentOS7/8

设定某服务开机自启      systemctl enable name.service

设定某服务开机禁止启动    systemctl disable name.service

查看所有服务的开机自启状态    systemctl list-unit-files --type service

查看服务是否开机自启    systemctl is-enabled name.service

 loaded:Unit 配置文件已处理

 active(running):一次或多次持续处理的运行

 active(exited):成功完成一次性的配置

 active(waiting):运行中,等待一个事件

 Inactive:不运行

•enabled:允许开机启动

•disabled:禁止开机启动

•static:表示该服务与其他服务相关联,不能单独设置该服务的启动状态

17.2.4  运行级别

centos6下Linux运行级别0-6的各自含义

0: 关机模式

1:单用户模式 ,一用于破解root密码

2:无网络,支持的多用户模式

3:有网络支持的多用户模式(一般叫字符界面,工作中最长使用的模式)

4:保留,未使用

5:有网络支持,支持图形界面,支持的多用户模式(图形界面)

6:重新引导系统,及重启

可以在不同级别下,设置服务是否随系统启动运行。在centOS7/8上运行级别的含义已经和之前不同了,已由.target来代替运行级别,我们可以称target为目标态,我们可以通过target定制更符合我们工作的运行环境。

[root@xuegod63 ~]# ls /usr/lib/systemd/system/*.target  

#查看我们的机器上有多少个target

[root@xuegod63 ~]# ll /usr/lib/systemd/system/*.target   | grep runlevel

注: 发现在runlevel2-4 都是调用multi-user.target这个unit。所以在centos7/8上runlevel2-4是一个意思

[root@xuegod63 ~]# systemctl list-unit-files --type target #查看所有target的状态

[root@xuegod63 ~]# systemctl list-dependencies runlevel3.target   

#查看3级别Unit 的所有依赖。Unit 之间存在依赖关系:A 依赖于 B,就意味着 Systemd 在启动 A 的时候,同时会去启动 B。也可以理解为3运行级别下都开启哪些服务,绿色的就是开启的。

在centOS7/8上所谓的目标态,其实就是由各种指定的服务和基础target组合而成的。

总结:centos6和7运行级别的变化

6                                            7-8

init                                         systemd

Traditional runlevel |New target nameSymbolically linked to...

Runlevel 0|runlevel0.target->  poweroff.target

Runlevel 1 | runlevel1.target  ->  rescue.target

Runlevel 2 | runlevel2.target  ->  multi-user.target

Runlevel 3  |runlevel3.target  ->  multi-user.target

Runlevel 4|runlevel4.target ->  multi-user.target

Runlevel 5 |runlevel5.target ->  graphical.target

Runlevel 6 |  runlevel6.target->  reboot.target

Init0  à  systemctl  poweroff关机

Init1  à  systemctl  isolate rescue.target单用户

Init3  à  systemctl  isolate  multi-user.target字符界面

Init5  à  systemctl  isolate graphical.target图形化

Init6  à  systemctl  reboot重启

17.2.5  运行级别的切换

1、在centOS6上,我们切换级别使用init,在centOS7上虽然也能使用,但是调用的不再是原来的程序了。centos7使用systemctl  isolate name.target来切换target。 #isolate[ˈaɪsəleɪt] 分离,隔离

例1:在centos6/7下切换到字符界面:

[root@xuegod63 ~]# init 3   #切换到字符界面

[root@xuegod63 ~]# init 5   #切换到图形界面

例2:centos7切换到字符界面

[root@xuegod63 ~]# systemctl isolate multi-user.target

或:

[root@xuegod63 ~]#  systemctl isolate runlevel3.target

2、centos7设置默认系统默认启动级别

systemctl set-default name.target来修改我们的目标态。

我们看一下我们的默认目标态究竟为何物。

[root@xuegod63 ~]# ll /etc/systemd/system/default.target

注:它其实就是创建了一个软链接到指定的target上去了

例1:默认系统启动使用3级别字符界面

[root@xuegod63 ~]#systemctl set-default multi-user.target

Removed symlink /etc/systemd/system/default.target.

Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.

[root@xuegod63 ~]#  ll /etc/systemd/system/default.target  #查看链接

lrwxrwxrwx 1 root root 41 5月  23 19:08 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target

例2:默认系统启动使用5级别图形界面

[root@xuegod63 ~]#systemctl set-default  graphical.target

[root@xuegod63 ~]# systemctl get-default       查看默认启动级别

系统默认启动就是启动这个软连接,你改变了软连接的指向,就等于改变了启动级别

17.2.6  grub2和grub区别(了解) 

在centOS6上,我们的grub文件是/boot/grub/grub.conf

在centOS7/8使用grub2,配置文件改成/boot/grub2/grub.cfg了,但是功能还是大致一样的都是用于加载内核的,不过在centOS7/8上设置默认启动项发生了一些变化。

如果我们的系统中有两个内核?怎么改变默认启动的内核顺序?

例1: centos8修改内核启动顺序

[root@xuegod63 ~]# vim /etc/default/grub

GRUB_TIMEOUT=5   #开机时grub 默认5秒后启动内核

GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"

改:GRUB_DEFAULT=saved

为:GRUB_DEFAULT=1   #这里我们改成1,0代表第一个内核,1代表第二个,以此类推。

UB_DISABLE_SUBMENU=true

GRUB_TERMINAL_OUTPUT="console"

GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet net.ifnames=0"

GRUB_DISABLE_RECOVERY="true"

[root@xuegod63 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg  #修改完成后,并没有立即生效,使用此命令来生成grub.cfg文件,我们在下次启动的时候就会默认选择新的默认内核。

[root@xuegod63 ~]# uname -r  #查当前系统内核

3.10.0-693.2.2.el7.x86_64

[root@xuegod63 ~]# reboot

[root@xuegod63 ~]# uname  -r  #重启成功后, 发现加载的内核变了

3.10.0-693.el7.x86_64

例2: centos6修改内核启动顺序-了解

[root@xuegod63 ~]# vim /boot/grub/grub.conf

改:10 default=0

为:10 default=1

[root@xuegod63 ~]# reboot

更多学习内容请移步至公众号【学神来啦】

你可能感兴趣的:(linux运维零基础学习教程:Linux系统启动原理及故障排除)