系统引导是操作系统运行的开始,在用户能够正常登录到系统之前,Linux的引导过程完成了一系列的初始化任务,并加载必要的程序和命令终端,为用户登录做好准备。
从CentOS7版本开始,系统启动和服务管理器都交给systemd进行管理
Linux操作系统的引导过程一般包括以下几个阶段:
1、开机自检:
服务器开机后将根据主板BIOS中的设置对CPU、内存等硬件设备进行初步检测,并初始化部分硬件,建成完成后会将系统的控制权,一般都会已交给本机的硬盘。
2、MBR 引导:
从本机硬盘中启动系统时,首先根据硬盘第一个扇区中的MBR设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据MBR记录中的引导信息调用启动菜单。MBR与我们的正常开机息息相关,所以为了以备不时之需我们还需是对MBR提前备份。
3、GRUB 菜单:
选择加载哪个系统、模式(安全、急救模式)
系统控制权传递到GRUB之后,会对我们需要的系统进行选择,然后加载相关系统的内核文件。
4、加载linux 内核与内存文件系统:
系统控制权此时到了内核,程序引导器会从本地硬盘中加载内核以及内存文件系统。
5、init进程初始化
加载硬件驱动以及初始化过程(加载全部驱动)
内核与文件系统由内存文件系统切换至系统根文件系统,并重新运行/sysroot.systemd。启动默认图形或字符终端,最后等待用户登录。
Linux系统中的进程(运行中的程序)使用的数字进行标记,每个进程的身份标记号称为PID。在引导Linux系统的过程中,“sbin/init“是内核第一个加载的程序,因此init进程对应的PID号永久为1。
在CentOS 7中我们可以查看一下init:
[root@localhost ~]# which init
/usr/sbin/init
[root@localhost ~]# ls -l /sbin/init
lrwxrwxrwx. 1 root root 22 10月 24 08:40 /sbin/init -> ../lib/systemd/systemd
可见/sbin/init是一个指向/lib/systemd/systemd的软链接文件,所以systemd的PID号也永远为1,是系统第一个进程。
Systemd在CentOS 7中提供了更优秀的框架以表示系统服务间的依赖关系,实现了系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果。
Systemd的目标时尽可能启动更少的进程,尽可能将更多的进程并行启动。同时Systemd尽可能减少对Shell脚本的依赖。
CentOS 7中 Systemd进程取代init进程,主要体现在service和chkconfig命令上,在CentOS 7中我们经常使用Systemctl代替service和chkconfig两个命令。
systemd是系统第一个进程。对应的PID号永远为1,
常见故障原因:
病毒、木马等造成的破坏
不正确的分区操作、磁盘读写误操作
故障现象:
找不到引导程序,启动终端
无法加载操作系统,开机后黑屏
解决思路:
应提前做好备份文件
以安装光盘引导进入急救模式
从备份文件中恢复
实验环境:
添加一块磁盘sdb,建立分区
格式化分区,创建挂载点/aaa,将sdb1挂载到挂载点
[root@localhost ~]# mkfs.xfs /dev/sdb1 (格式化sdb1分区)
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# mount /dev/sdb1 /aaa (将sdb1挂载到/aaa目录)
[root@localhost ~]# df -hT (查看挂载点)
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda2 xfs 20G 4.3G 16G 22% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 912M 0 912M 0% /dev/shm
tmpfs tmpfs 912M 9.0M 903M 1% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda5 xfs 10G 41M 10G 1% /home
/dev/sda1 xfs 6.0G 174M 5.9G 3% /boot
tmpfs tmpfs 183M 12K 183M 1% /run/user/42
tmpfs tmpfs 183M 0 183M 0% /run/user/0
/dev/sdb1 xfs 20G 33M 20G 1% /aaa (以上为挂载点信息)
因为引导文件在sda中占有首部512字节的空间,所以我们先做一个备份,复制此空间提取到/aaa目录下,并生成一个sda.mbr.bak承载这部分资料。示例:
[root@localhost ~]# dd if=/dev/sda of=/aaa/sda.mbr.bak bs=512 count=1
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000805887 秒,635 kB/秒
提取/dev/zero(不用的软件)覆盖sda1头部512字节的空间(模拟MBR代码损坏)
[root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000473292 秒,1.1 MB/秒
重启:reboot
[root@localhost ~]# init 6
重启时我们可见,因MBR引导代码“损坏”,无法加载到系统。这里我们重启虚拟机,如下图:
在读条过程中,按“ESC”进入Boot Menu (启动菜单),因为我们的镜像是存放在虚拟光驱中,所以我们在这里从CD-ROM开始引导。
在此界面我们选择进入急救模式,如图:
选择1 Continue,进入系统基本的镜像模式,这里我们进入了基本的Shell终端模式,我们需要在这里进行操作修复。
重启后可以正常进入,已经将MBR故障修复。
总结:我们在实际生活中最好养成备份重要文件的习惯,如需经常更换工作场所,可以备份到U盘中。
常见故障原因
MBR中的GRUB引导程序遭到破坏
grub.conf文件丢失,引导配置有误
故障现象
系统引导停滞,显示“grub>”提示符
解决思路
尝试手动输入引导命令(通常不用。。。)
进入急救模式,重写或者从备份中恢复grub.conf
向MBR扇区中重建grub程序
实验环境:编辑虚拟机CD/DVD,载入镜像,开启连接(同4.1)
再次重新启动,进入Boot启动菜单,重复实验1的步骤,进入到其基本的Shell终端模式。
进行修复,过程及含义如图:
重启后可以正常进入,已经将GRUB故障修复。
常见故障原因:
遗忘root用户的密码
故障现象
无法进行需要root权限的管理操作
若没有其他可用账号,将无法登录系统
解决思路
进入急救模式,重设密码
实验环境:编辑虚拟机CD/DVD,载入镜像,开启连接(同4.1))
再次重新启动,进入Boot启动菜单,重复实验1的步骤,进入到其基本的Shell终端模式。然后我们加载镜像系统并修改密码,如图:
常用方式:
systemctl 控制类型 服务名称
常用控制类型:
start:启动
stop:停止
restart:重新启动 (重新启动,会中断服务,相当于先stop再start)
reload:重新加载 (重新加载配置文件不会中断服务,所以相对restart更安全)
status:查看服务状态
我们针对httpd进行控制,例如:
[root@localhost ~]# systemtcl start httpd
[root@localhost ~]# systemtcl stop httpd
[root@localhost ~]# systemtcl restart httpd
[root@localhost ~]# systemtcl reload httpd
查看运行级别:
runlevel 命令
systemctl工具
临时切换运行级别
init命令
systemctl工具
我们刚登陆时(默认登陆时为图形界面):示例:
[root@localhost ~]# runlevel
N 5
(因为我们刚登陆,所以第一个是N,代表没有任何在此之前的运行级别)
我们先使用“init 3"的方式切换运行级别,进入字符界面输入需要切换的用户,然后输入密码,最后使用init5切换到图形界面:
使用systemctl 查看当前运行级别:
命令:systemctl get-default,示例:
[root@localhost ~]# systemctl get-default
graphical.target (图形化界面)
使用systemctl切换运行级别的方式:
使用systemctl isolate mult.user.target切换到字符界面(等同于init3)使用systemctl isolate graphical.target切换到图形界面。
ntsysv工具
提供一个交互式,可视化窗口(伪图形化界面)
可以在字符终端运行
便于集中管理多个服务
systemctl 工具
不提供交互式、可视化窗口
管理单个服务效率更高
我们先用"netstat -ntap"查看当前正在运行的服务及端口
netstat:查看当前正在运行的端口
n:以数字形式表示
t:TCP协议
a:所有
p:协议
示例:
[root@localhost ~]# netstat -natp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1373/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1032/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1031/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1299/master
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 1032/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1031/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1299/master
其中有一个sshd服务,这是支持远程连接的服务,之后我们演示针对这个服务进行管理。
最后四行是IPV6的地址。
这里我们先通过伪终端的形式查看一下sshd的状态,命令如下:
[root@localhost ~]# ntsysv
进入伪终端,找到sshd.service:
"*" 代表开机自启动
按“空格”控制开启或关闭开机自启动功能
Tab键 切换到选项(确定 ,取消)
我们也可以通过systemctl 对开机启动项进行查询和管理:
查看系统服务的启动状态:
systemctl is-enabled (服务名称)
设置系统服务的启动状态:
systemctl enable/disable 服务名称
示例:
[root@localhost ~]# systemctl is-enabled sshd (查询sshd服务启动状态)
enabled (状态为开机自启)
[root@localhost ~]# systemctl disable sshd (关闭sshd开机自启)
Removed symlink /etc/systemd/system/multi-user.target.wants/sshd.service.
[root@localhost ~]# systemctl is-enabled sshd (查询)
disabled (以关闭开机自启)
[root@localhost ~]# systemctl enable sshd (重新开启)
Created symlink from /etc/systemd/system/multi-user.target.wants/sshd.service to /usr/lib/systemd/system/sshd.service.
[root@localhost ~]# systemctl is-enabled sshd
enabled (以恢复开机自启)
在日常工作或学习中,我们需要养成一个备份重要文件的习惯,同时备份或将我们的系统镜像刻录在U盘上,在进行故障修复的过程中,我们往往优先进入急救模式,进入系统的基本终端模式,然后根据情况修复故障。