ACC SHELL

Path : /sbin/
File Upload :
Current File : //sbin/activate_dm_linear

#!/bin/sh
#
# activate_dm_linear
#
# Activate a linear mapping on top of an existing block device.
# This allows for partitions to be mapped via kpartx, so all
# partitions on a device can be accessed.
#

RULE=/etc/udev/rules.d/62-dm_linear.rules

if [ -z "$1" ] ; then
    echo "Usage: $0 [-d] devname"
    exit 1
fi

if [ "$1" == "-d" ] ; then
    remove_only=1
    shift
fi

if [ ! -b "$1" ] ; then
    echo "$1 is not a block device"
    exit 1
fi

dev=${1#/dev/}

if [ ! -d /sys/block/$dev ] ; then
    echo "$1 is not a disk device"
    exit 1
fi

blksize=$(/sbin/blockdev --getsize $1)
if [ $? -ne 0 ] ; then
    echo "blockdev --getsize $1 failed: $?"
    exit 1
fi

for link in $(udevadm info -q symlink -p /block/$dev) ; do
    case "$link" in
	*/by-id/ata*)
            atalink=${link#*/by-id/ata-}
	    ;;
	*/by-id/scsi*)
	    scsilink=${link#*/by-id/scsi-}
	    ;;
    esac
done
if [ "$atalink" ] ; then
    # Remove existing rules
    echo "/$atalink/d
w
q
" | ed $RULE > /dev/null 2>&1
    [ "$remove_only" = 1 ] && exit 0
    cat >> $RULE <<EOF
ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_VENDOR}=="ATA", ENV{ID_ATA_COMPAT}=="$atalink", RUN+="/bin/bash -c 'echo 0 $blksize linear \$major:\$minor 0 | /sbin/dmsetup create ata-\$env{ID_ATA_COMPAT} -u linear-ata-\$env{ID_ATA_COMPAT}'"
EOF
fi
if [ "$scsilink" ] ; then
    # Remove existing rules
    echo "/$scsilink/d
w
q
" | ed $RULE > /dev/null 2>&1
    [ "$remove_only" = 1 ] && exit 0
    # And create a new one
    cat >> $RULE <<EOF
ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_BUS}=="scsi", ENV{ID_SERIAL}=="$scsilink", RUN+="/bin/bash -c 'echo 0 $blksize linear \$major:\$minor 0 | /sbin/dmsetup create \$env{ID_BUS}-\$env{ID_SERIAL} -u linear-\$env{ID_BUS}-\$env{ID_SERIAL}'"
EOF
fi

ACC SHELL 2018