kstep 24.10.2009 13:42

Tips & tricksУлучшенное динамическое автомонтирование с помощью autofs

Для тех, кто не знает, autofs — это демон, позволяющий монтировать любое устройство автоматически при захождении в указанный каталог.
Например стоит сделать cd /media/cdrom, и он будет смонтирован, даже если не был раньше (если, конечно, он присутствует в приводе, иначе будет ошибка «каталог не найден»).
Здесь я рассмотрю его нестандартное конфигурирование, при котором устройства для монтиования опеределяются не статическими конфигами, а с динамически с помощью скриптов.


Для начала общие сведения.

Во-первых autofs нужно поставить. В дебиан-сквиз присутствует две версии портов: autofs четвёртой версии и autofs5 для новой пятой ветки.
Я, желая чувствовать себя на bleeding edge, поставил пакет autofs5, но думаю, что это не так критично.

Главный конфигурационный файл autofs — /etc/auto.master. Это простенькая табличка, чем-то напоминающая /etc/fstab.
Её структура — три колонки разделённые табами и/или пробелами:


/media /etc/auto.misc --timeout=30


Первая колонка — каталог, за которым нужно следить. Здесь это /media, всё динамическое монтирование будет при попытке зайти в подкаталог этого каталога.
Вторая колонка — конфиг-файл, определяющий маппинг команд монтирования на подкаталоги главного каталога.
Третья колонка — общие параметры монтирования для этого каталога. Здесь для примера параметр --timeout задаёт время простоя (без обращения к динамически смонтированной файловой системе), через которое она будет автоматически размонтирована, в секундах.

Формат /etc/auto.misc:


cdrom -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom0


Здесь опять три колонки:
Первая — имя каталога (подкаталога в /media в нашем случае), который будет динамически создан и к которому будет подмонтирован cdrom (в нашем случае).
Вторая — параментры монтирования, которые будут переданы команде mount для монтирования.
Третья — что именно нужно монтировать. Двоеточие в начале означает, что монтируется локальный файл (устройство /dev/cdrom0). В теории до двоеточия может стоять имя хоста, и тогда будет смонтирован сетевой диск по NFS, но в реальной жизни я это никогда не использовал.

В итоге при указанной примерной конфигурации будет происходить следующее:
при любой попытке войти в /media/cdrom (/media из auto.master, cdrom из auto.misc), autofs будет автоматически создавать этот каталог и монтировать в него /dev/cdrom0. Если никто не будет обращаться к cdromу 30 секунд, то autofs автоматически его отмонтирует.

Теперь перехожу к более интересным вещам.

Я постоянно работаю с удалёнными машинами по ssh и ftp. Для ssh я использую sshfs, для ftp — curlftpfs. Соответственно для следующих примеров понадобяться одноимённые пакеты.
У autofs есть такая фича: если в файл из второй колонки в auto.master имеет права на выполнение, то он воспринимается как скрипт, которому в качестве первого параметра передаётся ключ монтирования (подкаталог в каталоге из первой колонки auto.master, к которому человек пытается обратиться, то есть в нашем случае это будет cdrom0), а вернуть на стандартный выход этот скрипт должен оставшиеся две колонки (как auto.misc, с параметрами монтирования и устройством).
Или скрипт может вернуть ненулевой код ошибки (через «exit 1»), и тогда autofs выдаст юзеру ошибку «каталог не существует».

Все свои конфиги от autofs я сложил в /etc/auto.d, чтоб не перепутались. В него положил такой скрипт под именем remote.conf:

 1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh

key="$1"
opts="-fstype=fuse,rw,nodev,nosuid,nonempty,noatime,allow_other"

case $0 in
*/ssh*) proto="sshfs"; key="$key\\:" ;;
*/ftp*) proto="curlftpfs" ;;
*) exit 1 ;;
esac

echo "$opts" ":$proto\\#$key"



И сделал ему так:


# chmod a+x /etc/auto.d/remote.conf
# ln -s /etc/auto.d/remote.conf /etc/auto.d/ssh.conf
# ln -s /etc/auto.d/remote.conf /etc/auto.d/ftp.conf


Теперь он будет выдавать конфигурацию монтирования для autofs по имени хоста, а вид монтирования (sshfs или curlftpfs) будет определяться по тому, от какого имени его вызвали (если его вызовут как ftp.conf, то будет конфиг для curlftpfs, а если как ssh.conf, то для sshfs).

В auto.master добавлены следующие строки:


/remote/ssh /etc/auto.d/ssh.conf uid=1001,gid=1001,--timeout=30
/remote/ftp /etc/auto.d/ftp.conf uid=1001,gid=1001,--timeout=30


uid и gid задают юзера и группу, которые будут владеть смонтированными каталогами (здесь это я и моя группа =).

Передёргиваем autofs с помощью «sudo /etc/init.d/autofs restart» и всё!

Проверка очень проста:


$ cd /remote/ftp/ftp.debian.org


И наслаждаемся репозитриями дебиана, смонтированными в нашей уютненькой локальной фс =)

Тут есть одна деталь, касающеяся паролей и ключей от ssh и ftp. Первые храняться в ~/.ssh, вторые — в ~/.netrc.
Но дело в том, что autofs работает из-под рута, соответственно в доме рута понадобяться копии этих конфигов, если хотите работать не только с анонимными серваками:


$ cd
$ sudo cp -R .ssh .netrc ~root


Это, конечно, не очень удобно, но вполне приемлемо.

PS. Другой пример, но немного более старый в моём блоге.
Ещё подробнее см. маны по autofs и auto.master.


Тэги: autofs curlftpfs ftp mount ssh sshfs
+ 9 -
Похожие Поделиться