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:
И сделал ему так:
# 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.