任何人都帮我在Perl中创建一个虚拟文件系统。 非常简单,2深度级别,如
/subdir
subdir-l2
file2.txt
/file1.txt
我尝试使用Fuse.pm,但不了解如何创建subdir级别。我创建%files hash,如果转到subdir,则使用新记录重新创建它。它仅供测试。
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Fuse;
use POSIX qw(ENOENT EISDIR EINVAL);
my (%files) = (
'.' => {
type => 0040,
mode => 0755,
ctime => 1490603721
},
subdir => {
type => 0040,
mode => 0755,
ctime => 1490603721
},
"file1.txt" => {
type => 0100,
mode => 0755,
ctime => 1490603721
}
);
sub filename_fixup {
my ($file) = shift;
$file =~ s,^/,,;
$file = '.' unless length($file);
return $file;
}
sub getdir {
my $tmp = shift;
if ($tmp eq '/') {
return (keys %files),0;
} else {
(%files) = (
'.' => {
type => 0040,
mode => 0755,
ctime => 1490603721
},
# /subdir/subdir-l2
"subdir-l2" => {
type => 0040,
mode => 0755,
ctime => 1490603721
} ,
# /subdir/a-l2.file
"file2.txt" => {
cont => "File 'al2'.\n",
type => 0100,
mode => 0755,
ctime => 1490603721
}
);
return (keys %files),0;
}
}
sub getattr {
my ($file) = filename_fixup(shift);
$file =~ s,^/,,;
$file = '.' unless length($file);
return -ENOENT() unless exists($files{$file});
my ($size) = exists($files{$file}{cont}) ? length($files{$file}{cont}) : 0;
$size = $files{$file}{size} if exists $files{$file}{size};
my ($modes) = ($files{$file}{type}<<9) + $files{$file}{mode};
my ($dev, $ino, $rdev, $blocks, $gid, $uid, $nlink, $blksize) = (0,0,0,1,0,0,1,1024);
my ($atime, $ctime, $mtime);
$atime = $ctime = $mtime = $files{$file}{ctime};
return ($dev,$ino,$modes,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks);
}
Fuse::main(
mountpoint => "/tmp/123",
getdir => \&getdir,
getattr => \&getattr,
);
一级安装正常,但如果深入我得
?????????? ? ? ? ? ? file2.txt
?????????? ? ? ? ? ? subdir-l2
答案 0 :(得分:3)
我真的不是Fuse模块的常规用户,也不是FUSE系统的普通用户。出于纯粹的好奇心,对这个问题进行了修改。因此,虽然我无法详细解释如何使用普通的Fuse模块来实现您的目标,但我有一个可以创建所需文件系统的工作代码(至少在我的系统上,似乎它有能力创建任意文件系统树),我可以解释我是如何使用此代码的。
首先,我在CPAN上发现了Fuse::Simple模块。
它的概要表明它为Fuse模块提供了一个非常简单的API,用于从哈希结构创建任意文件系统。它的source code并不是那么大,所以我刚创建了&list; list.pl&#39;脚本文件并在那里复制了大部分函数(导致Modification of a read-only value
异常的fserr除外),将主子内容放出,因此它们将成为主脚本的流程,硬编码文件系统结构({{ 1}} var),并在这里和那里做了一些小调整(比如使用$fs
声明变量以防止异常),最后安装了文件系统,列出了所有目录和文件可读。所以这就是我最后得到的代码:
my
最后一句话:我没有尝试使用模块本身(它没有在我的发行版软件包存储库中列出,我太懒了(抱歉)通过cpanm或其他方式安装它)。但我认为,如果我不得不在Perl中使用FUSE,我可能只是使用Fuse :: Simple而不是Fuse,可能会使用它。我认为,我只使用普通保险丝进行学术研究......
希望这有帮助。