带保险丝的Perl虚拟文件系统

时间:2017-03-27 11:45:26

标签: perl fuse

任何人都帮我在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

1 个答案:

答案 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,可能会使用它。我认为,我只使用普通保险丝进行学术研究......

希望这有帮助。