실수로 / bin을 제거했습니다. 어떻게 복원합니까?


91

나는라는 디렉토리에서 일하고있었습니다 bin. 작업이 끝나면 bin파일 의 소유권 과 일부 파일로 인해 실수로 실행되었습니다.

sudo rm -r /bin

대신에:

sudo rm -r bin

내 손이 /내가 입력하는 모든 것 앞에 추가하는 데 사용 된 것 같습니다 .

/bin디렉토리를 어떻게 복원 할 수 있습니까?

내 우분투에 속한 동일한 파일을 원합니다. 라이브 디스크 또는 다른 실행중인 시스템에서 복사하여 붙여 넣기를 좋아하지 않습니다.


3
아닌가 /bin에 우분투 단지 심볼릭 링크에 /usr/bin요즘? 그래서 당신이해야 할 일은 심볼릭 링크를 다시 넣는 것입니까?
Muzer

3
@ Muzer 16.04를 실행 중이며 여기에 /bin대한 상징적 인 링크는 아닙니다 . 또한 우리는 같은 사소한 패키지를 확인하는 경우 에 (여기) . 우리는 많은 것들이 와 함께 설치되는 것을 볼 수 있지만 여전히 링크는 될 수 있습니다. /usr/binFHScoreutilszesty /bin/usr/bin
Ravexina

2
@Ravexina Arch Linux는 이미 / bin을 / usr / bin으로 심볼릭 링크합니다
Dmitry Kudriavtsev

1
나는 사람들이 그것이 상황을 구성하고 있다는 것을 깨닫게 될 것이라고 생각했다. 나는 실제로 내 것을 제거하지 않았다 /bin. 나는 다른 사람에게 일어날 수있는 것을 고려했다. 다른 사람들과 함께 :), 나는 모든 의견을 주셔서 감사하지만이 질문을 읽는 다른 사람들에게도 도움이됩니다. 모두 감사합니다;)
Ravexina

1
"rm -r"명령 또는 중요한 결과를 초래할 수있는 다른 명령을 사용할 때마다 습관을들이는 경우 명령을 입력 한 다음 타격하기 전에 적어도 약 3 초 동안 키보드에서 손을 떼십시오. 들어가다. 그것은 내가 그것을 조사하고 내가 모든 것을 올바르게 입력했는지 확인하고 내가 계획하고있는 일을 어떻게 할 것인지를 알 수있는 기회를 제공합니다. 드문 경우에, 일시 정지 중에 명령이 지워 져야한다고 결정합니다. 항상 명령이 잘못 되었기 때문에가 아니라 검증을 먼저 수행해야하기 때문입니다.
ajb

답변:


180

가능합니까?

글쎄, 대부분의 사소하고 중요한 유틸리티는에 설치되어 /bin있으며 이제 모든 유틸리티에 대한 액세스 권한을 잃었습니다. 실제로 재부팅하면 시스템을 더 이상 부팅 할 수 없습니다.

어쨌든 우리는 문제를 해결하고 /bin가능한 한 가깝게 내용을 만들 것입니다. 유일한 차이점은 우리가 고칠 일부 심볼릭 링크입니다.


어떻게?

먼저 chroot깨진 시스템에 들어가야하지만 약간의 차이가 있습니다 ! 그런 /bin다음 디렉토리에 설치된 파일이있는 시스템에 설치된 패키지 목록이 표시 되며 필요한 패키지 만 다운로드하여에 필요한 파일을 추출합니다 /bin. 그런 다음 끝납니다.

예를 들어 after chroot/bin사용하면 다음 을 사용하여 파일을 설치 한 패키지 목록을 얻을 수 있습니다 .

dpkg --search /bin | cut -f1 -d: | tr ',' '\n'

그리고 우리는 또한 사용할 수 있습니다 :

dpkg --listfiles PACKAGE-NAME | grep "^/bin/" # or awk '$0 ~ "^/bin/

에서이 패키지별로 설치된 파일을 나열합니다 /bin.

그런 다음 우리에게 필요한 모든 패키지 목록을 만든 다음 다운로드하여 다음과 같이 추출하십시오 /bin.

