На досуге допилил автомонтирование. Суть в том, чтобы не только иметь возможность автоматического монтирования, но монтировать/размонтировать флэшки удобным мне способом. Собственно всё сводится к прописыванию двух правил для udev и тройке скриптов. Но, обо всё по-порядку.
1. Создаём файл 20-local.rules в /etc/udev/rules.d/
# touch /etc/udev/rules.d/20-local.rules
2. Прописываем следующие правила:
ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd[c-z]", RUN+="/home/agamestor/.bin/udev.sh $env{DEVNAME} $env{ID_MODEL}"
ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd[c-z][0-9]", RUN+="/home/agamestor/.bin/udev.sh $env{DEVNAME} $env{ID_MODEL}"
Ограничение по sd[c-z] и sd[c-z][0-9] специально выбрано таким по двум причинам. Во-первых, sda и sdb уже зобиты под винчестер, стало быть эти устройства нам не нужны. Во-вторых, есть девайсы, ака мой плеер Samsung, у которых нет разделов, поэтому правил два. В качестве параметров исполняемому скрипту передаются два значения: это само имя устройства, ака /dev/sd? и модель, дальше станет понятно для чего это нужно.
3. Создаём файл udev.sh, делаем его исполняемым и наполняем содержимым:
# touch ~/.bin/udev.sh
# chmod +x ~/.bin/udev.sh
Содержимое:
#!/bin/sh
USER="agamestor"
RETURN=`sh -c "/sbin/udevadm info --query=property --name="$1" | /bin/grep 'ID_FS_TYPE'"`
f_mount () {
RETURN=$(/bin/su - "$USER" -c "/usr/bin/pmount -w -A '$1' '$2'")
if [ -z "$RETURN" ]; then
/bin/su - $USER -c "env DISPLAY=:0.0 /usr/bin/notify-send 'Устройство успешно смонтировано' '$1 => /media/$2'"
else
/bin/su - $USER -c "env DISPLAY=:0.0 /usr/bin/notify-send 'Ошибка монтирования устройства!' '$RETURN'"
fi
}
if [ ! -z $RETURN ]; then
/bin/su - $USER -c "env DISPLAY=:0.0 /usr/bin/notify-send 'Найден новый USB накопитель' '$2'"
f_mount $1 $2 # $1 => DEVICE, $2 => LABEL
fi
exit 0
По существу скрипт принимает вышеупомянутые значения, по первому производит проверку на наличие в устройстве разделов, как бы если их нет, то и монтировать нечего. Радостно сообщает, что устройство найдено и благополучно/неблагополучно смонтировано. Вывод сообщений идёт через notify-send, монтирование осуществляется командой pmount.
4. Вроде бы, что ещё нужно? Но, я пошёл дальше. Создаём исполняемый скрипт с именем umount.sh и пишем в него следущее:
#!/bin/sh
FLABEL=`/bin/ls -1Q /media/ | /bin/sed 's/\"/\[/;s/\"/\]/' | /usr/bin/dmenu -p "umount"`
LABEL=`/bin/echo "$FLABEL" | /bin/sed 's/\[//;s/\]//'`
RETURN=$(/usr/bin/pumount /media/"$LABEL" 2>&1)
if [ ! -z "$LABEL" ]; then
if [ -z "$RETURN" ]; then
/usr/bin/notify-send "Устройство успешно размонтировано" "$LABEL"
else
/usr/bin/notify-send "Ошибка размонтирования устройства!" "$RETURN"
fi
fi
exit 0
В принципе, ничего особенного, только вот выбор устройства для размонтирования подаётся команде dmenu. В этоги получаем все устройства, которые смонтированы в каталоге /media в виде узкой полоски меню с возможностью выбора последнего стрелочками, али автокомплитишином. Также получаем нотификацию об окончании операции.
5. Но, я подумал, что неплохо бы было написать скрипт и для монтирования. Вдруг мне нужно будет вручную смонтировать флэху, которую я размоунтил. Создаём файл mount.sh и пишем в него следующее:
#!/bin/sh
MTAB="/home/agamestor/.etc/mtab"
MOUNT_LOG="/home/agamestor/.var/log/mount.log"
DEVICES=`/bin/ls -1 /dev/sd[c-z]; /bin/ls -1 /dev/sd[c-z][0-1]`
rm $MTAB
for i in $DEVICES;
do
RETURN=`sh -c "/sbin/udevadm info --query=property --name="$i" | /bin/grep 'ID_FS_TYPE'"`
if [ ! -z $RETURN ]; then
LABEL=`sh -c "/sbin/udevadm info --query=property --name="$i" | /bin/grep -w 'ID_MODEL' | /bin/cut -f2 -d'='"`
FLABEL=`/bin/echo "$LABEL" | /bin/sed 's/^/\[/;s/$/\]/'`
echo "$i $LABEL" >> $MTAB
fi
done
FLABEL=`cat $MTAB | awk '{ print $2 }' | dmenu -p 'mount'`
LABEL=`/bin/echo "$FLABEL" | /bin/sed 's/\[//;s/\]//'`
DEVICE=`/bin/grep "$LABEL" "$MTAB" | /bin/awk '{ print $1 }'`
RETURN=$(/usr/bin/pmount "$DEVICE" /media/"$LABEL" 2>&1)
if [ ! -z "$LABEL" ]; then
if [ -z "$RETURN" ]; then
/usr/bin/notify-send "Устройство успешно смонтировано" "$LABEL [$DEVICE] => /media/$LABEL"
else
/usr/bin/notify-send "Ошибка монтирования устройства!" "$RETURN"
fi
fi
exit 0
Здесь немного позаковыристей, но смысл тот же. Только наоборот. Ищем устройства которые не винчестеры, ака sd[c=z] и выводим их список через dmenu с последующим монтированием и уведомлением.
P.S.: Уважаемые камрады, заранее извиняюсь за стилистику кода и оформление, как последнего так и самого поста. Сильно не пинайте, авось кому-то будет интересно. Скрипты не лишены недостатков, но для начала пойдёт. Весь упор делался на unix-way и затачивался под себя. Надеюсь на понимание.
С уважением...Ярлыки: Bash, Linux