휴지통 및 기타 폴더를 이동했습니다! 다시 돌려받는 방법?


13

실수로 모든 폴더를 루트에서 하위 폴더로 옮겼습니다. ( /bin, /etc, /home, /lib, /usr그들이 사용 된 이후, 이동되지 않은 유일한 사람 ... 모든 이동)이다 /bak, /boot, /dev, /proc, /sys.

이제 내가 실행하려고하는 명령은 단순히 발생하지 않습니다. 나는 끊임없이 "그런 파일이나 디렉토리가 없다"고 생각합니다.

ssh와 ftp를 통해 연결되었지만 직접 SU 로그인이 비활성화되어 ftp를 통해 파일을 이동할 수 없습니다. 거기에서 직접 무언가를해야하는 경우에도 실제 서버에 액세스 할 수 있습니다.

/bin폴더 를 찾을 위치를 알려주기 위해 구성 파일을 편집해야하고 다시 액세스하는 데 도움이 될 것이라고 가정하지만 어떤 파일인지 또는 수행 방법을 알지 못합니다. chmod권한을 변경하기 위해 실행할 수도 없습니다 ).

다시 설치하는 것 외에 다른 방법이 있습니까?

CentOS의 이전 버전을 작업 중입니다.

나는 리눅스의 세계에 매우 익숙하기 때문에이 행동과 질문은 ...


귀하의 문제에 대한 해결책은 아니지만 lug.wsu.edu/node/414 비슷한 상황이지만 실제로 / bin을 삭제했습니다.
stribika

답변:


33

여전히 루트 셸이 있으면 시스템을 복구 할 수 있습니다. 이제 당신은 모든 일반 디렉토리를 이동한다고 가정 해 봅시다 ( /bin, /etc, /lib, /sbin, /usr- 이러한 회복을 어렵게 만들 수있는 것들입니다)에서 /oops.

mv전체 경로를 지정하더라도 명령을 직접 실행할 수 없습니다 /oops/bin/mv. 동적으로 연결되어 있기 때문 mv입니다 . 디렉토리를 이동 했기 때문에 코드의 일부를 구성하는 라이브러리를 찾을 수 없으므로 실행할 수 없습니다. 사실, 그보다 더 나쁜 : 찾기 수 없습니다 동적 로더 (이름이 아키텍처와 유닉스 변종에 따라 달라질 수 있으며, 디렉토리 등의 다른 이름이 될 수 또는 ). 따라서 디렉토리를 다시 이동할 때까지 링커를 명시 적으로 호출하고 이동 된 라이브러리의 경로를 지정해야합니다. 다음은 데비안 스퀴즈 i386에서 테스트 한 명령입니다./libmvmv /lib/ld-linux.so.2/lib32/lib64/lib

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

다른 배포판이나 아키텍처에 대해서는 약간 조정해야 할 수도 있습니다. 예를 들어 x86_64의 CentOS의 경우 :

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

무언가를 망 쳤을 때 /lib정적으로 링크 된 도구 상자를 감싸는 데 도움이됩니다. 일부 배포판 (CentOS에 대해 모른다)은 정적으로 링크 된 Busybox 사본을 제공합니다 . 많은 명령이 내장 된 독립형 쉘인 sash 도 있습니다 . 이 중 하나가 있으면 복구를 수행 할 수 있습니다. 사실 전에 설치하지 않은 경우 너무 늦습니다.

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

더 이상 루트 셸이 없지만 SSH 데몬이 수신 대기 중이고 ssh를 통해 루트로 직접 로그인 할 수 있으며 이러한 정적으로 링크 된 도구 상자 중 하나가있는 경우 ssh를 입력 할 수 있습니다. 당신이 이동 한 경우에 사용할 수 있습니다 /lib/bin있지만 /etc.

ssh root@broken.example.com /oops/bin/sash
root@broken.example.com's password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

일부 관리자는 정적으로 연결된 셸을 사용하여 대체 계정을 설정하거나 이러한 종류의 문제에 대해서만 루트 계정을 정적으로 연결된 셸을 사용하도록합니다.

루트 셸이없고 예방 조치를 취하지 않은 경우 Linux 라이브 CD / USB로 부팅해야합니다 (최근 디스크와 파일 시스템에 액세스 할 수있을 정도로 오래 지속되는 경우). 파일을 다시 이동하십시오.


1
질 감사합니다. 앞으로주의해야 할 사항에 대한 유용한 정보를 제공했습니다.
Menelaos

고마워 질스! 이것은 나를 구했다. 64 비트 리눅스 환경에 대한 편집을 추가했습니다. 제 경우에는 64 비트 CentOS 7
CompEng88

@ ComputerEngineer88 감사합니다. 그러나 수정을 할 때“편집”마커를 추가하거나 해당 게시물이 아닌 게시물 끝에 추가하지 마십시오. 텍스트의 흐름을 유지하십시오. 사람들이 게시물에 포함 된 내용을 알고 싶다면 게시물에 수정 기록이 있습니다. 사람들이 게시물을 정상적으로 읽을 때 나중에 약간 추가 된 것을 신경 쓰지 않습니다.
Gilles 'SO- 악마 그만해'

정말? 나는 항상 편집에 중점을 둡니다. 새로운 것을 배웠고 가장 중요한 것을 나에게 의미합니다. 사람들이 이익을 얻는 한 모두 동일합니다!
CompEng88

@ ComputerEngineer88 Stack Overflow를 사용하기 시작했을 때 동일한 반사가 발생했습니다. 그러나 실제로 Stack Exchange 게시물은 여러 가지면에서 토론 포럼의 게시물보다 Wikipedia 기사에 더 가깝습니다. 사람들은 게시 된 직후 포럼 게시물을 읽을 것으로 예상되므로, 편집 된 경우 시각적 표시를하는 것이 좋습니다. 그러나 누군가가 2027 년에이 실을 본다고 가정 해 봅시다. 2011 년 이후로 문단이 있었는지 2019
Gilles 'SO- 악의를 멈춰라'

