go - Overlayfs 复制创建一个空文件
问题描述
我正在做一些奇怪的事情,创建一个overlayfs挂载,其中较低的目录是一个FUSE卷(我已经实现了)。这似乎主要工作,我可以通过overlayfs挂载从FUSE挂载读取文件,并且它们具有正确的内容。我还可以在 overlayfs 挂载中创建新文件,这并不奇怪,因为这应该只要求较低的 FUSE 层ENOENT
在您尝试LOOKUP
那个文件。失败的是当我尝试附加到现有文件时,而不是获取现有内容后跟附加内容,我只是获取附加内容。我假设一定有我的 FUSE 卷应该做的事情,它不是,这导致了这个错误。但是,查看日志并没有抱怨任何未实现的方法,也没有任何错误。以下是相关文件(“foo”)的日志。
2020/04/15 10:35:42 rx 9: LOOKUP i9223372036854775808 ["foo"] 4b
2020/04/15 10:35:42 tx 9: OK, {i9223372036854775809 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*0 i0:9223372036854775809 A 0.000000 M 0.000000 C 0.000000}}
2020/04/15 10:35:42 rx 10: OPEN i9223372036854775809 {O_RDONLY,0x8000}
2020/04/15 10:35:42 tx 10: OK, {Fh 1 }
2020/04/15 10:35:42 rx 11: GETATTR i9223372036854775809 {Fh 0}
2020/04/15 10:35:42 tx 11: OK, {tA=0s {M0100600 SZ=4 L=1 0:0 B8*4096 i0:9223372036854775809 A 1586972142.827290 M 1586972142.855292 C 1586972142.855292}}
2020/04/15 10:35:42 rx 12: GETATTR i9223372036854775809 {Fh 1}
2020/04/15 10:35:42 tx 12: OK, {tA=0s {M0100600 SZ=4 L=1 0:0 B8*4096 i0:9223372036854775809 A 1586972142.827290 M 1586972142.855292 C 1586972142.855292}}
2020/04/15 10:35:42 rx 13: READ i9223372036854775809 {Fh 1 [0 +4096) L 0 NONBLOCK,0x8000}
2020/04/15 10:35:42 tx 13: OK, 4096b data (fd data)
2020/04/15 10:35:42 rx 14: GETATTR i9223372036854775809 {Fh 1}
2020/04/15 10:35:42 tx 14: OK, {tA=0s {M0100600 SZ=4 L=1 0:0 B8*4096 i0:9223372036854775809 A 1586972142.855292 M 1586972142.855292 C 1586972142.855292}}
2020/04/15 10:35:42 rx 15: FLUSH i9223372036854775809 {Fh 1}
2020/04/15 10:35:42 tx 15: OK
2020/04/15 10:35:42 rx 16: RELEASE i9223372036854775809 {Fh 1 NONBLOCK,0x8000 L0}
2020/04/15 10:35:42 tx 16: OK
2020/04/15 10:35:42 rx 17: GETATTR i9223372036854775808 {Fh 0}
2020/04/15 10:35:42 tx 17: OK, {tA=0s {M040755 SZ=0 L=0 0:0 B0*0 i0:9223372036854775808 A 0.000000 M 0.000000 C 0.000000}}
2020/04/15 10:35:42 rx 18: LISTXATTR i9223372036854775808 {sz 0}
2020/04/15 10:35:42 tx 18: OK
2020/04/15 10:35:42 rx 19: GETATTR i9223372036854775809 {Fh 0}
2020/04/15 10:35:42 tx 19: OK, {tA=0s {M0100644 SZ=0 L=0 0:0 B0*0 i0:9223372036854775809 A 0.000000 M 0.000000 C 0.000000}}
2020/04/15 10:35:42 rx 20: LISTXATTR i9223372036854775809 {sz 0}
2020/04/15 10:35:42 tx 20: OK
如果这很重要,保险丝层是用 go 编写的。
解决方案
首先,这个设置并不奇怪。其次,您将有更好的机会在 linux-unionfs@vger.kernel.org 上获得答案。
但无论如何,据我所知,问题似乎出在你的保险丝 fs 上:
2020/04/15 10:35:42 rx 9:查找 i9223372036854775808 [“foo”] 4b 2020/04/15 10:35:42 tx 9:好的,{i9223372036854775809 g0 tE=0s 46 S=0s {M0100 = L=0 0:0 B0*0 i0:9223372036854775809 A 0.000000 M 0.000000 C 0.000000}}
2020/04/15 10:35:42 rx 19:GETATTR i9223372036854775809 {Fh 0} 2020/04/15 10:35:42 tx 19:OK,{tA=0s {M0100644 SZ=0 L=0 0:0 B0 *0 i0:9223372036854775809 A 0.000000 M 0.000000 C 0.000000}}
不知道为什么,但是您的 fs 将查找时发现的文件大小报告为零,而稍后在读取文件时,大小正确报告为 4。
我希望如果您在 fuse fs 上运行 stat(1) 或 ls -l 您也可能会观察到这个问题。可能是您正确实现了 fstat(2) 而不是 lstat(2)?
谢谢,阿米尔。
推荐阅读
- sorting - 如何使用 pug 从一个数组中将项目过滤到两个单独的列表中?
- c - 重新排列双向链表时偶尔会出现段错误
- c# - RegEx 用于匹配两个数字之间的特殊字符
- python - 无法减去两个时间列
- rust - 宏匹配令牌递归扩展
- javascript - 如何在 React Hooks 的对象数组中更新状态`onChange`
- c# - 使用 DTE,阅读 .NET 标准项目,配置管理器属性属性值抛出
- mysql - 设置字符串外键在 Laravel 中不起作用
- c++ - 有没有办法用 C++ 查询 .accdb/.mdb 文件?
- swift - SK 子视图颜色不会更改为 .backgroundColor