[架构之美]linux常见故障问题解决方案(十九)
[架构之美]linux下常见故障问题解决方案
一,文本文件忙
问题一:root@wh-VMware-Virtual-Platform:/home/hail# cp /root/containerd/bin/* /usr/bin/
cp: 无法创建普通文件 ‘/usr/bin/containerd’: 文本文件忙
在Linux系统中遇到“文本文件忙”错误时,通常是因为目标文件正在被进程占用。以下是分步解决方案:
现象截图:
1.1 问题原因分析
错误 cp: 无法创建普通文件 '/usr/bin/containerd': 文本文件忙
表明:
- 目标文件
/usr/bin/containerd
正在被系统进程占用。 - 该文件可能属于正在运行的容器运行时服务(如
containerd
或docker
)。
1.2 解决方案步骤
1. 确认占用文件的进程
使用 lsof
或 fuser
命令查找正在使用文件的进程:
sudo lsof /usr/bin/containerd
# 或
sudo fuser -v /usr/bin/containerd
2. 停止相关服务
停止正在使用 containerd
的服务(按顺序操作):
# 停止 Docker(如果使用)
sudo systemctl stop docker# 停止 Containerd
sudo systemctl stop containerd# 确保进程终止(强制清理)
sudo pkill -9 containerd
3. 复制文件
确认服务停止后,重新执行复制命令:
sudo cp /root/containerd/bin/* /usr/bin/
4. 重启服务
复制完成后恢复服务:
sudo systemctl start containerd
sudo systemctl start docker # 如果之前停止了 Docker
1.3 附加说明
- 内核锁定问题:某些情况下,即使服务已停止,内核仍可能锁定文件。此时可重启系统或使用
cp --remove-destination
覆盖:sudo cp --remove-destination /root/containerd/bin/* /usr/bin/
- 安全模式操作:如果仍无法替换,可尝试进入单用户模式或使用 LiveCD 环境操作。
1.4 命令总结
# 1. 检查进程占用
sudo lsof /usr/bin/containerd# 2. 停止服务
sudo systemctl stop docker containerd
sudo pkill -9 containerd# 3. 强制复制
sudo cp --remove-destination /root/containerd/bin/* /usr/bin/# 4. 重启服务
sudo systemctl start containerd docker
解决截图:
二,域名解析错误
root@wh-VMware-Virtual-Platform:~# ping www.baidu.com
ping: www.baidu.com: 域名解析出现暂时性错误
root@wh-VMware-Virtual-Platform:~#
现象截图:
以下是一些可能的原因和解决方法:
2.1 DNS 服务器配置问题
- 原因:DNS 服务器可能没有正确配置,或者当前的 DNS 服务器无法解析
www.baidu.com
。 - 解决方法:
-
检查当前系统的 DNS 设置。你可以通过以下命令查看当前的 DNS 配置:
cat /etc/systemd/resolved.conf
如果发现 DNS 服务器地址不正确或不可用,可以手动修改为可靠的 DNS 服务器,例如 Google 的公共 DNS(8.8.8.8 和 8.8.4.4)或阿里云的公共 DNS(223.5.5.5 和 223.6.6.6)。
-
修改 /etc/systemd/resolved.conf 文件,添加以下内容:
DNS=8.8.8.8 8.8.4.4
-
保存文件后, 重启
systemd-resolved
服务 ,再次尝试ping
。sudo systemctl restart systemd-resolved
-
解决截图:
2.2 网络连接问题
- 原因:你的网络连接可能不稳定,或者网络配置有问题。
- 解决方法:
- 检查网络连接是否正常。尝试
ping
本地网关或其他已知的 IP 地址,例如:
如果无法成功,说明网络连接可能有问题。ping -c 4 8.8.8.8
- 检查网络配置文件(如
/etc/network/interfaces
或/etc/netplan/*.yaml
),确保网络配置正确。 - 如果是通过 DHCP 自动获取 IP 地址,尝试重启网络服务:
或者重启网络管理器:sudo systemctl restart networking
sudo systemctl restart NetworkManager
- 检查网络连接是否正常。尝试
2.3 防火墙或安全组限制
- 原因:防火墙或安全组可能阻止了 DNS 查询或 ICMP(ping)请求。
- 解决方法:
- 检查系统防火墙规则。你可以使用以下命令查看防火墙状态:
如果防火墙处于活动状态,确保允许 DNS 查询(UDP 端口 53)和 ICMP 流量。sudo ufw status
- 如果你在虚拟机中运行,检查虚拟机的网络设置和宿主机的防火墙规则。
- 检查系统防火墙规则。你可以使用以下命令查看防火墙状态:
2.4 DNS 缓存问题
- 原因:本地 DNS 缓存可能损坏或过期。
- 解决方法:
- 清除本地 DNS 缓存。在 Linux 系统中,可以尝试以下命令:
或者:sudo systemctl restart nscd
sudo systemctl restart NetworkManager
- 再次尝试
ping
。
- 清除本地 DNS 缓存。在 Linux 系统中,可以尝试以下命令:
三,卸载pcre
3.1 卸载通过 apt
安装的 PCRE
运行以下命令卸载系统中通过 apt
安装的 PCRE:
sudo apt remove --purge libpcre3 libpcre3-dev
这将删除所有与 PCRE 相关的包及其配置文件。
3.2 确认卸载成功
运行以下命令确认 PCRE 是否已被完全卸载:
pcre-config --version
如果系统提示 没有那个文件或目录,说明 PCRE 已被成功卸载。
四,openrsty
root@wh-VMware-Virtual-Platform:~/apisix-offline/apisix/apisix-3.12.0# openresty -v
openresty: symbol lookup error: openresty: undefined symbol: lua_getexdata
# 删除旧版OpenResty
sudo rm -rf /usr/local/openresty# 清理可能的残留库
sudo rm -f /usr/local/lib/libluajit-*.so*# 检查全局环境变量(确保无旧路径)
echo $LD_LIBRARY_PATH # 如有旧路径,需修改~/.bashrc或/etc/profile#清除后重新安装
4.1 解决 APISIX 安装时的 GPG 公钥错误
此错误是由于 APT 软件源缺少 Docker 官方仓库的 GPG 公钥导致。以下是详细修复步骤:
1. 添加缺失的 Docker GPG 公钥
# 直接下载并安装 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg# 设置密钥文件权限
sudo chmod 644 /etc/apt/trusted.gpg.d/docker.gpg
2. 修正软件源配置
检查 /etc/apt/sources.list.d/
目录下的 Docker 源文件(如 docker.list
),确认其指向 华为云镜像源 时使用正确的密钥配置:
# 示例:华为云 Docker CE 镜像配置
echo "deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://repo.huaweicloud.com/docker-ce/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list
3. 清除并更新 APT 缓存
# 清理旧缓存
sudo rm -rf /var/lib/apt/lists/*# 强制更新
sudo apt update --allow-insecure-repositories
4. 修复 APISIX 依赖安装
重新执行 APISIX 的依赖安装命令:
cd apisix-3.12.0
make deps
4.2关键问题解析
问题原因 | 解决方案 | 作用说明 |
---|---|---|
缺少 Docker 仓库公钥 | 手动下载并安装 GPG 密钥 | 验证软件包签名合法性 |
镜像源签名配置错误 | 在源配置中显式指定 signed-by 路径 | 明确关联密钥与仓库 |
APT 缓存污染 | 强制清理并更新缓存 | 确保获取最新元数据 |
4.3验证修复结果
# 检查 Docker 源状态
sudo apt update 2>&1 | grep "docker-ce"# 预期输出应无 GPG 错误,显示仓库可更新:
# Get:1 https://repo.huaweicloud.com/docker-ce/linux/ubuntu noble InRelease [2,854 B]
4.4备选方案:跳过 GPG 验证(不推荐)
若紧急情况下需临时绕过验证(生产环境禁用):
# 修改源配置为信任仓库
echo "deb [trusted=yes] https://repo.huaweicloud.com/docker-ce/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
4.5 附录:Docker 官方源配置参考
# 标准 Docker 官方源(非镜像)
echo "deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list
五,docker拉取镜像超时
# 查看 containerd 是否正在运行
sudo systemctl status containerd# 如果未运行,启动服务并设置开机自启
sudo systemctl start containerd
sudo systemctl enable containerd
5.1 问题分析
Docker 在尝试拉取镜像时无法连接到 containerd
服务(底层容器运行时),导致超时错误。常见原因包括:
- containerd 未运行:服务未启动或崩溃。
- 权限问题:用户或 Docker 无权限访问
containerd.sock
。 - 资源不足:系统资源(如磁盘空间、内存)耗尽。
- 配置错误:Docker 或 containerd 的配置损坏。
5.2 逐步解决方案
1. 检查 containerd 服务状态
# 查看 containerd 是否正在运行
sudo systemctl status containerd# 如果未运行,启动服务并设置开机自启
sudo systemctl start containerd
sudo systemctl enable containerd
2. 验证 containerd.sock 文件权限
# 检查 socket 文件是否存在
ls -l /run/containerd/containerd.sock# 预期权限示例(所属组通常为 docker 或 root)
srw-rw---- 1 root root 0 Aug 10 15:30 /run/containerd/containerd.sock# 如果权限不符,修复权限并重启服务
sudo chmod 660 /run/containerd/containerd.sock
sudo chown root:docker /run/containerd/containerd.sock
sudo systemctl restart containerd
3. 重启 Docker 和 containerd 服务
sudo systemctl restart docker containerd
4. 检查系统资源
# 检查磁盘空间
df -h# 检查内存使用
free -h# 如果资源不足,清理空间或增加资源
5. 查看详细日志定位问题
# 查看 containerd 日志
sudo journalctl -u containerd --since "5 minutes ago"# 查看 Docker 日志
sudo journalctl -u docker --since "5 minutes ago"
6. 重装 Docker 和 containerd(若配置损坏)
# 卸载旧版本
sudo apt-get purge -y docker-ce docker-ce-cli containerd.io# 清理残留文件
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd# 重新安装
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io# 启动服务
sudo systemctl start docker containerd
5.3 其他可能原因
1. Docker 与 containerd 版本不兼容
- 确保使用官方支持的版本组合,参考 Docker 文档。
2. 防火墙/SELinux 拦截
# 临时禁用 SELinux(仅用于测试)
sudo setenforce 0# 如果问题解决,需调整 SELinux 策略或禁用
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
3. 检查 Docker 配置文件
# 查看 Docker 的 containerd 配置
sudo cat /etc/docker/daemon.json# 如果文件存在,确保包含以下内容(若无则无需修改)
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": { "max-size": "100m" },"storage-driver": "overlay2"
}
六,apisix停服务报错
root@wh-VMware-Virtual-Platform:/home/apisix/apisix-3.12.0# apisix stop /usr/local/openresty//luajit/bin/luajit ./apisix/cli/apisix.lua stop nginx: [error] open() “/home/apisix/apisix-3.12.0/logs/nginx.pid” failed (2: No such file or directory)
6.1 问题原因
执行 apisix stop
时提示 nginx.pid
文件缺失,通常有两种可能:
- APISIX/Nginx 并未真正运行,因此没有生成 PID 文件。
- PID 文件路径配置错误,APISIX 找不到预期的
nginx.pid
文件。
6.2 解决步骤
1. 确认 APISIX/Nginx 是否正在运行
ps aux | grep -E 'apisix|nginx'
- 如果输出中没有类似
nginx: worker process
或apisix
的进程,说明服务未运行,直接忽略错误即可(无需停止)。 - 如果输出中有相关进程,说明服务仍在运行,但 PID 文件丢失,需手动停止。
2. 手动停止服务
-
方法 1:优雅停止(推荐)
如果知道nginx.pid
的正确路径(比如在配置文件中指定了其他路径):nginx -p /home/apisix/apisix-3.12.0/ -c conf/nginx.conf -s stop
-
方法 2:强制停止
如果进程存在但找不到 PID 文件:sudo pkill -f nginx # 强制终止所有 nginx 相关进程
6.3. 检查 PID 文件路径配置
打开 APISIX 的配置文件 conf/config.yaml
,确认 nginx_config.pid_file
配置项:
nginx_config:pid_file: /home/apisix/apisix-3.12.0/logs/nginx.pid # 检查此路径是否存在
- 如果路径错误(例如目录不存在),需修改为正确路径或手动创建目录:
mkdir -p /home/apisix/apisix-3.12.0/logs/
6.4. 重新启动 APISIX
停止后重新启动服务,观察是否正常生成 PID 文件:
apisix start
- 检查 PID 文件是否生成:
ls /home/apisix/apisix-3.12.0/logs/nginx.pid
6.5. 查看日志定位问题
如果启动失败,检查错误日志:
tail -f /home/apisix/apisix-3.12.0/logs/error.log
常见问题:
- 端口被占用
- 配置文件语法错误
- 权限不足(可尝试用
sudo
运行)
希望本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!