Linux 常见问题

FreeGuideOnline 最新 2026-07-14

bash mount -o remount,rw /sysroot # rd.break 方式 chroot /sysroot # 进入系统环境

或直接:
```bash
mount -o remount,rw /
  1. 使用 passwd 命令重置 root 密码:
    passwd root
    
  2. 创建 /.autorelabel 文件(仅 SELinux 开启时需要):
    touch /.autorelabel
    
  3. 输入 exit,系统会继续启动或自动重启。

普通用户无法使用 sudo 提权

现象:执行 sudo 时提示 “user is not in the sudoers file”。
解决方法

  1. 切换到 root 用户。
  2. 使用 visudo 安全编辑 sudoers 文件。
  3. 添加用户权限,例如:
    username  ALL=(ALL:ALL) ALL
    
    或加入 wheel 组(CentOS)或 sudo 组(Ubuntu):
    usermod -aG wheel username   # CentOS
    usermod -aG sudo username    # Ubuntu
    
  4. 保存退出后,用户需重新登录使组权限生效。

文件权限错误导致无法访问

常见错误Permission denied
检查与修复

  1. 查看当前权限:
    ls -l 文件名
    stat 文件名
    
  2. 修改所有者和组:
    chown 用户名:组名 文件
    
  3. 修改读写执行权限:
    chmod 755 文件   # 目录通常用 755,文件用 644
    
  4. 需要递归修改目录时加 -R,谨慎操作。

磁盘与文件系统问题

磁盘空间不足(No space left on device)

原因:数据量大、日志膨胀、inode 耗尽等。
排查步骤

  1. 查看分区使用情况:
    df -h
    
  2. 若空间未满但报错,检查 inode:
    df -i
    
  3. 查找大文件或大目录:
    du -ah / | sort -rh | head -20
    # 或在特定目录下
    du -sh /*
    
  4. 清理日志、临时文件、旧内核:
    journalctl --vacuum-size=200M   # 清理 systemd 日志
    apt autoremove --purge          # Debian/Ubuntu 清理旧内核
    yum autoremove                  # CentOS 8+/Fedora
    
  5. 若 inode 耗尽,查找大量小文件并删除。

分区无法挂载或文件系统损坏

现象mount 报错,如 “wrong fs type, bad option”。
解决方法

  1. 确认文件系统类型:
    lsblk -f
    blkid 设备名
    
  2. 尝试修复文件系统(分区必须未挂载):
    fsck -y /dev/sda1    # ext4 示例
    xfs_repair /dev/sda1 # xfs 示例
    
  3. 若为 Windows 分区(ntfs),安装 ntfs-3g 后挂载:
    mount -t ntfs-3g /dev/sda1 /mnt
    
  4. 检查 /etc/fstab 配置是否正确,避免开机挂载失败。

逻辑卷(LVM)扩容后文件系统未扩大

现象df -h 显示容量未改变。
解决

  1. 扩容逻辑卷后,需扩展文件系统:
    • ext4:resize2fs /dev/vg_name/lv_name
    • xfs:xfs_growfs /挂载点
  2. 若为根分区,可能需要进入救援模式操作。

网络配置与排错

无法上网或网络中断

基本检查流程

  1. 查看网卡是否启动:
    ip link show
    
  2. 检查 IP 地址获取:
    ip addr show
    
  3. 若为静态 IP,确认配置无误:/etc/network/interfaces(Debian)或 /etc/sysconfig/network-scripts/ifcfg-eth0(RHEL)。
  4. 测试网关连通性:ping 网关IP
  5. 测试 DNS 解析:nslookup baidu.comdig baidu.com
  6. 重启网络服务:
    systemctl restart networking   # Debian
    systemctl restart NetworkManager  # 部分发行版
    
  7. 检查路由表:ip route,添加默认路由:
    ip route add default via 192.168.1.1
    

SSH 连接被拒绝

常见原因及解决

  • 服务未启动systemctl status sshd,启动 systemctl start sshd
  • 端口被防火墙阻挡
    firewall-cmd --add-service=ssh --permanent && firewall-cmd --reload  # firewalld
    ufw allow 22/tcp   # ufw
    
  • 配置文件禁用密码登录或禁止 root 登录:编辑 /etc/ssh/sshd_config,检查 PasswordAuthentication yesPermitRootLogin yes,重启 sshd。
  • IP 被 /etc/hosts.deny 误拦:检查并清除。

DNS 解析缓慢或失败

诊断

  1. 测试 DNS 服务器响应:dig @8.8.8.8 baidu.com
  2. 检查 /etc/resolv.conf 是否被正确写入。
  3. 若使用 systemd-resolved,查看状态:
    systemd-resolve --status
    

临时修复:手动添加公共 DNS 到 /etc/resolv.conf

nameserver 8.8.8.8
nameserver 114.114.114.114

永久修改需编辑网络配置文件或 /etc/systemd/resolved.conf

软件包管理

包依赖损坏或安装失败

现象dpkgrpm 报依赖错误,无法安装/卸载。
Debian/Ubuntu 系

sudo apt --fix-broken install
sudo dpkg --configure -a

RHEL/CentOS/Fedora 系

sudo yum-complete-transaction   # 完成未完成的事务
sudo package-cleanup --cleandupes   # 清理重复包(需 yum-utils)
sudo rpm --rebuilddb

如果特定包损坏,强制移除:

sudo rpm -e --nodeps 包名   # 谨慎使用
sudo dpkg --remove --force-remove-reinstreq 包名

存储库密钥过期或缺失

错误信息NO_PUBKEYThe following signatures couldn't be verified
解决

  • 更新密钥:
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 缺失的KeyID  # Debian
    sudo rpm --import https://example.com/RPM-GPG-KEY   # RHEL
    
  • 对于新系统,检查是否完全安装了发行版的密钥包(如 debian-archive-keyring)。

安装的软件包版本过旧

原因:默认源版本滞后。
升级策略

  1. 添加官方第三方 PPA(Ubuntu):
    sudo add-apt-repository ppa:example/ppa
    sudo apt update
    
  2. 使用通用二进制包(.AppImage.tar.gz、Flatpak/Snap)。
  3. 从源码编译安装。

系统启动与引导

系统卡在引导界面无法进入桌面

可能原因:显卡驱动失败、显示管理器崩溃。
应急方案

  1. 在 GRUB 界面编辑内核参数,在 linux 行添加 nomodesetsingle
  2. 进入命令行后,重新安装显卡驱动或禁用显示管理器:
    sudo systemctl disable gdm  # 或 lightdm、sddm
    sudo systemctl stop gdm
    
  3. 检查 Xorg 日志:/var/log/Xorg.0.log

GRUB 引导丢失(双系统安装后)

现象:直接启动到 Windows,无法选择 Linux。
修复方法

  1. 使用 Ubuntu 等发行版的 Live USB 启动。
  2. 挂载系统分区,chroot 进入系统:
    sudo mount /dev/sda2 /mnt        # 根分区
    sudo mount /dev/sda1 /mnt/boot   # 若有单独 boot 分区
    for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
    sudo chroot /mnt
    
  3. 重新安装 GRUB 到磁盘主引导记录:
    grub-install /dev/sda
    update-grub
    
  4. 退出 chroot,重启。

启动报错 “A start job is running for...”

原因:某个服务或挂载点在超时等待。
临时跳过:通常会有倒计时,可等待结束或按相应键跳过。
永久修复

  • 检查并禁用无法启动的服务:
    systemctl list-units --state=failed
    systemctl disable 服务名
    
  • 检查 /etc/fstab 中不存在的挂载项,添加 nofail 选项或删除。

进程与性能

系统负载高、响应卡顿

分析工具

  • tophtop 查看 CPU/内存使用。
  • iostat -x 1 查看磁盘 I/O 等待。
  • sar -u 1 3 综合性能数据。 常见元凶及处理
  1. 僵尸进程:ps aux | grep 'Z',若大量存在可尝试重启父进程。
  2. 内存不足导致 Swap 频繁:增加物理内存或调整 swappiness 值:
    sysctl vm.swappiness=10
    
  3. 单个进程占用过高 CPU:使用 kill -STOP PID 暂停,或 renice 调整优先级。

进程无法杀死(kill -9 无效)

现象D 状态(不可中断睡眠),通常与 I/O 阻塞有关。
方法

  • 该进程不能直接杀死,需解决底层 I/O 问题(如 NFS 超时、磁盘故障)。
  • 若为 NFS 导致的挂起,尝试强制卸载 NFS 挂载点:
    umount -f -l /mnt/nfs
    
  • 重启系统是最后手段。

端口被占用

查找占用进程

sudo lsof -i :端口号
sudo netstat -tulpn | grep 端口号
ss -tulpn | grep 端口号

释放端口:杀死进程或停止对应服务。

安全与防火墙

防火墙规则错误导致服务不可用

快速排查

  1. 查看当前防火墙状态及规则:
    sudo ufw status numbered          # ufw
    sudo firewall-cmd --list-all      # firewalld
    sudo iptables -L -n -v            # iptables
    
  2. 临时禁用防火墙测试连通性(仅限排查):
    sudo systemctl stop firewalld
    sudo ufw disable
    
  3. 永久添加允许规则:
    sudo firewall-cmd --add-port=80/tcp --permanent && sudo firewall-cmd --reload
    sudo ufw allow 80/tcp
    

SELinux 导致服务异常

现象:权限拒绝,日志 /var/log/audit/audit.log 中有 AVC 拒绝记录。
临时诊断:将 SELinux 设置为宽容模式验证:

sudo setenforce 0

若问题消失,则调整策略而不是直接关闭。
修复

  1. 使用 audit2why 分析日志,获取建议。
  2. 调整布尔值或上下文:
    sudo semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
    sudo restorecon -Rv /web
    
  3. 避免永久禁用 SELinux,安全风险高。

其它常见问题

时间不同步

问题:时区错误或时间漂移。
解决

  1. 设置时区:
    sudo timedatectl set-timezone Asia/Shanghai
    
  2. 启用 NTP 同步:
    sudo timedatectl set-ntp true
    
    若使用 chrony:
    sudo systemctl enable --now chronyd
    

字符集或语言乱码

原因:locale 未正确配置。
检查和设置

locale                 # 查看当前设置
locale -a              # 查看可用 locale
sudo localectl set-locale LANG=en_US.UTF-8

生成缺失的 locale(Debian):

sudo dpkg-reconfigure locales