xargs apt download < list-packages
dpkg-deb -x PACKAGE .
mv ./bin/* /bin

그러나 시스템에 설치된 모든 패키지를 확인하려면 스크립트를 사용해야합니다. 수동으로하는 것은 광기이기 때문입니다.

그래서 우리가 필요한 모든 것을하는 스크립트를 작성했습니다. 복원에 필요한 모든 패키지를 찾고 /bin각 패키지의 이름과 관련 파일을 보여줍니다 /bin. 스크린 샷은 다음과 같습니다.

내 스크립트에서 출력 한 <code> / bin </ code> 패키지 목록의 스크린 샷

마지막으로 모든 패키지를 다시 설치하거나 필요한 파일 만 다운로드하여 압축을 풉니 다 /bin(권장 옵션).

내 스크립트에서 제공 한 옵션의 스크린 샷

이 스크립트의 사본을 가져 오거나 직접 다운로드 할 수 있습니다 .


시작하자

chroot

설치된 Ubuntu와 동일한 아키텍처를 가진 라이브 디스크로 시스템을 부팅하고 터미널을 열고 루트 액세스 권한을 얻습니다.

sudo -i

root파일 시스템을 마운트하십시오 (나를 위해 /dev/sda1).

mount /dev/sda1 /mnt

인터넷에 연결해야하므로 resolv.conf라이브 우분투에서 마운트 된 루트 파티션으로 복사 하십시오.

cp /etc/resolv.conf /mnt/etc/resolv.conf

이제 스크립트를 마운트 된 파티션의 어딘가에 복사하십시오. 예 :

cp /media/ubuntu/usb/restore-bin.sh /mnt/restore-bin.sh

또는 다음 wget과 같이 등을 사용하여 다운로드 할 수 있습니다 .

wget https://git.io/v9fRm -O /mnt/restore-bin.sh

다른 필요한 경로를 마운트하십시오.

mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc /proc /mnt/proc

그리고 여기에 사소한 차이점이 있습니다 . 디렉토리 chroot가 없을 때 어떻게 깨진 시스템을 만들 /bin수 있습니까? 어떤 쉘을 실행해야합니까?

따라서 임시 bin 디렉토리를 작성하십시오. 예 : bintmp깨진 시스템 루트 내에서 이름 지정 :

mkdir /mnt/bintmp

그런 다음 라이브 /bin를 그 안에 묶으십시오 .

mount --bind /bin /mnt/bintmp

/bintmp/bash로그인 쉘로 설정하는 동안 시스템에 Chroot :

chroot /mnt /bintmp/bash

환경 변수 /bintmp로를 내보내십시오 PATH.

export PATH=/bintmp:$PATH

스크립트에 실행 비트를 제공하십시오.

chmod +x restore-bin.sh

스크립트를 실행하십시오.

./restore-bin.sh

검색이 완료 될 때까지 기다린 다음 스크린 샷에서 본 질문에 답변하십시오. 복구가 시작되고 /bin거의 끝났습니다.

완료되면 CTRL+ D를 사용 하여 chroot환경에서 벗어나 마운트 된 경로를 마운트 해제하십시오.

umount -R /mnt

시스템을 재부팅하십시오.

내에서 링크 복원 /bin

/bin의해 관리되는 약 5 개의 심볼릭 링크를 제외하고 디렉토리 내의 거의 모든 파일 이 다시 돌아옵니다 update-alternatives.

실행중인 시스템에서 다음을 실행하십시오.

sudo update-alternatives --all

몇 가지 질문을합니다. 당신은 단순히 ENTER그들 모두를 받아 들일 수 있습니다.

이제 끝났습니다.


30
이것은 의심 할 여지없이 Ask Ubuntu에서 본 최고의 답변입니다. OP가 불편한 상황에 처해 있다는 것을 알고 너무 많은 일을하는 것은 당신에게 매우 친절합니다.
Nonny Moose

15
아 잠깐만 네가 그렇게했음을 깨달았어야 했어
Nonny Moose

이것은 놀랍다. 나는 SE 디자인이 이것이 스스로 대답하는 질문이라는 힌트를 전혀주지 않는 방법을 좋아합니다.
Pedro A

5
@Hamsteriffic : 응답자 이름 (서명)이 들어있는 사각형을 참조하십시오 : OP가 아닌 게시물은 어두운 배경을 가지고 있습니다. 이것은 의견, 답변 및 질문에 적용됩니다.
Ruslan

27

현재 시스템에 여전히 쉘 및 인터넷 액세스가 실행중인 경우 시스템의 다른 곳에있는 도구를 사용하여이를 수행 할 수 있습니다. 삭제 한 것으로 가정합니다 /bin. /bin물론 그러한 상황에서 사용할 수있는 가장 편리한 유틸리티 (busybox)가 있지만, 그렇지 않으면 약간의 창의력을 가져야합니다.


이미 실행중인 쉘을 가지고 있기 때문에 sudoin에 있기 때문에 /usr/bin추가 손상을 입기 전에 실행중인 루트 쉘을 가져 오십시오. 그러나 /bin/bash대부분의 다른 껍질은 사라졌습니다! 운 좋게도 Linux에는 여전히 사용중인 쉘의 메모리 내 사본이 있습니다. 그래서:

sudo /proc/$$/exe

엄밀히 말하면 우리는 뒤에 오는 것의 많은 부분에 루트 쉘이 필요하지 않습니다. 그러나 어쨌든.

이제 dpkg최소한 파일이있는 패키지를 찾기 위해 여전히 작동합니다 /bin.

dpkg -S /bin

우리는 사용할 수 awk를 처리하고 패키지 이름을 얻고, xargsapt-get패키지 (모두 다운로드 /usr/bin). 사용할 수있는 임시 디렉토리가있는 경우 cd현재 디렉토리가 약간 지저분해질 수 있으므로 다음과 같이하십시오.

dpkg -S /bin | awk -F '[, :]' '{NF--}1' | xargs apt-get download

이제 우리가 가진 가장 큰 문제 /bin/tar는 누락 dpkg되어 아카이브 파일을 추출 할 수 없다는 것입니다. 다음과 같은 이유로 3 분의 2를 얻을 수 있습니다.

  1. .deb파일은 실제로 ar아카이브입니다 ( /usr/bin).

    ar x tar_*.deb
    
  2. 이 구성된 .tar.*아카이브 datacontrol:

    $ echo *.tar.*
    control.tar.gz data.tar.xz
    
  3. gzip을 유틸리티에있는 동안 /bin, unxz/usr/bin:

    unxz data.tar.xz
    

이제 추출 할 data.tar파일이 없습니다 .tartar

구조에 파이썬 ! 이것은 sudo실제로 필요한 곳 입니다.

$ sudo python -c 'import tarfile; tarfile.open("data.tar").extractall("/")'
$ echo /bin/*
/bin/tar

이제 우리가 사용할 수있는 dpkg합리적으로 전체를 얻기 위해 나머지 DEB 파일의 압축을 /bin:

for i in *.deb; do dpkg-deb -x "$i" /; done

그러나 패키지에 의해 생성 된 심볼릭 링크 등이 다시 생성되도록 deb 파일을 올바르게 설치해야합니다.

sudo apt install --reinstall ./*.deb

또는:

sudo dpkg -i *.deb
sudo apt-get install -f

노트:

  1. data.tar.xzPython 2는 gzip 및 bzip2 압축 만 지원하므로 Python 2를 사용하여 파일 을 직접 추출 할 수 없습니다 . 그러나 Python 3는이를 지원하므로 다음 없이도 Python 3을 직접 사용할 수 있습니다 unxz.

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. 돌아온 /bin/tar후에도 apt-get쉘, coreutils 등을 사용하기 전에 일부 deb 파일을 추출해야합니다 . 모든 파일을 추출하고 나중에 다시 설치하기가 더 쉽습니다.

테스트하지는 않았지만 거의 완전히 읽었습니다. 굉장했습니다. 실제로 메모리에서 bash 복사본을 찾으려고 노력했습니다. 약간 검색했습니다. 에 /usr/bin, 나는 chroot와 함께 무엇이든간에 말했다 ... 굉장.
Ravexina

1
질문, /proc/$$/exe링크가 /bin/bash아닙니까? /bin제거 하면 어떻게 작동 합니까? (작동하지만 어떻게), 나는 그것이 깨진 링크라고 생각했습니다 ... 그래서이 아이디어를 남겨 두었습니다.
Ravexina April


1
PATH = / usr / lib / klibc / bin : $ PATH는 고양이를
Joshua

@Joshua 그리고 그들 모두는 정적으로 연결되어 있습니다! 좋은!
muru

7

당신은 할 수 일시적으로 당신에 라이브 CD 나 다른 시스템에서 파일을 넣어 /bin다음 실행하여 우분투 설치에서 파일로 교체, 시스템이 사용할 수 있도록 apt-get install --reinstall에서 물건을 패키지 /bin.


이것이 내가 할 일입니다. 버전 번호가 동일한 라이브 DVD는 현재 설치된 것과 정확히 동일하지 않은 경우 거의 동일합니다. 디스크 또는 USB Live 버전이 있다면이를 비교하여 답변을 게시 할 수 있습니다. OP가 처음부터 / bin을 삭제하지 않은 경우이 스레드는 더 이론적입니다. 아직도 아주 좋은 생각 실험과 훌륭한 작문 스타일.
WinEunuuchs2Unix

이 작업을 수행하는 방법에 대한 특정 세부 정보로 확장 하려면 이 답변 을 편집하는 것이 좋습니다 . ( AskUbuntu에서 어떤 종류의 답변이 가장 가치있는 것으로 간주되는지에 대한 일반적인 조언은 좋은 답변을 작성하는 방법을 참조하십시오 .)
David Foerster

1

에 일부 추가 이 우수한 대답 나는이 문제가 발생, 후 (삭제와 함께 /boot, /etc, /lib/lib64) :

  • chroot요구 /lib하고 /lib64존재한다; 그렇지 않으면 다음과 같은 오류가 발생합니다.
    failed to run command ‘/bin/bash’: No such file or directory
    LiveCD OS에서이 파일을 복사했으며 복원하는 데 아무런 문제가 없었습니다. 시스템에 설치 한 패키지에 따라 YMMV
  • 위에서 언급 한 답변을 편집 할 수는 없지만 오타
    cp /etc/resolv.conf /mnt/etc/resolv.cof
    가 있습니다.
    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /bootgrub 도구를 사용하여 쉽게 복원 할 수 있습니다. 여기를 참조 하십시오 .
  • 이 답변이 권장 apt install --reinstall <package>에서 누락 된 파일을 복원 할 수있는 좋은 방법입니다 /bin, /lib하고 /lib64.
    • 재설치를 요구 일부 패키지 : libaio1, mysql-server, openvpn,vsftpd

자기 참고 :
rm -rf folder /*동일하지 않습니다rm -rf folder/*

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.