FUSE 是個好東西, 可以用在特殊的領域里面來實現自己的虛擬文件系統。
FUSE的下載與安裝 :
從fuse官網下載最新安裝包:http://sourceforge.net/projects/fuse/files/fuse-2.X/
安裝很簡單:
./configure
make
make install(注意:這一步要在root用戶模式下做)
掛載 fuse 虛擬文件系統:
modprobe fuse
查看fuse是否掛載成功:
lsmod|grep fuse 執行該命令后會輸出
[root@localhost fuse]# lsmod | grep fuse
fuse 49237 2
證明掛載成功
下來就是使用的問題了, 呵呵。
安裝完fuse后,其子文件夾example下有一些做好的文件系統實例,教你掛載和使用該文件系統,推薦使用 fusexmp_fh.c 這個例子
因為他包括了所有的文件操作相關的映射。
編譯 fusexmp_fh.c 需要用下面的編譯命令:
gcc -Wall `pkg-config fuse --cflags --libs` -lulockmgr fusexmp_fh.c -o fusexmp_fh.exe
編譯后生成 fusexmp_fh.exe 可執行文件
在 /mnt 目錄下面建立文件夾 fuse
cd /mnt
mkdir fuse
然后到 fusexmp_fh.exe 目錄去執行
./fusexmp_fh.exe /mnt/fuse -d
即可啟動虛擬文件系統, 這個時候執行
df 命令,可以看到 虛擬文件系統掛載出來了
[root@localhost example]# df
fuse 6824296 3499688 2972352 55% /mnt/fuse
這個時候你進入 /mnt/fuse 目錄
執行 ls , 即可看到映射的文件內容, 在這個目錄下面所作的文件操作,都會調用到 fusexmp_fh.exe 這個進程里面注冊的
文件操作函數。
注冊句柄如下:
- static struct fuse_operations xmp_oper = {
- .getattr = xmp_getattr,
- .fgetattr = xmp_fgetattr,
- .access = xmp_access,
- .readlink = xmp_readlink,
- .opendir = xmp_opendir,
- .readdir = xmp_readdir,
- .releasedir = xmp_releasedir,
- .mknod = xmp_mknod,
- .mkdir = xmp_mkdir,
- .symlink = xmp_symlink,
- .unlink = xmp_unlink,
- .rmdir = xmp_rmdir,
- .rename = xmp_rename,
- .link = xmp_link,
- .chmod = xmp_chmod,
- .chown = xmp_chown,
- .truncate = xmp_truncate,
- .ftruncate = xmp_ftruncate,
- .utimens = xmp_utimens,
- .create = xmp_create,
- .open = xmp_open,
- .read = xmp_read,
- .write = xmp_write,
- .statfs = xmp_statfs,
- .flush = xmp_flush,
- .release = xmp_release,
- .fsync = xmp_fsync,
- #ifdef HAVE_SETXATTR
- .setxattr = xmp_setxattr,
- .getxattr = xmp_getxattr,
- .listxattr = xmp_listxattr,
- .removexattr = xmp_removexattr,
- #endif
- .lock = xmp_lock,
- .flag_nullpath_ok = 1,
- };
比如你執行 mkdir xxx , 則會調用到 fusexmp_fh.exe 進程的 int xmp_mkdir(const char *path, mode_t mode) 這個函數。
你可以修改這個函數的實現, 在里面添加你自己的信息。
當出現下面的錯誤提示:
fuse: bad mount point `/mnt/fuse': Transport endpoint is not connected
你只需要執行
umount -l /mnt/fuse 命令即可化解上面的錯誤, 具體原因就不用說了吧, umount 這么明顯。
我們這次使用 fuse 使用, 主要是要實現一個雲的功能。
http://blog.csdn.net/langeldep/article/details/6221112