news 2026/10/3 4:04:42

RHCSA与云原生:进程、网络、systemd与存储日志排障实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RHCSA与云原生:进程、网络、systemd与存储日志排障实战

今天是RHCSA+云原生学习日志的第三篇,前两篇我把文件权限、用户与组、yum源配置、vim操作这些基础扫了一遍,笔记也攒了二十多节。这篇我打算换个思路:不再往命令清单里硬塞东西,而是把Linux系统日常运行最关键的几条线串起来——进程、网络、服务、存储、日志。理由很简单,RHCSA考试不是考你背了多少命令,而是考你在断网、磁盘满、服务起不来这些真实故障现场能不能把系统恢复;云原生也一样,容器、Kubernetes这些上层技术,落地时完全依赖Linux的进程模型和systemd机制。你每天花四十分钟,开一台Rocky Linux 9虚拟机跟着敲一遍,一个月后再回头看这些命令,理解深度会完全不一样。这篇文章里的命令我全部在Rocky Linux 9上实际验证过,个别发行版有差异的地方会单独标注,建议你边看边动手,光存书签是没有用的。

1. 进程管理:从看懂输出到能改进程名

1.1 先分清ps输出里的每一列:进程状态的底层含义

很多新手学进程管理,上来就敲ps aux,看到一堆输出反而懵了。我备考RHCSA时也是这个状态,直到我把ps输出里的每一列都搞明白,才觉得整个系统清晰了很多。先看最常用的两组:

ps -ef ps aux

ps -ef适合看进程的父子关系,第一列UID是启动者,第二列PID是进程号,第三列PPID是父进程号。排查问题时我基本都用ps -ef | grep 进程名来找目标进程,特别是需要知道它是谁拉起来的时候,直接看PPID能省不少事。

ps aux适合查看资源占用情况,里面有个STAT列,这一列才是新手最容易忽略的重点。STAT列会显示进程当前处于什么状态,常见的有这么几个:

  • S:可中断的睡眠,进程在等待某个事件,比如等待I/O完成,这是最正常的休息状态。
  • R:运行中或在运行队列里,代表进程正在吃CPU。
  • D:不可中断睡眠,通常是等待磁盘I/O,这一类进程连kill都杀不掉,只能等I/O超时恢复。
  • Z:僵尸进程,子进程结束了但父进程没去收尸,PID还在,但已经不占内存了。偶尔出现不是大事,如果越积越多,就要去找父进程的问题。
  • T:被暂停,通常是任务被Ctrl+Z或kill -STOP挂起。

我遇到过最迷惑的情况是系统看起来卡,但CPU占用并不高,top里一堆D状态的进程,一查是在等那块快挂掉的磁盘。这时候不要急着kill,先去看磁盘I/O和dmesg日志,问题很可能出在存储层而不是进程本身。

pstree这个命令也值得养成习惯。它把进程的父子关系画成一棵树,配合systemd(PID 1)往下看,整个系统的进程结构一目了然。排查“哪个进程是谁拉起来的”这种问题,pstree -ap比看一堆ps输出直观得多。

1.2 信号是进程管理的遥控器:kill/pkill/systemctl的共通逻辑

进程管理里最常踩的坑,是把kill当成“强制杀掉”的代名词。实际上kill只是给进程发信号,进程收到信号后怎么处理,取决于信号类型和进程自己的逻辑。先记住一条铁律:kill -9是最后的手段,不是第一选择。

kill -l

kill -l会列出所有信号。实际运维中常用的就这几个:

  • SIGTERM(15):默认信号,请求进程自行退出。进程可以捕获这个信号做清理工作再退出,相当于“优雅关停”。
  • SIGKILL(9):由内核直接终止进程,进程没有机会做任何清理,相当于“强制断电”。
  • SIGHUP(1):挂断信号,很多守护进程收到SIGHUP会重新加载配置文件,比如sshd、nginx,所以改完配置不一定要重启,可以kill -HUP让它平滑生效。
  • SIGSTOP(19)和SIGCONT(18):暂停和继续运行,相当于进程版的Ctrl+Z和fg。

