从零开始的云计算生活——第十六天,五花八门,综合实例。

一·故事背景

在经过一系列的学习,最终这些命令,语法,脚本还是为了实际问题而服务,解决问题是关键,接下来是一些故障,优化等案例,多熟悉案例,将来工作上才得心应手。

二·故障排除

1·GRUB引导故障

故障现象: 系统启动卡在"GRUB>"提示符,无法进入系统

原因分析

  • GRUB配置文件损坏(/boot/grub/grub.cfg)

  • 引导文件被误删或磁盘损坏

 解决步骤

1.在GRUB命令行依次执行

insmod xfs
set root=(hd0,msdos1)
linux /vmlinuz root=/dev/sda1
linux16 /vmlinuz-3.10.0-1160.e17 .x86_64 root=/dev/mapper/centos-root ro rd.lvm.iv=centos/swap rhgb quiet
initrd /initramfs-名字.img
boot

2.进入系统后执行:grub2-mkconfig -o /boot/grub2/grub.cfg

2·文件系统只读故障

故障现象: 无法创建文件,提示"Read-only file system"

排查过程

  1. dmesg | grep -i error 发现磁盘I/O错误

  2. smartctl -a /dev/sda 检查磁盘健康状态

解决方案

  1. 卸载分区:umount /dev/sda1

  2. 强制修复:fsck -y /dev/sda1或者 xfs_repair /dev/sda1

  3. 重新挂载:mount -a

3·OOM Killer触发

故障现象: 关键进程突然被终止,系统日志出现"Killed process"

分析工具

  1. grep -i 'killed process' /var/log/messages

  2. free -h 查看内存使用情况

  3. vmstat 1 监控内存交换

 优化方案

  • 调整oom_score_adj:echo -100 > /proc/[PID]/oom_score_adj

  • 修改sysctl.conf:

vm.overcommit_memory = 2
vm.overcommit_ratio = 80

4·系统启动卡住(initramfs损坏)

故障现象: 启动时卡在"Loading initial ramdisk"

紧急处理

  1. 进入救援模式(trouble shooting)使用rescue a centos system,

  2. 选择1

  3. 重建initramfs:

chroot /mnt/sysimage
dracut -f /boot/initramfs-$(uname -r).img $(uname -r)
exit
reboot

4.还原启动顺序

5·磁盘空间耗尽

故障现象: 服务异常,df显示使用率100%

