FreeBSD 8.2, supprimé / bin / sh, ne peut pas démarrer

8

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

J'ai supprimé /bin/sh. J'ai redémarré le serveur et le serveur ne fonctionnera pas car il doit /bin/shdémarrer les scripts rc. 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 shell bourn?

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

J'ai essayé un lien symbolique vers /usr/local/bin/bashmais cela me présente toujours une erreur de type "ne peut pas trouver sh". Je suppose que c'est parce que /usrn'est pas encore monté car il est fait à partir d'un script rc.

Toute aide est grandement appréciée.

Jon
la source
2
Oh mon. C'est euh, pas bon. Il est temps de tirer la dernière bande.
MDMarra
Vos malheurs LiveCD sont probablement parce que c'est une version différente de FreeBSD (ou votre LiveCD utilise un binaire écrasé magique qui est / bin / ABunchOfStuff lié avec des noms différents). Quelle version de FreeBSD utilisez-vous?
voretaq7
la version herp-derp est dans le titre. Ne me dérange pas. J'ai besoin de café.
voretaq7
3
Alors ... euh ... qu'est-ce qui vous a poussé à faire ça? Vous donnez l'impression que c'était intentionnel.
user606723

Réponses:

8

Vous devez remplacer / bin / sh par quelque chose ; c'est la clé. Si vous pouvez accéder au 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 du chargeur (8) des pages de manuel de FreeBSD (en ligne). Je ne l'ai pas fait, mais cela devrait fonctionner (en supposant que / bin / csh est présent et exécutable).

Si vous avez un serveur FreeBSD 8.2 opérationnel ailleurs, vous pouvez essayer de voler le / bin / sh de cette source et de le placer dans le système si nécessaire.

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

EDIT: J'aurais dû noter: si vous démarrez dans / bin / csh, vous devez toujours obtenir 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 package ou quelque chose; utiliser / bin / csh pour démarrer vous permet d'accéder à la machine. La copie sur le réseau nécessite que vous ouvriez le réseau; sinon, copiez à partir d'un CD-ROM.

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

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

Faites les trois.

Mei
la source
Également une excellente solution «faites-moi remonter pour que je puisse résoudre ce problème» (avec la vertu de ne pas vous obliger à avoir un LiveCD pour démarrer).
voretaq7
6

OK, d'abord la conférence:

  1. NE PAS AVEC SYSTÈME MESS BINARIES
    Tout en/bin,/sbinet/rescuesur FreeBSD devrait être laissé seul. Même si vous savez ce que vous faites (si vous savez ce que vous faites, vous savez également que ceux-ci doivent être laissés seuls. Ils sont vraiment importants - tous!)

  2. NE supprimez PAS/bin/sh . DÉJÀ. Sur tout système * NIX qui en est équipé.
    Vraiment. Ne le fais pas. Un LOT de scripts comptent sur/bin/shêtre un Bourne Shell. Cela brise l'univers.
    Si vous voulez vraiment vous pouvez probablement remplacertoute sécurité avec une copie debashcomme Adam Z suggéré, mais si vous allez faire que vous pouvez lien statiquement cette copiebash- Il tire dans beaucoup de bibliothèques, et vous peut ne pas les avoir avant que le système ne soit en place et/usr/localmonté.


Maintenant, comment réparer le désordre? Deux options:

Option 1: un peu pénible
Rendez-vous sur http://www.freesbie.org/ (ou le LiveBSD 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 éclaté, copiez le /bin/shdepuis le LiveCD sur votre ordinateur, puis redémarrez.

Cela devrait vous permettre de vous remettre en marche et de fonctionner - Vous voudrez peut-être suivre les instructions pour reconstruire "World" , ou au moins recompiler à /bin/shpartir d'une arborescence source qui correspond à votre système en cours d'exécution.

Option 2: moins douloureuse, pas de LiveCD
Si vous avez une autre boîte FreeBSD autour de laquelle vous pouvez vous déconnecter (ou d'une autre manière de mettre la main sur une copie de/bin/sh, mettez votre machine FreeBSD en mode utilisateur unique. Configurez le réseau (ou montez quel que soit le support contenant le shell de remplacement), et copiez-le là où il est censé se trouver.

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

voretaq7
la source
1
Utiliser / bin / bash à partir d'une autre distribution de FreeBSD ne fonctionnera que si les bibliothèques partagées sont la bonne version. Mieux vaut utiliser quelque chose qui vient directement de FreeBSD 8.2 au lieu d'une version alternative. Cependant, tout système FreeBSD 8.x devrait être capable de fournir un shell construit statiquement qui fonctionnerait.
Mei
@david Bon point - /binn'est plus lié statiquement. Je pense que les CD Rescue pour la version appropriée de FreeBSD ont un shell utilisable (c'est-à-dire un qui peut juste être vidé en place), mais cela fait un moment que je
n'en
4

Au lieu de créer des liens symboliques, copiez votre fichier bashdans /bin/sh. Utilisez la lddcommande pour rechercher toutes les bibliothèques susceptibles de résider sur des systèmes de fichiers autres que rootfs et copiez-les également dans rootfs.

Adam Zalcman
la source
1
C'est une bonne solution, mais cela crée un peu de désordre dans la bibliothèque qui nécessitera un nettoyage ultérieur plus tard.
voretaq7
Oui, le nettoyage est nécessaire par la suite. Une alternative serait d'utiliser un binaire shell construit statiquement.
Adam Zalcman