linux系统服务二!

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了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 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
20 3
linux系统服务!!!
|
12天前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
108 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
4天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
16 2
|
5天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
8天前
|
Linux 数据库
Linux服务如何实现服务器重启后的服务延迟自启动?
【10月更文挑战第25天】Linux服务如何实现服务器重启后的服务延迟自启动?
43 3
|
8天前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
50 3
|
9天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
11天前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###
|
6月前
|
Linux
linux中服务管理
在Linux服务管理中,从传统的System V init到Upstart,再到广泛采用的systemd,管理方式不断发展。systemd以其强大的功能和依赖解决成为现代Linux的核心。`systemctl`是管理服务的关键命令,如启动(`start`)、停止(`stop`)、重启(`restart`)服务及设置开机启动(`enable`)或取消(`disable`)。了解和服务管理,特别是systemd和`systemctl`的使用,对系统管理员至关重要。其他如xinetd用于控制网络服务,而特定环境下有OpenRC等工具。
54 2
|
安全 Ubuntu 网络协议
Linux中的服务管理
Linux系统可以同时运行数百个任务。其中大多数都属于操作系统环境的组成部分,不过可能也会有那么一两个你不需要的**守护进程**。有3种可用于启动守护进程和服务的工具,Linux发行版支持其中任意一种。传统的SysV系统使用/etc/init.d中的脚本。较新的systemd守护进程除了使用/etc/init.d之外,还用到了systemctl调用。还有些发行版使用的是upstart,配置脚本保存在/etc/init中。systemd如今已经取代了SysVinit系统。upstart是由Ubuntu开发并采用的,但是在14.04版中,已经改成了systemd。
148 3