首页HTML开始的地方

系统管理之Linux启动流程

1.系统初始化进程

  • SysV风格: init
    centos5 配置文件:/etc/inittab

  • Upstart风格: init
    centos6 配置文件:/etc/init.d/,/etc/inittab

  • Systemd风格: systemd
    centos7 配置文件:/usr/lib/systemd/system/,/etc/systemd/system/
    systemctl是一个systemd管理工具

2.Systemd

服务的启动脚本,被服务单元unit取代,服务单元以.service扩展名
systemd使用unit(单元,个体) 的概念来管理服务,这unit表现为一个个配置文件。
很多以d结尾的守护进程,httpd。

在目录 /etc/init.d/ 下的脚本文件的优先级会高于目录 /etc/systemd/system/ 下的 service 文件

  • Unit单元

unit配置文件保存位置:
/etc/systemd/system/
/usr/lib/systemd/system/
/run/systemd/system
  • Unit类型

Unit分为服务、套接字、目标、路径、快照、定时器等类型。

.service #一般服务类型(service unit):主要是系统服务,包括服务器本身所需要的本机服务以及网络服务,比较经常被使用到的服务大多是这种类型,所以,这也是最常见的类型。
.socket #内部程序数据交换的插槽服务(socketunit):
.target #执行环境类型(target unit):其实是一群unit的集合,例如multi-user.target其实就是一堆服务的集合。
.mount #文件系统挂载相关的服务(automount unit/mount unit):例如来自网络的自动挂载、NFS文件系统挂载等与文件系统相关性较高的程序管理。
.path #监测特定文件或目录类型(path unit)
.timer #循环执行的服务(timer unit)
Device unit     #文件扩展名为.device,用于定义内核识别的设备
Swap unit       #文件扩展名为.swap,用于标识swap设备
Automount unit  #文件扩展名为.automount,用于实现文件系统的自动挂载点
  • Systemctl管理服务

语法:systemctl COMMAND XXX[.service/.target]

#常用COMMAND:
systemctl start XXX.service                 #启动
systemctl stop XXX.service                  #停止
systemctl reload XXX.service                #重载
systemctl restart XXX.service               #重启
systemctl status XXX.service                #查看状态
systemctl enable XXX.service                #设定开机自动启动
systemctl disable XXX.service               #取消开机自动启动
systemctl mask XXX.service                  #关闭开机自启功能
systemctl unmask XXX.service                #开启开机自启功能

systemctl list-units                        #列出所有服务
systemctl list-unit-files                   #列出所有自启动状态的服务static 不可自己启动,可被其他服务唤醒。
systemctl list-unit-files --type=service    #列出所有类型为service,不显示target等

服务状态
enabled #这个daemon将在开机时被执行;
disabled #这个daemon在开机时不会被执行;
static #这个daemon不可以自己启动(enable不可),不过可能会被其他的enabled 的服务来唤醒(关联属性的服务);
mask #这个daemon无论如何都无法被启动,因为已经被强制注销(非删除),可通过systemctlunmask方式改回原本状态; 解决某些冲突服务。
  • 开机启动(service服务方式)

在 /usr/lib/systemd/system 下新建服务脚本
vim /usr/lib/systemd/system/XXX.service


[Unit]
Description=描述
Environment=环境变量或参数(系统环境变量此时无法使用)
PIDFile=/xxx/xxx.xxx  #存放PID文件的位置
#pid文件的作用:防止进程启动多个副本。只有获得pid文件(固定路径固定文件名)写入权限(F_WRLCK)的进程才能正常启动并把自身的PID写入该文件中。其它同一个程序的多余进程则自动退出。
After=network.target(服务依赖,再这些服务后启动本服务)
Before=nss-lookup.target (服务依赖,再这些服务前启动本服务)
Wants=network-online.target nss-lookup.target (与当前服务配合的其他服务,如果它们没有运行,当前服务不会启动失败)

[Service]
Type=forking #simple:默认值,执行ExecStart指定的命令,启动主进程。
#forking以 fork 方式从父进程创建子进程,创建后父进程会立即退出
EnvironmentFile=所需环境变量文件或参数文件
ExecStart=启动命令(需指定全路径)
ExecStop=停止命令(需指定全路径)
User=root #以什么用户执行命令

