操作记录:在ubuntu16.04.1配置fuse开发环境及fuse开发规范测试

前端之家收集整理的这篇文章主要介绍了操作记录:在ubuntu16.04.1配置fuse开发环境及fuse开发规范测试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、使用ssh客户端,登陆ubuntu

ssh-p2206root@127.0.0.1

2、下载fuse源码,进行编译,安装(当前工作目录为~)

wgethttps://github.com/libfuse/libfuse/releases/download/fuse-3.0.0rc3/fuse-3.0.0rc3.tar.gz
tarxvffuse-3.0.0rc3.tar.gz
cdfuse-3.0.0rc3/
./configure
make-j8
makeinstall
depmod
modprobefuse

3、测试example\hello_ll是否能正常工作

cdexample/
./hello_ll--help
./hello_ll/mnt
mount
cd/mnt
ls
cathello
cd
umount/mnt

  • 针对example\hello_ll.c,进行改动测试:


1、在根目录下多创建一个文件出来,节点号定为5,名称为frombyte,内容为文本"http://www.datahf.net"

改动如下:

/*
FUSE:FilesysteminUserspace
Copyright(C)2001-2007MiklosSzeredi<miklos@szeredi.hu>

ThisprogramcanbedistributedunderthetermsoftheGNUGPL.
SeethefileCOPYING.
*/

/**@file
*
*minimalexamplefilesystemusinglow-levelAPI
*
*Compilewith:
*
*gcc-Wallhello_ll.c`pkg-configfuse3--cflags--libs`-ohello_ll
*
*##Sourcecode##
*\includehello_ll.c
*/

#defineFUSE_USE_VERSION30

#include<config.h>

#include<fuse_lowlevel.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<fcntl.h>
#include<unistd.h>
#include<assert.h>

staticconstchar*hello_str="HelloWorld!\n";
staticconstchar*hello_name="hello";
//change1#0
staticconstchar*inode5_str="http://www.datahf.net!\n";
staticconstchar*inode5_name="frombyte";
//changeend
staticinthello_stat(fuse_ino_tino,structstat*stbuf)
{
	stbuf->st_ino=ino;
	switch(ino){
	case1:
		stbuf->st_mode=S_IFDIR|0755;
		stbuf->st_nlink=2;
		break;

	case2:
		stbuf->st_mode=S_IFREG|0444;
		stbuf->st_nlink=1;
		stbuf->st_size=strlen(hello_str);
		break;

//change1#1
case5:
stbuf->st_mode=S_IFREG|0444;
stbuf->st_nlink=1;
stbuf->st_size=strlen(inode5_str);
break;
//change1end

	default:
		return-1;
	}
	return0;
}

staticvoidhello_ll_getattr(fuse_req_treq,fuse_ino_tino,structfuse_file_info*fi)
{
	structstatstbuf;

	(void)fi;

	memset(&stbuf,sizeof(stbuf));
	if(hello_stat(ino,&stbuf)==-1)
		fuse_reply_err(req,ENOENT);
	else
		fuse_reply_attr(req,&stbuf,1.0);
}

staticvoidhello_ll_lookup(fuse_req_treq,fuse_ino_tparent,constchar*name)
{
	structfuse_entry_parame;
//change1#2
/*
if(parent!=1||strcmp(name,hello_name)!=0)
fuse_reply_err(req,ENOENT);
else{
memset(&e,sizeof(e));
e.ino=2;
e.attr_timeout=1.0;
e.entry_timeout=1.0;
hello_stat(e.ino,&e.attr);

fuse_reply_entry(req,&e);
}*/


if(parent!=1)
		fuse_reply_err(req,ENOENT);
	elseif(strcmp(name,hello_name)==0){
		memset(&e,sizeof(e));
		e.ino=2;
		e.attr_timeout=1.0;
		e.entry_timeout=1.0;
		hello_stat(e.ino,&e.attr);
		fuse_reply_entry(req,&e);
	}
elseif(strcmp(name,inode5_name)==0){
memset(&e,sizeof(e));
e.ino=5;
e.attr_timeout=1.0;
e.entry_timeout=1.0;
hello_stat(e.ino,&e.attr);
fuse_reply_entry(req,&e);
}
else
fuse_reply_err(req,ENOENT);
//change1end
}

