Estaba trabajando en un directorio llamado bin. Después de que terminé, debido a la propiedad biny algunos archivos dentro de él, accidentalmente ejecuté:
sudo rm -r /bin
En lugar de:
sudo rm -r bin
Parece que mis manos solían agregar un /frente a todo lo que escribo.
¿Cómo puedo restaurar mi /bindirectorio?
Quiero los mismos archivos que pertenecen a mi Ubuntu, no me gusta copiarlos y pegarlos desde un disco en vivo u otro sistema en ejecución.
command-line
restore
Ravexina
fuente
fuente

/binUbuntu solo un enlace simbólico en/usr/binestos días? ¿Entonces todo lo que necesita hacer es volver a colocar el enlace simbólico?/binno es un enlace simbólico/usr/binaquí, creo que estaría en contra de laFHS. también si verificamos un paquete trivial comocoreutilsenzesty(aquí) . podemos ver que se instalarán muchas cosas/binjunto con el/usr/bin, pero aún así puede ser un enlace, no estoy al tanto./bin, consideré algo que podría pasarle a cualquiera (Basado en otra pregunta a la que respondí), luego escribí una instrucción para compartir mi conocimiento con otros :), aunque agradezco todos los comentarios, también son útiles para otras personas que vienen a leer esta pregunta. Gracias a todos;)Respuestas:
¿Es posible?
Bueno, la mayoría de las utilidades triviales e importantes están instaladas
/bin, y ahora has perdido el acceso a todas ellas. De hecho, si reinicia, su sistema ya no podrá arrancar.De todos modos, solucionaremos el problema y haremos que
/binel contenido esté lo más cerca posible de donde estaba. La única diferencia sería algunos enlaces simbólicos que también arreglaremos.¿Cómo?
Primero, debemos
chrootentrar en su sistema roto, ¡pero con una pequeña diferencia ! Después de eso, obtendremos una lista de los paquetes instalados en su sistema que tienen cualquier archivo instalado en el/bindirectorio, luego solo descargaremos los paquetes necesarios y extraeremos los archivos necesarios/bin. Entonces habremos terminado.Por ejemplo, después
chroot, podemos obtener una lista de paquetes que tienen archivos instalados al/binusar:Y también podemos usar:
para enumerar los archivos instalados por estos paquetes en
/bin.Luego, simplemente creamos una lista de todos los paquetes que son necesarios para nosotros, luego los descargamos y los extraemos
/bincon algo como:Sin embargo, debemos usar un script para verificar todos los paquetes instalados en nuestro sistema, porque hacerlo manualmente es una locura.
Entonces escribí un guión que hace todo lo que necesitamos. Encuentra todos los paquetes necesarios para que los restauremos
/bin, nos muestra el nombre de cada paquete y sus archivos relacionados a los que pertenece/bin. Aquí hay una captura de pantalla:Al final, elegimos reinstalar todos los paquetes o solo descargar y extraer los archivos necesarios para
/bin(que es la opción recomendada):Puede obtener una copia de este script o descargarlo directamente .
Empecemos
chroot
Arranque su sistema con un disco en vivo que tenga la misma arquitectura que su Ubuntu instalado, abra una terminal y obtenga acceso de root:
Monta tu
rootsistema de archivos (para mí es/dev/sda1):Necesitaremos conectividad a Internet, así que copie
resolv.confdesde Ubuntu en vivo a su partición raíz montada:Ahora copie el script en algún lugar de la partición montada, por ejemplo:
o puedes descargarlo usando
wget, etc. como:Monte otros caminos necesarios:
Y aquí está la pequeña diferencia : ¿cómo podemos acceder
chroota un sistema dañado cuando no hay un/bindirectorio allí? ¿Qué shell debemos ejecutar?Entonces cree un directorio bin temporal. Por ejemplo: nombrado
bintmpdentro de la raíz del sistema roto:Luego une la vida
/bina eso:Ingresa al sistema mientras configuras
/bintmp/bashcomo tu shell de inicio de sesión:Exporte
/bintmpcomo suPATHvariable de entorno:Dele al script el bit ejecutable:
Ejecute el script:
Espere a que se complete la búsqueda y luego responda la pregunta que vimos en la captura de pantalla. Comenzará a restaurar el
/biny ya casi hemos terminado.Una vez hecho esto, use CTRL+ Dpara salir del
chrootentorno y desmontar las rutas montadas:Reinicia el sistema.
Restaurando los enlaces dentro
/binAhora casi todos los archivos dentro del
/bindirectorio están de regreso, excepto alrededor de 5 enlaces simbólicos que son administrados porupdate-alternatives.En su sistema en ejecución, ejecute:
Te hace algunas preguntas; simplemente puede presionar ENTERpara aceptarlos a todos.
Y ahora hemos terminado.
fuente
Si su sistema actual todavía tiene un shell en ejecución y acceso a Internet, esto se puede hacer utilizando herramientas existentes en otras partes del sistema. Supongo que solo borraste
/bin./binpor supuesto, tiene la utilidad más conveniente que podría usar en tal situación (busybox), pero sin eso, tendremos que ser un poco creativos.Como ya tiene un shell en ejecución y ya
sudoestá en funcionamiento/usr/bin, obtengamos un shell de root en ejecución antes de causar más daños. ¡Pero/bin/bashy la mayoría de los otros proyectiles se han ido! Afortunadamente, Linux todavía tiene una copia en memoria del shell que está utilizando. Entonces:Estrictamente hablando, no necesitamos un shell raíz para gran parte de lo que sigue. Pero de todos modos.
Ahora,
dpkgtodavía funciona, al menos para encontrar qué paquetes tienen archivos/bin:Podemos usarlo
awkpara procesarlo y obtener los nombres de los paquetes,xargsyapt-getpara descargar los paquetes (todo incluido/usr/bin). Si tiene un directorio temporal que puede usar,cdallí, porque su directorio actual se volverá un poco desordenado:Ahora, el mayor problema que tenemos es que
/bin/tarfalta, y sin él,dpkgno se pueden extraer los archivos. Podemos llegar a dos tercios del camino, porque:.deblos archivos son en realidadararchivos (nuevamente en/usr/bin):Consta de dos
.tar.*archivosdataycontrol:Mientras las utilidades gzip están en
/bin,unxzestá en/usr/bin:Ahora tenemos un
data.tararchivo sintarextraertarde él.Python al rescate ! Aquí es donde
sudorealmente se necesita:Ahora podemos usar
dpkgpara extraer los archivos deb restantes para obtener un archivo razonablemente completo/bin:Sin embargo, aún deberíamos hacer una instalación adecuada de los archivos deb, para que los enlaces simbólicos, etc., que serían creados por los paquetes se vuelvan a crear:
O:
Notas:
No podemos usar Python 2 para extraer directamente el
data.tar.xzarchivo, ya que Python 2 solo admite la compresión gzip y bzip2. Python 3, sin embargo, lo admite, por lo que puede usar Python 3 directamente sinunxz:/bin/tar, aún necesita extraer algunos de los archivos deb antes de poder usarlosapt-get: los shells, coreutils, etc. Es más fácil extraerlos todos y volver a instalarlos más tarde.fuente
/usr/bin, dije lo que sea que vaya con chroot ... Impresionante./proc/$$/exeun enlace/bin/bash? ¿Cómo funciona cuando/binse elimina? (Está funcionando, pero cómo), pensé que debería ser un enlace roto ... por eso dejé atrás esta Idea.Podrías poner temporalmente archivos de un CD en vivo u otro sistema en tu
/binpara hacer que tu sistema sea utilizable, luego reemplazarlos con archivos de tu instalación de Ubuntu ejecutandoapt-get install --reinstallpaquetes que contengan cosas/bin.fuente
Algunas adiciones a este excelente respuesta , después de que me encontré con este tema (junto con el borrado
/boot,/etc,/liby/lib64):chrootrequiere/liby/lib64estar presente; de lo contrario, recibirá el siguiente error:failed to run command ‘/bin/bash’: No such file or directoryCopié esto del sistema operativo LiveCD y no tuve ningún problema para restaurarlo. YMMV dependiendo de los paquetes que haya instalado en el sistema
cp /etc/resolv.conf /mnt/etc/resolv.cofdebería ser
cp /etc/resolv.conf /mnt/etc/resolv.conf/bootse puede restaurar fácilmente con herramientas grub. Ver aquí .apt install --reinstall <package>es una excelente manera de restaurar los archivos que faltan/bin,/liby/lib64.libaio1,mysql-server,openvpn,vsftpdNota para uno mismo:
rm -rf folder /*no es lo mismo querm -rf folder/*fuente