[Install]
WantedBy=multi-user.target #表示该服务所在的服务组,当前是服务所在的服务组是multi-user.target
#它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
RequiredBy=
#它的值是一个或多个 Target,当前Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Alias=XXX.service #别名=XXX.service
Also= #当前 Unit 激活(enable)时,会被同时激活的其他 Unit

systemctl daemon-reload
#使systemd 读取新的服务文件,需要重新加载。

systemctl enable XXX
#设置自启动,实质就是在 /etc/systemd/system/multi-user.target.wants/ 添加服务文件的链接。

3.Centos6以前版本的系统控制服务方式

service XXX start      #启动
service XXX stop       #停止
service XXX status     #查看态
service XXX restart    #重启
chkconfig --add XXX    #把XXX脚本纳入管理并设置开机自启
chkconfig XXX on       #设置开机自启
chkconfig XXX off      #设置开机不自动启动
#service xxxx start|stop 相当于是对 /etc/init.d/ 下的 xxxx 的封装
System V init(6系统) systemctl命令(7系统) 作用
service crond start systemctl start crond.service 启动服务
service crond stop systemctl stop crond.service 停止服务
service crond restart systemctl restart crond.service 重启服务
service crond reload systemctl reload crond.service 重新加载配置(不终止服务)
service crond status systemctl status crond.servre 查看服务运行状态
systemctl is-active sshd.service 查看服务是否在运行中
systemctl mask crond.servre 禁止服务运行
systemctl unmask crond.servre 取消禁止服务运行
chkconfig crond on systemctl enable crond.service 开机自动启动
chkconfig crond off systemctl disable crond.service 开机不自动启动
chkconfig --list systemctl list-unit-files 查看各个级别下服务的启动与禁用
chkconfig --list crond systemctl is-enabled crond.service 查看特定服务是否为开机自启动
chkconfig--add crond systemctl daemon-reload 创建新服务文件或者变更设置
  • init.d类型

rcx.d/: 都是指向init.d/的软连接

  • 开机自启动(init.d方式)

自己写的脚本,比如hello.sh,放入/etc/init.d/。
chmod +x test.sh #给文件一个可执行权限。
chkconfig --add test.sh #将脚本添加到开机启动项。
chkconfig test.sh on #开启开机自启
chkconfig #检查一下是否设置为开机自启动

  • 开机自启动(rc.local方式)

/etc/rc.d/rc.local 用于添加开机启动命令。
/etc/rc.local是/etc/rc.d/rc.local的软连接。

4.CentOS6启动流程

a. 内核引导

首先是开机BIOS加电自检,按启动顺序启动,操作系统接管硬件以后,首先读取 /boot 目录下的内核文件。

b. 运行init

init 在CentOS中,是系统所有进程的起点,
init 程序首先是需要读取配置文件 /etc/inittab

在init中,就涉及到7个运行级别(runlevel)

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有文件系统)
运行级别3:完全的多用户状态(有文件系统),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

runlevel #查看当前运行级别。
init 5 #切换运行级别
chkconfig --list #查看运行级别
[root@zls ~]# chkconfig --list

注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。

      要列出 systemd 服务,请执行 'systemctl list-unit-files'。
      查看在具体 target 启用的服务请执行
      'systemctl list-dependencies [target]'。

netconsole      0:关 1:关 2:关 3:关 4:关 5:关 6:关
network         0:关 1:关 2:开 3:开 4:开 5:开 6:关
sysstat         0:关 1:关 2:开 3:开 4:关 5:开 6:关


CentOS6忘记root密码或者调整了运行级别为6

进入单用户级别:
1.重启服务器,一直按“E”键,进入grub引导菜单的内核界面
2.在内核界面选择使用上下箭头移动并选择内核
3.内核选定之后再次按下“E”键进行编辑
4.在最后一行后面加上数字1(是单用户模式的运行级别)或者single然后回车
5.然后根据提示按下boot进行重新引导



许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。init进程的一大任务,就是去运行这些开机启动的程序。

守护进程: 后台运行,独立于控制终端,周期性运行某任务。
比如:apache,杀死进程后,过一会自己启动。
比如: 终端调用firefox浏览器,是 子进程, 终端父进程关闭 子进程关闭。但不受终端,systemd start httpd, 终端关闭后httpd 仍然在内存。叫守护进程。