RHCSA考点里,kill、killall、pkill三个命令的区别也经常出现。简单说:kill需要精确PID,killall按进程名精确匹配,pkill支持按进程名的模糊匹配和正则。比如要结束所有名为nginx的进程,pkill nginx会匹配到nginx和nginx-worker,killall nginx则需要精确匹配。我喜欢用pkill -f配合完整命令行匹配,比如:

pkill -f "python manage.py runserver"

这条命令会杀掉命令行里包含这段字符串的进程,比按进程名匹配更准。

学到这里要建立一个大观念:systemctl停止服务时,底层也是给主进程发SIGTERM,等几秒再发SIGKILL;systemctl restart也一样。理解了信号之后,再看systemd服务管理就不是“背命令”,而是明白每一步做了什么。这也是本系列一直强调的:把Linux看成一套有规则的协作系统,而不是一堆孤立命令。

1.3 通过exec -a和setproctitle修改进程名

标题里写了“修改进程名称”,这个需求在RHCSA教材里很少展开,但在云原生场景下非常实用。容器里同时跑着好几个同类型的worker进程,全都叫java或者python,排查问题时根本分不清谁是谁。给进程起一个可识别的名字,就是“可观测性”的第一步。

Linux进程名的展示逻辑其实由两部分决定:一部分是/proc/<PID>/comm,这个文件限制在15个字符以内,ps默认显示的进程名主要来自它;另一部分是argv[0],也就是命令行里的第一个参数,ps -ef里展示的完整命令行会用到它。

最简单的方式是用bash的exec -a命令,启动时临时改掉argv[0]:

exec -a myworker python3 /opt/worker.py

这样ps -ef里看到的进程名就是myworker,但要注意exec -a只改了argv[0],不会修改/proc/<PID>/comm,所以ps默认的进程名列可能还是显示python3。如果需要同时改comm,可以用Python的setproctitle库:

pip install setproctitle

然后在Python脚本开头加一行:

import setproctitle setproctitle.setproctitle("myworker-01")

这个库会用prctl系统调用直接修改内核里的进程名,效果最干净。C语言里也有prctl(PR_SET_NAME, "worker01"),原理一样。我在实测中发现,容器里给每个worker设置不同的名称参数,再配合后面要讲的journalctl按_COMM过滤,定位问题速度能提升一个档次。

2. 网络配置实战:nmcli为主,iptables共享上网为辅

2.1 用nmcli从零配置静态IP:连接名和设备名的区别

网络配置是RHCSA的重头戏,也是云原生运维的基础。现在主流发行版都用NetworkManager管理网络,命令行下对应的工具是nmcli。很多新手在配静态IP时反复失败,根本原因是没分清“连接”和“设备”。

先看两行命令:

nmcli device status nmcli connection show

device是物理网卡,比如ens160、ens192、eth0;connection是网络配置项,可以理解成网卡上绑定的“配置方案”。一块网卡上可以存在多个connection,但同一时刻只能激活一个。新手常犯的错是只改connection不管device,或者建了connection但忘了激活。

配置一个静态IP的完整过程如下:

# 新建一个连接,绑定到ens160 nmcli connection add con-name my-static ifname ens160 type ethernet # 设置IP、网关和DNS nmcli connection modify my-static ipv4.method manual \ ipv4.addresses 192.168.1.100/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 223.5.5.5 # 激活连接 nmcli connection up my-static

这里con-name后面跟的是连接名,ifname指定的是物理网卡。系统安装时默认生成的连接名通常也叫ens160,但那只是一个默认名字,两个“ens160”完全不是一个东西。我建议配置时给连接起一个有意义的名称,比如my-static或office-internal,便于后续维护。

改完IP后第一件事是验证连通性:

ping -c 3 192.168.1.1

如果网关能通,再检查DNS:

dig baidu.com

没有dig的话用:

nslookup baidu.com

很多网络故障其实是DNS配置错了,但排查顺序却先卡在网关,这条链路要记牢。

2.2 排查思路:通不通、快不快、通到哪,三层定位

网络排查最忌讳的是没有章法地乱ping。我在运维实践中总结出一套三段排查思路,RHCSA考试里的网络故障题也完全适用。

第一段,确认网卡和链路状态:

ip link ip -s link show ens160

