Как смонтировать ресурсы FTP с помощью fstab, когда соединение доступно?

Я хотел бы автоматически смонтировать папку FTP, используя curlftpfs положить в fstab строка как:

curlftpfs#user:pwd@myhost:port/folder/ /mnt/mymountfolder fuse allow_other,uid=1000,gid=1000,umask=0022,_netdev 0 0

Обычно это не работает, так как во время загрузки сеть (обычно wifi) не доступна для моего ноутбука. Я прочитал это _netdev опция в fstab должна обеспечивать монтирование только тогда, когда сеть доступна, но я получаю сообщение:

Error connecting to ftp: Couldn't resolve host myhost

В качестве альтернативы я мог бы смонтировать ресурс с помощью скрипта автозапуска после того, как был выполнен вход в систему, но я бы хотел больше решения fstab.

Конечная цель - синхронизировать локальную папку с папкой ftp с помощью crontab rsync, поэтому, если у вас есть другие предложения, я буду благодарен!

3 ответа

Решение

Поскольку ваша цель - "синхронизировать локальную папку с папкой ftp с помощью crontab rsync", я предлагаю вам написать небольшой скрипт, который монтирует FTP, rsync, размонтирует FTP. Затем запустите этот скрипт из crontab.

Это должно пойти примерно так:

#!/bin/bash
curlftpfs user:pwd@myhost:port/folder/ /mnt/mymountfolder
#might need sleep 1 here
rsync -a /mnt/mymountfolder /local/folder
fusermount -uz /mnt/mymountfolder

Убедитесь, что вы используете chmod +x в сценарии.

crontab -e

#m h d M wd
0 * * * * /usr/local/bin/backup-script

Кроме того, если вы действительно хотите, чтобы папка FTP монтировалась все время, вы можете создать скрипт, который монтирует / размонтирует ваш диск. Если вы также добавите его в fstab, вы можете вручную смонтировать диск.

Fstab:

curlftpfs#user:pwd@myhost:port/folder/ /mnt/mymountfolder fuse noauto,user,uid=1000,gid=1000,umask=0022 0 0

network-mount.sh:

#!/bin/bash
folder=/media/ftp
# check if host is alive
ping=`/usr/bin/fping -q host.dyn.org`
if [ $? == 0 ]; then
  # check if folder is mounted
  mountpoint $folder > /dev/null
  if [ $? != 0 ]
    # mount, timeout in case something goes wrong
    then timeout 10s mount $folder
  fi
  else
  mountpoint $folder > /dev/null
  if [ $? = 0 ]
    #unmount lazy (network down)
    then umount -l $folder
  fi
fi

Добавьте это в crontab (crontab -e):

* * * * * /usr/local/bin/network-mount.sh

Также следите за тем, чтобы rsync не завершился до следующего запуска. Это может быть сделано автоматически (проверьте, работает ли rsync) или на основе количества данных, которые должны быть синхронизированы (количество времени, необходимое rsync, в худшем случае).

Предполагая, что вы не запускаете rsync для чего-либо еще, проверка его запуска может быть выполнена следующим образом:

pgrep rsync
if [ $? == 0 ]; then
  # rsync running
  exit
else
  # rsync not running
  #do stuff
fi

Я использую SFTP / sshfs для этой цели

echo password | sshfs username@serverIP:/ /mnt/mountpointfolder -p portnumber -o reconnect -o password_stdin

Не уверен, что есть способ fstab. Если вы выполняете задачу cron, делая это каждые x минут, все будет в порядке. Если папка уже смонтирована, вы просто получите сообщение "уже подключено". Если вы отключены, вы получите еще одну ошибку, и соединение не будет установлено. Но когда вы снова подключитесь, вы подключитесь через минуту... В случае задания cron вы можете удалить -o reconnect часть.

Сделайте файл скрипта безопасным, так как он содержит пароль.

Вы можете попробовать опцию curlftpfs

connect_timeout=N (секунд).

В вашем примере (допустим, 30 секунд достаточно),

curlftpfs # user: pwd @ myhost: порт / папка / /mnt/mymountfolder, uid=1000, gid=1000, umask=0022, connect_timeout=30 0 0 предохранитель -o allow_other

Кроме того, вы можете удалить из fstab и подключиться в Nautilus, затем сохранить его как закладку и подключаться при каждом запуске.

Другие вопросы по тегам