Here are the topics this blog is going to cover.
- Samba Server
- Samba VFS
- GlusterFS VFS plugin for Samba and libgfapi
- Without GlusterFS VFS plugin
- FUSE mount vs VFS plugin
About Samba Server:
Samba server runs on Unix and Linux/GNU operating systems. Windows clients can talk to Linux/GNU/Unix systems through Samba server. It provides the interoperability between Windows and Linux/Unix systems. Initially it was created to provide printer sharing and file sharing mechanisms between Unix/Linux and Windows. As of now Samba project is doing much more than just file and printer sharing.
Samba server works as a semantic translation engine/machine. Windows clients talk in Windows syntax e.g. SMB protocol. And Unix/Linux/GNU file-systems understand requests in POSIX. Samba converts Windows syntax to *nix/GNU syntax and vice versa.
This article is about Samba integration with GlusterFS. For specific details I have taken example of GlusterFS deployed on Linux/GNU.
If you have never heard of Samba project before, you should read about it more , before going further in to this blog.
Here are important link/pointers for further study:
Samba code is very modular in nature. Samba VFS code is divided in to two parts i.e. Samba VFS layer and VFS modules.
The purpose of Samba VFS layer is to act as an interface between Samba server and below layers. When Samba server get requests from Windows clients through SMB protocol requests, it passes it to Samba VFS modules.
Samba VFS modules i.e. plugin is a shared library (.so) and it implements some or all functions which Samba VFS layer i.e. interface makes available. Samba VFS modules can be stacked on each other(if they are designed to be stacked).
For more about Samba VFS layer, please refer http://unix4.com/w/writing-a-samba-vfs-richard-sharpe-2-oct-2011-e6438-pdf.pdf
Samba VFS layer passes the request to VFS modules. If the Samba share is done for a native Linux/Unix file-system, the call goes to default VFS module. The default VFS module forwards call to System layer i.e. operating system. For User space file-system like GlusterFS, VFS layer calls are implemented through a VFS module i.e. VFS plugin for GlusterFS .The plugin redirects the requests (i.e fops) to GlusterFS APIs i.e. libgfapi. It implements or maps all VFS layer calls using libgfapi.
libgfapi (i.e. glusterfs api) is set of APIs which can directly talk to GlusterFS. Libgfapi is another access method for GlusterFS like NFS, SMB and FUSE. Libgfapi bindings are available for C, Python, Go and more programming languages. Applications can be developed which can directly use GlusterFS without a GlusterFS volume mount.
GlusterFS VFS plugin for Samba and libgfapi:
Here is the schematic diagram of how communication works between different layers.
Samba Server: This represents Samba Server and Samba VFS layer
VFS plugin for GlusterFS: This implements or maps relevant VFS layer fops to libgfapi calls.
glusterd: Management daemon of Glusterfs node i.e. server.
glusterfsd: Brick process of Glusterfs node i.e. server.
The client requests come to Samba server and Samba servers redirects the calls to GlusterFS’s VFS plugin through Samba VFS layer. VFS plugin calls relevant libgfapi fucntions. Libgfapi acts as a client, contacts glusterd for vol file information ( i.e. information about gluster volume, translators, involved nodes) , then forward requests to appropriate glusterfsd i.e. brick processes where requests actually get serviced.
If you want to know specifics about the setup to share GlusterFS’s volume through Samba VFS plugin, refer below link.
Without GlusterFS VFS plugin:
Without GlusterFS VFS plugin, we can still share GlusterFS volume through Samba server. This can be done through native glusterfs mount i.e. FUSE (file system in user space). We need to mount the volume using FUSE i.e .glusterfs native mount in the same machine where Samba server is running, then share the mount point using Samba server. As we are not using the VFS plugin for GlusterFS here, Samba will treat the mounted GlusterFS volume as a native file-system. The default VFS module will be used and the file-system calls will be sent to operating system. The flow is same as any native file system shared through Samba.
FUSE mount vs VFS plugin:
If you are not familiar with file systems in user space, please read about FUSE i.e. file system in user space.
For FUSE mounts, file system fops from Samba server goes to user space FUSE mount point -> Kernel VFS -> /dev/fuse -> GlusterFS and comes back in the same path. Refer to below diagrams for details. Consider Samba server as an application which runs on the fuse mount point.
You can observe the process context switches happens between user and kernel space in above architecture. It is going to be a key differentiation factor when compared with libgfapi based VFS plugin.
For Samba VFS plugin implementation, see the below diagram. With the plugin Samba calls get converted to libgfapi calls and libgfapi forward the requests to GlusterFS.
The above pictures are copied from this presentation:
Advantage of libgfapi based Samba plugin Vs FUSE mount:
- With libgfapi , there are no kernel VFS layer context switches. This results in performance benefits compared to FUSE mount.
- With a separate Samba VFS module i.e. plugin , features ( e.g: more NTFS functionality) can be provided in GlusterFS and it can be supported with Samba, which native Linux file systems do not support.