服务:
先说软件安装,比如qq安装后,可选择运行或不运行。软件还可以安装成服务,比如蓝牙,装成服务。如果装成软件,想连接需要打开软件,不想连接需关闭软件。选“自动”开机时,自动将服务加载到内存,“手动”开机不启动。

c. 系统初始化

在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

d. 建立终端

rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。

init接下来会打开6个终端,以便用户登录系统

e. 用户登录系统

一般来说,用户的登录方式有三种:(1)命令行登录。(2)ssh登录。(3)图形界面登录

Linux 的账号验证程序是 login,login 会接收 mingetty 传来的用户名作为用户名参数。

然后 login 会对用户名进行分析:如果用户名不是 root,且存在 /etc/nologin 文件,login 将输出 nologin 文件的内容,然后退出。

image
image

5.centos7启动流程

1.BIOS(开机自检)

2.MBR ( Master Boot Record 主引导记录)

3.GRUB2 Bootloader(引导菜单)

4.Kernel(内核引导)

5.Systemd (不再使用init,改成了systemd)

6.Runlevel-Target (运行级别)

a. BIOS

基本输入/输出系统是一个固件接口,它不仅控制启动过程,还提供对连接的外围设备的低级接口的所有控制。打开系统电源后,它将读取所有设备设置并执行开机自检(开机自检)过程,以识别硬件设备,以测试和初始化系统硬件组件。成功后处理后,它将加载MBR(主引导记录)以进行下一个引导处理。

b. MBR引导

主引导记录放在Linux引导硬盘的第一个扇区中,此信息通过BIOS预加载到ROM(只读内存)中。

MBR的大小只有512个字节,它包含用于引导操作系统的机器代码指令,称为引导加载程序,以及分区表。一旦BIOS找到引导加载程序(GRUB2)并将其加载到(ROM)内存或硬盘驱动器中,它就会控制引导过程。只是MBR(主引导记录)加载并执行GRUB2引导加载程序。

c. GRUB2(引导加载程序版本2)引导加载程序

言简意赅:grub2菜单,如果装了双系统会让你进行选择,Linux?还是windows?还是MacOS?

GRUB2是所有最新版本(如Red Hat/CentOS 7)中的默认引导加载程序,也是9.10版中的Ubuntu。它已经被GRUBbootloader(也称为GRUBLegacy)所取代。

grub2配置文件位于/boot/grub2/grub.cfg中,由grub2 mkconfig使用/etc/grub.d中的模板和/etc/default/grub中的设置自动生成。不建议编辑GRUB2配置文件。

引导加载程序(rhel 7的grub2)启动rhel7内核和初始RAM磁盘(initrd)。GRUB 2安装在服务器硬盘的引导扇区中,配置为加载Linux内核和initramfs,initrd是一个初始根文件系统,将在Linux系统上的实际根文件系统之前安装。

d. kernel内核引导

Linux内核是操作系统的核心,它是系统上第一个加载的程序。当系统启动时,内核从initrd.img加载所有必要的内核模块和驱动器,以加载Linux7中的系统第一个进程systemd,在6里面,init是爸爸,在7里面换了个爸爸,那就是systemd

CentOS7中的运行级别:
runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target
runlevel3.target -> multi-user.target
runlevel4.target -> multi-user.target
runlevel5.target -> graphical.target
runlevel6.target -> reboot.target
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户运行级别(没有文件系统)
运行级别3:完全的多用户状态(有文件系统),登陆后进入控制台命令行模式
运行级别4:多用户运行级别
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动



几个应用
CentOS7如何进入单用户模式
CentOS7通过光盘进入救援模式
当系统坏了,无法登陆系统,但是需要把里面的数据拷贝出来,怎么办?
修复MBR,主要出现在安装双系统的时候,后安装的系统把原来的MBR删除了,需要修复
CentOS7 误删除grub文件,进行修复
已经安装完系统后,还想修改CentOS7网卡名称为eth0和eth1
image

posted @ 2024-05-03 15:26  csnotes  阅读(300)  评论(0编辑  收藏  举报

这是页脚html