У меня есть дерево файлов и папок, большинство из которых принадлежит основному пользователю, которого мы назовем «лавр». Одно из поддеревьев полностью принадлежит другому пользователю по имени hardy. Наконец, поскольку Laurel & Hardy любят mysql, существует каталог данных mysql, принадлежащий пользователю mysql. В системе существуют все три пользователя, хотя mysql не имеет оболочки входа.
(Поместим поддерево в ~/subtree
.)
Я хочу переместить поддерево в общую систему. Я создал реж /mnt/data
и каталог на удаленном сервере / data / main и использовал следующую команду для монтирования remote:/data/main
(принадлежит удаленному пользователю "ubuntu") на /mnt/data
:
sshfs -o idmap=user -o reconnect -o allow_other -o ServerAliveInterval=15 -o IdentityFile=$HOME/.ssh/id_rsa ubuntu@$IP:/data/main /mnt/data
Однако я не могу понять, как перенести дерево файлов с тремя владельцами в удаленную систему, и даже могу ли я. Если я сбегу cp -r ~/subtree /mnt/data/
Я получаю ошибки отказа в разрешении для некоторых файлов mysql в ~ / subtree, которые имеют perms 0700:
cp: cannot open `mysql/data/ib_logfile0' for reading: Permission denied
Если я сбегу sudo cp -r ~/subtree /mnt/data/
полученные файлы теперь принадлежат laurel, и mysqld больше не будет работать, потому что он хочет, чтобы файлы принадлежали mysql. Если я сбегу sudo cp -r -p ~/subtree /mnt/data/
, Я получаю эти сообщения об ошибках:
cp: failed to preserve ownership for `/mnt/data/mysql/data/ib_logfile0': Permission denied
... # and on and on for every other file owned by mysql
Я построил непонятную систему, которая работает, но ужасно. Я создал 3 несистемных пользователя на своем сервере, скопировал туда ключи и сделал 3 отдельных вызова sshfs
чтобы настроить их:
# As laurel:
sshfs -o idmap=user -o reconnect -o allow_other -o ServerAliveInterval=15 -o IdentityFile=$HOME/.ssh/id_rsa ubuntu@$IP:/data/main-laurel /mnt/data-main
sudo -u hardy sshfs -o idmap=user -o reconnect -o allow_other -o ServerAliveInterval=15 -o IdentityFile=/home/hardy/.ssh/id_rsa hardy@$IP:/data/main-hardy /mnt/data-hardy
sudo -u mysql sshfs -o idmap=user -o reconnect -o allow_other -o ServerAliveInterval=15 -o IdentityFile=/home/mysql/.ssh/id_rsa ubuntu@$IP:/data/main-mysql /mnt/data-mysql
cd ~/subtree
cd mysql
sudo -u mysql cp -r data /mnt/data-mysql/
sudo -u mysql rm -fr data
cd ../
sudo -u hardy cp -r hardy /mnt/data-hardy/
sudo -u hardy rm -fr hardy
cd ..
cp -r subtree /mnt/data-main/
rm -fr subtree
# And now link everything back together
ln -s /mnt/data-main/subtree .
cd /mnt/data-main/subtree
ln -s ../../data-hardy/hardy .
cd mysql
ln -s /mnt/data-mysql/data .
Я упоминал, что мне пришлось настроить mysql и laurel как несистемные пользователи на обеих машинах? В противном случае sshfs не работает.
Это работает, но есть еще одна сложность. Это комедийный сервер, и пользователи могут создавать новые объекты, похожие на контейнеры, каждый из которых имеет своего нового владельца. Поэтому, когда пользователь пытается создать новый объект, скажем keaton
, он немедленно завершится ошибкой, потому что ссылка sshfs не распознает нового владельца, ожидая, что новые объекты будут принадлежать laurel
. Если до того, как пользователь создаст новый объект, он сначала создаст его на удаленном сервере, а затем система может установить другую ссылку, например hardy
один я показываю выше. Я не думаю, что это пройдет хорошо.
То, что вы хотите, на самом деле невозможно с SSHFS. Основная причина заключается в том, что SSHFS работает от имени конкретного пользователя на удаленном хосте, и этому пользователю не разрешено изменять информацию о владельце файлов, расположенных на удаленном хосте. Я не знаю, поддерживает ли SSHFS это даже, если вы монтируете с помощью root в качестве удаленного пользователя (я не рекомендую это, даже если он работает, поэтому я не тестировал его).
Если возможно, лучше использовать другое решение для удаленных файлов. И NFS, и CIFS (Samba) работают хорошо, но требуют небольшой настройки, и вам нужно помнить о безопасности.
Самый простой способ сделать это - использовать rsync
на работу или трубу tar
через SSH на удаленный сервер.
tar cf - /path/to/source | ssh user@remote.server "cat > /path/temp/dest/file.tar"
На конечном сервере после этого:
cd /path/to/destination
tar xf /path/temp/dest/file.tar
Если вам абсолютно необходимо использовать SSHFS для этого, возможно, странного сценария, вам нужно использовать несколько подключений SSHFS, чтобы добиться этого без ошибок разрешений. В частности, по одному на пользователя.