Réinstallation distante

Publié le par Peck

Maintenent sur http://linux-attitude.fr/post/Reinstallation-distante

Niveau
:
Résumé: mke2fs; mount; tar; grub; reboot

Si vous administrez des machines à distance sous linux, il se peut que cet article vous intéresse.

Il arrive parfois qu'on veuille réinstaller une machine sur laquelle on n'a qu'un accès distant (en général ssh), par exemple pour changer de distribution ou pour beaucoup d'autres mauvaises raisons. Il existe pour cela peu de méthodes. Nous allons en voir quelques unes avec différentes contraintes. Il est certainement possible d'appliquer la méthode pour installer d'autres unix, mais les pièges sont sûrement différents.

Attention toutefois, une erreur de manipulation peut vous faire perdre le contrôle. Il vous faut disposer d'un éventuel collaborateur pouvant agir directement sur la machine en cas d'urgence. Ou tout au moins la possibilité d'un reboot distant (du style par commande de la prise électrique), avec un bootloader bien configuré ou la possibilité de booter par le réseau, ceci permet de rattraper quasiment toutes les erreurs. Et n'oubliez pas de tester chez vous ce dont vous n'êtes pas sûr :-).

Méthode 1
La plus simple, si vous avez une partition vide disponible. Ou de l'espace libre sur votre disque auquel cas un cfdisk && mkfs bien placé vous ramène dans la situation voulue (notez le besoin de rebooter si vous faites un cfdisk sur le disque ou se situe votre / ).

Les étapes sont alors les suivantes :
  • Préparer la partition
$ mke2fs -j /dev/hda3
$ mount /dev/hda3 /mnt
  • Installer la système selon la méthode qui lui convient
# si vous avez une installation de référence dans une archive
$ tar xfz base.tgz -C /mnt
# si vous installez une debian (debootstrap peut s'installer sur une non debian)
$ debootstrap etch /mnt ftp://ftp.debian.org
Debootstrap est très pratique, il permet d'installer une debian dans un répertoire.