ip link能看到网卡是否UP,物理链路是否正常。ip -s link能看到累计收发流量,如果发送/接收计数一直不变,多半是物理链路或对端设备问题。

第二段,确认路由和连通性:

ip route ping -c 3 网关地址 ping -c 3 8.8.8.8

这里有个小技巧:先ping网关,再ping公网IP,如果网关通但公网IP不通,那是路由或防火墙问题;如果公网IP通但域名不通,再转第三段查DNS。

第三段,确认端口和服务:

ss -tulnp

ss是取代netstat的现代工具,-t看TCP,-u看UDP,-l只看监听端口,-n不解析服务名,-p显示占用进程。比如排查nginx为什么打不开,先ss -tulnp | grep 80,如果nginx在监听但外部连不上,问题多半在防火墙。查看防火墙状态:

firewall-cmd --list-all

我遇到过很多次配置完全正确、服务也在监听,结果就是firewalld默认zone没放行对应端口,外网一直访问不了。这条经验放在RHCSA考试里同样适用:答网络题时,检查顺序能救命。

2.3 把Linux主机变成内网出口:NAT共享上网的两种做法

热搜词里“linux 共享上网 办法”值得展开讲。场景是这样的:一台CentOS/Rocky主机有外网网络(比如ens160),内网网段192.168.10.0/24通过这台主机访问外部网络。这时候要让Linux主机承担网关角色,做NAT转发。

第一步,开启内核IPv4转发:

sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/98-forward.conf sysctl --system

第二步,配置防火墙或iptables做NAT。如果用的是firewalld,直接开启masquerade:

firewall-cmd --permanent --zone=public --add-masquerade firewall-cmd --permanent --zone=public --add-interface=ens160 firewall-cmd --reload

如果内网网口和外网网口在不同zone,需要单独把内网网口加入internal zone,再开启masquerade。我习惯用更直观的iptables方式理解原理,命令如下:

iptables -t nat -A POSTROUTING -o ens160 -j MASQUERADE iptables -A FORWARD -i ens192 -o ens160 -j ACCEPT iptables -A FORWARD -i ens160 -o ens192 -m state --state ESTABLISHED,RELATED -j ACCEPT

这里关键点是POSTROUTING链的MASQUERADE:内网机器发出来的数据包到达Linux主机后,源地址是192.168.10.x,经过这一条规则,源地址会被改写成ens160的公网地址,返回的数据包再自动转换回去。内网机器的网关地址要指向Linux主机的内网IP,同时配置一台可用的DNS。

这种NAT共享上网,在实验室搭测试环境非常实用。云原生场景里也常见:一台裸机作为Kubernetes节点的跳板机,同时为内网容器提供访问外网的途径,原理完全一致,只是把iptables换成了更底层的eBPF或IPVS。

3. systemd:服务管理,RHCSA考题与容器托管都靠它

3.1 systemd的unit文件:写一个nginx服务练手

systemd是Linux服务管理的核心,RHCSA几乎必考。云原生场景下,containerd、kubelet、etcd都是通过systemd托管的,学透systemd,后面理解容器生命周期会轻松很多。

先写一个最简单的systemd服务unit文件。假设我有一个脚本/opt/hello.sh,内容如下:

#!/bin/bash while true; do echo "hello at $(date)" >> /tmp/hello.log sleep 5 done

给它加上执行权限并运行一次确认目录没问题:

chmod +x /opt/hello.sh

然后新建unit文件/etc/systemd/system/hello.service:

[Unit] Description=Hello service demo After=network-online.target [Service] Type=simple ExecStart=/opt/hello.sh Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target

写完执行:

systemctl daemon-reload systemctl start hello systemctl status hello

unit文件分成三段,理解这三段就够了:

  • [Unit]:描述服务信息及依赖关系。After表示当前服务在哪个目标之后启动,不代表必须依赖它,只是顺序关系。真正表达“我启动需要先有它”的是Requires。
  • [Service]:定义服务怎么跑。Type=simple表示ExecStart启动的进程就是主进程,systemd不会额外fork。如果是传统SysV风格的daemon,用Type=forking,同时通常要配PIDFile。Restart=on-failure是容器环境下非常常用的配置:进程异常退出后自动拉起,配合RestartSec=5做间隔重启。
  • [Install]:定义如何被启用。WantedBy=multi-user.target是大多数命令行服务的标准写法,表示开启自启时把这个服务挂到多用户模式target下。

