Después de renombrar / usr accidentalmente, ¿cómo cambio el nombre?

62

Accidentalmente renombré el directorio /usra /usr_bak.

Quiero cambiarlo de nuevo, por lo que añado el camino /usr_bak/binpara $PATHpermitir que el sistema para encontrar el comando sudo.

Pero ahora sudo mv /usr_bak /usrme da el error:

sudo: error while loading shared libraries: libsudo_util.so.0: cannot open shared object file: No such file or directory

¿Hay una manera de cambiar el nombre del /usr_bakque /usr, además de volver a instalar el sistema?

Yves
fuente
2
¿Qué sistema operativo es este? Me pregunto cómo sudollegó a la etapa de biblioteca, generalmente está en /usr/bin/y debería haber fallado con un error de comando no encontrado. Además, ¿tiene configurada una contraseña de root?
Muru
3
@muru Es Ubuntu. Tienes razón, me hizo llegar el error acerca de not foundantes, así que la nueva ruta adjuntas /usr_bak/bina $PATHy ahora me sale el error en mi post aquí ...
Yves
2
@ user1717828 es complicado. Tengo que compilar un proyecto, desarrollado en Ubuntu 16.04, en Ubuntu 17.10. Así que estoy pensando si puedo simplemente copiar /usrUbuntu 16.04 para sobrescribir /usrUbuntu 17.10 ...
Yves
66
¿Ha considerado usar una VM para compilar el proyecto en lugar de cambios tan drásticos?
Kevin
3
Puede ejecutar virtualbox en modo sin cabeza . Puede ser más fácil configurar un invitado en otra máquina u obtener uno preconfigurado.
Kevin

Respuestas:

109

Como ha establecido una contraseña para root, use sue busybox, instalada por defecto en Ubuntu. Todas sulas bibliotecas requeridas están en /lib. Busybox es una colección de utilidades estáticamente vinculadas, por lo que las bibliotecas faltantes no deberían ser un problema. Hacer:

su -c '/bin/busybox mv /usr_bak /usr'

(Si bien Busybox también tiene un suapplet, el /bin/busyboxbinario no está configurado y, por lo tanto, no funciona a menos que se ejecute como root).

Si no tiene una contraseña de root, probablemente podría usar la solución de Gilles aquíLD_LIBRARY_PATH , o (Gilles dice que esto no funcionará con los binarios setuid como sudo) reinicie y edite el menú de GRUB para arrancar init=/bin/busyboxcomo un parámetro del núcleo y mover la carpeta de vuelta.

muru
fuente
73
Ahora, no renombre accidentalmente /lib.
sleblanc
55
LD_LIBRARY_PATHno ayudaría a ejecutar sudo ya que sudoes setuid. Si sus bibliotecas no están en el lugar correcto, sudo no funcionará hasta que root lo repare.
Gilles 'SO- deja de ser malvado'
3
Nota histórica de @Yves: los viejos sabores de Unix (que son mucho más antiguos que Linux) incluían una pequeña colección de binarios enlazados estáticamente /sbinpara ese tipo de escenario: "Estoy haciendo alguna actividad en la que las bibliotecas de tiempo de ejecución estarán malabarizadas pero aún necesita manipular archivos ". Básicamente, el mismo enfoque antes de que se inventara Busybox. (El número de comandos disponibles de esta manera era muy limitado, porque esos binarios enlazados estáticamente engullen el espacio en disco).
Ti Strga
8
@Yves si cambiaste el nombre /lib, entonces probablemente debas reiniciar ainit=/bin/busybox
muru
3
@Yves: Arranque desde una memoria USB, con una distribución en vivo que puede montar sus sistemas de archivos, y está listo para arreglar cualquier cosa. Incluso descargando archivos de reemplazo de los espejos del paquete si eliminó algo.
Peter Cordes
33

Además de la respuesta de muru :

  • podrías haber usado alguna llave USB de arranque de rescate para reparar tu sistema; por ejemplo, si su sistema es Debian o Ubuntu, inicie la llave USB de instalación en modo de rescate y haga lo apropiado mounty mvy umount.

  • ser capaz de reparar más fácilmente este tipo de errores, por lo general también se instala una carcasa estática con varias órdenes internas (sobre todo con un poco de cp, rm, mvórdenes internas similares a) como sash(se envasa en Debian y Ubuntu, y también está disponible como faja-3.8. tar.gz en forma de fuente) y arranque con init=/bin/sashpasado a Grub.

PD: sashes un poco defectuoso y no es totalmente compatible con Posix, pero sigue siendo muy útil.

