실수로 루트 폴더의 모든 폴더를 하위 폴더로 옮겼습니다. ( /bin
,,,,...모두 이동했습니다.) 사용 중이므로 이동하지 않은 폴더는 /etc
,,,,뿐입니다./home
/lib
/usr
/bak
/boot
/dev
/proc
/sys
이제 실행하려는 명령이 실행되지 않습니다. 계속 "해당 파일이나 디렉터리가 없습니다"라는 메시지가 나타납니다.
SSH 및 FTP를 통해 연결하지만 직접 SU 로그인이 비활성화되어 있기 때문에 FTP를 통해 파일을 이동할 수 없습니다. 또한 실제 서버에서 직접 작업이 필요한 경우 실제 서버에 액세스할 수도 있습니다.
다시 액세스하는 데 도움이 되는 폴더를 찾을 수 있는 위치를 알려주기 위해 구성 파일을 편집해야 한다고 가정하고 있지만 /bin
파일이 무엇인지, 어떻게 해야 하는지 전혀 모릅니다. 실행하여 chmod
권한을 변경하세요).
재설치 외에는 해결 방법이 없나요?
이전 버전의 CentOS를 사용하고 있습니다.
저는 Linux 세계를 처음 접했기 때문에 이 작업과 질문은...
답변1
아직 루트 셸이 있는 경우 시스템을 복구할 수 있는 기회가 있을 수 있습니다. 자주 사용하는 디렉토리( /bin
, /etc
, /lib
, /sbin
, /usr
— 복구를 어렵게 만들 수 있는 디렉토리)를 모두 아래로 옮겼다고 가정해 보겠습니다 /oops
.
mv
전체 경로를 지정하더라도 명령을 직접 실행할 수는 없습니다 /oops/bin/mv
. mv
그러기 때문이죠동적 링크/lib
; 디렉토리를 이동했기 때문에 mv
해당 코드의 일부를 구성하는 라이브러리를 찾을 수 없기 때문에 실행할 수 없습니다. 사실, 그보다 더 나쁜 것은 mv
찾을 수 없다는 것입니다 .동적 로더 /lib/ld-linux.so.2
(이름은 아키텍처 및 UNIX 변형에 따라 다를 수 있으며, 디렉토리 이름은 /lib32
또는 와 같이 다르게 지정될 수 있습니다 /lib64
.) 따라서 /lib
디렉터리를 다시 이동하기 전에 명시적으로 링커를 호출해야 하며, 이동된 라이브러리의 경로를 지정해야 합니다. 이것은 Debian scrape i386에서 테스트된 명령입니다.
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에 대해서는 잘 모르겠습니다)은 정적으로 연결된 복사본을 제공합니다.바쁜 상자. 게다가허리띠, 많은 명령이 내장된 독립형 셸입니다. 이 중 하나가 있으면 거기에서 복원할 수 있습니다. 이전에 설치하지 않았다면 너무 늦습니다.
# mkdir /oops
# mv /lib /bin /oops
# sash
Stand-alone shell (version 3.7)
> -mv /oops/* /
> exit
더 이상 루트 셸이 없지만 여전히 SSH 데몬이 수신 대기 중이고 SSH를 통해 루트로 직접 로그인할 수 있으며 정적으로 연결된 도구 상자 중 하나가 있는 경우 SSH를 통해 로그인할 수 있습니다. 이사하면 일할 /lib
수 /bin
있지만 일할 수는 없습니다 /etc
.
ssh [email protected] /oops/bin/sash
[email protected]'s password:
Stand-alone shell (version 3.7)
> -mv /oops/* /
일부 관리자는 이 문제를 해결하기 위해 정적 링크 셸을 사용하여 대체 계정을 설정하거나 루트 계정이 정적 링크 셸을 사용하도록 허용합니다.
루트 셸이 없고 예방 조치를 취하지 않은 경우 Linux 라이브 CD/USB에서 부팅해야 합니다. 디스크에 액세스할 수 있을 만큼 새 CD/USB라면 모두 가능합니다. 파일 시스템) 파일을 다시 이동합니다.
답변2
재부팅하지 않고도 복구할 수 있으므로 부팅되지 않으므로 다른 작업을 시도하기 전에 재부팅하지 마세요. SSH 세션이 아직 열려 있으면 다음을 시도해 보세요.
프로그램이 실행되는 위치는 $PATH 변수를 사용하여 설정됩니다. 를 실행하여 경로에 새 저장소 위치를 추가할 수 있습니다
export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin"
. 적절한 항목을 추가해야 할 수도 있습니다.회전디렉토리에도 마찬가지입니다. 전체 경로로 프로그램을 수동으로 실행할 수도 있습니다./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를 부팅하고 드라이브를 마운트하면 폴더를 원래 있던 위치로 다시 이동할 수 있습니다. 배포 livecd를 다시 설치하거나 사용할 필요도 없습니다. 드라이브를 마운트하고 폴더를 디스크의 올바른 위치로 다시 이동하기만 하면 됩니다. 많은 Linux 기반 복구 디스크는 이러한 복구를 수행하기 위한 몇 가지 기본 콘솔 도구를 제공하도록 설계되었습니다.
답변3
설치 CD를 사용하여 단일 사용자 모드에서 컴퓨터를 다시 시작하고, 루트 파일 시스템을 마운트하고, 파일을 다시 Linux로 이동할 수 있습니다. 저는 centos에 대해 잘 모르지만 RHEL과 비슷하므로 이것이 작동할 것입니다.
답변4
신청 후 더 많은 명령을 추가하고 싶습니다 ktip의 답변최신 시스템(Unix를 실행하는 x86_64 시스템)의 경우 오류가 표시되므로 mv를 사용하여 "etc" 디렉터리를 이동할 수 없습니다.
Error : Directory not empty
그래서 나는 사용해야했다
rsync -a source_file target_location
모든 것을 정상으로 되돌릴 수 있는지 확인하기 위해. 아직 설치하지 않았다면 먼저 설치해야 합니다.