Автомонтирование в userspace с помощью incrond
Раньше я писал, как можно динамически монтировать устройства и хосты с помощью 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, чтобы они оставались на виду и не демонизировались, не давая тем самым инкрону запускать себя второй раз.
Собственно вот, эта связка прекрасно работает у меня на данный момент =)