linux系统服务二!

简介: 本文详细介绍了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
相关文章
|
3月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
272 3
Linux系统禁用swap
|
3月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
393 3
|
2月前
|
Linux 网络安全 Docker
盘古栈云,创建带ssh服务的linux容器
创建带ssh服务的linux容器
290 146
|
3月前
|
缓存 安全 Linux
六、Linux核心服务与包管理
在没有网络的情况下,使用系统安装光盘是获取RPM包的常用方法。场景二:配置本地文件镜像源 (使用系统安装光盘/ISO)(检查RPM包的GPG签名以保证安全) 或。YUM/DNF包管理工具 (yum/dnf)(此处可以放置您为本主题制作的思维导图)处理依赖问题的危险选项 (应极力避免)(覆盖文件、替换已安装包)。(list) 则是列出文件。(query file) 是。(假设系统安装光盘已挂载到。信息 (verbose)。(upgrade) 选项。(all) 已安装的包。(package) 选项
362 11
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
358 0
Linux系统初始化脚本
|
4月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
276 18
|
3月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
326 1
|
3月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1044 1
|
4月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1632 10
|
4月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
632 0