#!/bin/bash
# ==> usb.sh
# ==> Сценарий монтирует и устанавливает USB-устройства флэш-памяти.
# ==> Запускается с правами root во время загрузки системы (см. ниже).
# Этот сценарий распространяется на условиях GNU GPL license версии 2 или выше.
# Полный текст лицензии вы найдете на <a href="http://www.gnu.org/.
#
#" title="http://www.gnu.org/.
#
#">http://www.gnu.org/.
#
#</a> Часть кода заимствована из сценария usb-mount, автор Michael Hamilton (LGPL)
#+ см. <a href="http://users.actrix.co.nz/michael/usbmount.html
#
#" title="http://users.actrix.co.nz/michael/usbmount.html
#
#">http://users.actrix.co.nz/michael/usbmount.html
#
#</a> УСТАНОВКА
# ---------
# Поместите сценарий в каталог /etc/hotplug/usb/diskonkey.
# Затем скопируйте все описания устройств usb-storage из /etc/hotplug/usb.distmap
#+ в /etc/hotplug/usb.usermap, заменяя "usb-storage" на "diskonkey".
#
# TODO
# ----
# Обслуживание более одного устройства diskonkey (например /dev/diskonkey1
#+ и /mnt/diskonkey1), и т.д. Наибольшая проблема здесь состоит в работе с
#+ devlabel.
#
# АВТОР и ПОДДЕРЖКА
# -------------------
# Konstantin Riabitsev, <icon linux duke edu>.
# Сообщения об обнаруженных ошибках отправляйте мне на электронный адрес.
#
# ==> Комментарии добавленные автором книги.
SYMLINKDEV=/dev/diskonkey
MOUNTPOINT=/mnt/diskonkey
DEVLABEL=/sbin/devlabel
DEVLABELCONFIG=/etc/sysconfig/devlabel
IAM=$0
##
# Функция заимствована из usb-mount.
#
function allAttachedScsiUsb {
find /proc/scsi/ -path '/proc/scsi/usb-storage*' -type f | xargs grep -l 'Attached: Yes'
}
function scsiDevFromScsiUsb {
echo $1 | awk -F"[-/]" '{ n=$(NF-1); print "/dev/sd" substr("abcdefghijklmnopqrstuvwxyz", n+1,
1) }'
}
if [ "${ACTION}" = "add" ] && [ -f "${DEVICE}" ]; then
##
# заимствовано из usbcam.
#
if [ -f /var/run/console.lock ]; then
CONSOLEOWNER=`cat /var/run/console.lock`
elif [ -f /var/lock/console.lock ]; then
CONSOLEOWNER=`cat /var/lock/console.lock`
else
CONSOLEOWNER=
fi
for procEntry in $(allAttachedScsiUsb); do
scsiDev=$(scsiDevFromScsiUsb $procEntry)
# Это ошибка в usb-storage?
# Разделы не появляются в /proc/partitions до тех пор
#+ пока к ним не было хотябы одного обращения.
/sbin/fdisk -l $scsiDev >/dev/null
##
# Большинство устройств имеет информацию о разделах, например
#+ /dev/sd?1. Однако, некоторые устройства не имеют разделов
#+ выделяя под данные весь объем памяти. Здесь делается
#+ попытка определить такие устройства, т.е. имеется ли /dev/sd?1
#+ или нет.
#
if grep -q `basename $scsiDev`1 /proc/partitions; then
part="$scsiDev""1"
else
part=$scsiDev
fi
##
# Изменение владельца устройства, чтобы пользователь
#+ мог смонтировать его.
#
if [ ! -z "$CONSOLEOWNER" ]; then
chown $CONSOLEOWNER:disk $part
fi
##
# Здесь проверяется — зарегистрирован ли UUID с помощью devlabel.
# Если нет, то устройство добавляется в список.
#
prodid=`$DEVLABEL printid -d $part`
if ! grep -q $prodid $DEVLABELCONFIG; then
# скрестим пальцы, надеюсь это поможет
$DEVLABEL add -d $part -s $SYMLINKDEV 2>/dev/null
fi
##
# Если точка монтирования отсутствует, то она создается.
#
if [ ! -e $MOUNTPOINT ]; then
mkdir -p $MOUNTPOINT
fi
##
# Позаботиться о создании соответствующей записи в /etc/fstab.
#
if ! grep -q "^$SYMLINKDEV" /etc/fstab; then
# Добавить запись в fstab
echo -e \
"$SYMLINKDEV\t\t$MOUNTPOINT\t\tauto\tnoauto,owner,kudzu 0 0" \
>> /etc/fstab
fi
done
if [ ! -z "$REMOVER" ]; then
##
# Обеспечить запуск сценария при извлечении устройства.
#
mkdir -p `dirname $REMOVER`
ln -s $IAM $REMOVER
fi
elif [ "${ACTION}" = "remove" ]; then
##
# Если устройство смонтировано — отмонтировать его.
#
if grep -q "$MOUNTPOINT" /etc/mtab; then
# отмонтировать
umount -l $MOUNTPOINT
fi
##
# Удалить запись из /etc/fstab, если она там имеется.
#
if grep -q "^$SYMLINKDEV" /etc/fstab; then
grep -v "^$SYMLINKDEV" /etc/fstab > /etc/.fstab.new
mv -f /etc/.fstab.new /etc/fstab
fi
fi
Последние комментарии