Installation du nouveau serveur, l’ancien serveur reste utilisé.
/etc/group
et /etc/passwd
du "vieux" serveur dans le répertoire root
du nouveau, répertoire personnel de l’utilisateur root
où l’on se trouve par défaut après s’être connecté en root
.
scp root@IP_OLD:/etc/group group_old
scp root@IP_OLD:/etc/passwd passwd_old
Toute cette procédure est justifiée par le fait que smbpasswd
contient l’uid et doit être rapatrié entièrement, donc il faudra protéger les UID et privilégier les anciens (utilisateurs déclarés dans Samba).
usermod -u 502 ftptrans
groupmod -g 502 transfert
cp /etc/group /root/group_new
cp /etc/passwd /root/passwd_new
1) Groupes
cat group_old | awk -F: '{ if ($3 > 999) print $0 }' | sort -t':' -k3n -k1> fic_g_old1000
cat group_new | awk -F: '{ if ($3 < 1000 ) print $0 }' | sort -t':' -k3n -k1 > fic_g_new1000
mv /etc/group /etc/group_orig
cat fic_g_new1000 fic_g_old1000 > /etc/group
2) Utilisateurs
cat passwd_old | awk -F: '{ if ($3 > 1001 ) print $0 }' | sort -t':' -n -k3 > fic_u_old1000
cat passwd_new | awk -F: '{ if ($3 < 1002 ) print $0 }' | sort -t':' -n -k3 > fic_u_new1000
mv /etc/passwd /etc/passwd_orig
cat fic_u_new1000 fic_u_old1000 > /etc/passwd
il peut être utile de mettre ces commandes dans un fichier de script afin de régénérer les fichiers passwd et group en cas de changements avec nouveaux utilisateurs ou nouvelles machines reliées à Samba
Désactiver sur le nouveau serveur le démarrage automatique des services smb
et nmb
, pour éviter les conflits avec l’ancien serveur lors du transfert des données.
new_serv:~ # chkconfig -d smb
smb 0:off 1:off 2:off 3:off 4:off 5:off 6:off
new_serv:~ # chkconfig -d nmb
nmb 0:off 1:off 2:off 3:off 4:off 5:off 6:off
Récupérer de l’ancien serveur les fichiers suivant avec la commande scp
: scp root@IP_OLD:/fichier /fichier
/etc/hosts
/etc/ssh/sshd-banner
qu’il faudra éditer pour signaler que l’on est sur un nouveau serveur et éviter la confusion avec l’ancien/var/lib/samba/
, s’assurer que les services smb/nmb sont arrêtés sur le nouveau serveur/etc/samba/
,/etc/shadow
/etc/HOSTNAME
(si le nouveau a été mal nommé pendant masterisation)/var/spool/cron/tabs/root
il faudra redémarrer le serveur cron par service crond restart
/etc/ssh/sshd_config
il faudra redémarrer le serveur ssh par service sshd restart
avec la commande rsync --numeric-ids -avz --rsh="ssh -c arcfour" root@IP_OLD_SERVER:/repertoire_source/ /repertoire/destination/
En raison du volume de certains répertoires, lancer les synchronisations le soir ou le week-end.
Synchroniser les données, même si cela a été fait à l’étape précédente, afin de mettre à jour.
en utilisant une commande du type rsync --numeric-ids -avz --rsh="ssh -c arcfour" root@IP_OLD_SERVER:/repertoire_source/ /repertoire/destination/
il faudra aussi copier les répertoires et fichiers système/de configuration
/var/lib/samba
, s’assurer que les services smb/nmb sont arrêtés sur le nouveau serveur/etc/samba
,/etc/shadow
/etc/HOSTNAME
(si le nouveau a été mal nommé pendant masterisation)/var/spool/cron/tabs/root
il faudra redémarrer le serveur ssh par service sshd restart
/etc/ssh/sshd_config
/etc/ssh/sshd-banner
en utilisant la commande scp de la manière suivante : scp -r root@IP_OLD:/chemin/repertoire /chemin/
, sans le "/" final pour le chemin source cette fois.
par exemple : scp -r root@10.233.185.93:/etc/samba /etc/
(répertoire )ou scp -r root@10.233.185.93:/var/spool/cron/tabs/root /var/spool/cron/tabs/
(fichier)
:attention à titre expérimental :attention Pour automatiser les synchronisations, voir onglet précédent, et relancer le même script.
Si l’authentification par clé fonctionne pour les synchronisations par rsync
, alors il en sera de même pour les scp
.
les utilisateurs n’auront plus accès au serveur à cet instant
:attention Prévenir ou faire prévenir les utilisateurs :attention
smb
et nmb
sur l’ancien serveur
service smb stop
service nmb stop
smb
, nmb
, sur le nouveau serveur
chkconfig -a
nom_service (smb/nmb)les utilisateurs accèdent désormais au nouveau serveur
service
nom_service status
/root
Ne pas oublier de mettre à jour la documentation de site.
Et l’explication détaillée :
#!/bin/bash
IP_OLD=""; # adresse IP de l'ancien serveur, sur lequel on se connecte pour récupérer les données. Permet de réutiliser le script en ne changeant que cette variable.
reponse="z";
until [ $reponse == "y" -o $reponse == "n" ] ; do echo "Afficher à l'écran (en plus du fichier journal) le détail des fichiers téléchargés ? y/n"; read reponse ; done;
nblignes=$(cat liste_synchros | grep -vE "^$" | wc -l);
cat
-v
) les lignes vides avec grep
.
-E
) signifie : ^
début de ligne $
fin de ligne, donc ligne ne contenant rien entre les deux, donc videecho "Il y a $nblignes dossiers à copier" | tee -a synchros.log;
tee
fait un affichage à l’écran + envoi dans un fichier,
-a
ajoute à la fin du fichier au lieu de l’écrasertabtaille[0]=$nblignes;
tabtailleh[0]=$nblignes;
totalk=0;
compteur=1;
echo "On détermine la taille des fichiers et dossiers à télécharger, cela peut prendre un peu de temps." | tee -a synchros.log
tee
for ligne in <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Y2F0IGxpc3RlX3N5bmNocm9zPC9jb2RlPg=="></span> ;
liste_synchros
do
echo -n "$ligne" | tee -a synchros.log;
tee
taillek=$(ssh root@$IP_OLD du -s $ligne 2>/dev/null | grep "$ligne" | awk '{ print $1 }');
du
(disk usage, ne pas confondre avec df
, disk free) sur l’ancien serveur, actuellement en production, à distance par SSH.
-s
signifie que l’on veut le summary, autrement dit le résumé pour le dossier, sa taille globale, et non le détail de chaque fichier.-h
afficherait le résultat dans une forme lisible par un humain : en Ko, Mo, Go...2>/dev/null
renvoie les messages de la sortie standard n°2, réservée aux messages d’erreurs, et en l’occurrence à la bannière SSH, vers le vide.grep
qui suit ne retiendra que la ligne contenant le nom du dossier dont l’on souhaite déterminer la tailleawk
final ne gardera que le premier champ - le séparateur par défaut étant l’espace - qui contient la taille du dossier. totalk=$(expr $totalk + $taillek);
tabtaille[$compteur]=$taillek;
if [ $taillek -gt 1024 ]
then
taillem=$(expr $taillek / 1024);
if [ $taillem -gt 1024 ]
then
tailleg=$(expr $taillem / 1024);
restm=$(expr $tailleg \* 1024);
taillem=$(expr $taillem - $restm);
tabtailleh[$compteur]="$tailleg Go et $taillem Mo";
else
tabtailleh[$compteur]="$taillem Mo";
fi
else
tabtailleh[$compteur]="$taillek Ko";
fi
echo " : ${tabtailleh[$compteur]}" | tee -a synchros.log;
compteur=$(expr $compteur + 1);
done;
if [ $totalk -gt 1024 ]
then
totalm=$(expr $totalk / 1024);
if [ $totalm -gt 1024 ]
then
totalg=$(expr $totalm / 1024);
if [ $totalg -gt 1024 ]
then
totalt=$(expr $totalg /1024);
totalh="$totalt To";
else
totalh="$totalg Go";
fi
else
totalh="$totalm Mo";
fi
else
totalh="$totalk Ko";
fi
echo "Total : $totalh" | tee -a synchros.log;
compteur=1;
tailledlk=0;
for ligne in <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Y2F0IGxpc3RlX3N5bmNocm9zPC9jb2RlPg=="></span> ;
liste_synchros
do
if [ $tailledlk -gt 1024 ]
then
tailledlm=$(expr $tailledlk / 1024);
if [ $tailledlm -gt 1024 ]
then
tailledlg=$(expr $tailledlm / 1024);
tailledlh="$tailledlg Go";
else
tailledlh="$tailledlm Mo";
fi
else
tailledlh="$tailledlk Ko";
fi
taillelocale=$(du -sh $ligne | awk '{ print $1 }');
du
mais cette fois en local et avec les deux options s
et h
echo "====== synchronisation de $ligne - $compteur/$nblignes - ${tabtailleh[$compteur]} à télécharger, $taillelocale sur disque ======" | tee -a synchros.log;
echo "Téléchargé jusqu'à maintenant : $tailledlh sur $totalh" | tee -a synchros.log;
dispo=$(df $ligne | tail -n 1 | awk '{ print $3 }');
df
(disk free)
tail -n 1
enlève la ligne de titre pour ne garder que la dernière ligneawk
affiche le troisième champ à savoir le nombre de Ko libres. echo "Il reste $dispo Ko, il faut ${tabtaille[$compteur]} Ko";
if [ $dispo -gt ${tabtaille[$compteur]} ]
then
echo "Il y a assez de place sur la destination";
if [ $reponse == "y" ]
then
rsync --numeric-ids -avz --rsh="ssh -c arcfour" root@$IP_OLD:$ligne $ligne 2>&1 | tee -a synchros.log;
else
rsync --numeric-ids -avz --rsh="ssh -c arcfour" root@$IP_OLD:$ligne $ligne 2>&1 1>>synchros.log;
fi
else
echo "Il n'y a pas assez de place sur la destination";
fi
tailledlk=$(expr ${tabtaille[$compteur]} + $tailledlk);
compteur=$(expr $compteur + 1);
expr
et on fait de même pour la taille téléchargée. done;
echo "====== fin du script le $(date) ======" | tee -a synchros.log;
tee