FUSE(Filesystem in USErspace)
2014-04-21 14:34
369 查看
FUSE用户空间文件系统是指在内核模块fuse.ko的支持下,在不改下内核代码的前提下在用户空间实现用户自己的文件系统。该文件系统与其他类型的文件系统无异,可以支持所有的文件操作和系统调用,如read,write,open,close等。下面就是FUSE的系统结构图。
简单的说,如read,write等的系统调用,在FUSE.ko模块的路由作用下最终会调用在用户空间文件系统进程下相应注册实现的read,write等文件操作函数。
如下最简单的Hello文件系统例子,支持open,read操作;
/*
FUSE: Filesystem in Userspace
Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
This program can be distributed under the terms of the GNU GPL.
See the file COPYING.
*/
#define FUSE_USE_VERSION 30
#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
static const char *hello_str = "Hello World!\n";
static const char *hello_path = "/hello";
static int hello_getattr(const char *path, struct stat *stbuf)
{
int res = 0;
memset(stbuf, 0, sizeof(struct stat));
if (strcmp(path, "/") == 0) {
stbuf->st_mode = S_IFDIR | 0755;
stbuf->st_nlink = 2;
} else if (strcmp(path, hello_path) == 0) {
stbuf->st_mode = S_IFREG | 0444;
stbuf->st_nlink = 1;
stbuf->st_size = strlen(hello_str);
} else
res = -ENOENT;
return res;
}
static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi)
{
(void) offset;
(void) fi;
if (strcmp(path, "/") != 0)
return -ENOENT;
filler(buf, ".", NULL, 0);
filler(buf, "..", NULL, 0);
filler(buf, hello_path + 1, NULL, 0);
return 0;
}
static int hello_open(const char *path, struct fuse_file_info *fi)
{
if (strcmp(path, hello_path) != 0)
return -ENOENT;
if ((fi->flags & 3) != O_RDONLY)
return -EACCES;
return 0;
}
static int hello_read(const char *path, char *buf, size_t size, off_t offset,
struct fuse_file_info *fi)
{
size_t len;
(void) fi;
if(strcmp(path, hello_path) != 0)
return -ENOENT;
len = strlen(hello_str);
if (offset < len) {
if (offset + size > len)
size = len - offset;
memcpy(buf, hello_str + offset, size);
} else
size = 0;
return size;
}
static struct fuse_operations hello_oper = {
.getattr = hello_getattr,
.readdir = hello_readdir,
.open = hello_open,
.read = hello_read,
};
int main(int argc, char *argv[])
{
return fuse_main(argc, argv, &hello_oper, NULL);
}
用法:
% mkdir mnt
% ./hello mnt # program will vanish into the background
% ls -la mnt
total 4
drwxr-xr-x 2 root root 0 Jan 1 1970 ./
drwxrwx--- 1 root vboxsf 4096 Jun 16 23:12 ../
-r--r--r-- 1 root root 13 Jan 1 1970 hello
% cat mnt/hello
Hello World!
% fusermount -u mnt
有FUSE这个神器,我们就可以在用户空间自由实现各种各样的文件系统,简直是事半功倍。
详请可以参考:fuse.sourceforge.net/doxygen/index.html
简单的说,如read,write等的系统调用,在FUSE.ko模块的路由作用下最终会调用在用户空间文件系统进程下相应注册实现的read,write等文件操作函数。
如下最简单的Hello文件系统例子,支持open,read操作;
/*
FUSE: Filesystem in Userspace
Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
This program can be distributed under the terms of the GNU GPL.
See the file COPYING.
*/
#define FUSE_USE_VERSION 30
#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
static const char *hello_str = "Hello World!\n";
static const char *hello_path = "/hello";
static int hello_getattr(const char *path, struct stat *stbuf)
{
int res = 0;
memset(stbuf, 0, sizeof(struct stat));
if (strcmp(path, "/") == 0) {
stbuf->st_mode = S_IFDIR | 0755;
stbuf->st_nlink = 2;
} else if (strcmp(path, hello_path) == 0) {
stbuf->st_mode = S_IFREG | 0444;
stbuf->st_nlink = 1;
stbuf->st_size = strlen(hello_str);
} else
res = -ENOENT;
return res;
}
static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi)
{
(void) offset;
(void) fi;
if (strcmp(path, "/") != 0)
return -ENOENT;
filler(buf, ".", NULL, 0);
filler(buf, "..", NULL, 0);
filler(buf, hello_path + 1, NULL, 0);
return 0;
}
static int hello_open(const char *path, struct fuse_file_info *fi)
{
if (strcmp(path, hello_path) != 0)
return -ENOENT;
if ((fi->flags & 3) != O_RDONLY)
return -EACCES;
return 0;
}
static int hello_read(const char *path, char *buf, size_t size, off_t offset,
struct fuse_file_info *fi)
{
size_t len;
(void) fi;
if(strcmp(path, hello_path) != 0)
return -ENOENT;
len = strlen(hello_str);
if (offset < len) {
if (offset + size > len)
size = len - offset;
memcpy(buf, hello_str + offset, size);
} else
size = 0;
return size;
}
static struct fuse_operations hello_oper = {
.getattr = hello_getattr,
.readdir = hello_readdir,
.open = hello_open,
.read = hello_read,
};
int main(int argc, char *argv[])
{
return fuse_main(argc, argv, &hello_oper, NULL);
}
用法:
% mkdir mnt
% ./hello mnt # program will vanish into the background
% ls -la mnt
total 4
drwxr-xr-x 2 root root 0 Jan 1 1970 ./
drwxrwx--- 1 root vboxsf 4096 Jun 16 23:12 ../
-r--r--r-- 1 root root 13 Jan 1 1970 hello
% cat mnt/hello
Hello World!
% fusermount -u mnt
有FUSE这个神器,我们就可以在用户空间自由实现各种各样的文件系统,简直是事半功倍。
详请可以参考:fuse.sourceforge.net/doxygen/index.html
相关文章推荐
- Linux Filesystem in Userspace(FUSE)
- FUSE(Filesystem in userspace)(用户空间文件系统),user-space框架简单介绍
- fuse : Filesystem in Userspace
- FUSE(Filesystem in Userspace)简介和使用
- FUSE(Filesystem in Userspace)简介和使用
- Hadoop FUSE filesystem in Userspace
- Linux Filesystem in Userspace(FUSE)
- FUSE - implementing filesystems in user space
- BI Java 补丁错误处理 :Cannot login to the SAP J2EE Engine using user and password as provided in the Filesystem Secure Store. Enter va
- File Types in Unix System
- Mount a remote file system using sshfs and fuse - How to install sshfs
- 编译选项导致死机(Unaligned userspace access in "XXX.exe" )
- mariadb日志出现InnoDB: Operating system error number 23 in a file operation
- How to Set and Unset Local, User and System Wide Environment Variables in Linux
- [解决思路]ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file
- linux i2c access in kernel and user space
- Autogrow of file '******' in database '******' was cancelled by user or timed out after ****** milli
- XXXX.axf: Warning: L6373W: libattrs.map file not found in System Library directory 问题解决
- 每天一命令(15)df - report file system disk space usage
- Inaccurate values for “Currently allocated space” and “Available free space” in the Shrink File dialog for TEMPDB only