我正在做一件有点奇怪的事情,创建一个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写的。
首先,这个设置并不奇怪。其次,你会有更好的机会得到答案linux-unionfs@vger.kernel.org.
但无论如何,据我所知,问题似乎出在你的保险丝fs:上
2020/04/15 10:35:42 rx 9:LOOKUP i9223372036854775808["foo"]4b2020/04/15 10:35:42 tx 9:OK,{i9223372036854775809 g0 tE=0s tA=0s{M0100644SZ=0L=0 0:0 B0*0 i0:9223372036854775809 A 0.000000 M0.000000 c0.000000}}
2020/04/15 10:35:42 rx 19:GETTR i9223372036854775809{Fh 0}2020/04/15 10:35:42 tx 19:好,{tA=0s{M0100644SZ=0L=0 0:0 B0*0i0:9223372036854775809 A 0.000000 M 0.000000 C 0.000000000}
不确定原因,但您的fs会报告查找时发现的文件的大小为零,而稍后读取文件时,会报告大小正确地为4。
我希望如果你在你的保险丝fs上运行stat(1(或ls-l,你也可以观察这个问题。可能是您正确地实现了fstat(2(,但没有实现lstat(1(?
谢谢,阿米尔。