11

재부팅하지 않고 복구 할 수 있으므로 부팅되지 않으므로 다른 작업을 시도 할 때까지 재부팅하지 마십시오. 여전히 SSH 세션이 열려 있으면 다음을 시도하십시오.

  • 프로그램이 실행되는 위치는 $ PATH 변수를 사용하여 설정됩니다. 를 실행하여 경로에 새 빈 위치를 추가 할 수 있습니다 export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin". 해당 sbin 디렉토리도 추가해야 할 수도 있습니다. 전체 경로 /path/to/mv [from] [to]를 통해 프로그램을 수동으로 실행할 수도 있습니다. 예를 들어 mv가 다른 위치에 있더라도 작동해야합니다. 까다로운 부분은 대부분의 명령이 공통 라이브러리에 액세스하기를 원하고 /lib이동되었다는 것이므로 해당 위치에 변수를 설정해야합니다.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • 몇 가지 기본 명령을 실행할 수 있으면 다시 이동하십시오! mv /path/to/subfolder/* /순서대로 될 것입니다! 모든 것이 제자리에 돌아 오면 시스템은 정상적으로 작동해야합니다.

실패하면 모든 LiveCD를 부팅하고 드라이브를 마운트하면 폴더가 속한 곳으로 폴더를 다시 이동할 수 있습니다. distros livecd를 다시 설치하거나 사용할 필요가 없습니다. 드라이브를 마운트하고 폴더를 디스크의 올바른 위치로 다시 옮기기 만하면됩니다. 많은 리눅스 기반 복구 디스크는 이러한 종류의 복구를 수행하는 몇 가지 기본 콘솔 도구를 제공합니다.


SSH를 통한 작업이 실패하여 liveCD를 다운로드했으며 작업을 수행하려고합니다. 나는 grub에 있고 드라이브를 마운트하려고 노력하고 있지만 커널이로드되지 않았기 때문에 허용하지 않습니다. 기존 경로의 정확한 경로를 볼 수없는 것은이를 어렵게 만듭니다 ...
Menelaos

1
라이브 부팅, 디스크 마운트, 물건을 올바른 위치로 옮기고 시스템으로 재부팅 ... 행운을 빕니다.
Caleb

2
설정하기에 충분하지 않습니다 . LD_LIBRARY_PATH예를 들어 동적 로더를 명시 적으로 호출해야합니다 LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv.
Gilles 'SO- 악한 중지'

4

단일 사용자 모드에서 설치 CD를 사용하여 컴퓨터를 재부팅하고 루트 파일 시스템을 마운트 한 후 Linux에서 파일을 다시 이동할 수 있어야합니다. 나는 많은 centos를 알지 못하지만 RHEL과 비슷하므로 이것이 효과가 있습니다.


우리가 말한대로 다운로드하고 있습니다. 라이브 CD 또는 전체 설치 DVD라면 차이가 있습니까?
Menelaos

@ Menelaos : 설치하고 싶지 않고이 솔루션을 위해 라이브로 실행할 수있는 것을 원합니다. 일부 설치 디스크에는 라이브 버전이 있지만 일부는 바로 설치하지 않으려 고합니다. 일부는 실제로 원하는 "레스큐"모드를 가지고 있지만 전용 리눅스 복구 디스크도 있습니다. 그것은 배포판 일 필요는 없으며 Linux 파일 시스템을 마운트하고 폴더를 다시 이동할 수있는 것이어야합니다. 내 대답을 참조하십시오.
Caleb

본다 sysresccd.org는 당신이 그것을 사용하는 방법을 볼 수있는 폭 넓은 문서를 가지고 좋아하는 경우에 복구 CD 중 하나를 확인합니다. 이 포럼에서이 문제를 해결하는 데 도움을주는 것은 어려울 수 있습니다. 그렇지 않으면 centos CD가 도움이 될 것입니다. 최신 라이브 CD가 작동하거나 작동하지 않을 수 있습니다 ... 이러한 종류의 문제를 염두에두고 설치 한 버전의 설치 미디어 / iso를 항상 유지해야합니다. 또한 전체 파일 시스템의 백업을 만듭니다.
Jamess

2

5 년이 지난 후에 Gilles에게 많은 감사를 표하며 게시물이 일주일이 아니라면 여전히 내 하루를 구했습니다.

나는 현재 폴더에 대신의 하위 폴더의 내용을 이동하기위한 것 mv sub/* ., 내가 한 mv sub /* .내가 현재 폴더에 모든 것을 이동 있도록. 운 좋게도이 답변을 찾았으며 비교적 쉽게 내 컴퓨터를 수정할 수있었습니다. 그러나 우분투 16.04를 실행하는 x86_64 컴퓨터에서 작업 중이므로 명령을 약간 조정해야했습니다. 누군가 어려움을 겪고있는 경우 여기에 지침을 남기고 싶습니다.

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/* /

0

최신 시스템 (유닉스를 실행하는 x86_64 시스템)에 Ktipr의 답변 을 적용한 후 수행 할 명령을 몇 개 더 추가하고 싶습니다. 오류가 표시된 것처럼 mv로 디렉토리 "etc"를 가져올 수 없었습니다.

Error : Directory not empty

그래서 나는 사용해야했다

rsync -a source_file target_location

모든 것을 순서대로 되돌릴 수있었습니다. 아직 설치하지 않은 경우 먼저 설치해야합니다.

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