edit

Автомонтирование в userspace с помощью incrond

event Fri 06 Nov '09
language ru
code code

Раньше я писал, как можно динамически монтировать устройства и хосты с помощью autofs. Этот способ не лишён недостатков, основной из которых — монтирование всегда из-под рута. А значит надо ставить рута в известность о своих паролях-ключах (то есть держать копию ~/.ssh и ~/.netrc в ~root), что далеко не всегда удобно, а кроме того вредно с точки зрения безопасности. Не говоря уже о том, что этот метод работает только если ты единственный, кто сидит за этим компом.

Решение мне подсказал muhas, и звучит оно просто — inotify.

Для моих же целей я посчитал, что лучшим решением будет использовать incrond. Это разновидность крона, которая запускает команды по событиям в файловой системе, а для слежения за файлам использует libinotify.

Нам потребуется: пакет incron (apt-get install incron), sshfs/curlftpfs (или ещё какие демоны-монтировщики, смотря что будем монтировать) и немного настроить инкрон.

Формат конфигов инкрона прост, как полено:

имя_файла список_флагов_через_запятую команда_для_запуска

За подробностями отправляю в man 5 incrontab, а здесь скажу то, чего в манах нет, и на что сам напоролся. Дело в том, что поля в конфиге инкрона должны разделяться пробелом. Именно пробелом и именно одним. Табуляции и прочие «пробельные символы» не подходят. Серии пробелов — тоже, т.к. «лишние» пробелы в итоге попадут либо в список флагов, либо в имя команды, так что рискуете получить в сислоге ошибку «выполняемый файл не найден», т.к. инкрон попытается запутить не «команду_для_запуска», а « команду_для_запуска», с лидирующими пробелами в имени команды.

Теперь, собственно, конфигурация:

mkdir -p ~/remote/ssh ~/remote/ftp ~/remote/ftpa

Каталог ftpa нужен для монтирования хостов в активном режиме (есть у меня пара таких хостингов, что такое требуют).

Дальше добавляем себя в /etc/incron.allow, чтобы инкрон нас допустил к себе:

sudo vim /etc/incron.allow
<добавляем строчку со своим логином>

Теперь правим инкронтаб:

incrontab -e

/home/kstep/remote/ssh IN_ATTRIB,IN_CREATE,IN_NO_LOOP sshfs -f $#: $@/$#
/home/kstep/remote/ftp IN_ATTRIB,IN_CREATE,IN_NO_LOOP curlftpfs -f $# $@/$#
/home/kstep/remote/ftpa IN_ATTRIB,IN_CREATE,IN_NO_LOOP curlftpfs -f -o ftp_port=- $# $@/$#

IN_CREATE монтирует при создании каталога с именем хоста в соответствующем подкаталоге ~/remote. Если такой каталог уже есть, то благодаря IN_ATTRIB монтирование произойдёт на touch. Это не так удобно, как в случае с autofs, но другого выхода я пока не нашёл.

IN_NO_LOOP не даёт монтировать каталог второй раз, до тех пор пока он не размонтируется. Реально этот флаг не даёт инкрону продолжать следить за файлом-каталогом до тех пор, пока не завершиться запущенный процесс-обработчик. А так как curlftpfs и sshfs по дефолту становятся демонами, то я им даю флаг -f, чтобы они оставались на виду и не демонизировались, не давая тем самым инкрону запускать себя второй раз.

Собственно вот, эта связка прекрасно работает у меня на данный момент =)