Estaba trabajando en un directorio llamado bin
. Después de que terminé, debido a la propiedad bin
y 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 /bin
directorio?
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
/bin
Ubuntu solo un enlace simbólico en/usr/bin
estos días? ¿Entonces todo lo que necesita hacer es volver a colocar el enlace simbólico?/bin
no es un enlace simbólico/usr/bin
aquí, creo que estaría en contra de laFHS
. también si verificamos un paquete trivial comocoreutils
enzesty
(aquí) . podemos ver que se instalarán muchas cosas/bin
junto 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
/bin
el 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
chroot
entrar 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/bin
directorio, 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/bin
usar: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
/bin
con 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
root
sistema de archivos (para mí es/dev/sda1
):Necesitaremos conectividad a Internet, así que copie
resolv.conf
desde 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
chroot
a un sistema dañado cuando no hay un/bin
directorio allí? ¿Qué shell debemos ejecutar?Entonces cree un directorio bin temporal. Por ejemplo: nombrado
bintmp
dentro de la raíz del sistema roto:Luego une la vida
/bin
a eso:Ingresa al sistema mientras configuras
/bintmp/bash
como tu shell de inicio de sesión:Exporte
/bintmp
como suPATH
variable 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
/bin
y ya casi hemos terminado.Una vez hecho esto, use CTRL+ Dpara salir del
chroot
entorno y desmontar las rutas montadas:Reinicia el sistema.
Restaurando los enlaces dentro
/bin
Ahora casi todos los archivos dentro del
/bin
directorio 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
./bin
por 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
sudo
está en funcionamiento/usr/bin
, obtengamos un shell de root en ejecución antes de causar más daños. ¡Pero/bin/bash
y 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,
dpkg
todavía funciona, al menos para encontrar qué paquetes tienen archivos/bin
:Podemos usarlo
awk
para procesarlo y obtener los nombres de los paquetes,xargs
yapt-get
para descargar los paquetes (todo incluido/usr/bin
). Si tiene un directorio temporal que puede usar,cd
allí, porque su directorio actual se volverá un poco desordenado:Ahora, el mayor problema que tenemos es que
/bin/tar
falta, y sin él,dpkg
no se pueden extraer los archivos. Podemos llegar a dos tercios del camino, porque:.deb
los archivos son en realidadar
archivos (nuevamente en/usr/bin
):Consta de dos
.tar.*
archivosdata
ycontrol
:Mientras las utilidades gzip están en
/bin
,unxz
está en/usr/bin
:Ahora tenemos un
data.tar
archivo sintar
extraertar
de él.Python al rescate ! Aquí es donde
sudo
realmente se necesita:Ahora podemos usar
dpkg
para 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.xz
archivo, 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/$$/exe
un enlace/bin/bash
? ¿Cómo funciona cuando/bin
se 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
/bin
para hacer que tu sistema sea utilizable, luego reemplazarlos con archivos de tu instalación de Ubuntu ejecutandoapt-get install --reinstall
paquetes 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
,/lib
y/lib64
):chroot
requiere/lib
y/lib64
estar presente; de lo contrario, recibirá el siguiente error:failed to run command ‘/bin/bash’: No such file or directory
Copié 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.cof
debería ser
cp /etc/resolv.conf /mnt/etc/resolv.conf
/boot
se puede restaurar fácilmente con herramientas grub. Ver aquí .apt install --reinstall <package>
es una excelente manera de restaurar los archivos que faltan/bin
,/lib
y/lib64
.libaio1
,mysql-server
,openvpn
,vsftpd
Nota para uno mismo:
rm -rf folder /*
no es lo mismo querm -rf folder/*
fuente