Estou tentando usar o unionfs para criar várias instâncias (mais de 100) de algumas ferramentas de desenvolvimento para nosso servidor de desenvolvimento. Aqui está o script que estou usando:
PROJECT=$1
DEPLOYMENT=$2
TOOL=$3
DIR_TOOL="/var/www/tools/${TOOL}"
DIR_CONFIG="/var/www/tools-instances/${PROJECT}/${DEPLOYMENT}/${TOOL}/config"
DIR_TMP="/var/www/tools-instances/${PROJECT}/${DEPLOYMENT}/${TOOL}/tmp"
DIR_MERGED="/var/www/tools-instances/${PROJECT}/${DEPLOYMENT}/${TOOL}/merged"
mkdir -p "${DIR_CONFIG}"
mkdir -p "${DIR_TMP}"
mkdir -p "${DIR_MERGED}"
unionfs -o cow "${DIR_TMP}"=RW:"${DIR_CONFIG}"=RO:"${DIR_TOOL}"=RO "${DIR_MERGED}"
E depois use assim:
create-tool-overlay.sh "project-1" "staging" "phpmyadmin"
Tudo funciona bem, mas apenas para o nosso manager
usuário. Se eu tentar acessar a pasta como qualquer outro usuário, incluindo www-data
(quem precisa desse acesso) e root
(quem deve ter acesso a tudo), recebo permission denied
. E se eu tentar executar ls
nesta pasta, recebo esta saída estranha:
root@app-1:/var/www/tools-instances/project-1/staging/phpmyadmin# ls -al
ls: cannot access 'merged': Permission denied
total 32
drwxrwxr-x+ 5 manager manager 4096 Dec 16 15:51 .
drwxrwxr-x+ 3 manager manager 4096 Dec 14 15:29 ..
drwxrwxr-x+ 2 manager manager 4096 Dec 14 15:29 config
d?????????? ? ? ? ? ? merged
drwxrwxr-x+ 2 manager manager 4096 Dec 16 15:51 tmp
O
unionfs
executável que você usou criou um sistema de arquivos no espaço do usuário (FUSE) . O processo de gerenciamento do sistema de arquivos é executado sob um usuário específico (no seu caso:manager
) e outros usuários não têm acesso. Dar acesso a outros usuários é menos seguro. Leia sobre questões de segurança .Você pode diminuir a segurança. Veja
man 8 fuse
. A opçãoallow_root
permitirá que o root use o sistema de arquivos. A opçãoallow_other
permitirá que qualquer pessoa use o sistema de arquivos. Essas opções são mutuamente exclusivas, parece que você quer o último. Observe que você precisa colocaruser_allow_other
para/etc/fuse.conf
usarallow_other
como um usuário regular. Este é o comentário relevante do padrãofuse.conf
no meu Kubuntu [formatting
meu]:Você passa
allow_other
como (uma parte de) um argumento de opção ao-o
invocarunionfs
. No seu caso ficará assim:Observe que, se o sistema de arquivos for executado em um usuário regular específico, ele só poderá fazer (para o armazenamento subjacente) o que esse usuário pode fazer. Por exemplo, se você executar
unionfs
comomanager
eallow_other
permitirwww-data
o uso do sistema de arquivos, qualquer arquivo criado porwww-data
ainda pertencerá a elemanager
. Outras limitações possivelmente se manifestarão.A execução do sistema de arquivos
root
pode ajudar, mas veja a resposta já vinculada . Correr abaixoroot
não é recomendado.Em geral, o FUSE é projetado como uma maneira genérica para usuários sem acesso root montarem e usarem sistemas de arquivos para si mesmos , sem incomodar os administradores reais. Para usar um sistema de arquivos com outros usuários, o caminho certo é ter suporte do kernel e de um administrador que possa
mount
.AFAIK é possível ter o UnionFS como um módulo do kernel (não o FUSE), mas não está no kernel principal, você precisa construí-lo sozinho. Se bem entendi, o UnionFS implementado no kernel deve se comportar como você esperava.
No meu Kubuntu posso usar o OverlayFS (que é uma das alternativas ) já presente como um módulo do kernel (não o FUSE).