실수로 모든 폴더를 루트에서 하위 폴더로 옮겼습니다. ( /bin
, /etc
, /home
, /lib
, /usr
그들이 사용 된 이후, 이동되지 않은 유일한 사람 … 모든 이동)이다 /bak
, /boot
, /dev
, /proc
, /sys
.
이제 내가 실행하려고하는 명령은 단순히 발생하지 않습니다. 나는 끊임없이 “그런 파일이나 디렉토리가 없다”고 생각합니다.
ssh와 ftp를 통해 연결되었지만 직접 SU 로그인이 비활성화되어 ftp를 통해 파일을 이동할 수 없습니다. 거기에서 직접 무언가를해야하는 경우에도 실제 서버에 액세스 할 수 있습니다.
/bin
폴더 를 찾을 위치를 알려주기 위해 구성 파일을 편집해야하고 다시 액세스하는 데 도움이 될 것이라고 가정하지만 어떤 파일인지 또는 수행 방법을 알지 못합니다. chmod
권한을 변경하기 위해 실행할 수도 없습니다 ).
다시 설치하는 것 외에 다른 방법이 있습니까?
CentOS의 이전 버전을 작업 중입니다.
나는 리눅스의 세계에 매우 익숙하기 때문에이 행동과 질문은 …
답변
여전히 루트 셸이 있으면 시스템을 복구 할 수 있습니다. 이제 당신은 모든 일반 디렉토리를 이동한다고 가정 해 봅시다 ( /bin
, /etc
, /lib
, /sbin
, /usr
– 이러한 회복을 어렵게 만들 수있는 것들입니다)에서 /oops
.
mv
전체 경로를 지정하더라도 명령을 직접 실행할 수 없습니다 /oops/bin/mv
. 동적으로 연결되어 있기 때문 mv
입니다 . 디렉토리를 이동 했기 때문에 코드의 일부를 구성하는 라이브러리를 찾을 수 없으므로 실행할 수 없습니다. 사실, 그보다 더 나쁜 : 찾기 수 없습니다 동적 로더 (이름이 아키텍처와 유닉스 변종에 따라 달라질 수 있으며, 디렉토리 등의 다른 이름이 될 수 또는 ). 따라서 디렉토리를 다시 이동할 때까지 링커를 명시 적으로 호출하고 이동 된 라이브러리의 경로를 지정해야합니다. 다음은 데비안 스퀴즈 i386에서 테스트 한 명령입니다./lib
mv
mv
/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로 부팅해야합니다 (최근 디스크와 파일 시스템에 액세스 할 수있을 정도로 오래 지속되는 경우). 파일을 다시 이동하십시오.
답변
재부팅하지 않고 복구 할 수 있으므로 부팅되지 않으므로 다른 작업을 시도 할 때까지 재부팅하지 마십시오. 여전히 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를 다시 설치하거나 사용할 필요가 없습니다. 드라이브를 마운트하고 폴더를 디스크의 올바른 위치로 다시 옮기기 만하면됩니다. 많은 리눅스 기반 복구 디스크는 이러한 종류의 복구를 수행하는 몇 가지 기본 콘솔 도구를 제공합니다.
답변
단일 사용자 모드에서 설치 CD를 사용하여 컴퓨터를 재부팅하고 루트 파일 시스템을 마운트 한 후 Linux에서 파일을 다시 이동할 수 있어야합니다. 나는 많은 centos를 알지 못하지만 RHEL과 비슷하므로 이것이 효과가 있습니다.
답변
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/* /