Mover bin y otras carpetas! ¿Cómo recuperarlos?

13

Accidentalmente moví todas las carpetas desde la raíz a una subcarpeta. ( /bin, /etc, /home, /lib, /usr... todo desplazado) Los únicos que no se han movido, ya que estaban en uso, son /bak, /boot, /dev, /proc, /sys.

Ahora, cualquier comando que intente ejecutar simplemente no sucederá. Constantemente recibo "No existe tal archivo o directorio".

Estoy conectado a través de ssh y ftp, pero no puedo mover archivos a través de ftp, ya que el inicio de sesión directo en SU ​​está desactivado. También tengo acceso al servidor real si necesito hacer algo directamente desde allí.

Supongo que necesitaría editar un archivo de configuración para decirle dónde encontrar la /bincarpeta y eso me ayudaría a acceder nuevamente, pero no sé qué archivo sería o cómo hacerlo (ya que ni siquiera puede correr chmodpara cambiar los permisos).

¿Hay alguna forma de salir de esto que no sea la reinstalación?

Estoy trabajando en una versión antigua de CentOS.

Soy extremadamente nuevo en el mundo de Linux, de ahí esta acción y la pregunta ...

Menelaos
fuente
Si bien no es una solución a su problema, le recomiendo leer esto: lug.wsu.edu/node/414 Situación similar pero en realidad eliminó / bin.
stribika

Respuestas:

33

Si aún tiene un shell raíz, puede tener la oportunidad de reparar su sistema. Digamos que ha movido todos los directorios comunes ( /bin, /etc, /lib, /sbin, /usr- estos son los que podrían hacer difícil recuperación) bajo /oops.

