Eu tenho um repositório git (na verdade git-annex) que estou tentando tornar compartilhado, parte do qual envolve definir o bit set-group-id em vários diretórios. Isso está em uma caixa Debian GNU/Linux Stretch, em um sistema de arquivos ext4. Por algum motivo estranho, chmod g+s DIRECTORY
está sendo ignorado (linhas em branco ao redor chmod
do bloco adicionadas para facilitar a leitura):
$ stat objects
File: objects
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd06h/64774d Inode: 12353692 Links: 260
Access: (0775/drwxrwxr-x) Uid: ( 1000/ anthony) Gid: ( 1025/git-books)
Access: 2018-07-30 14:43:13.831641743 -0400
Modify: 2018-07-28 14:28:14.970667931 -0400
Change: 2018-07-30 14:46:38.179597449 -0400
Birth: -
$ chmod g+s objects
$ echo $?
0
$ stat objects
File: objects
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd06h/64774d Inode: 12353692 Links: 260
Access: (0775/drwxrwxr-x) Uid: ( 1000/ anthony) Gid: ( 1025/git-books)
Access: 2018-07-30 14:43:13.831641743 -0400
Modify: 2018-07-28 14:28:14.970667931 -0400
Change: 2018-07-30 14:50:43.355539381 -0400
Birth: -
O que verifiquei até agora:
- Não parece haver nenhuma opção de montagem estranha (por exemplo,
nosuid
) que possa impedi-lo de funcionar. Eu verifiquei fstab e/proc/mounts
, o que mostra/dev/mapper/slow-srv /srv ext4 rw,relatime,nobarrier,errors=remount-ro,stripe=384,data=ordered 0 0
- Não parece haver nenhuma ACL estranha no diretório; para ter certeza que eu fiz
setfacl -b objects
. Mesmo depois de fazer isso, o chmod continuou a não funcionar. strace
onchmod
mostra o syscall com sucesso e tem o bit sgid definido:fchmodat(AT_FDCWD, "annex", 02775) = 0
- Outros diretórios no mesmo sistema de arquivos têm o bit set-group-id definido. Na verdade, eu configurei alguns mais cedo na mesma sessão, em um repositório git-annex diferente.
Acontece que, embora eu tivesse criado esse grupo e me adicionado a ele vários dias atrás, e isso era o que eu achava que era uma nova conexão ssh, não era realmente. Devido ao uso do recurso de multiplexação de conexão do OpenSSH (
ControlMaster
/ControlPath
/etc.), eu estava realmente efetuando login em uma conexão com aproximadamente 10 dias, então minha sessão (processos) não tinha o novo grupo definido. Confirmei isso comid
.Depois de logar via
ssh -o ControlPath=none HOST
,id
confirma que minha sessão tem ogit-books
grupo, e oschmod g+s
trabalhos.Quanto ao motivo pelo qual isso não deu um erro de permissão negada, parece que o padrão exige esse comportamento para arquivos e permite que as implementações ignorem os bits:
Provavelmente, retornar um erro seria meramente sensato, não conforme ☹.