Монтирование USB-устройства из автозапуска KDE
Монтирование USB-устройства из автозапуска KDE
Появился у меня новый HDD 2.5'', который подсоединяется
к компьютеру через USB. Но вместе с ним и появились проблемы.
Дело в том, что он упорно не желает определяться на этапе
загрузки, но зато когда уже загрузились, то определяется сразу
как только воткнешь его в USB-разъем. Вдобавок к этому, на нем
располагается несколько каталогов, необходимых для работы:
например, на одном из разделов есть каталог, на который,
при примонтированом устройстве, ссылается симлинк
/home/koal/bin, а из этого каталога при старте сеанса
KDE должен запускаться скрипт sim.pl, ответственный
за управление программой SIM. Очевидно, что если я забуду
подключить USB-устройство с этими каталогами или забуду
подмонтировать соответствующие разделы, то KDE заругается...
Несколько дней это меня напрягало и поэтому я решил написать
не сложный скриптик.
Какие обязанности хотел я возложить на данный скрипт?
1. Он должен проверить подключено ли к системе необходимое
устройство. Если не подключено, то как-то сообщить
об этом.
2. Подмонтировать соответствующие разделы.
3. Если предыдущие пункты выполнены, то запустить
на выполнение некоторую программу. Таким образом
осуществляется запуск по условию.
Итак, вот что у меня получилось:
begin rmount.sh #!/bin/sh
# Скрипт позволяет монтировать внешние USB-диски перед их
# использованием.
# Для начала проверяются данные об устройстве, если подключено "нужное"
# устройство, то происходит выборка точек монтирования и производится
# операция монтирования разделов к этим точкам. Параметры монтирования
# в операцию монтирования не подставляются, поэтому должны быть описаны
# в файле /etc/fstab
# Данные об устройстве искать в файле /proc/scsi/scsi
DATAFILE="/proc/scsi/scsi"
# Файл, в котором перечислены точки монтирования
FSTABFILE="/etc/fstab"
# Производитель устройства
VENDOR="TOSHIBA"
# Для более точной идентификации - модель устройства
MODEL="MK4025GAS"
# Тип монтируемого устройства
MTYPE="sda"
# Программа, которую запускать после монтирования
PRUN="/home/koal/bin/sim.pl"
# Отладка скрипта
DEBUG=0
# Проверка есть ли поддержка SCSI устройств в системе
if [ ! -f $DATAFILE ]; then
echo "ERROR: SCSI subsystem not support"
exit 1
fi
FL=0
while [ $FL -eq 0 ]; do
# Выделение строки из списка SCSI-устройств
SCSI_STR=`cat $DATAFILE | grep $VENDOR | grep $MODEL`
if [ -z "$SCSI_STR" ]; then
# Запрос о повторении попытки
/usr/bin/Xdialog --screen-center --no-close \
--title "USB Storage" --buttons-style text \
--yesno "Повторить попытку после подключения устройства?" 0 0
# Если выбран отрицательный ответ
if [ $? -ne 0 ]; then
FL=2
else
sleep 2s
fi
else
FL=1
fi
done
if [ $FL -eq 2 ]; then
echo "ERROR: Device not found"
exit 2
fi
# Определение списка монтируемых устройств
DEVICES=`cat $FSTABFILE | grep -v ^[[:space:]]*# | grep $MTYPE | awk
'{print $2}'`
if [ -z "$DEVICES" ]; then
echo "ERROR: Can't find mount points"
exit 3
fi
# Монтируем найденные устройства
for i in $DEVICES; do
if [ $DEBUG -eq 0 ]; then
mount $i
else
echo "mount $i" >> /home/koal/__log.log
fi
done
# Выполнить заданную команду по заверешнии
if [ -n $PRUN ]; then
if [ -f $PRUN ]; then
if [ $DEBUG -eq 0 ]; then
exec $PRUN
else
echo "exec $PRUN" >> /home/koal/__log.log
fi
fi
fi
end rmount.sh Из текста скрипта видно, что разделы должны быть описаны
в /etc/fstab. Хотя скрипт можно было бы развить таким образом,
чтобы он сам определял разделы и файловые системы
на устройстве и автоматически генерировал параметры
необходимые для монтирования, но это будет домашним задание
для кого-либо другого.
Также для отладки скрипта можно установить переменную DEBUG
в 1, тогда никаких активных действий предприниматься не будет,
а скрипт только предупредит о том, что в данном месте
программы он должен был сделать.
Если теперь положить данный скрипт в /usr/local/bin/,
то остается только удалить ссылку на "/home/koal/bin/sim.pl"
из пункта "Автозапуск", а вместо него добавить ссылку
на "/usr/local/bin/rmount.sh".