Minha configuração exige que alguns dos meus /etc
arquivos residam em uma partição separada. Para isso criei um softlink:
ls -li /etc/group
956 lrwxrwxrwx 1 root root 21 May 7 15:48 /etc/group -> /var/common/etc/group
ls -li /var/common/etc/group
3145744 -rw-r--r-- 1 root root 668 May 11 11:02 /var/common/etc/group
Meu problema é quando tento executar comandos usando estes arquivos:
groupadd foo
groupadd: failure while writing changes to /etc/group
strace
relatórios:
rename("/etc/group+", "/var/common/etc/group") = -1 EXDEV (Invalid cross-device link)
write(2, "groupadd: failure while writing "..., 54groupadd: failure while writing changes to /etc/group
) = 54
Alguma ideia de como posso começar groupadd
a trabalhar?
Responder1
Dividir arquivos /etc
entre partições é uma má ideia por esse motivo.
O que está acontecendo é que o groupadd
utilitário está criando um arquivo temporário e, em seguida, substituindo o arquivo real /etc/groups
(ou melhor, para o qual o link simbólico aponta) pelo temporário por meio de uma rename
operação simples.
O problema é que rename()
só funciona no mesmo sistema de arquivos, caso contrário, gera um erro.
Outro problema potencial que você pode encontrar aqui é que quando algo faz o rename
, ele destrói o link simbólico e agora é um arquivo comum.
Outro problema potencial é que muitos arquivos /etc
são necessários para uma inicialização adequada, antes que o sistema tenha a chance de montar outros volumes. Portanto, esses arquivos estarão ausentes.
Resumindo, não, isso não pode ser consertado. E isso não deveria ser feito de qualquer maneira.
Responder2
/etc
deve estar no sistema de arquivos raiz. A coisa sensata a fazer é mantê-lo assim.
Se você realmente precisa split /etc
, poderá obter melhores resultados com uma montagem union. Não sei se o Linux suporta montagens de união onde um dos componentes corresponde ao ponto de montagem, e seria difícil não tornar /etc
o sistema de arquivos raiz parte da montagem de união.
Se você quiser colocar tudo /etc
em uma partição diferente, você pode fazer um mínimo /etc
que contenha apenas o que é necessário ( /etc/fstab
, o que o init precisa ( /etc/inittab
ou /etc/init
e /etc/rc*
ou o que quer que seu sistema init use), mínimo /etc/passwd
e /etc/group
, etc.). No início da inicialização (muito antes /etc/rc.local
!), Faça bind-mount /var/common/etc
no /etc
. Mas isso exigirá muito trabalho para acertar e resultará em /var/common/etc
ser o todo /etc
, o que provavelmente não é o que você deseja. Esta configuração faz sentido principalmente para alguns sistemas embarcados que não usam nenhum dos sistemas init usuais e têm uma restrição rigorosa no tamanho do sistema de arquivos raiz.
Se você tiver um /var/common
servidor compartilhado entre muitos servidores, deverá abordar o problema de maneira diferente. Use um sistema de gerenciamento de configuração adequado para implantar arquivos compartilhados no /etc
.
Um arquivo como /etc/passwd
e /etc/group
não deve ser compartilhado entre máquinas. Use esses arquivos somente para usuários e grupos locais. Para entradas compartilhadas entre máquinas, use NIS ou LDAP.