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
相关文章
|
24天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
65 3
|
24天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
60 2
|
18天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
15 3
|
24天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
65 3
|
27天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
44 6
|
27天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
66 6
|
28天前
|
机器学习/深度学习 自然语言处理 Linux
Linux 中的机器学习:Whisper——自动语音识别系统
本文介绍了先进的自动语音识别系统 Whisper 在 Linux 环境中的应用。Whisper 基于深度学习和神经网络技术,支持多语言识别,具有高准确性和实时处理能力。文章详细讲解了在 Linux 中安装、配置和使用 Whisper 的步骤,以及其在语音助手、语音识别软件等领域的应用场景。
54 5
|
28天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
50 3
|
28天前
|
监控 网络协议 算法
Linux内核优化:提升系统性能与稳定性的策略####
本文深入探讨了Linux操作系统内核的优化策略,旨在通过一系列技术手段和最佳实践,显著提升系统的性能、响应速度及稳定性。文章首先概述了Linux内核的核心组件及其在系统中的作用,随后详细阐述了内存管理、进程调度、文件系统优化、网络栈调整及并发控制等关键领域的优化方法。通过实际案例分析,展示了这些优化措施如何有效减少延迟、提高吞吐量,并增强系统的整体健壮性。最终,文章强调了持续监控、定期更新及合理配置对于维持Linux系统长期高效运行的重要性。 ####
|
7月前
|
Linux
linux中服务管理
在Linux服务管理中,从传统的System V init到Upstart,再到广泛采用的systemd,管理方式不断发展。systemd以其强大的功能和依赖解决成为现代Linux的核心。`systemctl`是管理服务的关键命令,如启动(`start`)、停止(`stop`)、重启(`restart`)服务及设置开机启动(`enable`)或取消(`disable`)。了解和服务管理,特别是systemd和`systemctl`的使用,对系统管理员至关重要。其他如xinetd用于控制网络服务,而特定环境下有OpenRC等工具。
60 2