суббота, 17 октября 2009 г.

FTPFS или что можно сделать на базе FUSE

Скопирую на будущее. Вдруг пригодится опять.

Владелец одного из серверов, администрированием которого занимается наша компания, поставил такую забавную задачу. На его сервере присутствует громадный ftp-архив (2 storage по 6 ТБ каждый на данный момент). Неподалеку от этого сервера стоит другой сервер, на котором есть тоже интересный архив, причем постоянно обновляемый. Необходимо было сделать так, чтобы архив второго сервера стал как бы частью ftp-архива нашего сервера. При этом копировать данные с сервера на сервер не допускалось (ну там, дублирование информации и все такое).

Задача усложнялась тем, что на втором сервере стоит FreeBSD и ручек от его администрирования нам, естественно, никто не дал. После небольшого гугления было найдено 2 варианта решения данной проблемы:

  1. sshfs. то есть файловая система, работающая поверх ssh через FUSE (Filesystem in USEr space)
  2. ftpfs, то есть то же самое, но только работающее поверх ftp

Выбор был сделан в пользу ftpfs. Во-первых, очевидно что протокол ftp будет работать быстрее чем ssh, т.к. соединение не шифруется. Во-вторых, оба сервера находятся на одном и том же узле связи, никакой особой безопасности тут не требуется, тем более что второй сервер вообще разрешает анонимный доступ по ftp. Да, забыл добавить немаловажный факт: между серверами гигабитная сетка.

Итак, решение выбрано, приступаем к настройке. Первым делом, установим необходимые пакеты:
apt-get install curlftpfs
все, что нужно, debian скачает и установит сам. Дальше нужно создать точку монтирования (куда собственно подключать удаленный ftp):
mkdir /home/ftp/cool-ftp
chown user:group /home/ftp/cool-ftp

Монтируем ftp-шник:
curlftpfs ftp://ftp.host.ru/ /home/ftp/cool-ftp/ -o ro,allow_other,uid=user,gid=gro
Собственно, вот и всё. Почти :) Дело в том, что нормальные админы не занимаются развешиванием соплей, отваливающихся при ребуте сервера, а приколачивают все гвоздиками. В нашем случае, нужно прописать соответствующую строчку в /etc/fstab, чтобы при загрузке нашего сервера, ftp-шник подмонтировался автоматом. Делается это очень просто, путем добавления в /etc/fstab вот такой строчки:
curlftpfs#anonymous:@ftp.host.ru /home/ftp/cool-ftp/ fuse ro,allow_other,uid=user,gid=group 0 0
Разумеется, так же полезно добавить строчку "fuse" в файл /etc/modules, чтобы модуль fuse был автоматом загружен в ядро.
Да, чуть не забыл добавить. Не знаю почему, но uid=user,gid=group у меня на самом деле не работало. Вместо этого я написал uid=1001 (цифровой идентификатор юзера user, который можно получить, выполнив id -u user) и, соответственно, gid=...

Еще, кстати, полезно сделать вот так:
ln -s /usr/bin/curlftpfs /sbin/mount.curlftpfs
чтобы можно было монтировать файловые системы типа curlftpfs обычной командой mount -t curlftpfs

P.S. После некоторого времени эксплуатации выяснилось, что система ведет себя не совсем стабильно: периодически процессы ftpfs зависали на команде LIST. Поэтому в итоге мы таки откатились на sshfs. Делается это не менее просто:

  1. Генерируем rsa-ключ для ssh для того пользователя, которым мы ходим на удаленный хост, то есть в нашем случае это root:
    ssh-keygen -t rsa
  2. Прописываем этот ключ, который лежит в файле ~/.ssh/id_rsa.pub на удаленном хосте в файл ~/.ssh/authorized_keys2
  3. В /etc/fstab добавляем строчку:
    sshfs#ftp.host.ru:/home/ftp/public/ /home/ftp/cool-ftp/ fuse ro,allow_other,uid=user,gid=group 0 0

Полный формат первого аргумента выглядит так: sshfs#user:pass@ftp.host.ru:/home/ftp/public/ но мы, разумеется, логин и пароль сюда не пишем, т.к. пользуемся ключами.
Ну и наконец, монтируем:
mount -a

Оригинал (Халиков Антон)

Комментариев нет: