Linux运维常见问题及解决方案(完整版)

一、YUM仓库配置问题

Q1:.repo文件没有priority参数,无法设置仓库优先级?
原因:未安装yum优先级插件,priority参数默认无效(yum默认不自带该插件)。
解决方案:
yum install yum-plugin-priorities -y
安装完成后,在目标.repo文件中添加优先级配置(数值越小优先级越高,范围1-99):
echo "priority=1" >> /etc/yum.repos.d/你的仓库.repo
Q2:多仓库冲突,如何指定优先使用某个仓库?
方法1:通过优先级插件设置(推荐,长期有效):
# 1. 确保已安装优先级插件(同上) # 2. 编辑目标仓库文件,添加priority参数 vim /etc/yum.repos.d/目标仓库.repo # 添加:priority=1(最高优先级)
方法2:安装软件时临时指定仓库(单次有效):
yum install 软件包名 --disablerepo=* --enablerepo=目标仓库ID
说明:仓库ID是.repo文件中[]包裹的名称(如[base]、[epel])
Q3:如何配置本地YUM仓库(使用ISO镜像)?
步骤1:挂载ISO镜像到/mnt目录:
mount /dev/sr0 /mnt
步骤2:创建本地仓库配置文件:
echo "[local] name=Local Repository baseurl=file:///mnt enabled=1 gpgcheck=0" > /etc/yum.repos.d/local.repo
步骤3:清理旧缓存并重建:
yum clean all && yum makecache
步骤4:测试安装(如安装tree):
yum install tree -y
Q4:如何验证新配置的YUM源是否生效?
步骤1:清理旧缓存+重建新缓存:
yum clean all && yum makecache
步骤2:查看仓库状态,确认目标仓库为enabled:
yum repolist all | grep 目标仓库ID
步骤3:搜索软件包,验证是否能从新仓库获取:
yum search 软件包名(如yum search nginx)
步骤4:查看仓库优先级(如有冲突):
yum-config-manager --dump 目标仓库ID | grep priority
步骤5:尝试安装测试包,无依赖错误即生效:
yum install -y 测试包名(如tree、vim)

二、远程连接问题

Q1:Linux如何修改SSH远程端口(默认22)?
步骤1:编辑SSH配置文件:
vim /etc/ssh/sshd_config
步骤2:找到#Port 22行,去掉行首#号,修改为自定义端口(如2222):
Port 2222 # 注意:端口号范围1-65535,避免使用知名端口
步骤3:重启SSH服务生效:
systemctl restart sshd
步骤4:设置防火墙开放新端口(以firewalld为例):
firewall-cmd --add-port=2222/tcp --permanent # 永久开放 firewall-cmd --reload # 重载防火墙规则
步骤5:验证端口监听:
netstat -tulnp | grep 2222
Q2:Windows如何修改远程桌面端口(默认3389)?
步骤1:打开注册表编辑器(Win+R输入regedit):
步骤2:定位到两个路径,分别修改PortNumber键值:
# 路径1: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp # 路径2: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp # 操作:右键PortNumber → 修改 → 选择"十进制" → 输入新端口(如3388)
步骤3:更新防火墙规则,允许新端口入站:
# 1. 打开"Windows安全中心"→"防火墙和网络保护"→"高级设置" # 2. 新建入站规则 → 选择"端口" → 输入新端口号 → 允许连接 → 完成
步骤4:重启远程桌面服务:
net stop TermService & net start TermService
步骤5:验证端口是否生效:
netstat -ano | findstr "3388" # 替换为你的新端口
Q3:Windows远程服务没启动,如何查询和启动?
步骤1:查询远程服务(TermService)状态:
sc query TermService
步骤2:解读状态:
- STATE: RUNNING → 服务已启动(正常)
- STATE: STOPPED → 服务未启动(需手动启动)
步骤3:启动远程服务:
net start TermService
步骤4:若启动失败,检查服务是否被禁用:
# 1. Win+R输入services.msc → 找到"Remote Desktop Services" # 2. 右键属性 → 启动类型改为"自动" → 应用 → 启动服务

三、系统资源监控问题

Q1:top命令中%CPU超过100%是什么意思?如何解读?
核心结论:%CPU是多核CPU的总占用率,并非单个核心的限制。
解读规则:
1. 单核CPU:%CPU范围0%~100%,100%表示占满单个核心;
2. 多核CPU:%CPU范围0%~(100%×核心数),如4核CPU最大400%;
3. 示例:4核CPU上%CPU=200% → 占用2个核心的全部算力;%CPU=400% → 占满所有核心。
如何查看CPU核心数?
nproc --all # 显示逻辑核心数(含超线程)
案例分析:%CPU=120%(4核CPU)
可能场景:
- 1个核心100% + 1个核心20%(单线程程序+少量多线程任务);
- 2个核心各60%(多线程程序未完全压榨核心);
- 超线程影响(逻辑核心数翻倍,负载不均)。
Q2:top命令中buff/cache占用很高,是内存不足吗?
结论:不是内存不足!buff/cache是Linux内核的缓存优化机制。
buff/cache的本质:
- Buffer:暂存磁盘写入数据(如文件元数据),减少磁盘碎片化写入;
- Cache:缓存频繁读取的文件数据(如程序代码、数据库索引),加速后续访问;
- 关键特性:当应用需要内存时,内核会自动回收buff/cache,属于"可回收内存"。
如何判断内存是否真的不足?
看free命令的"available"字段(而非free字段):
- available:系统当前可立即分配给新进程的内存(含可回收缓存);
- 若available持续低于总内存的20%,需警惕内存不足风险。
Q3:free命令显示的total内存和标称内存不符,是什么原因?
常见原因(正常现象,非故障):
1. 硬件保留:部分内存被BIOS/UEFI保留(如显卡显存、固件占用);
2. 内核预留:Linux内核会预留少量内存(用于内核栈、驱动等);
3. 示例:标称8GB内存,total显示7.7GB → 正常(0.3GB被硬件/内核占用)。
如何查看实际物理内存(权威方法)?
sudo dmidecode -t memory | grep "Size:"
sudo lshw -short -C memory
解读输出:
- 关注"DIMM RAM"字段(物理内存模块);
- 示例输出"Size: 8 GB" → 实际安装8GB内存,系统已完整识别。
Q4:磁盘空间充足但无法创建文件,是什么原因?
大概率原因:inode耗尽(而非磁盘空间不足)。
inode是什么?
- inode是文件系统中存储文件元数据(权限、所有者、修改时间等)的数据结构;
- 每个文件/目录都需要一个inode,inode耗尽后,即使磁盘空间充足也无法创建新文件。
排查步骤:
df -i # 查看inode使用情况
若IUse%显示100% → 确认inode耗尽,解决方案:
# 1. 查找大量小文件(如日志、临时文件) find / -type f -size -1k | wc -l # 2. 删除无用的小文件(如/var/log下的旧日志) rm -rf /var/log/*.log.old # 3. 重启相关服务(如日志服务) systemctl restart rsyslog
Q5:top命令中的硬中断(hi)和软中断(si)是什么?有什么区别?
核心定义:
- 硬中断:由外部硬件设备(网卡、磁盘、键盘)通过IRQ信号触发;
- 软中断:由内核代码主动触发(如系统调用、异常处理)或硬中断注册。
关键区别:
对比维度 硬中断 软中断
优先级 高(需立即响应) 低(可延迟执行)
可屏蔽性 可屏蔽(CLI指令) 不可屏蔽
执行上下文 原子上下文(禁止阻塞) 中断上下文(禁止睡眠)
是否打断当前任务 会打断CPU当前任务 不会打断,推后执行
典型场景 网卡收包、磁盘I/O完成、键盘输入 网络协议栈处理、定时器任务、磁盘缓存刷新
Q6:top命令中出现僵尸进程(Z状态),如何处理?
僵尸进程定义:进程已终止但父进程未调用wait()回收资源,残留的"空进程壳"。
排查僵尸进程:
ps aux | grep defunct # 查找僵尸进程(defunct标记)
解决方案:
# 方法1:重启父进程(推荐,安全) systemctl restart 父进程名称(如nginx、mysql) # 方法2:强制终止父进程(若父进程无响应) kill -9 父进程PID # 方法3:若父进程是init(PID=1),重启系统(最后手段) reboot
预防措施:
- 合理设计父进程逻辑(捕获SIGCHLD信号并调用wait());
- 避免父进程长期运行而不回收子进程资源。
Q7:Swap分区已启用,但used值持续增长,是什么问题?
原因:物理内存不足,系统开始将部分内存数据换出到Swap分区("换页")。
风险:
- Swap分区位于磁盘,读写速度远慢于物理内存;
- 频繁换页会导致系统卡顿("Swap颠簸")。
解决方案:
# 1. 查看内存使用情况,定位高内存占用进程 top -M # 按内存排序 # 2. 优化高内存进程(如调整JVM参数、清理缓存) # 3. 临时释放Swap(需物理内存充足) swapoff -a && swapon -a # 4. 长期解决方案:增加物理内存或调整Swapiness参数 echo "vm.swappiness=10" >> /etc/sysctl.conf # 减少Swap使用倾向 sysctl -p

四、Nginx服务问题

Q1:如何查看Linux中Nginx是否正在运行?
方法1:通过系统服务状态查看(推荐):
sudo systemctl status nginx
正常输出特征:
- 显示"active (running)";
- 无红色报错信息。
方法2:通过进程查看:
ps aux | grep nginx
正常输出特征:
- 包含1个主进程(root用户,COMMAND为nginx: master process);
- 包含多个工作进程(www-data或nginx用户,COMMAND为nginx: worker process)。
方法3:通过端口监听查看:
sudo netstat -tulnp | grep nginx
正常输出特征:
- 显示0.0.0.0:80(监听所有网卡的80端口);
- 或:::80(IPv6监听)。
Q2:Nginx已运行,但公网IP无法访问,是什么原因?
步骤1:先测试本地访问是否正常(排除Nginx配置问题):
curl -I http://localhost
正常输出:返回HTTP/1.1 200 OK(或301/302跳转)。