快速定位

  1. lsof -n | grep deleted 查找未释放空间的进程

  2. du -xh --max-depth=1 / | sort -hr 定位大文件

 典型场景

  • /var/log/journal 日志膨胀:journalctl --vacuum-size=100M

  • /tmp目录堆积:rm -rf /tmp/*.tmp

6·逻辑卷无法扩展

故障现象: lvextend后文件系统未扩容

正确操作流程

lvextend -L +10G /dev/vg01/lv_data
resize2fs /dev/vg01/lv_data  # 对ext4文件系统
xfs_growfs /data            # 对XFS文件系统

注意事项

  • 确保物理卷有足够空间:vgs查看Free PE

  • 在线扩容无需卸载

7·内核模块冲突

故障现象: 系统更新后网卡失效

解决方案

  1. lsmod | grep e1000 查看加载模块

  2. modinfo igb 检查模块信息

  3. rmmod igb && modprobe e1000 重载驱动

  4. 回滚驱动:dnf reinstall kmod-e1000-4.18.0

8·SELinux导致服务异常

故障现象: Apache无法访问自定义目录

诊断方法

  1. tail -f /var/log/audit/audit.log | grep httpd

  2. sealert -a /var/log/audit/audit.log

 解决方案

# 临时解决
setenforce 0
# 永久方案
semanage fcontext -a -t httpd_sys_content_t "/webroot(/.*)?"
restorecon -Rv /webroot

9·root密码遗忘

在RHEL/CentOS 7及更新版本中,如果忘记root密码,可以通过以下步骤重置(需物理/虚拟控制台访问权限):

方法原理

通过修改GRUB2启动参数进入单用户模式,绕过身份验证直接获取root权限

详细操作步骤

1·重启系统并中断引导

# 当系统启动到GRUB菜单时,快速按下方向键阻止自动引导
# 选择默认内核条目(通常第一条)按 `e` 键进入编辑模式

2·修改内核参数

# 在linux16行(或linux行)末尾追加:
rd.break enforcing=0

# 修改后的完整行示例:
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/rhel-root rw rd.break enforcing=0

3·进入紧急模式

# 按 Ctrl+X 启动系统,进入紧急救援模式的shell环境
# 此时文件系统挂载在/sysroot(只读模式)

4·切换根目录

chroot /sysroot

5·修改root密码

# 此时已获得完整root权限:
passwd root
# 输入新密码两次(不会显示输入内容)

6·修复SELinux上下文

# 强制重新标记文件系统(重要!):
touch /.autorelabel

7·退出并重启

exit
exit
reboot

关键参数说明

参数作用
rd.break在内核加载初期中断启动流程
enforcing=0临时禁用SELinux强制模式

注意事项

  1. 磁盘加密系统:若启用了LUKS加密,需先解密再操作

  2. 云服务器:部分云平台需通过VNC或救援模式操作

  3. 时间控制.autorelabel会导致首次重启时间较长(约5-15分钟)

  4. UEFI系统:可能需要关闭Secure Boot功能

  5. 审计日志:系统日志会记录密码修改操作(/var/log/audit/audit.log)

替代方案(适用于不同场景)

1·init方法

 # 在GRUB的linux行后追加:
init=/bin/bash

2·systemd方法

systemctl edit --force --full rescue.target

防范建议

  1. 配置sudo权限给普通用户

  2. 使用密码管理工具(如KeePass)

  3. 定期进行密码备份(加密存储)

  4. 启用SSH密钥认证+sudo组合验证

该方法适用于:RHEL/CentOS 7/8/9、Oracle Linux 7+、Fedora 19+等使用systemd的系统

三·性能优化

1·性能优化概述

  1. 目标:提升系统响应速度、资源利用率,避免瓶颈。

  2. 核心原则(*重要)

    • 监控先行:先分析瓶颈,再针对性优化。

    • 逐步调整:避免一次性修改过多参数。

    • 稳定性优先:优化后需充分测试。

2·子系统优化策略

a·CPU优化

调整进程优先级

nice -n 19 ./script.sh   # 启动低优先级进程
renice 19 -p PID         # 修改运行中进程的优先级

绑定CPU核心(减少上下文切换)

taskset -c 0,1 ./program  # 绑定到CPU0和CPU1 亲和性

内核参数调整

# 修改/etc/sysctl.conf
kernel.sched_child_runs_first = 1  # 子进程优先调度

b·内存优化

调整Swap使用策略

# 修改/etc/sysctl.conf
vm.swappiness = 10        # 降低Swap使用倾向(0-100,默认60)
vm.vfs_cache_pressure = 50 # 减少inode缓存回收频率

禁用透明大页(THP)

echo never > /sys/kernel/mm/transparent_hugepage/enabled

c·磁盘I/O优化

选择合适I/O调度器

# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 临时修改为deadline调度器(适用于SSD)
echo deadline > /sys/block/sda/queue/scheduler

文件系统优化(ext4)

# 挂载参数:noatime(不记录访问时间), data=writeback
UUID=xxx / ext4 defaults,noatime,data=writeback 0 1

d. 网络优化

TCP参数调优

# 修改/etc/sysctl.conf
net.core.somaxconn = 4096       # 提高连接队列长度
net.ipv4.tcp_fin_timeout = 30   # 缩短TIME_WAIT超时
net.ipv4.tcp_tw_reuse = 1       # 允许重用TIME_WAIT连接

sysctl -p  # 应用配置

限制连接数

# 使用iptables限制单IP连接数
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP

3·资源限制优化

a.ulimit

# 编辑/etc/security/limits.conf
* soft nofile 65535    # 文件描述符软限制
* hard nofile 65535    # 硬限制

生效方式:重启会话或执行 ulimit -n 65535

b.cgroups(控制组)

限制进程资源

# 创建cgroup(需安装cgroup-tools)
cgcreate -g cpu,memory:/my_group
# 限制CPU使用为50%
cgset -r cpu.cfs_period_us=100000 -r cpu.cfs_quota_us=50000 my_group
# 限制内存为1GB
cgset -r memory.limit_in_bytes=1G my_group
# 将进程加入cgroup
cgexec -g cpu,memory:my_group ./program

4·安全与注意事项

  1. 备份配置文件:修改前备份 /etc/sysctl.conf/etc/security/limits.conf

  2. 灰度测试:先在测试环境验证参数调整效果。

  3. 避免过度优化:如无明确瓶颈,优先使用默认配置。

5·综合案例

案例1:TCP连接数过高导致Web服务卡顿

问题描述

Nginx服务器在高并发时出现 Too many open files 错误,TCP连接数超过默认限制。

优化配置

1·修改文件描述符限制

# 编辑 /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
nginx soft nofile 65535   # 针对Nginx用户单独设置

2·调整Nginx配置

# /etc/nginx/nginx.conf
worker_rlimit_nofile 65535;  # 与limits.conf一致
events {
  worker_connections 4096;   # 每个Worker进程连接数
}

3·内核TCP参数优化

# 编辑 /etc/sysctl.conf
net.core.somaxconn = 65535     # 最大连接队列
net.ipv4.tcp_max_syn_backlog = 65535  # SYN队列长度
net.ipv4.tcp_tw_reuse = 1      # 重用TIME_WAIT连接
net.ipv4.tcp_fin_timeout = 30  # 缩短FIN超时

sysctl -p  # 生效配置

验证方法

ss -lnt | grep 'LISTEN'   # 查看监听队列长度
cat /proc/$(pidof nginx)/limits | grep 'open files'  # 确认Nginx进程限制

案例2:Java应用内存溢出导致系统崩溃

问题描述

Tomcat服务频繁触发OOM(Out of Memory),且系统Swap使用率过高。

优化配置

a.限制JVM堆内存

# 修改Tomcat启动脚本 catalina.sh
export JAVA_OPTS="-Xms2G -Xmx2G -XX:MaxMetaspaceSize=512M"

b.调整系统Swap策略

# 编辑 /etc/sysctl.conf
vm.swappiness = 10       # 降低Swap使用倾向
vm.overcommit_memory = 1 # 允许超量分配内存(谨慎使用)

c.使用cgroups限制内存

# 创建内存限制组
cgcreate -g memory:/tomcat
cgset -r memory.limit_in_bytes=4G /tomcat
cgset -r memory.memsw.limit_in_bytes=6G /tomcat  # 物理内存+Swap总限制
# 启动Tomcat
cgexec -g memory:tomcat /opt/tomcat/bin/startup.sh

验证方法

free -h          # 查看内存和Swap使用
ps aux | grep tomcat  # 确认cgroup限制生效
cat /sys/fs/cgroup/memory/tomcat/memory.usage_in_bytes  # 查看内存占用

案例3:磁盘I/O延迟导致数据库性能下降

问题描述

MySQL读写缓慢,iostat 显示磁盘 %util 持续高于90%。

优化配置

a.切换I/O调度器

# 临时切换为deadline调度器(SSD推荐)
echo deadline > /sys/block/sda/queue/scheduler
# 永久生效(GRUB配置)
vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="elevator=deadline"
update-grub  # Debian/Ubuntu
grub2-mkconfig -o /boot/grub2/grub.cfg  # CentOS/RHEL

b.调整文件系统挂载参数

# 编辑 /etc/fstab
UUID=xxxx /data ext4 defaults,noatime,nodiratime,data=writeback 0 2

c.MySQL配置优化

# /etc/my.cnf
innodb_flush_method = O_DIRECT     # 绕过内核缓存
innodb_io_capacity = 2000          # SSD建议值
innodb_buffer_pool_size = 8G       # 分配足够缓冲池

验证方法

cat /sys/block/sda/queue/scheduler  # 确认调度器
iostat -xm 1                        # 观察%util和await变化
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';  # 查看缓冲池命中率

案例4:CPU竞争导致多线程应用性能差

问题描述

Python多进程数据处理程序运行缓慢,top 显示CPU在多个核心间频繁切换。

优化配置

 a.绑定进程到特定CPU核心

# 使用taskset绑定到CPU0-3
taskset -c 0-3 python3 data_processing.py

b.调整进程优先级

nice -n -20 python3 high_priority_task.py  # 最高优先级(需root)
renice -n 19 -p 1234   # 将运行中的PID=1234进程设为低优先级

c.禁用CPU节能模式

# 安装cpufrequtils(Debian/Ubuntu)
apt install cpufrequtils
# 设置为性能模式
cpufreq-set -g performance -c 0  # 对每个CPU核心执行

验证方法

mpstat -P ALL 1      # 查看各核心利用率
cpufreq-info         # 确认当前CPU频率策略

案例5:网络丢包导致视频流传输卡顿

问题描述

视频流服务器在传输大流量UDP数据时出现丢包,sar -n UDP 1 显示 idgm/s(输入数据报)超过网卡处理能力。

优化配置

a.增大Socket缓冲区

# 编辑 /etc/sysctl.conf
net.core.rmem_max = 67108864   # 接收缓冲区最大值(64MB)
net.core.wmem_max = 67108864   # 发送缓冲区最大值
net.core.netdev_max_backlog = 500000  # 网卡队列长度

b.多队列网卡优化

# 启用RSS(Receive Side Scaling)
ethtool -L eth0 combined 8     # 设置8个队列(需网卡支持)
# 绑定IRQ到不同CPU核心
vi /etc/rc.local
/usr/bin/irqbalance --powerthresh=50  # 启用IRQ平衡

c.应用层优化(FFmpeg示例)

ffmpeg -i input -c copy -f mpegts udp://target:1234?buffer_size=4194304  # 增大发送缓冲区

验证方法

ethtool -S eth0 | grep rx_dropped  # 查看丢包统计
sar -n UDP 1                       # 监控UDP报文状态
cat /proc/interrupts | grep eth0   # 确认IRQ分布

6·总结:优化配置原则

  1. 精准定位瓶颈

    • 使用 perf top 分析CPU热点。

    • 通过 dmesg 检查内核OOM或I/O错误日志。

  2. 层级化调整

    层级工具/方法
    应用层代码优化、连接池配置
    运行时JVM参数、Golang GC策略
    操作系统sysctl、cgroups、ulimit
    硬件/驱动升级SSD、调整RAID级别
  3. 自动化监控

 # 使用Prometheus + Grafana监控模板
- node_exporter 采集系统指标  
- alertmanager 配置CPU/内存阈值告警  

四·基线检查与安全加固

1·系统安全基线

a.账户与认证安全

检查默认账户状态

检查点:锁定或删除不必要的默认账户(如guest, test)。

# 锁定账户
sudo passwd -l guest
# 删除账户
sudo userdel test

密码策略配置

检查点:密码长度≥8位,复杂度包含大小写、数字、符号,有效期≤30天

修改/etc/login.defs

PASS_MAX_DAYS 90
PASS_MIN_LEN 8
PASS_WARN_AGE 7

安装libpam-pwquality并配置复杂度(/etc/security/pwquality.conf):

minlen = 8
dcredit = -1
ucredit = -1

禁止Root直接登录

检查点:通过SSH禁止Root远程登录,使用普通用户+sudo提权。

修改/etc/ssh/sshd_config

PermitRootLogin no

空密码账户检查

检查点:确保所有账户均有密码

awk -F: '($2 == "") {print $1}' /etc/shadow

b.文件与目录权限

关键文件权限

检查点/etc/passwd权限644,/etc/shadow权限000

chmod 644 /etc/passwd
chmod 000 /etc/shadow

全局可写文件检查

检查点:查找权限为777的文件或目录。

find / -perm -0777 -type f -exec ls -l {} \;

无属主文件检查

检查点:修复无属主或属组的文件。

find / -nouser -o -nogroup -exec chown root:root {} \;

临时目录粘滞位

检查点/tmp目录设置粘滞位(权限1777)

chmod +t /tmp

c.SSH服务安全

使用SSH协议版本2

检查点:禁用不安全的SSHv1

修改/etc/ssh/sshd_config

Protocol 2

限制登录尝试次数
  • 检查点:防止暴力破解,限制失败尝试为3次。

  • 案例:修改/etc/ssh/sshd_config

MaxAuthTries 3

启用密钥认证

  • 检查点:禁用密码登录,强制使用密钥。

PasswordAuthentication no

d.网络与服务配置

关闭非必要服务

检查点:禁用Telnet、FTP等不安全服务。

systemctl stop telnet.socket
systemctl disable telnet.socket

防火墙配置
  • 检查点:仅开放必要端口(如SSH的22/HTTP的80)。

  • 案例(使用iptables):

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP

禁用ICMP重定向
  • 检查点:防止网络参数被篡改。

  • 案例:修改/etc/sysctl.conf

net.ipv4.conf.all.accept_redirects = 0

e.日志与审计

日志服务状态
  • 检查点:确保rsyslog/auditd运行。

systemctl status rsyslog

关键日志权限

检查点/var/log/secure权限设为640。

chmod 640 /var/log/secure

审计关键文件
  • 检查点:监控/etc/passwd的修改。

  • 案例:添加auditd规则(/etc/audit/rules.d/audit.rules):

-w /etc/passwd -p wa -k passwd_change

f.内核参数加固

防SYN洪水攻击
  • 检查点:启用SYN Cookies。

  • 案例:修改/etc/sysctl.conf

net.ipv4.tcp_syncookies = 1

禁用IP源路由

  • 检查点:防止IP欺骗。

net.ipv4.conf.all.accept_source_route = 0

g.更新与补丁

系统更新检查
  • 检查点:定期更新所有软件包

apt update && apt upgrade -y  # Debian/Ubuntu
yum update -y                 # CentOS/RHEL

h.安全模块配置

启用SELinux/AppArmor

  • 检查点:确保处于enforcing模式。

  • 案例:修改/etc/selinux/config

SELINUX=enforcing

i.SUID/SGID文件检查

清理危险权限文件
  • 检查点:移除不必要的SUID/SGID文件。

find / -perm /4000 -type f -exec ls -l {} \;  # SUID文件
find / -perm /2000 -type f -exec ls -l {} \;  # SGID文件

j.默认权限控制(umask)

设置严格umask

  • 检查点:全局umask设置为027(文件640,目录750)。

  • 案例:修改/etc/profile

umask 027

2·系统安全加固

通过账户加固、服务管理、文件权限控制、内核参数优化、日志审计、安全工具部署等综合措施,可显著提升Linux系统的安全性。实际操作中需结合业务场景调整策略,并通过工具(如Lynis、OpenSCAP)验证加固效果。

3·漏洞修复案例

案例1:Shellshock漏洞(CVE-2014-6271)
  • 影响版本:Bash ≤4.3

  • 漏洞描述:通过环境变量注入恶意代码,可远程执行任意命令。

  • 修复步骤

# 更新Bash
sudo apt-get update && sudo apt-get install --only-upgrade bash  # Debian/Ubuntu
sudo yum update bash -y  # RHEL/CentOS

验证方法

env x='() { :;}; echo vulnerable' bash -c "echo test"  # 若输出"vulnerable"则未修复。

案例2:Log4j2远程代码执行漏洞(CVE-2021-44228)
  • 影响版本:Log4j 2.x ≤2.14.1

  • 漏洞描述:JNDI注入漏洞,攻击者可通过日志记录触发RCE。

  • 修复步骤

 1·升级Log4j2到2.17.0+:

# 手动替换JAR文件或通过包管理器更新

2·设置环境变量禁用JNDI:

export LOG4J_FORMAT_MSG_NO_LOOKUPS=true

验证方法: 使用扫描工具(如log4j-detector)确认版本和配置。

案例3:Linux内核Netfilter漏洞(CVE-2024-1086)
  • 影响版本:Linux内核 5.14 ~6.6

  • 漏洞描述:释放后使用(Use-After-Free)漏洞,可导致本地提权。

  • 修复步骤

sudo apt-get update && sudo apt-get install linux-image-generic  # Debian/Ubuntu
sudo yum update kernel -y  # RHEL/CentOS
sudo reboot

 验证方法: 检查内核版本是否升级到修复版本(如6.6.15+)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值