Sunday, January 4, 2015

NFS Server porting to Android-4.2 (Should work for different version)

                    NFS SERVER PORTING TO ANDROID

QUICK TESTING OF NFS SERVER ON LINUX MACHINE:

# apt-get install nfs-kernel-server
# cat /etc/exports
/path-to-be-shared system-ip-address-which-accesses-shared-folder (rw,sync)
# /etc/init.d/nfs-kernel-server start

In remote machine mount the shared folder
# mount -t nfs -o nolock ip-addr-server-folder:/path-shared path-to-be-mounted-in-local-machine

NOTES
* Mounted directory will show the entire disk size of the server pc. One way to restrict the export folder size is creating a special file of required size, partition it, mount as a loop device locally and export it to client

DIFFERENT TECHNIQUES TO PORT NFS SERVER TO ANDROID:

1. STATIC CROSS COMPILATION WITH LINUX TOOL CHAIN--- Kernel support for NFS

--- Static Cross compilation

--- Runtime environmental setup

2. INTEGRATION OF NFS-UTILS INTO ANDROID BSP
--- Kernel support for NFS

--- Integrate NFS utils source into Android build

--- Run NFS service 

3. LIGHT WEIGHT NFS SERVER APP
--- Taking a Open source Java NFS server code and port it to Android

PORTING NFS SERVER TO ANDROID - LINUX TOOLCHAIN METHOD:

--- Kernel support for NFS

CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
# CONFIG_NFS_V4 is not set
CONFIG_ROOT_NFS=y
CONFIG_NFS_FSCACHE=y
CONFIG_NFSD=y
CONFIG_NFSD_DEPRECATED=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3=y
CONFIG_NFSD_V3_ACL=y
# CONFIG_NFSD_V4 is not set
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
CONFIG_NFS_ACL_SUPPORT=y
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y
CONFIG_SUNRPC_GSS=y
CONFIG_RPCSEC_GSS_KRB5=y

************Kernel HACK Starts here****************
kernel_imx/kernel/capability.c

bool ns_capable(struct user_namespace *ns, int cap)
{
        if (unlikely(!cap_valid(cap))) {
                printk(KERN_CRIT "capable() called with invalid cap=%u\n", cap);
                BUG();
        }

// if (security_capable(ns, current_cred(), cap) == 0) { // Serious kernel hacking: commented out the condition check and false return always
                current->flags |= PF_SUPERPRIV;
                return true;
// }
// return false;
}
EXPORT_SYMBOL(ns_capable);
************Kernel HACK Ends here****************

--- Static cross compilation

* Download NFS utils from below path
http://sourceforge.net/projects/nfs/files/nfs-utils/1.3.1/

* Cross compile required utils such as exportfs, nfsd, mountd statically (Copy all required source files from support folder to respective utils folder to make use of below command for all utilities)
# /opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-gcc -DHAVE_CONFIG_H -I../../support/include -D_GNU_SOURCE -Wall -Wextra -Wstrict-prototypes -pipe -g -O2 *.c -static -o binary-name

* Setup the run time environement
# mkdir -p /var/lib/nfs
# mkdir -p /var/lock/subsys
# mkdir -p /var/lib/nfs/sm
# mkdir -p /var/lib/nfs/sm.bak
# touch /var/lib/nfs/etab
# touch /var/lib/nfs/rmtab
# touch /var/lib/nfs/state
# touch /var/lib/nfs/xtab
# chmod -R 777 /proc/fs/nfsd/
# chmod -R 777 /var
# busybox vi /etc/exports
/path-to-be-shared 192.168.42.130(fsid=0,rw,async,insecure,no_subtree_check,no_root_squash)

* Run the Below utilities to start NFS Server
# mount -t nfsd nfsd /proc/fs/nfsd
# portmap
# exportfs -ra
# nfsd -p 2049
# mountd

NOTES
1. NFS Kernel space files
kernel_imx/net/sunrpc/svc.c
kernel_imx/fs/lockd/svc.c
kernel_imx/fs/nfsd/nfssvc.c
2. Configure and compile NFS package (dynamic cross compilation)
# export PATH=$PATH:/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/
# ./configure --host=arm-fsl-linux-gnueabi --disable-nfsv4 --disable-nfsv41 --disable-gss --disable-uuid --enable-mount=yes --without-tcp-wrappers --with-gnu-ld
# make

No comments:

Post a Comment