Forum général.cherche-logiciel pour changer massivement les permissions dans 5To de données

Posté par  .
Étiquettes : aucune
3
30
déc.
2011

dans le meme style que le sujet d'un autre posteur

je cherche à pouvoir changer massivement les uid/gid dans un systeme de fichier.

la situation

J'ai un NAS, piloté par un serveur linux dont les uid/gid commencent à 100 (vieux linux embarqué)

Je peux changer les uid/gid en exportant/important les utilisateurs/groupes via un fichier CSV, mais cela ne va pas toucher aux données

pour pouvoir utiliser l'identification centralisée de la société (ldap) et utiliser aussi celle-ci sur les machines recentes, il faut que mes uid/gid soient >10000 pour ne pas etre en conflit avec des comptes locaux linux (qui eux sont >1000)

le probleme

le NAS fait 9To, est accessible par NFS, et je suis root partout si besoin.
actuellement je fais une moulinette bourrine mais pas performante à mon gout.

# recuperation de l'uid à traiter dans le fichier csv
for UID in `cat uids.csv| cut -d ';' -f2`; 
do
# un petit echo pour savoir ou j'en suis
echo "Changing owner $UID to 10$UID" 
# recherche des fichiers/dossiers ayant cet UID 
# et changement de celui ci par changement de propriétaire en 10UID
find -uid $UID -exec chown 10$UID {} \; 
done


il va sans dire que j'ai la meme pour les gids avec un chown :10$GID

seulement comme il y a plein de fichiers/dossiers (environ 6To) c'est long.
et j'ai realisé ce matin que j'allais faire 25fois le find car j'ai 25 uid à traiter.

j'ai pensé refaire mon script pour faire le find une fois et faire le chown à la volée (à coup de grep/sed/awk sur l'uid/gid actuel) mais mon cerveau est resté à la maison

ma demande

alors si toi aussi tu veux jouer de la ligne de commande avec moi en ce vendredi de veille de fete, ton aide est la bienvenue.

  • # A afiner ou pas...

    Posté par  (site web personnel) . Évalué à 2.

    Selon le homedir de chaque utilisateur, mais s'il existe des répertoires partagés tu n'as pas trop le choix...

    Système - Réseau - Sécurité Open Source

    • [^] # Re: A afiner ou pas...

      Posté par  . Évalué à 2.

      helas pas ou peu de homedir

      les homedir c'est 50Go pour tous, alors que les 6To c'est les données des projets

      tant pis, je vais laisser tourner alors.

  • # Parcours dans l'autre sens ?

    Posté par  . Évalué à 4.

    Pourquoi ne pas lister récursivement tous les fichiers, et pour chaque UID présent dans le fichier csv modifier le propriétaire en conséquence ?

    Dans ce cas tu ne parcourras qu'une seule fois l'arborescence de fichiers, mais rechercher si chaque UID est à modifier devrait être rapide (recherche d'un UID parmi 25 possibles).

    • [^] # Re: Parcours dans l'autre sens ?

      Posté par  . Évalué à 2.

      oui, c'etait mon autre hypothese

      parcourir tous le systeme de fichier (find ...)
      et faire un chown intelligent à base de ls/grep/sed/awk pour changer l'uid/gid à la volée.

      mais comme je disais mon cerveau est à la maison et moi au boulot
      donc si quelqu'un avait deja eu le meme probleme il avait peut-etre un script ou un programme à me proposer.

      • [^] # Re: Parcours dans l'autre sens ?

        Posté par  . Évalué à 3.

        Quelque chose comme ça :

        find . -printf "%U %G %p\n" | while read u g f ; do chown 10$u:10$g "$f" ; done
        
        

        Il reste au besoin à vérifier que l'uid et le gid des fichiers (variables u et g) sont bien dans la plage à modifier.

        A+
        JJD

        • [^] # Re: Parcours dans l'autre sens ?

          Posté par  . Évalué à 1.

          Pour parcourir arborescence la commande tree le serai pas plus efficace?
          (je ne suis pas du tout expert en shell je dis peut -être une énorme bêtise)

        • [^] # Re: Parcours dans l'autre sens ?

          Posté par  (site web personnel) . Évalué à 3.

          Pour le coup, futé pour futé autant y aller carrément...

          find . -printf "chown 10%U:10%G \"%p\"\n" | sh
          
          

          En tout cas, merci, j'avais complètement oublié le coup des printf du find...
  • # micro optimisation ?

    Posté par  . Évalué à 7.

    Y'a tout plein de commentaire essayant de trouver pleins de solution pour optimiser, mais pour ma part je proposerais juste une petite optimisation, ça ne t'empêchera pas de faire 25 fois le find :
    donc mon optimisation ;
    find -uid $UID -exec chown 10$UID {} \;
    devient
    find -uid $UID -exec chown 10$UID {} \+

    je laisse 5 sec pour trouver la différence ^^

    \; -> pour chaque fichier je lance la commande
    \+ -> j'essaie de rajouter le max d'arguments à la commande.

    Donc optimisation -> on évite de créer un processus à chaque fichier, mais un seul pour n fichiers (n >> 1000).

    • [^] # Re: micro optimisation ?

      Posté par  . Évalué à 3.

      fallait y penser et ca semble avoir acceleré le script.

      merci à toi.

  • # python + dictionnaire

    Posté par  . Évalué à 1.

    Si j'étais à ta place, je réécrirai le script en python.
    Ça te permettrai d'utiliser un dictionnaire pour directement faire la correspondance entre les anciens et le nouveaux identifiants.
    Ainsi tu ne parcourras qu'une seule fois l'arborescence et tu feras les modifications à la volée. Ça sera beaucoup plus simple que du code sed/awk, tout en étant beaucoup plus rapide. (pas besoin de créer des nouveaux processus sans arrêts).

    http://docs.python.org/tutorial/datastructures.html#dictionaries

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.