【问题标题】:Overlayfs copy-up creates an empty fileOverlayfs 复制创建一个空文件
【发布时间】:2020-07-28 22:15:21
【问题描述】:

我正在做一些奇怪的事情,创建一个overlayfs 挂载,其中下层目录是一个FUSE 卷(我已经实现了)。这似乎主要工作,我可以通过overlayfs挂载从FUSE挂载读取文件,并且它们具有正确的内容。我还可以在 overlayfs 挂载中创建新文件,这并不奇怪,因为当您尝试 LOOKUP 该文件时,这应该只要求较低的 FUSE 层返回 ENOENT 响应。失败的是当我尝试附加到现有文件时,而不是获取现有内容后跟附加内容,我只是获取附加内容。我假设一定有我的 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 编写的。

【问题讨论】:

  • 一切都是用某种编程语言编写的;这似乎不是与编程相关的问题。你可以试试 SuperUser。

标签: go fuse overlayfs


【解决方案1】:

首先,这个设置并不奇怪。 其次,您将有更好的机会在 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 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 19: GETATTR i9223372036854775809 {Fh 0} 2020/04/15 10:35:42 tx 19:好的,{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)?

谢谢, 阿米尔。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 2010-10-22
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多