Estou recebendo um erro de permissão no CentOS 7 quando tento criar um link físico. Com as mesmas permissões definidas no CentOS 6, não recebo o erro. O problema é centrado nas permissões de grupo. Não tenho certeza de qual versão do sistema operacional está certa e qual está errada.
Deixe-me ilustrar o que está acontecendo. No meu diretório de trabalho atual, tenho dois diretórios: origem e destino. No início, o destino está vazio; source contém um arquivo de texto.
[root@tc-dlx-nba cwd]# ls -l
total 0
drwxrwxrwx. 2 root root 6 Jun 12 14:33 destination
drwxrwxrwx. 2 root root 21 Jun 12 14:33 source
[root@tc-dlx-nba cwd]# ls -l destination/
total 0
[root@tc-dlx-nba cwd]# ls -l source/
total 4
-rw-r--r--. 1 root root 8 Jun 12 14:20 test.txt
[root@tc-dlx-nba cwd]#
Como você pode ver, em relação às permissões, os dois diretórios são 777, com o proprietário e o grupo configurados para raiz. O proprietário e o grupo do arquivo de texto também estão definidos como raiz. No entanto, as permissões do arquivo de texto são de leitura e gravação para o proprietário, mas somente leitura para o grupo.
Quando estou logado como root, não tenho problemas para criar um link físico no diretório de destino apontando para o arquivo de texto (no diretório de origem).
[root@tc-dlx-nba cwd]# ln source/test.txt destination/
[root@tc-dlx-nba cwd]# ls destination/
test.txt
No entanto, se eu fizer login como outro usuário, neste caso, admin, não conseguirá criar o link. Eu recebo: "Operação não permitida".
[root@tc-dlx-nba cwd]# rm -f destination/test.txt
[root@tc-dlx-nba cwd]# su admin
bash-4.2$ pwd
/root/cwd
bash-4.2$ ln source/test.txt destination/
ln: failed to create hard link ‘destination/test.txt’ => ‘source/test.txt’: Operation not permitted
O que acontece realmente faz sentido para mim, mas como o acima é permitido no CentOS 6, eu queria verificar se estava entendendo algo errado. Para mim, parece um bug no CentOS 6 que foi corrigido no CentOS 7.
Alguém sabe o que dá? Estou certo de acreditar que o comportamento acima é o comportamento correto? O CentOS 6 está correto? Ou, ambos estão certos e talvez haja algum problema sutil de permissão de grupo que esteja faltando? Obrigado.
Edit: Eu tentei o mesmo teste agora em uma VM Debian v7 que eu tenho. O Debian concorda com o CentOS 7: "Operação não permitida".
Edição nº 2: tentei a mesma coisa no Mac OS X (Yosemite). Isso funcionou da maneira que o CentOS 6 funcionou. Em outras palavras, permitiu que o link fosse criado. (Nota: no OS X, o grupo raiz é chamado de "roda". Essa é a única diferença, pelo que sei.)
fonte
Respostas:
Acionei alguns CentOS 6 e 7 vm frescos e fui capaz de recriar o comportamento exato que você mostrou. Depois de fazer algumas investigações, verifica-se que essa é realmente uma alteração no kernel em relação ao comportamento padrão em relação aos links físicos e físicos por questões de segurança. As páginas seguintes me apontaram na direção certa:
http://kernel.opensuse.org/cgit/kernel/commit/?id=561ec64ae67ef25cac8d72bb9c4bfc955edfd415
http://kernel.opensuse.org/cgit/kernel/commit/?id=800179c9b8a1
Se você tornar o mundo do arquivo gravável, seu usuário administrador poderá criar o link físico.
Para reverter para o comportamento do sistema CentOS 6, foram adicionados novos parâmetros do kernel. Defina o seguinte em /etc/sysctl.conf:
então corra
Quanto ao motivo pelo qual seu programa opta por usar links em vez de copiar arquivos, por que criar uma cópia exata de um arquivo que você precisa usar quando você pode apenas criar uma entrada que aponte para os blocos originais? Isso economiza espaço em disco e a operação é menos dispendiosa em termos de CPU e E / S. O novo link físico é o mesmo arquivo, apenas com diferentes metadados / inode. Se você excluir o arquivo original após criar um link físico, ele não afetará o link. Um arquivo é apenas 'excluído' depois que todos os links forem removidos.
fonte