unix - movió accidentalmente todo debajo de root a / old - Solaris 10

13

Como dice el titular, todo o casi todo lo importante como root bajo root (/) se movió a / old en una máquina Solaris 10. Así que ahora la culpa típico cuando se trata cuando se ejecutan comandos son Cannot find /usr/lib/ld.so.1(cambian $PATHy también intentaron cambiar $LD_LIBRARY_PATH, $LD_LIBRARY_PATH_64y $LD_RUN_PATHy exportación de ellos, pero nada de eso parece cambiar la ruta de la biblioteca real). Intenté casi ayer para encontrar algo que podría ayudar, pero no encontré nada que realmente cambie la ruta de la biblioteca para Solaris 10 aparte de tal vez, crlepero no puede ejecutar eso desde entonces Cannot find /usr/lib/ld.so.1.

Encontré muchos consejos de recuperación de raíz o / usr / bin, etc. para Linux, pero la información para eso con respecto a Solaris 10 / Unix no es abundante y muy escasa.

No se puede ejecutar cp, ln, mkdiro mvpuesto Cannot find /usr/lib/ld.so.1. No puedo iniciar sesión con otras sesiones en la máquina. Aunque todavía hay una sesión activa que se puede usar y la ventana se está estancando while true; do date; echo hej 1234567; done. Hemos discutido la solución para usar un CD de arranque de Solaris y también un dist de Linux en una unidad USB. Hemos discutido la solución para cambiar los discos del disco duro a otro bastidor.

La /.../static/.../mvsolución ha sido probada pero no funcionó.

Los comandos que todavía se pueden utilizar son (que podría haber más comandos que se pueden utilizar): echo, <, >, >>, |, pwd, cd.

¿Hay alguna manera de crear un directorio o carpeta sin mkdir? ¿Hay alguna manera de utilizar echoy >o echoy >>para restaurar /usr/lib/ld.so.1? Sé que /usr/lib/ld.so.1probablemente será necesario restaurar más de lo necesario para que los comandos funcionen.

Muchas gracias por leer y que tengas un buen día =)

propaciencia
fuente
2
¿Qué comando se usó para mover cosas debajo de / old?
schaiba
Solaris estándar mv. O más precisamente: shopt -s extglob; mv !(old) /old.
propatience
1
¿Qué shell se está ejecutando en este momento? algunos proyectiles tienen comandos incorporados
Ferrybig
Podrías arreglarlo ln, si eso funciona.
David Schwartz
2
"La solución /.../static/.../mv ha sido probada pero no funcionó". ¿Que pasó? ¿Le dio un error de cargador? ¿Qué "no funcionó" exactamente? Los archivos binarios staticestán allí para exactamente esta categoría de problemas, si no desea iniciar medios temporales.
Ti Strga

Respuestas:

19

Si ya no tiene un shell ejecutándose como root, tendrá que reiniciar en medios de rescate. Cualquier cosa funcionará siempre que sea capaz de montar el sistema de archivos raíz de lectura-escritura.

Si aún puede ejecutar comandos como root, todo es copacetic. Establezca la variable de entorno LD_LIBRARY_PATHpara que apunte a los directorios que contienen bibliotecas utilizadas por las herramientas básicas del sistema. Eso es al menos /usr/liben un Solaris de 32 bits, /usr/lib/64en un Solaris de 64 bits, posiblemente en otros directorios (ahora no tengo acceso a Solaris 10 para verificar). Para ejecutar un ejecutable, agregue el prefijo con el vinculador de tiempo de ejecución : /usr/lib/ld.so.1(para un ejecutable de 32 bits) o /usr/lib/64/ld.so.1(para un ejecutable de 64 bits): ahora se ha movido a /old. Por lo tanto, debería poder recuperarse con algo como:

LD_LIBRARY_PATH=/old/usr/lib
export LD_LIBRARY_PATH
/old/usr/lib/ld.so.1 /old/usr/bin/mv /old/* /
Gilles 'SO- deja de ser malvado'
fuente
Uso inteligente del cargador. Si no se movió a toda la jerarquía /old, mi comentario al propio comentario de Peschke también es válido aquí. mvno debe ser utilizado, pero un comando que preservar la jerarquía existente como pax, tary los gustos.
jlliagre
1
Muchas gracias por su paciencia y por tomarse el tiempo para escribir esto. Ahora funciona como la ejecución de comandos /old/usr/lib/ld.so.1 /old/usr/bin/mvy /old/usr/lib/ld.so.1 /old/usr/bin/cpetcétera. Veré lo que puedo hacer, ahora el problema es que no tengo espacio, pero podría solucionarlo.
propatience
@propatience Lástima que tú y Gilles no
hayan
1
Yay DIOS! Me las arreglé para retroceder todo primero /old/usr/lib/ld.so.1 /old/usr/bin/mvy /old/usr/lib/ld.so.1 /old/usr/bin/cpsin espacio, así que no pude usar /old/usr/lib/ld.so.1 /old/usr/bin/cp. Y luego editando $PATHy luego carpeta por carpeta usando mvcon cambiado $PATH. Ahora todo se ha movido hacia atrás para que pueda iniciar sesión nuevamente y escribir df -h y todo. Muchas gracias a todos. Realmente, ¡muchas gracias a ti @Gilles! Gracias StackExchange!
propatience
1
La configuración LD_LIBRARY_PATHen Solaris tiene algunos peligros si necesita configurarla para que pueda ejecutar ejecutables de 32 y 64 bits. Sería mejor utilizar las versiones específicas de 32 y 64 bits LD_LIBRARY_PATHque están disponibles en Solaris. En este caso: LD_LIBRARY_PATH_32=/old/usr/liby LD_LIBRARY_PATH_64=/old/usr/lib/64. Consulte la ld.so.1página de manual : "Cada variable de entorno se puede especificar con un sufijo _32 o _64. Esto hace que la variable de entorno sea específica, respectivamente, para procesos de 32 bits o 64 bits".
Andrew Henle
16

No hay forma de crear un directorio o copiar archivos binarios con solo comandos integrados de shell (aunque Gilles describe una solución alternativa inteligente en su respuesta ).

Su mejor opción es iniciar Solaris en un medio externo (dvd, memoria usb), montar o importar los sistemas de archivos y arreglar el desastre con algo como:

  • Inicie un disco de instalación de Solaris y seleccione ejecutar un shell.

  • Monte la raíz antigua (y todos los demás sistemas de archivos, si los hay) en algún directorio como /mnto /a. El disco de arranque de Solaris podría ayudarlo a hacerlo cuando detecte sistemas de archivos existentes.

  • vuelva a colocar los archivos en su ubicación original con este comando (suponiendo que todo esté montado debajo /mnt):

    cd /mnt/old
    find . -depth | cpio -pdlmPV@ /mnt
    
  • Reinicie su sistema

    init 6
    

Si está utilizando ZFS y existe una instantánea reciente, hacer una copia de seguridad del /olddirectorio en otro lugar y luego volver a la última instantánea también podría ser una opción.

jlliagre
fuente
Gran respuesta. Inicie en el USB de rescate, monte el sistema de archivos y luego haga algo comomv /mountpoint/old/* /mountpoint
Peschke
1
@Peschke Gracias, aunque ejecutar ciegamente tu mvcomando sugerido no sería mi consejo. El OP escribió "todo o casi todo ". En el segundo caso, el movimiento romperá los directorios aún existentes. Es probable que utilizo una utilidad como tar, paxo cpiopara preservar la jerarquía de directorios de destino.
jlliagre
Muchas gracias por responder rápido y muchas gracias por sus respuestas. Podría intentar esto mañana.
propatience
Vinculado a la posible instantánea (ZFS o UFS), puede iniciar un BE alternativo si está utilizando la actualización en vivo. lustatus Y no entres en pánico todavía. Todos los datos todavía existen en los discos.
sleepyweasel
0

Solaris incluye estática se acumula de los servicios públicos básicos ( cp, ln, mv, rcp, y tar) en /usr/sbin/staticque se puede utilizar para reparar cualquier problema con la disponibilidad de /usr/lib/ld.so.1que impide el uso de los regulares vinculados dinámicamente /usr/binversiones.

No se mkdirproporciona ninguna estática , pero puede usar la estática lnpara vincular simbólicamente cualquier directorio que contenga lib/ld.so.1en su lugar como /usrtemporalmente, y luego usar el estándar mkdirpara crear los directorios que necesite. Puede cambiar el nombre de los directorios que ya existen utilizando el static mv.

rakslice
fuente
Esto se remonta al menos a Solaris 2.5.1, donde descubrí que el stock se ld.so.1daña si intentas ejecutarlo manualmente como se muestra en el ejemplo de Gilles
rakslice