#!/bin/bash NAME=${DEVNAME#/dev/} DESC="${ID_MODEL} (${ID_FS_LABEL})" SIZE=$[ $(cat /sys/$DEVPATH/size) * 512 ] MODE=w XS_KEY="qubes-block-devices/$NAME" xs_remove() { if [ "$QUBES_EXPOSED" == "1" ]; then xenstore-rm "$XS_KEY" fi echo QUBES_EXPOSED=0 } # Ignore mounted... if fgrep -q $DEVNAME /proc/mounts; then xs_remove exit 0 fi # ... and used by device-mapper if [ -n "`ls -A /sys/$DEVPATH/holders 2> /dev/null`" ]; then xs_remove exit 0 fi # ... and "empty" loop devices if [ "$MAJOR" -eq 7 -a ! -d /sys/$DEVPATH/loop ]; then xs_remove exit 0 fi # Special case for CD if [ "$ID_TYPE" = "cd" ]; then if [ "$ID_CDROM_MEDIA" != "1" ]; then # Hide empty cdrom drive xs_remove exit 0 fi MODE=r fi # Special description for loop devices if [ -d /sys/$DEVPATH/loop ]; then DESC=$(cat /sys/$DEVPATH/loop/backing_file) fi # Get lock only in dom0 - there are so many block devices so it causes xenstore # deadlocks sometimes. if [ -f /etc/qubes-release ]; then # Skip xenstore-write if cannot obtain lock. This can mean very early system startup # stage without /run mounted (or populated). Devices will be rediscovered later # by qubes-core startup script. exec 9>>/var/run/qubes/block-xenstore.lock || exit 0 flock 9 fi xenstore-write "$XS_KEY/desc" "$DESC" "$XS_KEY/size" "$SIZE" "$XS_KEY/mode" "$MODE" echo QUBES_EXPOSED=1 # Make sure that block backend is loaded /sbin/modprobe xen-blkback 2> /dev/null || /sbin/modprobe blkbk