24avr. 2010

useradd unknown group

gentoo-logo

  1. Contexte :

Il s'agit d'un serveur sous Gentoo Linux hébergeant des milliers de comptes (1520 précisément).

srv1 ~ # equery l sys-apps/shadow
[ Searching for package 'shadow' in all categories among: ]
 * installed packages
[I--] [  ] sys-apps/shadow-4.0.18.2 (0)
  1. Problème :

Lors de la création de nouveau compte :

srv1 ~ # /usr/sbin/useradd -m -d /ftps/XXXX/XX/xx15000 -s /bin/false -gusers -u 15000  xx15000
useradd: unknown group users
  1. Résolution :

Tout d'abord je crée un utilisateur pour l'ajouter manuellement dans le groupe users.

srv1 ~ # /usr/sbin/useradd -m -d /ftps/XXXX/XX/xx15000 -s /bin/false -u 15000  xx15000
srv1 ~ # gpasswd -a xx15000 users
Ajout de l'utilisateur xx15000 au groupe users

Le problème ne viens pas donc du groupe (/etc/group corrompu par exemple).

Je procède ensuite à la mise à jour de shadow vers la dernière version.

sys-apps/shadow-4.1.2.2 [4.0.18.2]

Ayant constaté lors de la mise à jour l'ajout d'une option dans le fichier /etc/login.defs (qui définit la configuration de shadow pour le système), je m'y intéresse.

#MAX_MEMBERS_PER_GROUP   0

Cette option définie le nombre maximum de membres par entrée de groupe.
Lorsque le maximum est atteint, une nouvelle entrée de groupe (ligne) est démarrée dans /etc/group (avec le même nom, même mot de passe et même GID).
Cette fonctionnalité (groupe découpé) permet de limiter la longueur des lignes dans le fichier de groupes.

Je décide donc d'utiliser cette option (avec mes 1520 utilisateurs la ligne correspondant au groupe users fait 10301 caractères).

MAX_MEMBERS_PER_GROUP   150

Je régénère mon fichier /etc/group.

/usr/sbin/grpconv

Le fait de limiter la longueur des lignes à 150 utilisateurs a résolu le problème.

J'ai effectué un test avec une limitation à 25 utilisateurs, un segfault est alors renvoyé à chaque tentative de création d'utilisateur, je pense donc que je serai confronté dans les prochains mois à un nouveau problème Quelles seront les limitations exacte avec /etc/group ?.