您尚未登录。

楼主 # 2025-04-27 22:15:43

memory
会员
注册时间: 2021-08-11
已发帖子: 595
积分: 567

终于找到 squashfs + overlayfs(jffs2) 不能删除lower文件的原因了

现象:

# rm test.pem
rm: can't remove 'test.pem': Not supported

驱动报错:

[  125.913143] overlayfs: ERROR - failed to whiteout 'AmazonRootCA1.pem'

离线

楼主 #1 2025-04-27 22:16:49

memory
会员
注册时间: 2021-08-11
已发帖子: 595
积分: 567

Re: 终于找到 squashfs + overlayfs(jffs2) 不能删除lower文件的原因了

原因: http://blog.chinaunix.net/uid-27057175-id-4913812.html

解决overlayfs删除文件遗留overlay-whiteout链接的问题
分类: LINUX2015-03-24 15:07:03

之前在openwrt上为了支持broadcom的一款芯片,替换掉了内核版本,这样overlayfs的补丁自己改的,openwrt overlayfs 2.6.36内核补丁
结果出来有问题,overlay的好处就是提供一个jffs2层把用户针对rootfs只读区的修改同步过去,包括删除和替换操作。
而我这个版本有个问题,就是删除只读层的文件时,提示删除失败,并且还留下一个非常难看的overlay-whiteout链接。

用strace跟踪,strace -f -F -o strace.log  rm /etc/config/ddns
确认是unlink系统调用返回错误
unlink("ddns")                    = -1 EOPNOTSUPP (Operation not supported)

就从overlayfs的ovl_unlink()入手,逐步跟踪到底,在__vfs_setxattr_noperm()中
inode->i_op->setxattr 回调指向为NULL,这个有点问题,于是把inode->i_op的回调地址打出来,查找system.map
i_op指向了

const struct inode_operations jffs2_file_inode_operations =
{
    .check_acl = jffs2_check_acl,
    .setattr = jffs2_setattr,
    .setxattr = jffs2_setxattr,
    .getxattr = jffs2_getxattr,
    .listxattr = jffs2_listxattr,
    .removexattr = jffs2_removexattr
};

再查代码,jffs2_setxattr被CONFIG_JFFS2_FS_XATTR宏给控制了,未定义时jffs2 xattr的接口全部被define为NULL。
这就是问题的根源了。

make kernel_menuconfig中把JFFS2_FS_XATTR 打开。
编译验证删除OK。多坑爹的问题,还是对fs不懂,只能靠这种土办法排查。

离线

楼主 #2 2025-04-27 22:17:07

memory
会员
注册时间: 2021-08-11
已发帖子: 595
积分: 567

Re: 终于找到 squashfs + overlayfs(jffs2) 不能删除lower文件的原因了

QQ20250427-213919.png

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn