linux系统服务!!!

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。

[TOC]

第1章 Linux系统启动流程

1.CentOS7启动流程说明

讲解启动流程意义:

笔试
systemd
运行级别
单用户模式

文字简化说明:

1.BIOS开机自检
2.读取可引导分区里的MBR信息选择启动设备
3.加载grub菜单,选择操作系统
4.加载内核及驱动程序
5.启动systemd程序加载必要文件,以下操作并行执行
   1) 执行initrd.target (/usr/lib/systemd/system/initrd.target)
   包含挂载/etc/fstab文件中的文件系统。
   2) systemd执行默认的target配置。
   3) systemd执行sysinit.target, 初始化系统及加载basic.target准备启动系统。
   4) systemd启动multi-user.target (生产工作模式)下的服务程序,即开机自启动的程序,程序目录.为/etc/systemd/system和/usr/lib/systemd/system。
   5) systemd执行multi-user.target下的/etc/rc.d/rc.local内容。
   6) systemd执行multi-user.target下的gtty.target及登录服务。
   7) systemd执行graphical所需要的服务(如果安装了图形桌面功能)。

第1步:BIOS开机自检

简单来说,BIOS是主板上的一块芯片,负责主板通电后各部件的自检,设置和保存,一切正常后才能启动操作系统。其记录了电脑最基本的信息,是软件与硬件打交道的最基础的桥梁,没有他,电脑就不能正常工作。

第2步:读取MBR信息

当正确检查完所有硬件信息后,计算机就会根据BIOS里的设置去读取相应的启动系统里的硬件设备。
如果预先设定了从硬盘启动加载系统,那么BIOS就会读取硬盘的MBR (即0磁道0柱面1扇区的前446字节)。
计算机读取BIOS所指定的磁盘MBR信息之后,就会将其读入到内存中。被读入到内存中执行的其实就是Boot Loader (引导加载程序),对应于Linux系统,就是加载Grub信息。

MBR包含的内容:

0磁道0扇区:512bytes
446 bytes: boot loader启动相关
64 bytes: 分区表
2 bytes: 55AA

查看MBR分区:

hexdump -C -n 512 /dev/sda

第3步:加载Grub菜单

引导加载程序(Boot Loader)是计算机在加载操作系统内核之前运行的一段小程序。这段小程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境加载到一一个适合的状态,以便为最终调用操作系统内核做好准备。Linux主流使用Grub做为引导菜单。CentOS7使用Grub2作为引导程序。

提示:

grub.conf的知识其实在企业Linux运维中用途不是很大,这里讲解Grub的目的是为了解Linux系统的整个启动流程做铺垫,因为在运维工作中,极少会在线处理问题,出了问题也是直接切换服务了,之后再来慢慢研究是修复还是重装。

第4步:加载Kernel内核及驱动程序

根据Grub设定的内核映像所在的路径,系统会读取内存映像,并进行解压缩操作。完成解压缩内核之后,屏幕会输出“OK,booting the kermel"的信息。其实就是根据grub.conf中的如下设置加载内核及相关参数

xfs的驱动程序:

df -T
modinfo xfs
ll -h /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/xfs/xfs.ko.xz

可引导的内核在哪里?

[root@linux ~]# ll /boot/
总用量 94132
-rw-r--r--. 1 root root   151918 11月  9 2018 config-3.10.0-957.el7.x86_64
drwxr-xr-x. 5 root root       79 4月   6 19:42 grub2
-rw-------. 1 root root 57270580 4月   6 19:41 initramfs-0-rescue-3c29b9dc81a34220b666aff272f3851c.img
-rw-------. 1 root root 21810980 4月   6 19:40 initramfs-3.10.0-957.el7.x86_64.img
-rw-r--r--. 1 root root   314036 11月  9 2018 symvers-3.10.0-957.el7.x86_64.gz
-rw-------. 1 root root  3543471 11月  9 2018 System.map-3.10.0-957.el7.x86_64
-rwxr-xr-x. 1 root root  6639904 4月   6 19:41 vmlinuz-0-rescue-3c29b9dc81a34220b666aff272f3851c
-rwxr-xr-x. 1 root root  6639904 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64

