#!/bin/sh # # Set up a fusefile as a disk device using device mapper. # Note that this requires root access. if [ $(id -u) != 0 ] ; then echo "block device set up requires root." >&2 exit 1 fi # fuse blkdev mounting needs to sniff an existing but unmounted block # device node for setup. However the device mapping has an empty table # and the content is only accessible via the fuse mount that links it # to the fusefile process. The device node (major:minor) are still # considered in use by the kernel and, and the device node is "open" # while mounted. [ -e /dev/mapper/control ] || modprobe dm_mod || exit 1 # Create up to N fusedisk named as fusedisk0..fusediskN, the device # mapper also creates its dm-X device nodes and we also force # /dev/mapper/$NAME nodes for them. N=15 DEV= for I in $(seq 0 $N) ; do NAME=fusedisk$I C="$(dmsetup info --noheadings -c -o open $NAME 2>/dev/null)" if [ "$C" != "1" ] ; then if [ -z "$C" ] ; then dmsetup create $NAME --notable || exit 1 dmsetup mknodes $NAME || exit 1 fi DEV=/dev/mapper/$NAME break fi done if [ -z "$DEV" ] ; then echo "** No more fusedisk devices" >&2 exit 1 fi echo "using $DEV for $*" | logger -t fusedisk exec fusefile -oblkdev,fsname=$DEV -oallow_other $*