unix - tout a accidentellement déplacé sous root vers / old - Solaris 10

13

Comme le titre l'indique, tout ou presque tout ce qui est important car root sous root (/) a été déplacé vers / old sur une machine Solaris 10. Alors maintenant , la faute typique lorsque vous essayez lorsque les commandes en cours d' exécution sont Cannot find /usr/lib/ld.so.1(changé $PATHet aussi essayé de changer $LD_LIBRARY_PATH, $LD_LIBRARY_PATH_64et $LD_RUN_PATHpour les exporter , mais rien qui semble changer le chemin de la bibliothèque réelle). J'ai essayé à peu près hier de trouver quelque chose qui pourrait aider mais n'a rien trouvé qui changerait réellement le chemin de la bibliothèque pour Solaris 10 à part peut-être crlemais ne peut pas l'exécuter depuis Cannot find /usr/lib/ld.so.1.

J'ai trouvé beaucoup de conseils de récupération racine ou / usr / bin et ainsi de suite pour Linux, mais les informations concernant Solaris 10 / Unix ne sont pas nombreuses et très rares.

Impossible d' exécuter cp, ln, mkdirou mvdepuis Cannot find /usr/lib/ld.so.1. Vous ne pouvez pas non plus vous connecter avec d'autres sessions à la machine. Bien qu'une session soit encore en cours, elle peut être utilisée et cette fenêtre est bloquée while true; do date; echo hej 1234567; done. Nous avons discuté de la solution pour utiliser un CD de démarrage Solaris et également une dist Linux sur un lecteur USB. Nous avons discuté de la solution pour basculer les disques durs vers un autre rack.

La /.../static/.../mvsolution a été testée mais n'a pas fonctionné.

Les commandes qui peuvent encore être utilisés sont (il pourrait y avoir plus de commandes qui peuvent être utilisées): echo, <, >, >>, |, pwd, cd.

Existe-t-il un moyen de créer un répertoire ou un dossier sans mkdir? Existe-t-il un moyen d'utiliser echoet >ou echoet >>de restaurer/usr/lib/ld.so.1 ? Je sais que plus que /usr/lib/ld.so.1probablement devra être restauré pour que les commandes fonctionnent.

Merci beaucoup d'avoir lu et bonne journée =)

propatience
la source
2
Quelle commande a été utilisée pour déplacer des éléments sous / ancien?
schaiba
Norme Solaris mv. Ou plus précisément: shopt -s extglob; mv !(old) /old.
propatience
1
Quel shell fonctionne actuellement? certains obus ont des commandes inbuild
Ferrybig
Vous pouvez le réparer avec ln, si cela fonctionne.
David Schwartz
2
"La solution /.../static/.../mv a été testée mais n'a pas fonctionné." Qu'est-il arrivé? At-il donné une erreur de chargeur? Qu'est-ce qui "n'a pas fonctionné" exactement? Les fichiers binaires staticsont là pour exactement cette catégorie de problèmes, si vous ne voulez pas démarrer un média temporaire.
Ti Strga

Réponses:

19

Si vous n'avez plus de shell en cours d'exécution en tant que root, vous devrez redémarrer sur un support de secours. N'importe quoi fera tant qu'il sera capable de monter le système de fichiers racine en lecture-écriture.

Si vous pouvez toujours exécuter des commandes en tant que root, tout est copacétique. Définissez la variable d'environnement LD_LIBRARY_PATHpour pointer vers les répertoires contenant les bibliothèques utilisées par les outils système de base. C'est au moins /usr/libsur un Solaris 32 bits, /usr/lib/64sur un Solaris 64 bits, éventuellement d'autres répertoires (je n'ai pas accès à Solaris 10 pour vérifier). Pour exécuter un exécutable, préfixez-le avec l' éditeur de liens d'exécution : /usr/lib/ld.so.1(pour un exécutable 32 bits) ou /usr/lib/64/ld.so.1(pour un exécutable 64 bits) - maintenant déplacé vers /old. Ainsi, vous devriez pouvoir récupérer avec quelque chose comme:

LD_LIBRARY_PATH=/old/usr/lib
export LD_LIBRARY_PATH
/old/usr/lib/ld.so.1 /old/usr/bin/mv /old/* /
Gilles 'SO- arrête d'être méchant'
la source
Utilisation intelligente du chargeur. Si toute la hiérarchie n'a pas été déplacée /old, mon commentaire sur le commentaire de Peschke est également valable ici. mvne doit pas être utilisé , mais une commande qui préserve la hiérarchie existante comme pax, taret les goûts.
jlliagre
1
Merci beaucoup pour votre patience et pour avoir pris le temps d'écrire ceci. Il travaille maintenant en cours d' exécution des commandes comme /old/usr/lib/ld.so.1 /old/usr/bin/mvet /old/usr/lib/ld.so.1 /old/usr/bin/cpet ainsi de suite. Je vais voir ce que je peux faire, maintenant le problème est que je suis à court d'espace mais je pourrais peut-être y remédier.
propatience le
@propatience Dommage que vous et Gilles n'ayez pas pris en compte mes commentaires ...
jlliagre
1
Yay DIEU! J'ai réussi à tout reculer avec d'abord /old/usr/lib/ld.so.1 /old/usr/bin/mvet /old/usr/lib/ld.so.1 /old/usr/bin/cpmais pas d'espace donc je n'ai pas pu utiliser /old/usr/lib/ld.so.1 /old/usr/bin/cp. Et puis l'édition $PATHet ensuite dossier par dossier en utilisant mvavec changé $PATH. Maintenant, tout est reculé pour que je puisse me reconnecter et taper df -h et tout. Merci beaucoup à tous. Vraiment, merci beaucoup à vous @Gilles! Merci StackExchange!
propatience le
1
La configuration LD_LIBRARY_PATHde Solaris présente certains risques si vous devez la définir afin de pouvoir exécuter les exécutables 32 et 64 bits. Il serait préférable d'utiliser les versions spécifiques 32 et 64 bits LD_LIBRARY_PATHdisponibles dans Solaris. Dans ce cas: LD_LIBRARY_PATH_32=/old/usr/libet LD_LIBRARY_PATH_64=/old/usr/lib/64. Voir la ld.so.1page de manuel : "Chaque variable d'environnement peut être spécifiée avec un suffixe _32 ou _64. Cela rend la variable d'environnement spécifique, respectivement, aux processus 32 bits ou 64 bits."
Andrew Henle
16

Il n'y a aucun moyen de créer un répertoire ou de copier des fichiers binaires avec juste des commandes intégrées au shell (bien que Gilles décrit une solution de contournement potentielle intelligente dans sa réponse ).

La meilleure option est de démarrer Solaris sur un support externe (dvd, clé USB), de monter ou d'importer le (s) système (s) de fichiers et de corriger le désordre avec quelque chose comme:

  • Démarrez un disque d'installation Solaris et sélectionnez pour exécuter un shell.

  • Montez l'ancienne racine (et tous les autres systèmes de fichiers le cas échéant) sous un répertoire tel que /mntou /a. Le disque de démarrage Solaris peut vous aider à le faire lorsqu'il détecte des systèmes de fichiers existants.

  • remettez les fichiers à leur emplacement d'origine avec cette commande (en supposant que tout est monté sous /mnt):

    cd /mnt/old
    find . -depth | cpio -pdlmPV@ /mnt
    
  • Redémarrez votre système

    init 6
    

Si vous utilisez ZFS et qu'un instantané récent existe, la sauvegarde du /oldrépertoire ailleurs, puis le retour au dernier instantané peuvent également être une option.

jlliagre
la source
Très bonne réponse. Démarrez dans l'USB de secours, montez le système de fichiers, puis faites quelque chose commemv /mountpoint/old/* /mountpoint
Peschke
1
@Peschke Merci, bien que l'exécution aveugle de votre mvcommande suggérée ne soit pas mon conseil. L'OP a écrit "tout ou presque tout ". Dans le second cas, le déplacement cassera les répertoires existants. J'utilise probablement un utilitaire comme tar, paxou cpiopour préserver la hiérarchie du répertoire de destination.
jlliagre
Merci beaucoup d'avoir répondu rapidement et merci beaucoup pour vos réponses. Je pourrais essayer ça demain.
propatience le
Lié à un instantané possible (ZFS ou UFS), vous pouvez démarrer sur un autre BE si vous utilisez la mise à niveau en direct. lustatus Et ne paniquez pas encore. Toutes les données existent toujours sur le ou les disques.
sleepyweasel
0

Solaris comprend statique construit des utilitaires de base ( cp, ln, mv, rcpet tar) à /usr/sbin/staticce que vous pouvez utiliser pour réparer tout problème avec la disponibilité de /usr/lib/ld.so.1qui empêche l'utilisation des réguliers dynamiquement liées /usr/binversions.

Il n'y a pas statique mkdirfourni, mais vous pouvez utiliser l'électricité statique lnpour symlink quel que soit le répertoire contient lib/ld.so.1en place que /usrtemporairement, puis utilisez la norme mkdirpour créer des répertoires dont vous avez besoin tout. Vous pouvez renommer des répertoires qui existent déjà en utilisant le statique mv.

rakslice
la source
Cela remonte au moins aussi loin que Solaris 2.5.1, où j'ai trouvé que le ld.so.1segfaults stock si vous essayez de l'exécuter manuellement comme le montre l'exemple de Gilles
rakslice