温馨提示×

debian readdir出错怎查

小樊
43
2026-09-13 09:12:24
栏目: 智能运维

在 Debian(或任何 Linux)上 readdir 出错,通常是程序调用 readdir() 系统/库函数失败。排查可以按下面步骤来做。


一、先确认“谁”在报错

不同场景排查方式不同:

  1. 自己的 C/C++ 程序
  2. 某个命令(ls、find、rsync 等)
  3. 日志里看到 readdir 错误
  4. NFS / 挂载目录出错

二、最常见原因 & 对应排查方法

1️⃣ 目录不存在 / 权限不足(最常见)

ls -ld /path/to/dir
  • 没权限 → Permission denied
  • 目录不存在 → No such file or directory

解决:

sudo chmod / chown

2️⃣ 目录在“坏掉”的文件系统(磁盘错误)

dmesg | tail

或:

journalctl -xe

看是否有:

  • I/O error
  • ext4 error
  • bad sector

检查文件系统:

sudo fsck -f /dev/sdX

(必须 umount)


3️⃣ 网络文件系统(NFS / SMB)断开

如果是挂载目录:

mount | grep nfs
df -h

测试:

ls /mnt/nfs

常见错误:

  • Stale NFS file handle
  • Input/output error

解决:

sudo umount -f /mnt/nfs
sudo mount -a

4️⃣ 目录文件数过多 / inode 用光

df -i /path

如果 IUsed = 100%:

find /path -xdev -type f | wc -l

5️⃣ 程序代码层错误(C 示例)

典型错误用法:

while ((entry = readdir(dir)) != NULL) {
    // 没有检查 errno
}

✅ 正确做法:

errno = 0;
while ((entry = readdir(dir)) != NULL) {
    // 正常处理
}
if (errno != 0) {
    perror("readdir");
}

常见 errno:

  • EBADF:目录流已关闭
  • ENOENT:目录被删
  • EIO:磁盘错误

6️⃣ 32位程序读超大目录(老系统)

  • 老 glibc + 大目录
  • 需要 _FILE_OFFSET_BITS=64

三、快速定位“readdir 出错”的万能方法

strace -e trace=file your_command

例如:

strace ls /bad/dir

你会看到:

openat(...) = -1 EACCES
readdir(...) = -1 EIO

四、如果你愿意,我可以更精准帮你

你可以告诉我:

  1. 报错的是 命令还是程序
  2. 完整错误信息(英文)
  3. 目录类型(本地 / NFS / Docker / 加密盘)

我可以直接帮你定位是哪一类问题。

0 踩