引导过程与服务控制

188 阅读9分钟

Linux 开机启动过程

1、主机加电自检,加载 BIOS 硬件信息。

2、读取 MBR 的引导文件(GRUB、LILO)。
前446字节GRUB(指引找到后2阶段的GRUB,是二进制不需要文件) 后面64字节是分区表

3、GRUB引导 Linux 内核。将内核加载到内存中。解析/boot/grub2/grub.cfg,来获取内核和镜像文
件系统的设置和路径位置。 (即选择内核文件和系统类型)

4、加载内核。在 CentOS 系统中,默认的内核文件位于“/boot/vmlinuz-3.10.0-514.el7.x86_64”。

5、进程初始化。Linux内核首先将系统中的“/sbin/init”程序加载到内存中运行,init 进程负责完成一系
列的系统初始化过程,最后等待用户进行登录。CentOS 7 采用的是 Systemd 启动方式。

init与systemd区别

init:一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚
本变得很长
systemd 能够将更多的服务进程并行启动。systemd并不是一个命令,而是一组命令,涉及到系统管理的方
方面面。
systemctl是 Systemd 的主命令,用于管理系统。

运行级别所对应的Systemd目标

0  系统停机模式,系统默认运行级别不能设置为0,否则不能正常启动,机器关的;
1   单用户模式,root权限,用于系统维护,禁止远程登录(只能通过实机进去),该模式的进入方式百度
操作即可;就像windows下的安全模式登录;(进入单用户模式的时候root不需要密码就可以登录,所以在
此模式下可以修改root密码)
2   多用户模式,没有NFS和网络支持;
3   完整的多用户文本模式,有NFS和网络,登录后进入控制台命令行模式。
4   系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电池用尽时,可
以切换到这个模式来做一些设置;
5   图形化模式,登录后进入图形GUI模式,X windows系;
6   重启模式,默认运行级别不能设为6,否则不能正常启动。运行init6机器就会重启

Systemd 单元类型

在systemd中不同类型的systemd对象被统一称为单元。 Systemd单元文件最初默认
存放在/lib/systemd/system目录中,每当安装新的软件都会自动在这个目录中添加一个配置文件。
通过配置文件进行标识和配置不同单元;文件中主要包含了系统服务、监听。
/etc/systemd/system/(一般为连接文件)

单元类型               护展名                            说明
Service              .service                          护展名
Socket               .socket                  描述一个进程间通信的套接字
Device               .device                  描述一个内核识别的设备文件
Mount                .mount                    描述一个文件系统的挂载点
Automoun           .automount                描述一个文件系统的自动挂载点
Swap                 .swap                    描述一个内存交换设备或目录
Timer                .timer             描述一个定时器(用于实现类似cron的调度任务)
Path                 .path               描述一个文件系统中文件或目录(path 路径)
Snapshot           .snapshot            用于保存一个systemd的状态(snapshot 快照)
Scope               .scope             使用systemd的总线接口以编程的方式创建外部进程
Slice               .slice            描述居于Cgroup的一组通过层次组织的管理系统进程
Target              .target              描述一组systemd的单元(target 目标)

排除启动类故障

修复mbr分区

故障原因和解决思路

故障原因:
病毒、木马的等造成的破坏;
不正确的分区操作、磁盘读写误操作等。

故障现象:
找不到引导程序,启动中断;
无法加载操作系统,开机后黑屏。

解决思路:
提前添加一块新硬盘;
提前做好备份文件(将MBR扇区备份到另一块硬盘上);
以安装光盘引导进入急救模式;
从备份文件中恢复。

操作步骤

1.备份MBR扇区数据到其它磁盘( /dev/sdb1)
[root@localhost ~]# mkdir /backup
[root@localhost ~]# mount /dev/sdb1 /backup
 [root@localhost ~]# dd if=/dev/sda of=/backup/mbr.bak bs=512 count=1
