首先要区分是源端读取失败还是目标端写入失败;若报错明确指向源路径(如open "/path/to/file": permission denied),则需检查源文件及所有父目录的r/x权限、运行用户身份、selinux/apparmor限制、挂载选项及不可变属性,并可选择性排除不可读文件。

遇到 rsync 同步失败且报错含 Permission denied,首先要区分是源端读取失败,还是目标端写入或属性设置失败。错误指向源路径(如 open "/path/to/file": Permission denied),说明问题在本地读取权限;若出现在目标路径或没明确路径但提示 some files could not be transferred,则多与目标端权限、挂载限制或时间戳/属主设置有关。
检查源文件及所有父目录的 r 和 x 权限
Linux 中读取一个文件,不仅需要文件本身有 r 权限,还要求从根目录到该文件的每一级父目录都具备执行权限(x)——否则无法进入目录访问其内容。
- 运行
ls -l /path/to/file查看文件权限,确认当前用户是否有r - 用
namei -l /path/to/file逐层显示路径各组件权限,重点排查哪一级目录缺少x(例如显示为drw-r--r--就是问题所在) - 常见情况:备份脚本用 root 运行,但源目录属主是普通用户且未开放组/其他执行权限;或 NFS/CIFS 挂载时服务端限制了客户端遍历能力
确认实际运行用户和环境上下文
定时任务、systemd 服务或 sudo 场景下,用户身份和权限上下文常与交互式登录不一致。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- crontab 默认不加载
~/.bashrc,可能缺失umask或PATH,建议显式设置umask 022并用绝对路径调用 rsync - 用
sudo rsync时,检查/etc/sudoers是否启用env_reset或限制了某些路径;可尝试sudo -i rsync模拟完整登录环境 - 在容器或受限环境中运行时,确认用户 UID/GID 在宿主机上有对应账户,避免因 UID 映射导致权限误判
排查 SELinux、AppArmor 或文件系统级限制
即使权限位看起来正常,安全模块或底层属性仍可能拦截访问。
- 检查 SELinux:运行
ausearch -m avc -ts recent | grep rsync或dmesg | tail -20 | grep avc,若有拒绝日志,临时设为 permissive 模式验证是否为根源 - 检查不可变属性:
lsattr /path/to/file,若输出含i(immutable),需用chattr -i解除(需 root) - 确认源路径所在分区未被只读挂载:
findmnt -T /path/to/source,若显示ro,需修复磁盘或重新挂载为rw
定位目标端权限问题与绕过策略
当错误不明确指向某文件,而是笼统提示 some files could not be transferred,通常因目标端无法设置时间戳、权限或属主。
- 重定向 stderr 查真实错误:
rsync -av src/ dst/ 2>&1 | grep -E "(Permission denied|Operation not permitted)" - 用
--itemize-changes(简写-i)查看每项变更结果,例如.f…….表示时间戳未更新,.p…….表示权限未同步 - 对 NFS、Docker volume 或 SMB 挂载目录,禁用元数据操作:
--no-times --no-perms --omit-dir-times可快速验证是否为挂载限制所致 - 确需跳过个别敏感文件(如密钥),用
--exclude='*.key'或--filter='hide, protect *.secret',避免用--ignore-errors掩盖问题










