Suite à une migration de serveurs de fichiers, je fus confronté à un problème d’encodage sur le nouveau serveur de fichier.
Si vous rencontrer ce même problème lors de vos copies de serveur à serveur voici ce qu’il faut faire:
Identification de l’encodage « chartset » du fichier
exemple de commande pour connaitre le chartset:
file -i report.txt report.txt: text/plain; charset=iso-8859-1
Préparation
Dans mon cas, j’avais un vieux serveur sous Mandriva avec comme encodage des fihiers en ISO-8859-1 et mon nouveau serveur sous Ubuntu avec un encodage UTF-8.
Voici la démarche à suivre:
toutes les commandes se feront sur le nouveau serveur
2 possibilités pour la copie: en découpe les paquets avec compression ou un bon vieux scp
ssh login@IP_old_serv "(cd /repertoir_fichier/;tar cfz - .|dd obs=1000b)"|dd ibs=1000b|tar xvpfz -
ou
scp -pr login@IP_old_serv:/repertoir_fichier/ /new_repertoir_fichier/
une fois la copie fini, on passe à l’encodage
sauvegarde ACL
dans mon cas, c’est un serveur de fichiers qui se trouve dans un domaine Windows avec des droits spécifiques sur les répertoires, je vais donc sauvegarder les ACL
ici on se place sur le vieux serveur
getfacl -R -P /repertoir_fichier/ | gzip -f --best /repertoir_autre/acl-repertoire.gz
Convertir arborescence complète
une fois nos données copiées et sauvegarde des ACL, nous allons passer à l’encodage
convmv --notest -r -f iso-8859-1 -t utf8 /new_repertoir_fichier/
-r: on renome toute l’arborescence de /new_repertoir_fichier/ récursivement. Par défaut, convmv ne convertit pas les fichiers et répertoires qui sont déjà en UTF-8
–notest: renomme effectivement les fichiers sinon convmv se content juste d’afficher ce qu’il faut convertir
-f: encodage de départ
-t: encodage cible
D’autres options peuvent être rajoutés, je vous invite donc à faire un man
man convmv
Restauration ACL
Une fois notre arborescence codée avec le bon charset, il faut restaurer les ACL.
Attention, ne pas restaurer les ACL de manière brut, car il faut aussi coder la sauvegarde des ACL avec le bon charset:
On commence par décompresser et convertir dans la foulé:
gzip -d acl-repertoire.gz && iconv -f ISO-8859-1 -t UTF-8 acl-repertoire -o acl-repertoire.txt
Puis on restaure:
setfacl --restore=/new_repertoir_fichier/acl-repertoire.txt