Предупреждение: Нижеописанное решение можно смело отнести к так называемым «костылям», но в наших условиях оно работает стабильно (плевок*3) 😀
Для внутренних нужд у нас есть отдельно стоящий системник с 3 BD приводами. Доступ туда лишь консольный, либо через NX. Внутри живет что-то из последних Ubuntu. Мы пишем на нем BD диски, индексируем Архивариусом 3000 и убираем на долгую память.
В процессе этих дел возникла задача. Очень хочется, чтобы
- Диск монтировался сразу как только попал в привод (и демонтировался) т.е. без лишнего клика в файловом менеджере. Ну как в Windows т.е.
- Диск был доступен по самбовской шаре с именем из метки диска.
Чтобы решить первую задачу (автомонтировки), пришлось покурить в сторону udev правил. В результате было написано простое правило в /etc/udev/rules.d/10-local.rules
поясню, как только любое блочное устройство с именем начинающимся с sr меняет свое состояние, запускается скрипт с двумя параметрами (параметры %k и %n посмотрите в man udev).
Содержимое скрипта /opt/scripts/mountbd
device=${1}
num=${2}
stat=`udevadm info --query=property --name=${device} | grep ID_CDROM_MEDIA=1`
if [ "$stat" == "ID_CDROM_MEDIA=1" ]
then
mount -o auto,user,utf8,exec /dev/$device /media/bd${num}
else
umount /dev/$device
fi
Перегрузим udev правила и все работает 😉
Как видите, никаких проверок на ошибки и прочего нет, оставляю это вам. Суть работы скрипта такова, как только диск повляется\извлекается в\из приводе, с помощью udevadm узнаем точное состояние, и монтируем или демонтируем диск. Вся папка /media раздется самбой, и следовательно, диски всегда доступны по сети.
Далее, как сделать метку не /media/bdN, а нечто такое /media/2013-12-23_22:12? Это надо для того, чтобы в индекс Архивариуса попала уникальная шара, чтобы по ней можно было идентифицировать диск т.е. своего рода ID. Делается тоже достаточно просто, необходимо лишь модифицировать наш скрипт.
device=${1}
num=${2}
stat=`udevadm info --query=property --name=${device} | grep ID_CDROM_MEDIA=1`
symlink=`udevadm info --query=property --name=${device} | grep ID_FS_LABEL_ENC | sed 's/ID_FS_LABEL_ENC=//'`
if [ "$stat" == "ID_CDROM_MEDIA=1" ]
then
mount -o auto,user,utf8,exec /dev/$device /media/bd${num}
ln -s /media/bd${num} /opt/symlinks/$symlink
else
umount /dev/$device
symdir=`find /opt/symlinks/ -maxdepth 1 -type l -print0 | xargs -0 ls -l | grep "/media/bd${num}" |awk '{print $9}'`
rm -f $symdir
fi
при монтировании диска создается симлинка с меткой диска, при демонтировании она удаляется. Шара /opt/symlinks/ также раздается по самбе. Вроде бы костыль, но можно допилить до ума, чего вам и желаю 🙂
P.S. Пока верстался номер, повился баг проявляющийся если метки дисков совпадают и эти диски загружены в приводы. Пришлось скрипт немного адаптировать к этой ситуации
device=${1}
num=${2}
count=0;
stat=`udevadm info --query=property --name=${device} | grep ID_CDROM_MEDIA=1`
symlink=`udevadm info --query=property --name=${device} | grep ID_FS_LABEL_ENC | sed 's/ID_FS_LABEL_ENC=//'`
check_and_create()
{
if [[ -e /opt/symlinks/${symlink}_${count} ]]; then
(( count++ ))
check_and_create
else
ln -s /media/bd${num} /opt/symlinks/${symlink}_${count}
fi
}
if [ "$stat" == "ID_CDROM_MEDIA=1" ]
then
mount -o auto,user,utf8,exec /dev/$device /media/bd${num}
#если
if [[ -e /opt/symlinks/${symlink} ]]; then
check_and_create
else
ln -s /media/bd${num} /opt/symlinks/$symlink
fi
else
umount /dev/$device
symdir=`find /opt/symlinks/ -maxdepth 1 -type l -print0 | xargs -0 ls -l | grep "/media/bd${num}" |awk '{print $9}'`
rm -f $symdir
fi