[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