我在实战中多次因为忘了daemon-reload,导致systemd还在用旧的unit配置而启动失败。记住一个原则:unit文件任何修改,都先执行systemctl daemon-reload再重启服务。

3.2 systemctl命令背后的机制:enable到底做了什么

新手的第二个困惑是systemctl start和systemctl enable分不开。简化的理解是:start是立即启动一次,enable是设置开机自启。但深入一点,enable的实际动作是创建符号链接:

ln -s /usr/lib/systemd/system/hello.service /etc/systemd/system/multi-user.target.wants/hello.service

看到这个链接就能理解,所谓“开机自启”就是在对应target的wants目录里建一个软链接,引导系统进入multi-user.target时就会把这个服务一起拉起来。同理,disable就是删除这个软链接。

常用命令总结如下:

systemctl enable --now hello # 启动并设置开机自启,等价于 start + enable systemctl disable --now hello # 停止并取消开机自启 systemctl restart hello systemctl reload hello # 如果unit文件配置了ExecReload指令,用这个做平滑加载 systemctl list-unit-files --type=service --state=enabled

RHCSA考试里经常考“设置某个服务开机自启且立即启动”,最简单的答案就是systemctl enable --now 服务名。但如果你理解了符号链接机制,就算不记得这个组合参数,也可以用前面两个命令凑出同样效果。

systemctl is-enabled可以查看是否开机自启,systemctl is-active查看是否运行。这两个命令在脚本里经常用作条件判断,比解析status输出简单多了。

3.3 journalctl日志与dbus状态通知

systemd另一个强大的地方是统一收集服务日志。传统方式里各服务自己往/var/log/目录写文件,systemd则默认把服务的标准输出和标准错误接到journal里,用journalctl统一查看。

journalctl -u hello.service # 只看hello服务的日志 journalctl -u hello.service -f # 持续跟踪 journalctl --since "10 minutes ago" # 只看最近10分钟 journalctl -p err # 只看错误级别以上

-u指定服务,-p指定优先级,--since按时间过滤,这三个参数组合基本覆盖了日常排障需求。做RHCSA模拟题时,看到“检查某服务为什么启动失败”,第一步一定是systemctl status看状态,第二步就journalctl -u 服务名 -n 50看最后50行日志。

这里要提一下热搜词里的“linux d bus通讯”。systemd与系统其他组件通信,很多依赖DBus。当你执行systemctl命令时,客户端会把请求通过DBus消息发给PID 1的systemd进程,systemd处理完再把结果返回。这也是为什么某些极端情况下DBus服务不正常,systemd命令会卡住。理解这个通信链路,对排查“systemctl命令无响应”很关键。如果哪天sytemctl status卡住,先看/run/dbus/system_bus_socket是否异常,再用ps -ef | grep dbus确认dbus-daemon进程是否活着。

顺带提一下“fence机制”这个词。它属于高可用集群领域,核心思想是当节点状态不可信时,必须先把异常节点从共享存储或网络中隔离(fence)掉,再让备用节点接手,防止两个节点同时操作数据导致脑裂。systemd的单机服务Restart是局部保活,fence是集群层面的“物理隔离”,两者解决的问题不同,但背后都是“异常后必须可靠恢复”的思路。单机基础没打牢之前,不建议一上来就折腾这套。

4. 存储与目录:看懂分区之后再谈挂载NAS

4.1 先理解目录地图:/etc、/var、/proc、/sys不能搞混

