结果出来有问题,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
- };
这就是问题的根源了。
make kernel_menuconfig中把JFFS2_FS_XATTR 打开。
编译验证删除OK。多坑爹的问题,还是对fs不懂,只能靠这种土办法排查。