Como alterar o UID e o GID do usuário e o que sai disso

5

Eu tenho arquivos de dados MySQL em um pen drive que são usados em dois hosts nos quais mysql UIDs do usuário são diferentes. Como resultado, o MySQL não inicia quando seus arquivos possuem 0700 perms e um UID desconhecido como proprietário.

Eu não consegui encontrar como mudar umask do MySQL (e na verdade eu não gosto da idéia de compartilhar esses arquivos para todos), portanto eu quero mudar o UID de mysql user em ambos os hosts para que os arquivos pertençam ao mesmo usuário.

Vou alterar o UID e chown de todos os arquivos pertencentes ao antigo UID do mysql para o novo usuário:

usermod --uid 900 --gid 900 mysql # assign the new uid
olduid=67   find / -user $olduid -group $olduid -print0 | xargs -0 chown "mysql:mysql"

Isso é suficiente para um aplicativo funcionar no caso geral? Talvez eu tenha melhores opções?

    
por kolypto 23.01.2010 / 01:31

2 respostas

3

Fiz algumas pesquisas e notei duas coisas que uma pessoa deve levar em conta ao alterar os UIDs e os GIDs:

  1. UID numérico e GID nem sempre correspondem: no meu caso id -u mysql = 120 e id -g mysql = 127
  2. Nem todos os arquivos pertencem ao usuário 'mysql' e ao grupo 'mysql' simultaneamente: esses arquivos devem ser pesquisados separadamente.

Portanto, primeiro mudamos o UID e o GID:

user=mysql new_uid=600 old_uid=$(id -u $user)
group=mysql new_gid=600 old_gid=$(id -g $user)
sudo usermod -u $new_uid $user
sudo groupmod -g $new_gid $group

Então, find para arquivos pertencentes ao usuário final e ao grupo separadamente: 'user = mysql' vai para um arquivo, 'group = mysql' vai para outro arquivo. Também excluímos alguns diretórios de find traversing tree:

chownlist=$(tempfile) chgrplist=$(tempfile) sudo find / \
\( \( -path "/proc" -or -path "/sys" -or -path "/dev" \) -prune \) -or \
\( \( -user $old_uid -fprint0 "$chownlist" \) , \
\( -group $old_gid -fprint0 "$chgrplist" \) \)

E somente agora não há problema em alterar proprietários e grupos para esses arquivos encontrados:

cat "$chownlist" | xargs -0 sudo chown $user
cat "$chgrplist" | xargs -0 sudo chown :$group
sudo rm "$chownlist" "$chgrplist"

Por fim, verificamos se tudo correu bem: encontrar arquivos de propriedade de UIDs desconhecidos de GIDs:

sudo find / \( \( -path "/proc" -or -path "/sys" -or -path "/dev" \) -prune \) -or \( -nouser -or -nogroup -print \)

Espero que isso ajude alguém.

    
por 23.01.2010 / 15:06
1

Sim, é praticamente tudo que você precisa fazer. Os únicos arquivos que precisam ser alterados são os logs e os arquivos de dados.

Você pode querer usar o find | xargs em vez de um loop embora.

    
por 23.01.2010 / 01:46