2.破坏MBR分区表,模拟扇区故障
[root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1     //使用空字符串覆盖掉前512字节
3.重启观察故障情况。因为第一块硬盘的引导程序被破坏,系统自动改用光盘启动。
选择Troubleshooting,之后选择rescue mode(急救模式),使用备份文件恢复MBR扇区。
4.在光盘中恢复MBR扇区
 sh-4.2# mkdir /backup    挂载点
 sh-4.2# mount /dev/sdb1 /backup   挂载sdb1
 sh-4.2# dd if=/backup/mbr.bak  of=/dev/sda  bs=512  count=1  恢复MBR扇区

修复GRUB引导故障

故障原因和解决思路

故障原因:
MBR中的GRUB引导程序遭到破坏
grub.cfg 文件丢失、引导配置有误

故障现象:
系统引导停滞,显示“grup>” 提示符

解决思路:
尝试手动输入引导命令(笨拙繁琐,不建议使用)
提前备份文件,恢复MBR扇区中的grub引导程序
进入急救模式,重写或者从备份中恢复grub.cfg 文件

操作步骤1

1.先备份MBR扇区的前446个字节
[root@localhost ~]# mount /dev/sdb1 /data/aa    //将sdb1挂载到/data/aa目录下
[root@localhost ~]# dd if=/dev/sda of=/data/aa/grub.bak bs=446 count=1     //将MBR扇区的前446个字节备
份到/dev/sdb1中
2.模拟对MRB中的GRUB引导程序的破坏,但并不破坏分区表
[root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=446 count=1
3.重启发生故障。进入急救模式,从备份中恢复grub引导程序
选择Troubleshooting,之后选择rescue mode(急救模式)
4.在光盘中恢复grub
sh-4.2# mkdir /backup    挂载点
sh-4.2# mount /dev/sdb1 /backup   挂载sdb1
sh-4.2# dd if=/backup/grub.bak  of=/dev/sda  bs=446  count=1  恢复grub

操作步骤2(重建grub.cfg 文件)

1.模拟删除grub.cfg文件。
[root@localhost ~]#cd /boot/grub2     //切换到/boot/grub2目录
[root@localhost ~]# ls             //查看目录内的文件,有grub.cfg文件
[root@localhost ~]# device.map  fonts  grub.cfg  grubenv  i386-pc  locale
[root@localhost ~]# rm -rf /boot/grub2/grub.cfg    //删除grub.cfg文件

2.重启观察故障。之后重新启动,在读条界面按 Esc 键进入启动菜单,改用光盘启动(CD ROM Drive),
引导界面进入急救模式,重建GRUB菜单配置文件。
3.进入光盘模式
sh-4.2# chroot /mnt/sysimage     
sh-4.2#  #进入急救模式后,加载光盘镜像,切换到光驱系统的根环境
sh-4.2#  grub2-install /dev/sda    
 #重新将GRUB引导程序安装到第一块硬盘(dev/sda)的MBR扇区
sh-4.2#  grub2-mkconfig -o /boot/grub2/grub.cfg    
 #重新构建GRUB菜单配置文件

遗忘root用户密码

故障原因和解决思路


故障原因:
遗忘root用户的密码

故障现象:
无法进行需要root权限的管理操作;
若没有其他可用账号,将无法登陆操作系统。

解决思路
进入急救模式,重设密码

情况一:

有光盘的情况下,使用光盘启动,进入急救模式。使用root环境,passwd修改root用户密码。

sh-4.2# chroot /mnt/sysimage      //进入急救模式后,切换到光驱系统的根环境​
sh-4.2# passwd                    //修改密码

情况二:

没有光盘的情况下,开机启动,在出现内核选项时,按任意键暂停启动,之后按e键进入编辑模式。

将光标移动到 linux 开始的行,添加内核参数 rd.break,之后按ctrl-x启动进入单用户模式


进入单用户模式后使用以下命令:
sh-4.2# mount –o remount,rw /sysroot
sh-4.2# chroot /sysroot
sh-4.2#  passwd root

 
 #如果SELinux是启用的,才需要执行下面操作,如果没有启动,不需要执行
sh-4.2# touch /.autorelabel
sh-4.2# exit
sh-4.2# reboot

系统服务管理

systemctl

命令格式:
systemctl 控制类型 服务名称

控制类型:
status:查看服务状态
start:启动
stop:停止
restart:重新启动
reload:重新加载
daemon-reload:加载新服务,让系统识别
enable:开机启动
enable --now:将服务设置为开机启动,并立即启动
disable:开机不启动
disable --now:将服务设置为开机不启动,并立即关闭该服务
[root@localhost ~]# vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/run/nginx.pid
ExecStart=/apps/nginx/sbin/nginx 
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
[root@localhost ~]# systemctl daemon-reload 
#重新加载配置
服务目录:/lib/systemd/system/

查看运行级别

runlevel命令(只能查看切换运行级别与当前运行级别)
[root@localhost ~]# runlevel     //查看切换运行级别与当前运行级别
 N 5#N:表示前一次没有切换过运行级别
 #5:当前运行级别5,处于图像界面的多用户模式

systemctl工具(能查看默认的运行级别)

 [root@localhost ~]# systemctl get-default    //查看默认的运行级别
 graphical.target                             //默认运行级别为图形界面

设置永久运行级别(即设置默认运行级别)

[root@localhost ~]# systemctl set-default multi-user.target     //将默认运行级别修改为字符界面

chkconfig

chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息

格式: 
[root@localhost ~]# chkconfig --list [服务名称]  
[root@localhost ~]# chkconfig --add 服务名称  加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。
[root@localhost ~]# chkconfig --del 删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据。
[root@localhost ~]# chkconfig --level<等级代号>  列表服务名on/off
[root@localhost ~]# chkconfig --level 35 nginx on   #开启3和5自动开启


所有的服务脚本位于/etc/ini.d/目录下;

chkconfig 和 systemctl 区别对比

                          chkconfig 和 systemctl 区别对比
任务	                    旧指令	                           新指令
使某服务自动启动	chkconfig --level 3 httpd on	   systemctl enable httpd.service
使某服务不自动启动chkconfig --level 3 httpd off	        systemctl disable httpd.service
检查服务状态   	         service httpd s                systemctl status httpd.service 
加入自定义服务	            chkconfig --add test          systemctl load test.service
删除服务	            chkconfig --del xxx	         停掉应用,删除相应的配置文件
显示所有已启动的服务	 chkconfig --list            systemctl list-units --type=service
启动某服务	           service httpd start	        systemctl start httpd.service
停止某服务	          service httpd stop	            systemctl stop httpd.service
重启某服务	          service httpd restart	         systemctl restart httpd.service