vmlinuz和initramfs作用:

vmlinuz:VM=Virtual Memory z=gzip 
vmlinuz是可引导可压缩的内核,主要作用是用来管理进程,内存,文件,驱动,网络等。

initrd.img:initial ramdisk,
主要作用是用于加载驱动模块,通常步骤是先启动内核,然后内核挂载initrd.img,并挂载各种模块和驱动,最重要的是文件系统的驱动模块,有了它才能挂载根文件系统,最后可以运行Linux第一个应用程序init或systemd。

第5步:启动systemd程序加载必要文件

CentOS7和CentOS6的启动流程绝大部分还是相同的,但也有一些小区别,例如,CentOS6下第一个启动的init进程被改为了systemd(并行启动模式),下面重点说一下CentOS7加载systemd进程后的启动流程,即从CentOS6启动流程的第五步开始讲起,前四步与CentOS6启动流程的描述一致。

1) 执行initrd.target (/usr/lib/systemd/system/initrd.target)
包含挂载/etc/fstab文件中的文件系统。
2) systemd执行默认的target配置。
3) systemd执行sysinit.target, 初始化系统及加载basic.target准备启动系统。
4) systemd启动multi-user.target (生产工作模式)下的服务程序,即开机自启动的程序,程序目录为/etc/systemd/system和/usr/lib/systemd/system。
5) systemd执行multi-user.target下的/etc/rc.d/rc.local内容。
6) systemd执行multi-user.target下的gtty.target及登录服务。
7) systemd执行graphical所需要的服务(如果安装了图形桌面功能)。

2.CentOS6以及CentOS7启动流程图对比

CentOS6启动流程:

image-20210406210540109

CentOS7启动流程:

image-20210121180314363

3.分析启动流程耗时

运行systemd-analyze blame命令可以打印出启动过程的详细流程

[root@linux ~]# systemd-analyze blame
          5.043s network.service
          2.609s dev-mapper-centos\x2droot.device
          1.694s lvm2-pvscan@8:2.service
          1.669s lvm2-monitor.service
          1.059s mysqld.service
           843ms tuned.service
           204ms auditd.service
           171ms polkit.service
           164ms rsyslog.service
           128ms chronyd.service
           102ms systemd-logind.service
            94ms rhel-dmesg.service
            93ms systemd-vconsole-setup.service
            77ms sysstat.service
            77ms systemd-user-sessions.service
            62ms boot.mount
            61ms systemd-udev-trigger.service
            58ms rhel-import-state.service
            50ms rhel-readonly.service
            36ms plymouth-quit-wait.service
            35ms plymouth-start.service
            34ms systemd-udevd.service
            27ms plymouth-read-write.service
            26ms systemd-tmpfiles-setup-dev.service
            25ms systemd-journald.service
            24ms sshd.service
            23ms plymouth-quit.service
            22ms systemd-tmpfiles-setup.service
            19ms systemd-journal-flush.service
            17ms rhel-domainname.service
            17ms systemd-sysctl.service
            16ms systemd-remount-fs.service
            15ms systemd-rfkill@rfkill0.service
            13ms systemd-fsck-root.service
            13ms kmod-static-nodes.service
            12ms sys-kernel-debug.mount
            12ms dev-mqueue.mount
            12ms dev-hugepages.mount
            10ms systemd-update-utmp.service
            10ms systemd-random-seed.service
             9ms systemd-tmpfiles-clean.service
             5ms systemd-update-utmp-runlevel.service
             5ms sys-kernel-config.mount

我们也可以将其生成网页查看

systemd-analyze plot > linux.html

image-20210406203811871

第2章 Linux运行级别

1.什么是系统运行级别

不同的运行级别就是指系统运行在不同功能的级别。
比如打游戏有新手模式,高级模式,炼狱模式一样,不同级别分别对应不同的使用场景。

2.系统运行级别分类

启动级别      systemd名称                   功能说明
0             poweroff.target            关机操作
1            rescue.target              单用户模式,救援模式
2            multi-user.target          
3            multi-user.target            多用户模式,文本界面
4             multi-user.target            
5            graphical.target            多用户模式,图形界面
6            reboot.target              重启操作