No podrá ejecutar el mvcomando directamente, incluso si especifica la ruta completa /oops/bin/mv. Eso es porque mvestá dinámicamente vinculado ; porque ha movido el /libdirectorio, mvno se puede ejecutar porque no puede encontrar las bibliotecas que constituyen parte de su código. De hecho, es aún peor que eso: mvno puedo encontrar el cargador dinámico /lib/ld-linux.so.2 (el nombre puede variar dependiendo de su arquitectura y variante de Unix, y el directorio podría ser un nombre diferente como /lib32o /lib64). Por lo tanto, hasta que haya movido el /libdirectorio hacia atrás, debe invocar el vinculador explícitamente y debe especificar la ruta a las bibliotecas movidas. Aquí está el comando probado en Debian squeeze i386.

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/i386-linux-gnu
/oops/lib/ld-linux.so.2 /oops/bin/mv /oops/* /

Es posible que deba ajustar esto un poco para otras distribuciones o arquitecturas. Por ejemplo, para CentOS en x86_64:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib64
/oops/lib64/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

Cuando has arruinado algo /lib, es útil tener una caja de herramientas enlazada estáticamente. Algunas distribuciones (no sé acerca de CentOS) proporcionan una copia estáticamente vinculada de Busybox . También hay faja , un shell independiente con muchos comandos incorporados. Si tiene uno de estos, puede hacer su recuperación desde allí. Si no los ha instalado antes, es demasiado tarde.

# mkdir /oops
# mv /lib /bin /oops
# sash
Stand-alone shell (version 3.7)
> -mv /oops/* /
> exit

Si ya no tiene un shell de raíz, pero aún tiene un demonio SSH escuchando y puede iniciar sesión directamente como root sobre ssh, y tiene una de estas cajas de herramientas vinculadas estáticamente, es posible que pueda ingresar. puede funcionar si te has mudado /liby /bin, pero no /etc.

ssh [email protected] /oops/bin/sash
[email protected]'s password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

Algunos administradores configuran una cuenta alternativa con un shell vinculado estáticamente, o hacen que la cuenta raíz use un shell vinculado estáticamente, solo para este tipo de problemas.

Si no tiene un shell raíz y no ha tomado precauciones, deberá arrancar desde un CD / USB en vivo de Linux (cualquiera funcionará siempre que sea lo suficientemente reciente como para poder acceder a sus discos y sistemas de archivos) y mover los archivos de vuelta.

Gilles 'SO- deja de ser malvado'
fuente
1
Gracias Gilles Me ha proporcionado información muy útil sobre lo que debería tener cuidado en el futuro.
Menelaos
Gracias Gilles! Esto me salvó. He agregado una edición para linux env de 64 bits. En mi caso, CentOS 7 de 64 bits
CompEng88
@ ComputerEngineer88 Gracias, pero cuando realice modificaciones, no agregue marcadores "EDITAR" ni los agregue al final de la publicación donde no pertenecen. Mantén el flujo del texto. Las publicaciones tienen un historial de edición si las personas quieren saber qué contenía la publicación antes. Cuando las personas leen la publicación normalmente, no les importa que se haya agregado algo más tarde.
Gilles 'SO- deja de ser malvado'
De Verdad? Siempre me concentro en las ediciones. Significa que se aprendió algo nuevo y para mí eso es lo más importante. De todos modos, ¡siempre y cuando la gente se beneficie!
CompEng88
@ ComputerEngineer88 Tuve el mismo reflejo cuando comencé a usar Stack Overflow. Pero, de hecho, una publicación de Stack Exchange está, en muchos sentidos, más cerca de un artículo de Wikipedia que de una publicación en un foro de discusión. Espera que las personas lean las publicaciones del foro poco después de su publicación, por lo que tiene sentido tener una indicación visible si se han editado. Pero digamos que alguien ve este hilo en 2027: no les importaría si un párrafo ha estado allí desde 2011 o si se agregó en 2019.
Gilles 'SO- deja de ser malvado'
11

Probablemente pueda recuperarse sin reiniciar, así que no reinicie hasta que haya intentado otras cosas porque no se iniciará. Si todavía tiene abierta su sesión SSH, intente lo siguiente:

  • Desde dónde se ejecutan los programas se establece usando la variable $ PATH. Puede agregar su nueva ubicación a la ruta ejecutando export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin". Es posible que también deba agregar los directorios sbin correspondientes . También puede ejecutar programas manualmente a través de su ruta completa, /path/to/mv [from] [to]por ejemplo, debería funcionar incluso si mv está en una ubicación diferente. La parte difícil es que la mayoría de los comandos van a querer acceder a bibliotecas comunes y usted dice que /libse movió, por lo que también debe establecer una variable para dónde está.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • Una vez que puedas ejecutar algunos comandos básicos, ¡mueve las cosas hacia atrás! mv /path/to/subfolder/* /estaría en orden! Una vez que todo vuelva a estar en su lugar, el sistema debería comportarse normalmente.

Si eso falla, arrancar CUALQUIER LiveCD y montar la unidad debería permitirle mover las carpetas de regreso a donde pertenecen. No necesita reinstalar o incluso usar sus distribuciones livecd, solo necesita montar la unidad y mover las carpetas nuevamente a la ubicación correcta en el disco. Muchos discos de rescate basados ​​en Linux se especializan en brindarle algunas herramientas básicas de consola para hacer este tipo de reparación.

Caleb
fuente
El trabajo a través de SSH falló, así que descargué un liveCD y estoy tratando de que las cosas funcionen. Estoy en grub e intento montar la unidad, pero no me deja porque el núcleo no está cargado. y no poder ver el camino exacto de los caminos existentes claramente hace que esto sea difícil ...
Menelaos
1
Arranque para vivir, monte su disco, mueva las cosas a sus lugares apropiados, reinicie a su sistema ... y buena suerte.
Caleb
2
No es suficiente establecerlo LD_LIBRARY_PATH, también debe invocar el cargador dinámico explícitamente, por ejemplo LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv.
Gilles 'SO- deja de ser malvado'
4

Debería poder reiniciar la computadora con un CD de instalación en modo de usuario único, montar el sistema de archivos raíz y mover los archivos nuevamente a Linux. No conozco muchos centos, pero es como RHEL, así que esto debería funcionar.

Jamess
fuente
Gracias. Lo estoy descargando mientras hablamos. ¿Hay alguna diferencia si es el Live CD o el DVD de instalación completo?
Menelaos
@Menelaos: No desea instalar, quiere algo que pueda ejecutar en vivo para esta solución. Algunos discos de instalación tienen versiones en vivo, pero algunos solo quieren instalarlo de inmediato. Algunos tienen modos de "rescate", que es lo que realmente quieres, pero también hay discos de rescate de Linux dedicados. No tiene que ser su distribución, solo tiene que ser algo que pueda montar un sistema de archivos Linux y mover las carpetas hacia atrás. Mira mi respuesta.
Caleb
Mira sysresccd.org a ver uno de los CD de rescate si te gusta, tiene una extensa documentación para ver cómo usarlo. Ayudar a usarlo para resolver este problema puede ser difícil en este foro y más allá de mi tiempo disponible. De lo contrario, los CD de centos deberían ayudar. El último CD en vivo puede o no funcionar ... Entonces, teniendo en cuenta este tipo de problemas, siempre debe mantener un medio de instalación / iso de la versión que instaló. También cree una copia de seguridad de sistemas de archivos completos.
Jamess
2

Muchas gracias a Gilles, 5 años después y tus publicaciones aún me salvaron el día, si no la semana.

Tenía la intención de mover el contenido de una subcarpeta a la carpeta actual, pero en lugar de mv sub/* .hacerlo mv sub /* ., así que moví todo a la carpeta actual. Afortunadamente, encontré esta respuesta y pude arreglar mi máquina con relativa facilidad. Sin embargo, tuve que ajustar los comandos ligeramente ya que estoy trabajando en una máquina x86_64 con Ubuntu 16.04. Me gustaría dejar las instrucciones aquí, en caso de que alguien tenga dificultades:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/x86_64-linux-gnu
/oops/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /
Ktipr
fuente
0

Me gustaría agregar un par de comandos más para hacer después de aplicar la respuesta de Ktipr para sistemas modernos (máquinas x86_64 que ejecutan Unix), no pude mover los directorios "etc" con mv ya que mostraba un error

Error : Directory not empty

así que tuve que usar

rsync -a source_file target_location

para asegurarme de que pude volver a poner todo en orden. Si aún no lo tiene instalado, deberá instalarlo primero.

Rishabh Gupta
fuente