From: Sapan Bhatia Date: Tue, 15 Apr 2014 21:05:18 +0000 (-0400) Subject: Let users mount a private filesystem within their slices, if they need a filesystem... X-Git-Tag: vsys-scripts-0.95-49~1 X-Git-Url: http://git.onelab.eu/?p=vsys-scripts.git;a=commitdiff_plain;h=7ea80c9bcd40ce21f44a97f2a7400d9855382292 Let users mount a private filesystem within their slices, if they need a filesystem not supported by default by the PlanetLab node. --- diff --git a/root-context/exec/pvtfs b/root-context/exec/pvtfs new file mode 100755 index 0000000..b2a035a --- /dev/null +++ b/root-context/exec/pvtfs @@ -0,0 +1,64 @@ +#!/usr/bin/python +# Lets a user loopback-mount a private fs of a given type. +# To use, configure the following vsys-attributes in addition to setting the vsys tag for the slice +# - vsys_privatefs_list -> comma-separated list of desired filesystems, e.g. xfs,btrfs +# - vsys_privatefs_size -> desired size in megabytes + +import sys +import os +import string + +vsys_config_dir = "/etc/planetlab/vsys-attributes" +slicename=sys.argv[1] +sliceroot='/vservers/%s'%slicename + +private_fs_config=os.path.join(vsys_config_dir,slicename,"vsys_privatefs_list") +private_fs_size_config=os.path.join(vsys_config_dir,slicename,"vsys_privatefs_size") + +private_fs_str = open(private_fs_config).read().rstrip() + +nonamespace_path = '/etc/vservers/%s/nonamespace'%slicename +if (not os.path.isfile(nonamespace_path)): + # Touch + open(nonamespace_path,'w').close() + + os.system('vserver %s stop'%slicename) + os.system('vserver %s start'%slicename) + print 'Reconfiguring slice for private mounts' + exit(1) + +fs_lst = private_fs_str.split(',') +try: + private_fs_size_str = open(private_fs_size_config).read().rstrip() + fs_size = int(private_fs_size_str) +except: + fs_size = 100 + +num_fs = len(fs_lst) +if num_fs==0: + print >>sys.stderr, "Please configure your private filesystems at PLC." + sys.exit(1) + +for fs in fs_lst: + # XXX There's a race condition here. You could + # intervene between the creation of the image + # and the mount operation to replace the empty image + # with a rogue volume. + + fs_file = '%s/pvtfs-%s'%(sliceroot,fs) + os.system('umount %s 2>&1>/dev/null'%fs_file) + + sanity_check_cmd = 'cat /proc/mounts | grep %s | wc -l'%fs_file + sanity_check = os.popen(sanity_check_cmd).read().rstrip() + if int(sanity_check)!=0: + print 'Private fs could not be remounted. Please contact support.' + exit(1) + os.system('mkdir -p %s'%fs_file) + + # This is the critical step + if (os.system('dd if=/dev/zero of=%s.img bs=1000000 count=%d'%(fs_file,fs_size))): + print 'Could not recycle private fs. Please contact support.' + exit(1) + + os.system('mkfs.%s %s.img'%(fs,fs_file)) + os.system('mount -o loop -t %s %s.img %s'%(fs, fs_file, fs_file))