8 votes

FreeBSD 8.2, suppression de /bin/sh, impossibilité de démarrer

J'ai pris une très mauvaise décision pour l'un de mes serveurs.

J'ai supprimé /bin/sh . J'ai redémarré le serveur et il ne s'exécute pas parce qu'il a besoin de /bin/sh pour lancer les scripts rc scripts. Je ne peux pas non plus accéder au mode mono-utilisateur car sh est nécessaire.

Existe-t-il un moyen simple de réinstaller le bourn Shell ?

J'ai essayé de copier sh à partir d'un live cd, cela a échoué sur la bibliothèque ld-elf.so.1. J'ai donc copié cette bibliothèque dans /libexec depuis le livecd vers ma partition /. Il a ensuite besoin de la bibliothèque libedit.so et je l'ai copiée dans /libexec mais cela ne fonctionne pas cette fois.

J'ai essayé de créer un lien symbolique vers /usr/local/bin/bash mais j'obtiens toujours une erreur du type "can't find sh". Je suppose que c'est parce que /usr n'est pas encore montée car elle est réalisée à partir d'un script rc.

Toute aide est la bienvenue.

8voto

Mei Points 4515

Vous devez remplacer /bin/sh par quelque chose ; c'est la clé. Si vous pouvez entrer dans le chargeur FreeBSD au démarrage (avec une invite "ok"), essayez quelque chose comme ceci :

set init_shell=/bin/csh
unset init_script
unset init_path

J'ai obtenu ces informations de chargeur(8) à partir des pages du manuel FreeBSD (en ligne). Je ne l'ai pas fait, mais cela devrait fonctionner (en supposant que /bin/csh soit présent et exécutable).

Si vous avez un serveur FreeBSD 8.2 qui fonctionne ailleurs, vous pouvez essayer de voler le /bin/sh de cette source et le mettre dans le système là où c'est nécessaire.

Alternativement, obtenez un /bin/sh construit statiquement et mettez-le à la place ; il n'y aura pas de problèmes de bibliothèque avec un binaire construit statiquement.

EDIT : J'aurais dû préciser que si vous démarrez avec /bin/csh, vous devez toujours trouver quelque chose à utiliser à la place de /bin/sh. Vous pouvez l'obtenir sur Internet ou le copier à partir d'un autre CD ou d'un paquetage ou autre ; l'utilisation de /bin/csh pour démarrer vous permet d'accéder à la machine. Pour copier sur le réseau, vous devez activer le réseau ; sinon, copiez à partir d'un CDROM.

Les meilleurs moyens d'éviter cela à l'avenir :

  1. Ne pas effacer de /bin ! (c'est la partie la plus facile)
  2. Avoir un /bin/sh construit statiquement, et non lié dynamiquement.
  3. Disposer d'un sh de sauvegarde tel que /bin/sh.static.

Faites les trois.

6voto

voretaq7 Points 78924

OK, d'abord la conférence :

  1. NE PAS TOUCHER AUX BINAIRES DU SYSTÈME
    Tout ce qui est /bin , /sbin y /rescue sur FreeBSD devrait être laissée en l'état. Même si vous savez ce que vous faites (si vous savez ce que vous faites, vous savez aussi qu'il faut les laisser tranquilles. Ils sont vraiment importants -- tous !)

  2. NE PAS supprimer /bin/sh . EVER. Sur tous *NIX qui le possède.
    Vraiment. Ne le faites pas. A LOT des scripts s'appuient sur des /bin/sh étant un Bourne Shell. Il brise l'univers.
    Si vous le voulez VRAIMENT, vous pouvez probablement le remplacer en toute sécurité par un copie de bash comme l'a suggéré Adam Z., mais si vous voulez faire cela, vous devriez peut-être lier statiquement cette copie de bash -- Il fait appel à de nombreuses bibliothèques, et il se peut que vous ne disposiez pas de ces bibliothèques avant que le système ne soit opérationnel. /usr/local est monté.


Maintenant, comment réparer ce gâchis ? Deux possibilités :

Option 1 : quelque peu douloureuse
Rendez-vous sur le site http://www.freesbie.org/ (ou le LiveCD FreeBSD de votre choix - Vous pouvez probablement même utiliser le CD de récupération de http://www.freebsd.org pour cela). Prenez le LiveCD, gravez-le et démarrez-le.

Une fois que vous êtes dans l'environnement LiveCD, montez la partition racine de votre système défectueux, copiez le fichier /bin/sh du LiveCD sur votre machine, puis redémarrez.

Le présent なければならない Vous pouvez suivre les instructions pour la mise en place d'un système de gestion de l'information. Reconstruire le "monde ou au moins recompiler /bin/sh à partir d'une arborescence de sources correspondant à votre système d'exploitation.

Option 2 : moins douloureuse, pas de LiveCD
Si vous avez une autre machine FreeBSD sur laquelle vous pouvez vous brancher (ou si vous avez un autre moyen de mettre la main sur une copie de /bin/sh pour mettre votre machine FreeBSD en mode mono-utilisateur. Configurez le réseau (ou montez n'importe quel support contenant le remplacement Shell), et copiez-le à l'endroit où il est censé se trouver.

Redémarrez et vous devriez être OK -- mêmes mises en garde que pour le LiveCD si le /bin/sh vous saisissez qu'il ne provient pas d'une machine raisonnablement proche de l'identique.

4voto

Adam Zalcman Points 779

Au lieu d'établir des liens symboliques, copiez votre bash en /bin/sh . Utiliser le ldd pour trouver toutes les bibliothèques qui pourraient se trouver sur des systèmes de fichiers autres que rootfs et les copier également sur rootfs.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X