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、待续