系统管理之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 文件的内容,然后退出。
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