Назад | Перейти на главную страницу

Могу ли я переместить поддерево, содержащее файлы, принадлежащие 3 разным пользователям, в точку монтирования sshfs?

У меня есть дерево файлов и папок, большинство из которых принадлежит основному пользователю, которого мы назовем «лавр». Одно из поддеревьев полностью принадлежит другому пользователю по имени 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, чтобы добиться этого без ошибок разрешений. В частности, по одному на пользователя.