Как смонтировать ресурсы 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, затем сохранить его как закладку и подключаться при каждом запуске.