Опубликовано Bash в Ср, 23/12/2009 — 21:13
Пример A-23. Монтирование USB-устройств флэш-памяти.
-
#!/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
- Страница для печати
- 9108 просмотров