想象一下这个场景:周一早上九点,你刚端起咖啡,监控报警群就炸了。某个关键服务的CPU占用率飙到100%,或者直接显示“Connection Refused”。你SSH连进去,发现系统卡得连ls都要转圈,或者更糟——服务怎么重启都起不来,日志里只有一堆你看不懂的报错。
别慌。这种时候,恐惧比问题本身更致命。我是Agnes,今天不跟你讲那些枯燥的官方文档,我们来聊聊怎么在混乱中保持冷静,像老练的医生一样,通过“望闻问切”快速找到病灶,并把AlmaLinux这个基于RHEL(红帽企业版)的强劲系统救回来。
AlmaLinux 9 是社区驱动的1:1二进制兼容RHEL 9的发行版,它的稳定性和底层逻辑与RHEL完全一致。这意味着,解决它的问题,其实就是解决现代企业级Linux系统通用的问题。
第一阶段:当系统“坐地起凶”——SSH连不上或响应极慢
这是最恐怖的情况。你敲ssh user@server,过了几十秒才弹出密码框;或者连上了,但执行任何命令都感觉延迟极高。
1. 先确认是“真死”还是“假死”
首先,判断网络是否通。在本地机器执行:
ping <server_ip>
如果ping不通,可能是防火墙、网络中断,或者系统内核恐慌(Kernel Panic)导致网络栈挂死。如果ping通,但SSH超时,说明系统还在“喘气”,只是资源耗尽。
关键技巧:如果你开了telnet或者nc(netcat),可以尝试连接22端口:
nc -vz <server_ip> 22
如果连不上22端口,但ping通,那SSH服务可能已经挂了,或者被防火墙规则拦截。
2. 资源诊断:谁在抢CPU?谁在吃内存?
如果能勉强连上SSH,第一件事就是打开另一个终端,不要在一个卡住的shell里疯狂按Ctrl+C,那只会让负载更高。
在第二个终端,快速检查资源:
检查内存和Swap:
free -h
看available列。如果内存几乎耗尽,且swap使用率也很高,系统正在“颠簸”(thrashing),在磁盘和内存之间疯狂交换数据,这就是卡住的根源。
检查谁在占内存:
ps aux --sort=-%mem | head -n 10
或者用更直观的htop(如果装了的话)。你会发现可能是某个Java进程、MySQL、或者一个泄漏的Python脚本把内存吃光了。
检查CPU和I/O:
top
看%CPU和%MEM列,按P按CPU排序,按M按内存排序。
检查磁盘I/O: 有时候CPU不高,但磁盘I/O爆满,系统也会卡死。
iostat -x 1 5
看%util列。如果某个磁盘的%util接近100%,说明I/O是瓶颈。再看await,如果这个数字很大(比如超过100ms),说明磁盘响应极慢,可能是硬件故障或文件系统损坏。
3. 查看系统日志:Linux的“黑匣子”
当系统卡顿,日志往往会有线索。查看最近的系统日志:
journalctl -p err -b --no-pager
-p err只查看错误及以上级别,-b只看当前启动后的日志,--no-pager避免分页。
如果日志里出现大量的Out of memory: Killed process,那就实锤了,是OOM(内存溢出)杀掉了某个进程,或者系统自己杀掉了关键服务。
实战案例:
有一次,某台的nginx突然挂了,SSH也连不上。我们通过ping发现网络通,但SSH超时。用带外管理(IPMI/iDRAC)登录控制台,发现屏幕上全是内核日志。重启后,用dmesg | grep -i oom查看,发现是某个内存泄漏的驱动导致的。重启后,我们给该服务加了cgroup内存限制,问题再没出现。
第二阶段:服务重启失败——为什么systemctl restart不管用?
这是AlmaLinux管理员最常遇到的问题。你以为执行systemctl restart mysqld就能恢复,结果发现:
- 命令执行了,但服务状态变成
failed。 - 或者服务短暂启动后又立即停止。
- 或者启动后,外部访问仍然失败。
1. 不要只看systemctl status,要看细节
很多人看一眼systemctl status nginx,看到failed就慌了。其实,systemctl status的输出中,最后几行才是关键。它会显示最近一次的错误日志摘要。
例如:
● nginx.service - The NGINX HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Mon 2023-10-23 10:00:00 UTC; 5min ago
Process: 12345 ExecStart=/usr/sbin/nginx (code=exited, status=1/FAILURE)
这里的Result: exit-code和code=exited, status=1告诉你,nginx进程自己退出了,返回了错误码1。
2. 深入查看服务日志:journalctl是王道
systemctl status只是摘要,真正的罪证在journalctl里。
查看某个服务的详细日志:
journalctl -u nginx --since "10 minutes ago" --no-pager
-u nginx指定单元,--since限制时间范围,--no-pager全屏输出。
你会看到类似这样的错误:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)- 原因:端口被占用了。可能是另一个nginx实例没杀干净,或者是其他服务占了80端口。
- 解决:
lsof -i :80找出占用进程,kill -9 <PID>,然后重启nginx。
nginx: [emerg] cannot load certificate "/etc/nginx/ssl/cert.pem": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory)- 原因:SSL证书文件不存在或路径错误。
- 解决:检查文件路径,或重新生成证书。
mysql: Can't open the privilege tables- 原因:MySQL数据目录权限问题,或者磁盘空间满。
- 解决:
df -h检查磁盘,chown -R mysql:mysql /var/lib/mysql修复权限。
3. 检查配置语法:配置文件写错了?
很多时候,服务起不来是因为配置文件有语法错误。Systemd会在启动时验证配置,如果配置错误,服务会立即退出。
对于nginx:
nginx -t
输出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
如果syntax is ok,但服务还是起不来,再看日志。如果提示某行有错误,就打开那个文件,检查第几行的语法。
对于PostgreSQL:
sudo -u postgres pg_lsclusters
sudo -u postgres pg_ctlcluster 14 main check
4. 检查依赖关系:MySQL挂了,nginx还能起吗?
有些服务有依赖。比如,一个自定义的Web应用可能需要先启动Redis或RabbitMQ。如果依赖服务没起来,主服务启动时会失败。
查看服务的依赖:
systemctl list-dependencies nginx
确保所有依赖服务都是active (running)状态。如果依赖服务失败了,先解决依赖问题。
5. 权限问题:SELinux是隐形杀手
AlmaLinux默认启用SELinux。很多时候,服务起不来,不是因为配置错,而是因为SELinux阻止了服务访问某个文件或端口。
如何判断是不是SELinux的锅?
查看/var/log/audit/audit.log,或者使用sealert工具:
sealert -a /var/log/audit/audit.log
它会生成一个报告,告诉你哪个进程被拒绝访问,以及推荐的解决方案。
常见场景:
你自定义了一个Web应用,放在了/home/webapp,但nginx以apache或nginx用户运行,没有权限读取该目录。SELinux会阻止nginx读取文件,导致500错误或服务启动失败。
解决:
- 临时关闭SELinux测试(不推荐生产环境长期使用):
如果关闭后服务能启动,那就是SELinux的问题。setenforce 0 - 正确解决:设置正确的SELinux上下文。
或者修改SELinux策略:restorecon -Rv /home/webappsemanage fcontext -a -t httpd_sys_content_t "/home/webapp(/.*)?" restorecon -Rv /home/webapp
第三阶段:磁盘空间满了——系统崩溃的常见元凶
df -h显示根分区100%使用,这是导致服务异常、日志无法写入、数据库崩溃的常见原因。
1. 找出大文件
du -sh /* | sort -hr
这会让你快速定位是哪个目录占了大头。通常是/var/log、/var/lib/docker、/tmp或用户的家目录。
常见罪魁祸首:
- 日志文件:
/var/log下的journal日志、nginx access/error log、mysql error log。 - Docker镜像/容器:
/var/lib/docker可能堆积了大量无用镜像。 - 旧的内核:
/boot分区满了,导致系统无法更新内核,甚至影响启动。
2. 清理策略
清理journal日志:
journalctl --vacuum-time=7d
只保留7天的日志。
清理旧内核: AlmaLinux 9默认保留最近3个内核。如果手动安装过内核,可能会堆积。
dnf remove --oldinstallonly --setopt=installonly_limit=3
清理Docker:
docker system prune -a
注意:这会删除所有未使用的镜像、容器和卷,谨慎操作。
第四阶段:网络问题——服务通了,外网访问不了
服务启动了,curl localhost正常,但外部访问超时。这通常是防火墙或网络配置问题。
1. 检查防火墙:firewalld
AlmaLinux使用firewalld作为防火墙管理工具。
查看当前规则:
firewall-cmd --list-all
看看你的服务端口是否在ports列表中。如果没有,添加它:
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
--permanent确保重启后规则依然存在。
2. 检查网络接口和路由
ip addr
ip route
确保你的服务监听在所有接口(0.0.0.0)还是只监听本地(127.0.0.1)。如果服务只监听127.0.0.1,外部自然访问不到。
例如,修改nginx配置,将listen 80;改为listen 0.0.0.0:80;。
3. 检查云服务商的安全组
如果你是在AWS、Azure、阿里云等云上运行AlmaLinux,别忘了云控制台的安全组(Security Group)或网络ACL。这些是防火墙之上的防火墙,即使firewalld放行了,安全组没放行,外部也访问不了。
第五阶段:内核恐慌与硬件故障——最坏的情况
如果系统直接蓝屏(Linux下的Kernel Panic),或者日志里出现I/O错误、硬件ECC错误,那可能是硬件问题。
1. 查看内核日志
dmesg | tail -n 50
或者
journalctl -k
寻找hardware error、I/O error、segfault等关键词。
2. 内存测试
如果怀疑内存故障,可以运行:
memtest86+
这需要重启进入BIOS/GRUB菜单选择。
3. 磁盘健康检查
smartctl -a /dev/sda
查看磁盘的SMART信息,关注Reallocated_Sector_Ct、Current_Pending_Sector等指标。如果这些值很高,磁盘可能快坏了,立即备份数据!
实战总结:一个完整的故障排查流程
当你在生产环境遇到AlmaLinux故障时,请按以下步骤操作:
- 保持冷静,确认现象:是CPU高、内存满、磁盘满、还是服务挂了?
- 快速诊断:
top/htop看资源。df -h看磁盘。free -h看内存。ping看网络。
- 查看日志:
journalctl -xe看系统级错误。journalctl -u <service_name>看具体服务日志。/var/log/messages或/var/log/secure看传统日志。
- 检查配置:
- 配置文件语法是否正确?
- 权限是否正确?(尤其是SELinux)
- 依赖服务是否就绪?
- 尝试重启:
systemctl restart <service>- 如果失败,看
status和journalctl的反馈。
- 如果是资源问题:
- 清理日志、临时文件、旧内核。
- 扩容磁盘或升级配置。
- 如果是硬件问题:
- 备份数据。
- 联系硬件供应商或云服务商。
给小朋友的比喻:你的AlmaLinux像一座城市
- 服务就像城市里的医院、电厂、水厂。如果医院(比如MySQL)停电了,你就得检查是不是没交电费(配置错误),还是变压器炸了(服务崩溃)。
- 日志就像城市的监控摄像头和警察记录。如果医院出问题,先调监控(
journalctl)看看发生了什么。 - 防火墙就像城市的城门守卫。如果外面的人进不来,看看守卫是不是在站岗时睡着了(规则没开),还是把路堵死了(安全组没配)。
- SELinux就像一个特别严格的保安,不仅看你的身份证(权限),还要看你是不是真的该进这个房间(上下文)。有时候保安太严格,会拦下好人,这时候要教会保安规矩,而不是把他赶走。
- 磁盘空间就像城市的垃圾处理能力。如果垃圾堆满了(磁盘100%),城市就会瘫痪,连医院都运不进物资。
结语
AlmaLinux以其稳定性和企业级特性著称,但再稳定的系统也会遇到故障。关键在于,不要盲目重启,不要乱敲命令。学会用top、df、journalctl这些工具,像侦探一样收集线索,你就能快速定位问题,成为同事眼中的“救火队长”。
记住,每一次故障都是学习的机会。多排查,多记录,下次遇到类似情况,你就能秒杀它。祝你系统永远稳定,报警永远静音!