RHCSA基础篇里“目录说明”必须过关。Linux的目录树看着复杂,本质就三类:用户数据、系统配置、内核与设备信息接口。搞清楚分类,遇到存放路径时就不会乱猜。

  • /etc:系统的全局配置文件目录,nginx.conf、fstab、hosts、passwd都在这。改系统配置基本绕不开它。
  • /var:会变动的数据,最常见的/var/log日志目录,/var/tmp临时目录,还有邮箱、缓存等。
  • /proc:这是一个虚拟文件系统,目录里的内容不是磁盘上的真实文件,而是内核运行信息的接口。比如/proc/cpuinfo是CPU信息,/proc/meminfo是内存信息,每个进程都有对应的/proc/PID/目录。执行cat /proc/version可以看到内核版本。
  • /sys:另一个虚拟文件系统,主要暴露内核设备模型。现代硬件管理工具(如udev、systemd)都在和它打交道。
  • /dev:设备文件的所在地,/dev/sda代表第一块SATA磁盘,/dev/nvme0n1代表NVMe磁盘。
  • /home和/root:普通用户家目录和root家目录。
  • /usr:系统软件资源的集中地,可执行文件在/usr/bin,库文件在/usr/lib。早期会把/usr单独分区,现在很多系统选择合并,但路径含义没变。

记住一句话:**真实数据在/home、/var和/etc,虚拟接口在/proc和/sys,设备节点在/dev。**这样在清理磁盘空间时就知道该往哪儿看,看到/proc里的“文件”不是垃圾。

4.2 分区、格式化、挂载与fstab持久化

存储操作的完整链路是:分区、格式化、挂载、持久化。RHCSA考试和真实运维里,这条链路必须闭着眼睛做下来。

先看当前盘符:

lsblk

假设有一块新磁盘/dev/sdb,计划分一个区并格式化为xfs。分区用fdisk交互式操作,但考试和脚本里更推荐用非交互方式,可以用parted:

parted /dev/sdb mklabel gpt parted /dev/sdb mkpart primary xfs 1MiB 100% mkfs.xfs /dev/sdb1

实际操作用parted可以避免fdisk的交互麻烦,如果只想快速分区,fdisk也没有问题:

fdisk /dev/sdb <<EOF n p 1 w EOF

格式化之后,创建挂载点并挂载:

mkdir -p /data mount /dev/sdb1 /data df -h

df -h显示-使用量和挂载点。如果要卸载,直接umount /data,注意先确保没有进程在使用该目录。

持久化到fstab,这一步最容易翻车:

blkid /dev/sdb1

用blkid查到UUID,再编辑/etc/fstab,添加这样一行:

UUID=xxxxxx /data xfs defaults 0 0

第一个0表示不在dump备份中,第二个0表示开机不做fsck检查。接着执行mount -a验证fstab有没有语法错误。

fstab写错最典型的后果是开机进emergency mode。真实运维里我在云主机上改fstab从来不是直接改文件,而是一边开着另一个终端,一边准备随时恢复。稳妥的做法是先备份:cp /etc/fstab /etc/fstab.bak,然后验证无误后再重启。如果已经开机失败,进入emergency mode后执行mount -o remount,rw /把根分区变为可写,再改回fstab。这个恢复流程RHCSA不一定会考,但很大概率是生产环境救命的操作。

4.3 挂载NAS:NFS和CIFS的实战参数与开机自动挂载

热搜词里“linux挂载nas存储csdn”的出现频率很高,说明这是真实运维里的高频需求。NAS本质就是一台通过网络提供存储的服务器,Linux下最常见两种协议:NFS主要面向Linux/Unix系统,CIFS/SMB主要用于Windows共享,但在Linux下也能挂载Windows共享目录。

NFS端操作:

# 安装客户端工具 dnf install -y nfs-utils # 查看服务端共享目录 showmount -e 192.168.1.200 # 挂载 mount -t nfs 192.168.1.200:/data/backup /mnt/nfs-backup

CIFS端操作:

dnf install -y cifs-utils mount -t cifs //192.168.1.200/share /mnt/windows-share \ -o username=smbuser,password=xxxxxx,vers=3.0

实际挂载CIFS时,建议指定vers=3.0,避免一部分NAS设备默认使用协议版本不一致导致挂载失败。如果不想密码写在命令行里,可以写成credentials文件并锁定权限:

echo "username=smbuser" > /etc/smb-credentials echo "password=xxxxxx" >> /etc/smb-credentials chmod 600 /etc/smb-credentials mount -t cifs //192.168.1.200/share /mnt/windows-share -o credentials=/etc/smb-credentials,vers=3.0

开机自动挂载网络存储,fstab里要特别注意用_netdev选项,它告诉systemd这是一个网络设备,要等网络就绪后再挂载,避免开机时网络还没起来就尝试挂载导致失败。NFS的fstab行为例:

