glibc 不解析 /etc/shadow,密码验证由 pam(pam_unix.so)完成;常见问题包括 shadow 权限错误(需 600、root:root)、不可变属性(i)、格式异常(如\r、空密码字段)或 pam 配置/模块损坏。

这个问题实际并不存在——Glibc 本身不解析 /etc/shadow,也不参与密码验证流程。/etc/shadow 的读取和校验完全由 PAM 模块(主要是 pam_unix.so)完成,而 Glibc 只提供基础的 getpwent()、getspnam() 等系统调用封装,其行为受编译时配置和运行时链接库影响,但不会因“Glibc 配置变动”导致 shadow 解析失败。
真正需要排查的方向是 PAM 和 shadow 文件本身
所谓“shadow 无法被正确读取解析”,本质是 PAM 在调用 getspnam("root") 后返回空或校验失败,常见原因如下:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
/etc/shadow 权限或属主错误:必须为
-rw------- (600)且属主root:root(或root:shadow,若启用 shadow 组)。宽松权限(如 644、640 但属组非 shadow)会触发pam_unix.so主动拒绝 -
/etc/shadow 文件被设为不可变:执行
sudo lsattr /etc/shadow,若含i(immutable)属性,getspnam()调用会直接失败,PAM 报Authentication token manipulation error -
/etc/shadow 内容格式异常:例如 root 行第二字段为空(
root::...)、为!或*(表示锁定),或哈希字符串含非法字符、换行、dos 回车(\r)——后者常因编辑器误保存导致 PAM 解析中断 -
PAM 配置引用了损坏或缺失的模块:检查
/etc/pam.d/common-auth或/etc/pam.d/system-auth中pam_unix.so行是否拼写错误,或路径下/lib/security/pam_unix.so文件实际不存在或 ELF 格式损坏
快速验证与修复步骤
以 root 身份执行以下命令逐项确认:
- 检查 shadow 权限与属性:
ls -l /etc/shadow && lsattr /etc/shadow
若异常,运行:chmod 600 /etc/shadow && chown root:root /etc/shadow && chattr -i /etc/shadow - 检查文件内容是否合法:
head -n1 /etc/shadow | tr -d '\r' | grep -q '^[^:]*:[^:]*:' && echo "格式基本正常" || echo "存在回车或字段分隔异常" - 手动触发 PAM 读取测试(绕过 passwd):
getent shadow root
若无输出或报错,说明底层 NSS 或文件状态已异常;若能输出,则问题在 PAM 链后续环节(如密码策略、token 锁定等)
特别注意 Buildroot 或精简系统场景
某些嵌入式系统(如 Buildroot)默认不启用 shadow 支持,/etc/passwd 第二字段仍存密码哈希,而 /etc/shadow 甚至不存在。此时 pam_unix.so 若被强制配置为读取 shadow,就会静默失败。需确认:
- 系统是否启用
USE_SHADOW编译选项 -
/etc/nsswitch.conf中shadow:行是否为files(而非compat或注释掉) -
getent shadow root是否有输出,而非仅依赖getent passwd root










