[ALTSP] Автомонтирование локальных устройств

Michael A. Kangin mak at rsmu.ru
Mon Nov 12 02:56:47 MSK 2007


Добрый день.

Приаттаченный плагин включает поддержку автоматического 
монтирования/размонтирования локальных устройств по событиям udev. Пригодится 
для работы в связке с windows-сервером, где, как я понимаю, никаким lbus и не 
пахнет. Монтируются устройства через subfs (помимо скриптов для udev, в 
тощеклиентскую систему устанавливается kernel-module-subfs и iconv). Точки 
монтирования создаются в /tmp/drives, на windows-сервер их очень хорошо 
передавать через РДП: 
RDP_OPTS= ... -L koi8-r -r disk:drives=/tmp/drives

Для пущей секурности и индивидуальности скрипт монтирования спрашивает 
разрешения у переменной AUTOMOUNT, которую нужно выставить во что-нибудь 
согласительное в lts.conf.

Для меня это хорошо работает, но был бы счастлив, если б еще кто-нибудь 
потестировал. Я не добрался проверить работу с дискетами, IDE-сдромами и 
совмествую работу со штатным lbus.

-- 
wbr, Michael A. Kangin
-------------- next part --------------
case "$MODE" in
    configure)
        KERNEL_MODULES="$KERNEL_MODULES subfs"
	;;
    install)
	$SETARCH chroot $ROOT apt-get $APT_GET_OPTS install iconv
        ;;
    after-install)
	tmpfile=`mktemp`
	cat <<EO\F > $tmpfile	
# /etc/udev/rules.d/85-ltsp-automount.rules
ACTION=="add", KERNEL=="fd[0-9]*", RUN+="automount %k"
ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="?*", RUN+="automount %k"
# IDE CDRoms
ACTION=="add", ENV{ID_CDROM}=="?*", RUN+="automount %k"
ACTION=="remove", SUBSYSTEM=="block", RUN+="autoumount %k"
EOF
	install -m 0644 $tmpfile $ROOT/etc/udev/rules.d/85-ltsp-automount.rules

	cat <<EO\F > $tmpfile
#!/bin/sh
# $1 = devicename

case "`getltscfg AUTOMOUNT`" in 
	yes|Yes|YES|true|True|TRUE|on|On|ON|Y|y|1)
		true
	;;
	*)
		exit 1
	;;
esac

devicename=$(basename $1)

BASEDEV=$(echo $devicename | tr -d "0-9")

fstype=$ID_FS_TYPE

if [ ${BASEDEV} = "fd" ]; then
    DEVNUM=$(echo $devicename | tr -d "fd")
    LABEL="floppy${DEVNUM}"
    fstype="floppyfss"
else
    export $(udevinfo --query=env --name=$devicename)
    LABEL=${ID_FS_LABEL_SAFE}
    [ "${ID_TYPE}" = "cd" ] && {
    	[ "$ID_CDROM_DVD" == 1 ] && CD_WHAT="dvd" || CD_WHAT="cd"
	[ "$ID_CDROM_CD_R" == 1 -o "$ID_CDROM_DVD_R" == 1 ] && CD_HOW="recorder" || CD_HOW="rom"
	LABEL="${CD_WHAT}${CD_HOW}"
	fstype="cdfss"
    }
    if [ -z ${LABEL} ]; then
	LABEL=$(echo ${ID_BUS}${ID_TYPE}-$devicename |tr " " "_")
    fi
fi

[ -z "$fstype" ] && fstype="auto"

# make sure the root we mount to exists
ROOT=/tmp/drives
[ -d $ROOT ] ||	mkdir ${ROOT}

# invent $MOUNTPOINT
MOUNTPOINT=$LABEL

while [ -e "$ROOT/$MOUNTPOINT" ]; do
      tail_mp=${MOUNTPOINT##*_}
      echo "$tail_mp" | grep -qvE "[^[:digit:]]" && \
      MOUNTPOINT="${MOUNTPOINT%_*}_$(($tail_mp + 1))" || \
      MOUNTPOINT="${MOUNTPOINT}_1"
done

MOUNTPOINT="$ROOT/$MOUNTPOINT"

[ -d $MOUNTPOINT ] || mkdir ${MOUNTPOINT}

if [ "${ID_TYPE}" = "cd" ]; then
    MOUNTOPTS="ro,mode=0444"
    echo "0" > /proc/sys/dev/cdrom/lock
else
    REMOVABLE=1
    MOUNTOPTS="rw,noatime,sync"

    [ "${fstype}" = "vfat" -o "${fstype}" = "fat" ] && MOUNTOPTS="${MOUNTOPTS},fmask=0111,dmask=000,quiet"
    [ "${fstype}" = "ntfs" ] && MOUNTOPTS="${MOUNTOPTS},umask=0111,dmask=0000"
fi

mount -t subfs /dev/$devicename ${MOUNTPOINT} -o fs=${fstype},${MOUNTOPTS}
EOF

	install -m 0755 $tmpfile $ROOT/lib/udev/automount

	cat <<EO\F > $tmpfile
#!/bin/sh

devicename=$1
mount |grep '^/dev/'${devicename}'[[:blank:]]' | while read MOUNT_LINE; do
    MOUNTDIR=`echo $MOUNT_LINE |cut -f 3 -d' '`
    umount -l $MOUNTDIR && {
	rmdir "$MOUNTDIR" || {
		#Double mounting?
		count=1
		while umount -l "$MOUNTDIR" && [ $count -lt 10 ] ; do
			count=$(($count + 1));
		done
		rmdir "$MOUNTDIR" 
	}
    }

done
EOF
	
	install -m 0755 $tmpfile $ROOT/lib/udev/autoumount
	rm -f $tmpfile
	;;
esac



More information about the Ltsp-server mailing list