192.168.1.200:/data/backup /mnt/nfs-backup nfs defaults,_netdev 0 0

云原生场景下,Kubernetes的PV/PVC也经常对接NFS这类存储,底层就是通过NFS协议挂载到宿主机或Pod里。理解了mount、fstab和权限问题,再看存储类资源就不会头大。硬盘是普通存储,NFS是网络存储,它们的共同点是都以文件系统形式挂载进目录树,这一点永远不变。

5. 日志排障与系统维护:把故障当成学习机会

5.1 用journalctl精准过滤日志:按时间、服务和优先级

日志是Linux排障的第一手证据。journalctl基础用法之前提过,这里再说几个能立刻提效的组合用法。

按时间过滤:

journalctl --since "2025-01-01 00:00:00" --until "2025-01-01 23:59:59"

按服务加优先级:

journalctl -u nginx.service -p warning --since "1 hour ago"

只显示关键进程的消息:

journalctl _COMM=sshd

按PID过滤:

journalctl _PID=12345

我排查问题时的习惯是先看错误级别,再逐步放宽条件,避免被大量info日志淹没。默认情况下journal只存在内存里,重启就丢了。如果想把系统日志持久化到磁盘,创建目录并设置:

mkdir -p /var/log/journal mkdir -p /var/log/journal/$(cat /etc/machine-id) systemd-tmpfiles --create --prefix /var/log/journal

重启后日志就会持久保留。生产环境建议一定要做这一步,否则想看上一次重启前发生了什么,会发现什么线索都没有。

5.2 日志文件不清理的后果:logrotate与清空技巧

日志文件如果不做轮转,/var/log迟早会被写满。很多“系统故障”的根因就是磁盘满了。先看磁盘空间:

df -h du -sh /var/log/* | sort -rh | head

日志清理的第一推荐方案是logrotate,它不是简单的删除,而是按策略轮转:把当前日志改名、压缩,再生成一个新的空日志文件,进程不用重启,继续往新文件里写。配置文件的默认位置在/etc/logrotate.conf,具体服务的轮转规则在/etc/logrotate.d/。

看一下一个典型的nginx日志轮转配置:

/var/log/nginx/*.log { daily rotate 14 compress delaycompress missingok notifempty sharedscripts postrotate /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || true endscript }

含义说明:daily每天轮转一次,rotate 14保留14份旧日志,compress对旧日志压缩,delaycompress延迟一天压缩(给还没有完全写完的日志留时间),notifempty表示日志为空时不轮转。postrotate是在轮转后执行的一段脚本,这里给nginx发送USR1信号让nginx重新打开日志文件,否则nginx还写旧文件句柄,轮转就失去意义了。

这里有个很重要的细节:不要用rm直接删除正在被进程写入的日志文件。进程打开的是文件句柄,不是文件名。你把文件删了,进程还在往那个句柄里写,磁盘空间并不会释放,只有把进程重启或让进程重新打开日志文件才生效。我实测里最稳妥的“快速清理”方式是用truncate清空文件,而不是删除:

truncate -s 0 /var/log/大文件.log

这条命令能立即释放磁盘空间,又不影响进程继续写入。应急处理时很好用,但根本解法还是配置好logrotate。

5.3 完整排障示例:从网络中断追到日志累积

学习Linux最有效的方式是真实排障。我拿一个非常典型的故障链完整演示一遍:某天内网一台测试服务器突然连不上,排查过程如下。

第一步,先猜问题范围。先ping服务器IP,不通;再ping网关,通。说明网络链路从我这台机器到服务器所在网段有问题,或服务器本身失联。

第二步,通过带外管理或物理控制台登录服务器。登录后发现系统能进入,但非常卡。查看系统负载和内存:

top free -h

发现CPU不高,但I/O waiting很高,磁盘读写异常。

第三步,查磁盘空间:

df -h

根分区100%满。进一步定位大文件:

du -ah /var | sort -rh | head -20

发现/var/log/某个服务的日志已经膨胀到几十GB。为什么之前没发现?因为这个服务的日志轮转配置缺失或失效,写日志的进程也一直没有重启,日志文件句柄还挂在两天前的位置,df看到空间确实满了,但du查这个文件却显示“实际占用的块”没有完全释放。

第四步,应急处理。别急着删除,先truncate -s 0清空那个大日志文件,然后重启那个服务,让进程重新打开日志。空间立刻释放,系统恢复响应。

第五步,根治。给该服务的日志加上logrotate规则,并调整日志级别,避免下次再发生同样问题。

上面这个链路里融合了进程、存储、日志三条主线,是我认为最有RHCSA风格的真实场景。故障排查的关键是控制节奏:先看现象,再定范围,再查根因,最后做根治,千万不要上来就kill进程或者格式化磁盘。

我备考RHCSA时,基本上把这类故障脚本化:每天故意在虚拟机里制造一个问题,比如关掉一个服务、写错一行fstab、改错网络配置,然后逼自己不看笔记去恢复。这个习惯帮我建立了条件反射,考试时面对“service sshd is not running”这类题目,扫一眼就能定位是服务挂了、配置错了还是网络不通。

基础篇到这里,前面三篇覆盖的命令和概念——文件权限、用户管理、yum源、vim、进程、网络、systemd、存储、日志——已经可以支撑你完成大部分RHCSA入门题。从我的学习经验看,接下来性价比最高的方向是两个:一是把Podman和容器跑起来,体验“systemd管理包含容器进程”的完整链路;二是开始接触Kubernetes核心概念,把单机Linux的知识搬到集群环境。下一篇的更新笔记,我计划写容器运行时和Pod的基础操作,正好把这篇里讲的systemd、网络、存储全部衔接起来。希望这篇日志能给你一点参考,也希望你不要只把命令记住,而是真的把虚拟机打开,在敲命令的过程中见到那些输出和报错。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 4:04:09

从CNN到Mamba:蛇形扫描破解视网膜血管分割拓扑难题

一篇发表在arXiv上的工作能够同时在结构相似度上逼近甚至反超UNet系列&#xff0c;同时又在血管连通性指标上拉开差距&#xff0c;这本身就说明了问题。如果你手里有DRIVE或CHASE数据集&#xff0c;拿现成的UNet和Mamba各自训练一版&#xff0c;在分割结果的视觉对比图上你能看…

作者头像 李华
网站建设 2026/10/3 4:03:45

8.2–12.4GHz宽频喇叭天线设计与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 4:03:40

TD立式管道离心泵:选型、安装与运维全流程实战指南

在暖通空调、给排水和水处理这个圈子里摸爬滚手这么多年&#xff0c;有一类设备你几乎在每一个项目现场都能见到&#xff0c;那就是TD立式管道离心泵。但凡做过机房改造、水泵房验收或者管网增压项目的人&#xff0c;都不会对这个名字感到陌生。它的结构紧凑、占地极小&#xf…

作者头像 李华
网站建设 2026/10/3 4:03:14

技术文档写作的艺术:如何让代码被世界理解

写代码的人大多都听过这样一句话&#xff1a;代码是写给人看的&#xff0c;只是顺便让机器执行。可真到了写技术文档的时候&#xff0c;很多人的表现完全忘记了这句话。需求能讲清楚&#xff0c;架构能画明白&#xff0c;唯独轮到写文档&#xff0c;要么是README里躺着一堆过期…

作者头像 李华
网站建设 2026/10/3 4:02:16

大众ID系列低速AEB系统原理与实操指南

1. 项目概述&#xff1a;这不是“自动驾驶”&#xff0c;而是真正能救命的底层安全逻辑你点开这个标题&#xff0c;大概率是刚接触智能驾驶的新手&#xff0c;可能刚提了辆ID.4或者ID.6&#xff0c;中控屏上闪出过“前方车辆距离过近”“自动刹停已激活”的提示&#xff0c;心里…

作者头像 李华
网站建设 2026/10/3 4:01:33

Android WebView稳定方案:TBS静态集成实战指南

1. 项目概述&#xff1a;为什么TBS静态集成不是“可选”&#xff0c;而是Android开发绕不开的硬需求在Android开发一线干了十多年&#xff0c;我经手过上百个从零起步的App项目&#xff0c;也接手过几十个濒临崩溃的老项目重构。每次聊到WebView兼容性问题&#xff0c;团队里总…

作者头像 李华