上面的运行级别名称从哪里得来的呢?通过查看系统命令可以得出结论

[root@linux ~]# ll /usr/lib/systemd/system/runlevel[0-9].target
lrwxrwxrwx. 1 root root 15 12月 13 11:01 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 12月 13 11:01 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 12月 13 11:01 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 12月 13 11:01 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 12月 13 11:01 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 12月 13 11:01 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 12月 13 11:01 /usr/lib/systemd/system/runlevel6.target -> reboot.target

3.运行级别常用命令

运行级别的说明文件路径:

cat /etc/inittab

查看当前运行级别:

systemctl get-default

切换运行级别:

init N

设置默认启动级别:最常用的两个级别是3和5

systemctl set-default TARGET.target

4.练习

自己试试如何将图形化的Linux切换到命令行级别以及更改默认启动运行级别为命令行界面

第3章 Linux Systemd

1.什么是systemd

CentOS7之前的系统都是使用init进程作为系统启动后的第一个进程,但是init有两个缺点:
1.启动时间长,因为init的进程是串行的,只有前一个启动完毕后一个进程才启动。
2.启动脚本复杂,以前的系统初始化需要加载很多脚本,依赖关系复杂,靠脚本自己处理。

而systemd的启动则是并行运行的,而且服务的启动配置文件统一语法,所以管理起来更方便。

2.systemd的优势

1.较新的系统都已经使用systemd来管理服务,例如Debian9,Centos7,Ubunut16等
2.系统引导时实现服务的并行启动,效率更高,启动更快
3.自动解决依赖关系
4.服务的启动配置文件统一语法,管理起来更方便

3.systemd常用管理命令

管理服务运行相关命令:

systemctl start nginx                #启动服务
systemctl stop nginx                #停止服务
systemctl restart nginx             #重启服务
systemctl reload nginx                #重新加载服务配置文件
systemctl status nginx                #查看服务的运行状态
systemctl is-active nginx            #查看服务是否正在运行

服务运行状态说明:

#当我们使用system status查看一个服务的运行状态时,有以下几种情况
loaded                            #配置文件已经被加载
active (running)                #服务正在运行
inactive (dead)                   #服务没有在运行
enabled                            #服务被设定为开机自启动
disabled                        #服务被设定为开机不自启动
static                            #服务开机不自启动,但是可以被其他服务调用启动

管理服务开机启动相关命令:

systemctl enable nginx            #设置服务开机自启动
systemctl disable nginx         #设置服务开机不自启动
systemctl is-enabled nginx    #查看服务是否开机自启动
systemctl list-unit-files        #查看所有服务的开机自启动状态
systemctl daemon-reload     #重新载入更改的systemd配置文件

4.systemd文件格式

systemd文件路径说明:

/etc/systemd/system/                #系统自带的启动文件
/usr/lib/systemd/system/        #一般使用软件包安装的软件的启动配置文件在这个目录下

systemd文件格式说明:

systemd unit文件通常是由三部分组成的
[Unit]                    #一般定义的是通用选项,比如描述信息,依赖关系等
[Service]                #特定服务的类型,具体的启动关闭重启选项都在此部分配置
[Install]                #定义由开机自启和不开机自启命令时实现的选项

Unit段常用说明:

Description                #描述信息
Documentation            #说明文档的在线地址
After                    #定义启动顺序,表示当前配置的服务应该晚与哪些服务之后启动
Wants                    #依赖其他的服务

Service段常用说明:

Type                    #定义服务类型
  forking                 #需要父进程启动子进程的服务类型为forking
PIDFile                    #定义PID文件路径
ExecStart                #指定启动服务命令绝对路径
ExecReload                #指定重新加载服务的配置文件的命令绝对路径
ExecStop                #指定停止服务命令绝对路径
ExecStartPre            #在启动之前运行的命令
ExecStartPost            #在启动之后运行的命令

Install段常用说明:

WantedBy                    #哪些服务需要被依赖

举例:nginx的systemd文件解释:

[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                                                                                #启动类型为forking
PIDFile=/var/run/nginx.pid                                                    #pid文件的绝对路径
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf    #启动命令的绝对路径
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"        #重新加载配置的绝对路径
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"        #停止服务命令的绝对路径

[Install]
WantedBy=multi-user.target        #需要依赖的服务

5.自定义nginx的systemd启动文件

编译安装nginx过程略。

#1.修改nginx配置文件的pid为自定义路径
[root@linux ~]# grep pid /opt/nginx/conf/nginx.conf
pid        /opt/nginx/pid/nginx.pid;

#2.写入自定义systemd配置
cat > /usr/lib/systemd/system/linux6.service << 'EOF'
[Unit]
Description=DIY nginx
Documentation=https://www.cnblogs.com/alaska/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/opt/nginx/pid/nginx.pid
ExecStart=/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /opt/nginx/pid/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /opt/nginx/pid/nginx.pid)"
ExecStartPre=/bin/sh -c "/usr/bin/chown -R www:www /opt/nginx/"

[Install]
WantedBy=multi-user.target
EOF

#3.重新加载systemd配置
systemctl daemon-reload

#4.启动我们自定义的服务
systemctl start linux6
systemctl status linux6

第4章 Linux单用户模式

1.什么是Linux单用户模式

单用户模式的最主要应用场景就是当我们忘记系统root密码的时候,就可以使用单用户模式找回。
如果谁都能随随便便的进入单用户模式修改root密码,那就风险太大了,所有单用户模式有前提条件:
1.进入单用户模式必须重启服务器,所以需要有重启服务器的权限
2.单用户模式是启动服务进程之前,所以需要有能实际接触服务器的条件才行,如果是物理机那就表示人必须在机器旁边,接键盘显示器才能操作。

2.实战:找回忘记的Linux密码

方法1: 添加rw init=/bin/bash

image-20210406204254305

1.开机启动时在启动菜单界面选择按e进入grup编辑模式
2.在linux开头的行最后添加以下内容
enforcing=0 init=/bin/bash

3.保存启动
ctrl + x

3.启动后重新挂载 
mount -o rw,remount /

4.重新修改root密码 
passwd root

5.重启进入系统
exec /sbin/init

详细步骤:

https://mp.weixin.qq.com/s/1f-zCq8j4gL3xiB3AV9K3A

方法2: 添加rd.break

image-20210406183227356

操作步骤如下:

1.开机启动时在启动菜单界面选择按e进入grup编辑模式
2.在linux开头的行最后添加
enforcing=0 rd.break
3.按ctrl+x保存退出重启
4.进入单用户模式后输入以下命令
mount -o remount,rw /sysroot/
chroot /sysroot/
passwd root
exit
reboot

遇到的坑: selinux没关导致修改不成功

临时关闭:
[root@centos7-100 ~]# getenforce 
Enforcing
[root@centos7-100 ~]# setenforce 0
[root@centos7-100 ~]# getenforce 
Permissive

永久关闭:
[root@centos7-100 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

第5章 Linux救援模式

1.什么是Linux救援模式

救援模式就是当我们的系统出现故障启动失败后,使用系统光盘镜像重新加载然后进入系统进行修复的一种模式。

2.实战Linux启动故障修复

注意:做启动修复实验前建议先快照一下

模拟场景1: 误删除/boot所有文件

rm -rf /boot/*
reboot

恢复步骤:

第1步:选择光盘启动

第2步:选择救援模式

image-20210406192903901

image-20210406192925763

第3步:输入1继续救援模式

image-20210406193016004

第4步:修复启动文件

#1.切换到
chroot /mnt/sysimage

#2.将光盘镜像挂在到临时目录
mount /dev/sr0 /opt

#3.安装grub2到指定磁盘
grub2-install /dev/sda

#4.从挂载的光盘镜像上安装Linux内核
#这一步会卡一会
rpm –ivh /opt/Packages/kernel-3.10.0-1062.el7.x86_64.rpm --force


#5.重新生成grub2的配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg

#6.退出救援模式
exit
exit
相关文章
|
4天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
110 78
|
7天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
36 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
1月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
119 48
|
3天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
38 13
|
27天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
20 3
|
4天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
16 0
|
1月前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
33 1
|
1月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
65 1
|
1月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
15天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
下一篇
DataWorks