structdirbuf{
	char*p;
	size_tsize;
};

staticvoiddirbuf_add(fuse_req_treq,structdirbuf*b,constchar*name,fuse_ino_tino)
{
	structstatstbuf;
	size_toldsize=b->size;
	b->size+=fuse_add_direntry(req,NULL,name,0);
	b->p=(char*)realloc(b->p,b->size);
	memset(&stbuf,sizeof(stbuf));
	stbuf.st_ino=ino;
	fuse_add_direntry(req,b->p+oldsize,b->size-oldsize,b->size);
}

#definemin(x,y)((x)<(y)?(x):(y))

staticintreply_buf_limited(fuse_req_treq,constchar*buf,size_tbufsize,off_toff,size_tmaxsize)
{
	if(off<bufsize)
		returnfuse_reply_buf(req,buf+off,min(bufsize-off,maxsize));
	else
		returnfuse_reply_buf(req,0);
}

staticvoidhello_ll_readdir(fuse_req_treq,size_tsize,structfuse_file_info*fi)
{
	(void)fi;

	if(ino!=1)
		fuse_reply_err(req,ENOTDIR);
	else{
		structdirbufb;

		memset(&b,sizeof(b));
		dirbuf_add(req,&b,".",1);
		dirbuf_add(req,"..",hello_name,2);
//change1
dirbuf_add(req,inode5_name,5);
//end
		reply_buf_limited(req,b.p,b.size,off,size);
		free(b.p);
	}
}

staticvoidhello_ll_open(fuse_req_treq,structfuse_file_info*fi)
{
//change1
	//if(ino!=2)
if((ino!=2)&&(ino!=5))
//end
		fuse_reply_err(req,EISDIR);
	elseif((fi->flags&3)!=O_RDONLY)
		fuse_reply_err(req,EACCES);
	else
		fuse_reply_open(req,fi);
}

staticvoidhello_ll_read(fuse_req_treq,structfuse_file_info*fi)
{
	(void)fi;

//change1
	//assert(ino==2);
	//reply_buf_limited(req,hello_str,strlen(hello_str),size);
switch(ino){
case2:
reply_buf_limited(req,size);
break;
case5:
reply_buf_limited(req,inode5_str,strlen(inode5_str),size);
break;
default:
;
}
//end
}

staticstructfuse_lowlevel_opshello_ll_oper={
	.lookup		=hello_ll_lookup,.getattr	=hello_ll_getattr,.readdir	=hello_ll_readdir,.open		=hello_ll_open,.read		=hello_ll_read,};

intmain(intargc,char*argv[])
{
	structfuse_argsargs=FUSE_ARGS_INIT(argc,argv);
	structfuse_session*se;
	structfuse_cmdline_optsopts;
	intret=-1;

	if(fuse_parse_cmdline(&args,&opts)!=0)
		return1;
	if(opts.show_help){
		printf("usage:%s[options]<mountpoint>\n\n",argv[0]);
		fuse_cmdline_help();
		fuse_lowlevel_help();
		ret=0;
		gotoerr_out1;
	}elseif(opts.show_version){
		printf("FUSElibraryversion%s\n",fuse_pkgversion());
		fuse_lowlevel_version();
		ret=0;
		gotoerr_out1;
	}

	se=fuse_session_new(&args,&hello_ll_oper,sizeof(hello_ll_oper),NULL);
	if(se==NULL)
	gotoerr_out1;

	if(fuse_set_signal_handlers(se)!=0)
	gotoerr_out2;

	if(fuse_session_mount(se,opts.mountpoint)!=0)
	gotoerr_out3;

	fuse_daemonize(opts.foreground);

	/*Blockuntilctrl+corfusermount-u*/
	if(opts.singlethread)
		ret=fuse_session_loop(se);
	else
		ret=fuse_session_loop_mt(se,opts.clone_fd);

	fuse_session_unmount(se);
err_out3:
	fuse_remove_signal_handlers(se);
err_out2:
	fuse_session_destroy(se);
err_out1:
	free(opts.mountpoint);
	fuse_opt_free_args(&args);

	returnret?1:0;
}

结果测试:

cd~/fuse-3.0.0rc3/example/
make
./hello_ll/mnt
ll-i/mnt
cat/mnt/frombyte
umount/mnt

2、待续

猜你在找的Ubuntu相关文章