Basile Starynkevitch
fuente
¿Podría explicar cómo instalar un shell estático con varios comandos incorporados? ¿Hay algún manual?
Yves
1
En Debian o Ubuntu: apt-get install sash. Pero también puede descargar sash-3.8.tar.gz y compilarlo.
Basile Starynkevitch
Mantengo un liveiso en el disco duro con una entrada de grub personalizada para problemas como este. No es necesario complicarse, simplemente inicie un sistema operativo en vivo y manipule archivos libremente :)
FreeSoftwareServers
3

Creo que la mejor manera más segura es reiniciar usando un sistema operativo USB, CD o DVD (Debian, Ubuntu, Suse, etc.). Luego monte la unidad que contiene los problemas y cambie el nombre.

Más seguro que arrancar en un campo minado con / usr o / lib efectivamente faltante.

Larry
fuente
1
Puede iniciar un ISO directamente desde Grub / HDD sin necesidad de USB / DVD, etc. Grub truco bastante ingenioso tiene loopback de llamada.
FreeSoftwareServers
0

Me encontré con un problema similar donde Me cambió el nombre /usr/bina /usr/bin_bkppor alguna prueba y entonces yo no era capaz de cambiar el nombre (como el comando no encuentra el sudoen el directorio estándar que es /usr/bin) y luego fui al /usr/bin_bkpdirectorio manualmente (utilizando el Gestor de archivos ) y la mayoría de las funciones (incluido el cambio de nombre) en el clic derecho están deshabilitadas.

Luego probé el siguiente comando y solucionó el problema

$/usr/bin_bkp/sudo mv /usr/bin_bkp/ /usr/bin/

Invoqué el sudo desde el camino actual y funcionó, ahora todo ha vuelto a la normalidad.

SO: Xubuntu 14.04

friki
fuente
-3

No puedo probar esto en este momento (y no estoy seguro de querer hacerlo), pero parece que debería funcionar para crear un nuevo "/ usr" como un enlace duro (no un enlace suave) a su " / usr_bak, luego elimine "/ usr_bak"

ln /usr_bak /usr
rm /usr_bak

El enlace duro creado por "ln" ( sin argumento "-s") en el sistema de archivos debe hacer que los directorios usr y usr_bak sean igualmente válidos para los directorios en cuestión. "rm" simplemente elimina el enlace que le pediste que elimine, no ambos. Como todavía hay un enlace válido a los contenidos, deben permanecer accesibles a través del enlace restante en "/ usr".

TED
fuente
55
Tenía la impresión de que Linux (o al menos Ubuntu) no permite enlaces duros a directorios. Por ejemplo, askubuntu.com/questions/210741/…
Chris Bouchard el
44
@Chris: Correcto, Linux no permite enlaces de directorio (aparte de .y .., por lo que el recuento de enlaces en un directorio le indica el número de subdirecciones de primer nivel). Además, rmno funciona en directorios, tendría que usar rmdir. ( lny rmtrabajar en enlaces simbólicos a directorios, pero estamos hablando de un directorio real). Además, esto no resuelve el problema, ya que requiere rootsimplemente mv, debido a los permisos en/ . Si pudieras correr esto, podrías correr mvcomo una persona normal.
Peter Cordes
2
Los enlaces duros a directorios no son compatibles con la mayoría (¿todos?) Unices porque es demasiado difícil para el software que realiza un rastreo recursivo del sistema de archivos para detectar bucles infinitos. Es posible si el software realiza un seguimiento de todos los inodes visitados y está rastreando un sistema de archivos compatible con inodes (es decir, no FAT32 / NTFS), pero verificar enlaces simbólicos y no atravesarlos es mucho más fácil. Todo lo que se necesita es una llamada rápida a lstat (2) para verificar el tipo de archivo.
penguin359
2
@Pryftan, mi ln(1)en Debian dice esto para la opción -d/ -F/ --directory: "permitir que el superusuario intente vincular los directorios (nota: probablemente fallará debido a restricciones del sistema, incluso para el superusuario)" . Así que puedes probarlo, pero tu sistema de archivos probablemente no te lo permita.
Toby Speight
1
@TobySpeight Otro pensamiento: vea también el enlace simbólico (7) que dice: Los enlaces duros pueden no referirse a directorios (para evitar la posibilidad de bucles dentro del árbol del sistema de archivos, lo que confundiría a muchos programas) y pueden no referirse a archivos en diferentes sistemas de archivos (porque los números de inodo no son únicos en todos los sistemas de archivos). Esto me hace pensar que el intento de enlace duro en realidad podría ser la forma de redactar algo más que sucede, a saber, que se llama a la función pero falla exactamente porque es un directorio. (La referencia del sistema de archivos es lo que estaba pensando en otro comentario)
Pryftan