【发布时间】:2015-12-18 14:25:29
【问题描述】:
如何防止操作系统(或任何正在执行此操作的系统)在我的 FUSE 文件系统中缓存文件的大小/内容?
我制作了一个小型的复制示例,它使用单个文件/foo 创建了一个文件系统。 /foo 的内容每 5 秒更改一次。这是我的 FUSE 文件系统 (sample.py):
import sys
import time
import errno
from stat import S_IFDIR, S_IFREG
from fuse import FUSE, LoggingMixIn, Operations, FuseOSError
class MyFS(LoggingMixIn, Operations):
now = time.time()
def getattr(self, path, fh=None):
if path == '/':
return dict(st_mode=(S_IFDIR | 0755),
st_ctime=self.now,
st_mtime=self.now,
st_atime=self.now,
st_nlink=2)
elif path == '/foo':
contents = self.fooContents()
now = time.time()
return dict(st_mode=S_IFREG,
st_nlink=1,
st_size=len(contents),
st_ctime=now,
st_mtime=now,
st_atime=now)
else:
raise FuseOSError(errno.ENOENT)
def readdir(self, path, fh):
if path == '/':
return ['.', '..', 'foo']
else:
raise FuseOSError(errno.ENOENT)
def open(self, path, flags):
return 0
def read(self, path, size, offset, fh):
if path == '/foo':
return self.fooContents()[offset:offset+size]
def fooContents(self):
t = int(time.time())
size = (t / 5) % 10 + 1
ret = ''
for i in xrange(size):
ret += str(i % 10)
return ret + '\n'
if __name__ == '__main__':
mountpoint = sys.argv[1]
FUSE(MyFS(), mountpoint, foreground=True)
如果我每秒cat 内容持续 10 秒,我预计会看到 2 或 3 个不同的内容打印出来,但我会看到相同的内容 10 次:
$ for i in $(seq 1 10); do
> cat /tmp/dump/foo
> sleep 1
> done
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
如果我在捕获文件之前ls -al,我会得到我所期望的:
$ for i in $(seq 1 10); do
> ls -al /tmp/dump >> /dev/null
> cat /tmp/dump/foo
> sleep 1
> done
01234567
01234567
01234567
01234567
012345678
012345678
012345678
012345678
012345678
0123456789
如何在运行第一个 shell 命令时获得第二个 shell 命令的输出?
【问题讨论】:
-
看起来将
direct_io=True传递给FUSE(调用会阻止缓存。它似乎可以普遍防止缓存。如果能够防止逐个文件缓存,那就太好了。