Si vous n'installez pas une debian ou si vous n'aimez pas debootstrap, il vous faut avoir préparé l'installation et disposer d'un base.tgz. Soit en trouvant une installation toute prête dans FreeOsZoo, soit en installant vous-même la distribution dans une machine virtuelle (ou non, mais la machine virtuelle a l'intérêt de permettre la lecture du disque à froid et donc sans modification en cours du système).

  • Configurer le nouveau système
$ mount -t proc proc /mnt/proc
$ mount --bind /dev /mnt/dev
$ chroot /mnt
$ vi /etc/network/interfaces
$ vi /etc/hostname
$ vi /etc/fstab
$ ...
  • Configurer le bootloader
# grub
$ vi /boot/grub/menu.lst
# lilo
$ vi /etc/lilo.conf
$ lilo
  • Rebooter
$ reboot

  • Il vous reste à supprimer l'ancien système et donc éventuellement réinstaller le bootloader pour le gérer dans cette nouvelle distribution.
C'est propre et sans bavure. N'oubliez pas d'avoir un noyau installé et de garder en option un reboot vers l'ancienne version. Petite astuce pour un reboot unique, en cas de problème le prochain reboot se fera comme avant :

$ lilo -R newlinux
ou pour grub
$ echo "savedefault --default=2 --once" | grub --batch


Méthode 2
Vous n'avez pas de partition disponible, mais vous avez une partition de swap.
Il vous faut alors éteindre suffisamment de services pour libérer de la mémoire puis désactiver la partition de swap :
$ swapoff -a
Il vous suffit de formater la swap en ext2 pour vous retrouver dans le cas de la méthode 1.

Si le swap vous semble trop petit, vous pouvez faire une installation très basique et suivre la méthode 3.



Méthode 3
Aucune des méthodes précédentes ne fonctionne car vous êtes un pauvre malheureux.

Cette fois vous devrez vous armer d'un peu plus de patience car nous allons utiliser une ruse de sioux.

Nous allons y mettre une distribution temporaire avec un serveur ssh dans un répertoire. Cette distribution peut être n'importe  laquelle, elle sera supprimée par la suite. Debootstrap et freeoszoo sont toujours vos amis. En cas de place restreinte, je vous fais confiance pour trouver une distribution miniature. Les outils indispensables sont les commandes de base permettant d'installer une distribution, le réseau ainsi qu'un serveur ssh.

Initramfs

Si vous disposez d'un noyau 2.6, cette distrib de base nous servira d'initramfs :
$ cd /mnt/distrib
$ find . | cpio -o -H newc | gzip -9 > /boot/init.gz

Attention, la taille totale décompressée plus la taille compressée ne doit pas dépasser la ram disponible.
Pour booter sur cet initramf ils vous faut simplement le spécifier comme initrd à votre bootloader, pas d'autres options.
# grub
$ initrd /boot/init.gz
# lilo
$ initrd=/boot/init.gz


Initrd

Si vous n'avez pas de noyau 2.6 à disposition vous pouvez aussi faire avec un initrd, mais c'est plus complexe et cela impose des restrictions de taille et d'outils. Je vous laisse donc découvrir tout seul le fonctionnement d'initrd.


Reboot

Vous pouvez maintenant rebooter. N'oubliez pas le conseil de la méthode 1 pour ne rebooter qu'une fois sur la nouvelle image.


Hop, maintenant vous êtes sur une machine basique qui vous laisse un accès en ssh. Nous nous rapprochons de la situation 1.

Formatons l'ancienne distribution sans pour autant perdre notre capacité à booter.

$ mount /dev/hda1 /mnt
# on va conserver, le bootloader, le noyau, et le ramfs
$ chattr -R +i /mnt/boot/vmlinux-* /mnt/boot/grub/ /mnt/boot/init.gz
$ rm -rf /mnt/*

A partir de maintenant vous ne pouvez plus reculer. Goto méthode 1, installez tout dans /mnt. Attention, le chattr peut vous causer quelques ennuis. Pour les éviter vous pouvez soit ne pas faire ce chattr (système non bootable pendant l'intervention, tout erreur est fatale) soit vous être préparé avant l'intervention. C'est-à-dire avoir précédemment placé tout le système de boot dans un autre répertoire :
$ cp -a /boot /boot-tmp
# changer la configuration de lilo / grub pour prendre en compte le changement
# relancer lilo / grub-install
# oui, même pour grub pour qu'il aille chercher les stages au bon endroit

Une fois ces petits inconvénients gérés, l'installation continue selon la méthode 1 avec le chroot et la configuration.

Par contre, ne rebootez pas une fois l'installation finie, installez proprement votre nouveau bootloader.

$ chattr -R -i /mnt/boot/vmlinux-blah /mnt/boot/grub/ /mnt/root/init.gz
$ chroot /mnt
# méthode d'installation choisie, lilo ou grub
$ vi /etc/lilo.conf && lilo
$ grub-install
# et n'oubliez pas de garder la possibilité de booter sur le ramfs



Conclusion

On peut tout faire à distance, il suffit d'être prudent !

Et le partitionnement c'est bien (tm), lvm aurait pu nous être utile.

Publié dans admin

Commenter cet article

Simon 18/04/2007 20:47

Si la distribution « cible » dispose d'un moyen d'installation automatique par le réseau, ou que le processus d'installation est accessible par ssh ou interface web (voir http://wiki.debian.org/DebianInstaller/NetworkConsole et http://wiki.debian.org/DebianInstaller/WebInstaller ), il est possible de charger depuis le grub déjà présent le kernel+initrd de la version par le réseau de l'installateur.Au passage, il vaut mieux éviter d'utiliser le miroir ftp.debian.org qui est très surchargé, mais lui préférer un miroir local.