ENOENT erro no diretório que existe

0

Histórico: Estou executando um servidor de redmine com o plug-in DMSF , que fornece pesquisa de texto completo usando o xapian. O Redmine está sendo executado no Passenger, hospedado pelo Nginx. O processo do Passenger está sendo executado como usuário "redmine" e group "nginx". Apparmor está desativado para passageiros e Nginx.

O log redmine indica que o índice xapian não pode ser encontrado:

REDMAIN_XAPIAN ERROR: Xapian database is not properly set, initiated or it's corrupted.
DatabaseOpeningError: Couldn't stat '/var/tmp/dmsf-index/english'

E um passo no processo do passageiro em exibição mostra o seguinte:

[pid  1013] stat("/var/tmp/dmsf-index/english", 0x7fa3bd112f00) = -1 ENOENT (No such file or directory)
[pid  1013] write(8, "REDMAIN_XAPIAN ERROR: Xapian dat"..., 88) = 88
[pid  1013] write(8, "DatabaseOpeningError: Couldn't s"..., 66) = 66

Uma listagem de arquivos como raiz:

775# ls -ahl /var/tmp/dmsf-index/english/
total 340K
drwxr-x--- 2 redmine nginx 4.0K Sep  5 13:04 .
drwxr-x--- 3 redmine nginx 4.0K Sep  5 13:04 ..
-rw-r----- 1 redmine nginx    0 Sep  5 14:00 flintlock
-rw-r----- 1 redmine nginx   28 Sep  5 13:04 iamchert
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 position.baseA
-rw-r----- 1 redmine nginx   16 Sep  5 13:04 position.baseB
-rw-r----- 1 redmine nginx  80K Sep  5 13:04 position.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 postlist.baseA
-rw-r----- 1 redmine nginx   17 Sep  5 13:04 postlist.baseB
-rw-r----- 1 redmine nginx 176K Sep  5 13:04 postlist.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 record.baseA
-rw-r----- 1 redmine nginx   14 Sep  5 13:04 record.baseB
-rw-r----- 1 redmine nginx 8.0K Sep  5 13:04 record.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 termlist.baseA
-rw-r----- 1 redmine nginx   14 Sep  5 13:04 termlist.baseB
-rw-r----- 1 redmine nginx  32K Sep  5 13:04 termlist.DB

E vários comandos são executados como usuário "redmine" e grupo "nginx" via sudo -i:

redmine@redmine:/var/tmp/dmsf-index/english$ pwd
/var/tmp/dmsf-index/english
redmine@redmine:/var/tmp/dmsf-index/english$ file .
.: directory
redmine@redmine:/var/tmp/dmsf-index/english$ ls
flintlock  iamchert  position.baseA  position.baseB  position.DB  postlist.baseA  postlist.baseB  postlist.DB  record.baseA  record.baseB  record.DB  termlist.baseA  termlist.baseB  termlist.DB
redmine@redmine:/var/tmp/dmsf-index/english$ file record.DB 
record.DB: data
redmine@redmine:/var/tmp/dmsf-index/english$ whoami
redmine
redmine@redmine:/var/tmp/dmsf-index/english$

Tanto quanto eu posso dizer que não há erros de permissão (geralmente indicados com EACCES). Eu li que NFS ou CIFS podem retornar ENOENT sob circunstâncias obscuras, mas esta é uma partição ext4 local montada em /

Eu até tentei configurar as permissões para o dmsf-index recursivamente como 777, mas recebo o mesmo erro.

Então, minha pergunta é: por que o Passenger / Redmine não consegue encontrar o diretório, enquanto um shell rodando como o mesmo usuário pode?

    
por Ianvdl 05.09.2017 / 14:16

1 resposta

1

Então, parece que Kusalananda estava no caminho certo em relação a um chroot.

O arquivo unitário nginx systemd nesta máquina define PrivateTmp=true , que de acordo com a documentação faz o seguinte:

Takes a boolean argument. If true, sets up a new file system namespace for the executed processes and mounts private /tmp and /var/tmp directories inside it that is not shared by processes outside of the namespace. This is useful to secure access to temporary files of the process, but makes sharing between processes via /tmp or /var/tmp impossible.

Alternar essa opção para falso corrige o problema.

    
por 06.09.2017 / 09:56