Автомонтировка cd/dvd/bd и расшаривание по лейблу

Предупреждение: Нижеописанное решение можно смело отнести к так называемым «костылям», но в наших условиях оно работает стабильно (плевок*3) 😀

Для внутренних нужд у нас есть отдельно стоящий системник с 3 BD приводами. Доступ туда лишь консольный, либо через NX. Внутри живет что-то из последних Ubuntu. Мы пишем на нем BD диски, индексируем Архивариусом 3000 и убираем на долгую память.

В процессе этих дел возникла задача. Очень хочется, чтобы

  • Диск монтировался сразу как только попал в привод (и демонтировался) т.е. без лишнего клика в файловом менеджере. Ну как в Windows т.е.
  • Диск был доступен по самбовской шаре с именем из метки диска.

Чтобы решить первую задачу (автомонтировки), пришлось покурить в сторону udev правил. В результате было написано простое правило в /etc/udev/rules.d/10-local.rules

SUBSYSTEM=="block" KERNEL=="sr?" ACTION=="change" RUN+="/opt/scripts/mountbd %k %n"

поясню, как только любое блочное устройство с именем начинающимся с sr меняет свое состояние, запускается скрипт с двумя параметрами (параметры %k и %n посмотрите в man udev).

Содержимое скрипта /opt/scripts/mountbd

#!/bin/bash
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 правила и все работает 😉

sudo udevadm control --reload-rules

Как видите, никаких проверок на ошибки и прочего нет, оставляю это вам. Суть работы скрипта такова, как только диск повляется\извлекается в\из приводе, с помощью udevadm узнаем точное состояние, и монтируем или демонтируем диск. Вся папка /media раздется самбой, и следовательно, диски всегда доступны по сети.

Далее, как сделать метку не /media/bdN, а нечто такое /media/2013-12-23_22:12? Это надо для того, чтобы в индекс Архивариуса попала уникальная шара, чтобы по ней можно было идентифицировать диск т.е. своего рода ID. Делается тоже достаточно просто, необходимо лишь модифицировать наш скрипт.

#!/bin/bash

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. Пока верстался номер, повился баг проявляющийся если метки дисков совпадают и эти диски загружены в приводы. Пришлось скрипт немного адаптировать к этой ситуации

#!/bin/bash

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