'rm -rf /'는 시스템의 모든 파일을 어떻게 삭제할 수 있습니까?


81

우분투 에서이 명령을 시도하지 않았으므로 (확실한 이유로) 우분투가 실행을 허용하는지 확실하지 않습니다. 그러나 모든 것을 삭제하는 것으로 유명합니다. 호기심 때문에 커널과 /bin삭제 시 어떤 일이 발생 합니까? rm런타임 스택 은 어떻게 유지됩니까? rm파일 시스템과 통신하고 삭제를 완료하려면 어떻게 해야합니까? 하드웨어와 어떻게 통신합니까?


18
rm -rf /가 없으면 아무 것도 삭제하지 않습니다 --no-preserve-root.
muru April

47
리눅스에 대한 나의 첫 경험은 우분투 vm을 만들어서 "rm -rf /"할 수 있도록하는 것이었다. 나는 이것을 시도하는 것이 좋습니다. 설치가 매우 빠르며 호스트를 안전하게 유지하고 OS의 다른 부분이 눈앞에서 무너지는 것을 보는 것은 매우 즐겁습니다. 매우 만족합니다.
DJMcMayhem

21
내가 좋아하는 절제된 버그 리포트 : bugzilla.redhat.com/show_bug.cgi?id=1202858 "예상 결과 : 오징어가 다시 시작됩니다. 실제 결과 : 모든 파일이 컴퓨터에서 삭제됩니다."

9
유닉스 복구 범례를 읽어야 합니다. 여전히 셸에 로그인되어 있으면 시스템이 완전히 죽지 않습니다!
200_success

2
@gerrit 내가 했어 . :)
muru

답변:


79

/bin/rm삭제 된 것은 중요하지 않습니다 . 그것은 한 번만 실행되며 그 시점까지는 파일 시스템과 디스크에 삭제를 계속 보내는 데 필요한 모든 것과 마찬가지로 메모리에 모두로드됩니다.


사이드 바 / 업데이트 :데이비드 엘저의 대답 (코멘트에 언급), 아이 노드 하드 링크 /bin/rm바로 때까지 남아있을 것입니다 가리키는 데 사용 rm완료 (리눅스는 오픈 상태로 유지하기 때문에) 하지만 그 사실은 무관하다; 디스크의 상태는 전혀 중요하지 않습니다.

바이너리는 실행되기 전에 메모리에로드됩니다. rm디스크 데이터를 수동으로 제거 할 수 있더라도 디스크를 사용할 수 없다고 가정하면 삭제 완료에 영향을 주거나 중지하지 않습니다.

아이 노드 나 하드 링크가 무엇인지 모르십니까? 이것이 내가 해결 한 대답입니다.


어쨌든, 이것이 컴퓨터가 파열되지 않고 현재 커널에 대한 패키지를 삭제할 수있는 이유이기도합니다 . 다른 버전을 설치하면 부팅 할 수 있습니다.

다시 한번, 이것은 rm한 번만 호출 되기 때문에 작동합니다 . 다음 /bin/rm 모든 파일 이름에 대해 한 번만 호출하기 때문에 사망 후 실패합니다 .

find / -exec rm {} \;

즉 말했다, find / -exec rm -rf {} +그리고 find / -print0 | xargs -0 rm -rf둘 다 인수 제한이 있기 때문에 둘 가능성이 그들은 단지 다시 호출되기 전에 파일의 번호를 삭제 것이라고 의미 실패합니다. 여행을 따라 어떤 시점에서, /bin/rm만료 수 ( 해제) 나머지 파일이 삭제되기 전에. 그러나 보장되지는 않습니다. 경우 /bin/마지막으로 입력 한 디렉토리 있었다, 이러한 방법은 작동합니다.


7
@DavidHoelzer가 설명했듯이, 링크되지 않은 파일은 계속 작동하기 위해 메모리에 이미있을 필요는 없습니다. 커널은 열린 파일 핸들이 있다는 것을 알고 있으므로 마지막 핸들이 닫힐 때까지 모든 요청 (페이지 인 포함)을 충족시키기 위해 파일 데이터를 유지합니다.
Andrew Medico

4
@Desty, 아니, 그것은 /bin/rm마지막 배치에 도달 하기에 충분히 가까워 지지 않는 한 성공하지 못할 것이다 ; -exec ... {} +(백 슬래시 이스케이프는 필요하지 않음) 여전히 여러 번 실행됩니다. 파일 당 하나가 아니라 ARG_MAX에 들어갈 수있는 인수 수에 따라 배치 당 하나입니다.
Charles Duffy

6
@Oli, 그것은 페이징에 관한 것이 아닙니다. 참조 카운터는 디렉토리 항목이 아닌 inode에 연결되며 열린 파일 핸들은 참조 (하드 링크와 동일)로 간주되어 inode의 할당이 해제되지 않습니다. 파일 크기는 전혀 영향을 미치지 않으며 스왑 공간이 없기 때문에 (따라서 페이징이 없어도) 발생합니다.
Charles Duffy

2
@CharlesDuffy 스왑 공간이 있는지 여부에 관계없이 페이징은 모든 메모리 매핑 파일에 사용됩니다. 여기에는 모든 실행 파일과 라이브러리가 포함됩니다. 실제로 스왑 공간이 부족하면 실제로 메모리 매핑 된 파일에 대해 더 많은 페이징이 진행될 수 있습니다.
kasperd

2
@CharlesDuffy 네, 크기는 실제로 관련이 없습니다. 파일을 메모리 매핑하면 파일의 내용이 액세스 될 때까지로드되지 않습니다. 필요한 경우 파일의 액세스 된 부분을로드하는 데 사용되는 메모리를 다시 해제 할 수 있으며, 그 후 다시 액세스하면 파일에서로드됩니다. 따라서 파일은 실제로 파일 시스템이 매핑되어있는 한 파일 시스템에 남아 있어야하며, 이는 전체 주소 공간에 걸쳐있을만큼 큰 파일에 대해 한 페이지 파일에 대해 동일한 방식으로 작동합니다. (세부 사항은 동적 연결에 필요한
COW (

57

우분투 에서이 명령을 시도하지 않았으므로 (분명한 이유로) 우분투가 실행을 허용하는지 확실하지 않습니다.

나는했다. 루트 계정을 사용하여 다른 컴퓨터에서 rm -rf / --no-preserve-root연결하는 동안 컴퓨터에서 직접 열린 루트 세션에서 실행 중이었습니다 ssh.

무슨 일이 발생하면 다음 과 같은 많은 메시지가 나타납니다.

rm : '/ ...'를 제거 할 수 없습니다 : 작업이 허용되지 않습니다

또는:

rm : '/ ...'를 제거 할 수 없음 : 장치 또는 리소스 사용 중

여기에 이미지 설명을 입력하십시오

놀랍게도, ssh작업이 끝날 때까지 연결이 열린 상태로 유지되었습니다. 연결을 닫고 다시 열어서 오류가 나타나는 경우에만 발생합니다.

소켓에서 읽지 못했습니다 : 피어에 의한 연결 재설정

머신에는 네 개의 디렉토리가 남아 있습니다.

  • /dev. 장치 파일이 저장되는 곳입니다.
  • /proc— 커널이 만든 메모리 내 파일 시스템.
  • /run데몬의 표준화 된 파일 시스템 위치입니다.
  • /sys. 이를 통해 시스템 및 해당 구성 요소에 대한 정보를 얻을 수 있습니다.

이것은 남은 것이 많지 않고 할 일이 많지 않다는 것을 의미합니다. 를 사용할 수는 없지만 ls( Tab디렉토리를 사용할 때 디렉토리와 파일 이름은 계속 표시됩니다). 당신은 cd다른 디렉토리와 echo물건에서 할 수 있지만 같은 명령 cat은 더 이상 사용할 수 없습니다.

더 없습니다 sudo중 하나.

shutdown -h now또한 reboot사라져서 유일한 옵션은 기계를 수동으로 끄는 것 같습니다. exit멋진 "로그 아웃"텍스트가 표시 되더라도 로그 아웃 ( )이 작동하지 않습니다.

컴퓨터를 다시 부팅하려고하면 멋진 GRUB 오류 15가 표시되고 아무 일도 일어나지 않습니다.이 시점에서 rm시스템에 문제가 있다고 생각하기 시작할 수 있습니다.

여기에 이미지 설명을 입력하십시오

너도 할 수있어

아니, 잠깐만, 기계에서하지 마라!

대신 가상 머신 을 실행하는 것이 가능 합니다 . VM은 실험을 정말 쉽게 만들어주는 이점이 있습니다. Ubuntu를 사용하고 있으므로 vmbuilder에 관심이있을 수 있습니다 . 이 도구를 사용하면 몇 분 안에 가상 머신을 배포 할 수 있습니다 (공식 문서에서는 "약 1 분 안에"수행 할 수 있다고 주장하지만 실제 하드웨어는 빠른 하드웨어 일지라도 약 2-3 분이 소요됩니다) .

배포가 끝나면 사용할 수있는 환경이 생깁니다. 시스템을 파괴하면 문제가되지 않습니다. 시스템을 다시 배포하고 2 분 후에 계속할 수 있습니다.

VMWare와 같은 소프트웨어를 사용하는 경우 스냅 샷에 관심이있을 수 있습니다 (무료 VMWare Player에는이 기능이 없으므로 VMware Workstation을 구입해야 함). Hyper-V는 무료이며 스냅 샷을 지원하지만 Windows를 실행해야합니다.

스냅 샷의 장점은 밀리 초 안에 스냅 샷을 찍을 수 있다는 것입니다. 스냅 샷으로 롤백하는 데 시간이 오래 걸리지 만 종종 초 단위입니다. 이를 통해 실험이 더욱 쉽고 빨라집니다.

이 실험은 운영 체제 자체에만 국한되지 않습니다. 소프트웨어와 관련된 모든 작업을 수행 할 수 있습니다. 의심스러운 응용 프로그램이 있습니까? VM에서 테스트하십시오. 바이러스 인 경우 아무런 해를 끼치 지 않습니다. 환경에 영향을 줄 수있는 데이터베이스에서 작업을 테스트하고 싶습니까? VM에서 테스트하십시오.

테스트를 거치지 않은 실제 머신에서 수행 한 경우

나쁜 일이 일어납니다. rm자신 을 보호하십시오 : rm -rf /작동하지 않습니다 :을 사용해야 --no-preserve-root합니다. 그래도 실수로 모든 것을 제거하기 위해 실제로 달성했다면 어떨까요?

rm파일의 링크 만 해제 하지만 데이터는 하드 디스크에 그대로 있습니다. 따라서 나중에 복구 할 수 있습니다 (따라서 더 이상 작동하지 않을 때 중요한 데이터가있는 하드 디스크를 버려서는 안됩니다).

즉, 거의 모든 파일 을 실제로 복구하려면 하드 드라이브 인클로저가있는 예비 PC 만 있으면됩니다 . 중요한 것은 복구하기 위해 하드 디스크에 아무것도 쓰지 않는 것입니다. 기록하는 데이터는 연결되지 않은 파일을 덮어 씁니다.

200_success 's comment의 기사에서 알 수 있듯이 똑똑하게 행동하면 여분의 PC가 없어도 기계를 다시 가져올 수 있습니다. 데이터에만 관심이 있다면 귀찮게하지 않을 것입니다. 여분의 PC로 데이터를 복구하는 것이 훨씬 쉽습니다.


VirtualBox는 디스크 스냅 샷을 지원합니다.
Nathan Osman

1
바이러스는 종종 VM을 탐지하도록 설계되었으므로이 바이러스 탐지 프로세스는 권장하지 않습니다. 작은 질문 : 나머지 4 개의 디렉토리가 "실제"디렉토리가 아닌가? 그들은 실제로 하드 드라이브에 있지 않습니까? 이 명령을 실행 한 후 하드 드라이브에 무엇이 남아 있습니까?
raptortech97

2
@ raptortech97 rm은 하드 드라이브에서 실제로 내용을 지우는 것이 아니라 파일 시스템 트리에서 디스크의 실제 데이터를 "연결 해제"(연결 해제)하여 사용 가능한 것으로 표시합니다 (일반적인 컴퓨터 사용을 통해 결국 덮어 쓸 수 있음). 따라서 rm -rf ~예를 들어와 같이 빠르게 행동하는 한 모든 것이 손실되는 것은 아닙니다 extundelete. 사서함에서 "삭제 된"폴더의 더 신뢰할 수없는 버전으로 생각할 수 있습니다. 너무 오래 기다리지 않으면 다시 가져올 수 있지만 결국 제거됩니다.
Thomas

어떤 이유로 당신이 사용하지 않은 경우 @ 한편 raptortech97은, rm하지만 shred당신은 아마 당신의 실수를 깨닫고 분쇄가 더 오래 걸립니다 이후 중단 시간을해야하지만, 그것은 거의 게임은 끝났어.
Thomas

5
보관되는 디렉토리는 대부분 어떤 형태의 마운트 지점 일 가능성이 높습니다. 그리고 계속 작동하는 명령은 별도의 바이너리가 아닌 bash 내장 명령입니다. 따라서 ls사라지는 동안 for i in /*; do echo $i; done작동해야합니다. 그리고 바꾸 cat려면 다음과 같은 명령을 사용할 수 있습니다 while read i; do echo $i; done < /proc/self/maps.
MvG

25

그 이유는 파일 이름 지정 계층 (으로 표시되는 항목 ls)이 실제로는 편의를위한 것입니다. 파일 시스템 드라이버와 커널은 inode 만 관리합니다. 파일이 이름으로 참조되면 권한, 디스크의 데이터 블록, 소유자 ID, 그룹 ID 및 링크 수를 포함한 모든 메타 데이터를 포함하는 inode로 즉시 변환됩니다.

링크 수는 여기서 정말로 중요합니다. UNIX 시스템에서 파일을 삭제하면 실제 시스템 호출은입니다 unlink. 실제로 발생하는 것은 해당 inode를 가리키는 링크 수 (파일 이름 지정 계층의 파일 이름 수)가 감소한다는 것입니다. 파일 시스템은 링크 수가 0에 도달하면 파일이 삭제됨을 알고 있습니다.

파일이 삭제 rm되면 디렉토리 파일도 편집됩니다 (예, 파일 이름과 inode를 포함하는 파일 일뿐 아니라이 답변에 중요하지 않은 몇 가지 다른 비트 일뿐입니다). 그러나 실제로 디스크 리소스를 해제하는 것은 연결 해제입니다.

이것은 다른 흥미로운 효과로 이어집니다. 먼저, 링크 카운트가 0 인 파일을 열 수 있습니다. 에 rm -rf /대한 항목을 삭제할 때 발생 합니다 /bin/rm. 파일이 열려 있지만 (파일 핸들이 있지만) inode가 삭제 된 것으로 표시됩니다 (링크 수 = 0). 파일 핸들이 닫힐 때까지 디스크 리소스가 해제되어 재사용되지 않습니다.

또 다른 흥미로운 효과는 링크 개수가 0보다 큰 아이 노드가 있지만 파일 명명 레이어에 아무것도없는 경우에 발생합니다. 이것은 어떤 의미에서 매우 숨겨진 파일입니다 :). 그것에 접근하려면 이름이 아닌 inode 번호로 참조하기 위해 낮은 수준의 무언가를 사용해야하거나 (16 진수 편집기를 사용하여 inode를 가리 키도록 디렉토리 항목을 편집해야합니다.)

세 번째 흥미로운 효과는 링크 수를 0으로 줄이지 만 어쨌든 디렉토리 항목을 inode로 지정하면 발생하는 현상입니다. 원한다면 실험 해 보도록하겠습니다. 그러나이 마지막 두 파일 모두 파일 시스템이 일관성이없는 상태가되게합니다.


다른 방법으로 보면 파일을 열면 / proc 내에 링크가 추가되므로 링크 수가 0이 아닙니다.
OrangeDog

@OrangeDog, procfs가 마운트 해제 된 경우에도이 동작은 여전히 ​​존재합니다.
Charles Duffy

1
@OrangeDog Charles Duffy가 정확합니다. / proc의 파일 핸들 은 링크 수를 조정하여 inode를 수정 하지 않습니다 .
David Hoelzer

/ proc 및 / sys는 현재 시스템 (커널) 상태를 반영합니다. 파일 및 디렉토리에 대한 조치 만 선택하면 실제로 시스템 상태가 변경됩니다.
CVn

18

이전 답변은 좋지만 세부 사항을 명확히하고 싶습니다.

rm단순한 명령이 아닙니다. 에있는 프로그램입니다 PATH.

따라서 실행할 때 발생하는 상황은 다음과 같습니다.

  • 당신은 (루트로) 전화 rm -rf /
  • 프로그램의 인스턴스는 rm인수 -rf와 함께 메모리에로드 되고/
  • 이 인수에 기초하여 프로그램 rm은 작업을 시작합니다 (마운트 / 파티션의 모든 것을 거치고 참조를 재귀 적으로 제거합니다 (기술적으로 죄송합니다))).
  • 완료되면 rm프로그램 인스턴스 가 언로드됩니다.
  • 이 시점에서 메모리에있는 유일한 것은 이전에로드 된 프로그램입니다 (예 : 우분투에서 터미널을 열면 bash, 데스크탑 환경, 커널, 드라이버 등)
  • 다른 명령을 호출하려고 시도하면 (Linux의 경우 독립형 프로그램이 됨) PATH 위치에 해당 프로그램이 없으므로 PATH 위치가 더 이상 존재하지 않기 때문에 실패합니다. 그러나 한 번로드 된 모든 것은 여전히 ​​실행됩니다.

작동 방식을 이해하기 위해 Ubuntu (Virtualbox), 일부 스크립트 및 PHP opcode 캐시에 LAMP를 설치 한 다음이 사악한 명령을 호출하십시오. 놀랍게도 (만약 운이 좋고 opcode 캐시가 PHP 파일 삭제를 알지 못하는 경우) 아파치 웹 서버를 통해 외부에서 PHP 스크립트에 계속 액세스 할 수 있습니다!

추신 :이 악의적 인 명령은 root wont delete로 실행되었으므로 everything커널 특권 프로세스를 /proc삭제할 수 없으며 /dev시스템에 파일로 나타나는 장치 에서 일부 항목을 삭제할 수 없습니다 . 사실, 루트는 우리가 생각하는 것처럼 전능하지 않습니다. 반면에 커널은 그렇습니다.

PPS : 또한 두 번째 생각 locked으로 삭제 시도시 다른 프로세스에 의한 파일이 여전히 있습니다 .


Linux에서는 루트로 실행할 때 장치 노드를 확실히 제거 할 수 있습니다. 그러나 예, /proc읽기 전용 파일 시스템이므로 아무것도 삭제할 수 없습니다 . 마찬가지로 /sys. 마운트 포인트도 삭제할 수 없다고 생각합니다.
Brian

@AlexKey 나는 "비 커널 내장 명령"의 의미를 명확히하기 위해 (또는 그 문구를 완전히 피하기 위해) 편집하는 것이 좋습니다. 커널에서 직접 구현 된 셸을 통해 실행할 수있는 명령이 있으므로 항상 작동합니다. (알다시피, 많은 독자들은 그렇지 않을 수도 있지만, 그렇지는 않을 것입니다.과 같은 명령을 실행할 때 cd,이 이름으로 내장쉘을 호출합니다. 이 명령은 커널이 아니라 쉘에 내장되어 있습니다.) Alt + SysRq "명령"을 의미합니까?
Eliah Kagan

@Brian은 배포판에 의존합니까? 나는 다양한 배포판에서 일했고 재미있게이 실수가 여러 번 발생했다고 들었습니다. 내가 유물을 조사한 후 기억했던 것처럼 / dev에는 여전히 무언가가 있었지만 cdrom이나 floppy와 같은 것들이 될 수 있습니다 ...
Alexey Kamenskiy

@EliahKagan 배포판을 독립적으로 유지하려고 노력하면서이 용어를 사용했습니다. 모든 시스템에서 cli 명령이 외부 프로그램을 의미하는 것은 아닙니다. 그러나 그것을 지적 해 주셔서 감사합니다. 요점을 분명히 할 것입니다.
Alexey Kamenskiy

@AlexKey /dev/pts마운트 포인트이므로 제거 할 수 없다고 생각합니다 . (또한 읽기 전용 파일 시스템도 있습니다.)
Brian

1

하드 드라이브에서 모든 것이 지워지면 커널은 여전히 ​​작동하지만 장치와 프로그램, 명령 등이 남아 있지 않아 일종의 붙어 있습니다.

OS가 더 이상 작동하지 않습니다.

그리고 Oli가 말한 것은 사실입니다. 명령이 메모리에로드 / 실행 되며이 프로세스를 종료하지 않으면 (물론 kill 명령이 여전히 존재하는 경우 ^^) 아무것도 멈추지 않습니다.


4
왜 커널이 멈출까요? MainMa의 대답은 그렇지 않으면 제안하고 내가 기대했던 것을 뒷받침합니다.
MvG

4
프로그램은 하드 드라이브가 아닌 메모리에서 실행됩니다. 커널은 재부팅 할 때까지 어떤 것도 잘못 알지 못합니다.
phyrfox

아마도 내가 사용한 단어를 바꿔야 할 수도 있고, 커널은 장치 나 프로그램 등이없이 "고착"되어 있으며, 루트 콘솔 앞에 있지 않다면 나쁜 일을 할 수 없습니다. 콘솔은 나쁜 일을 할 수 없습니다. 그러나 오해의 소지가 있으므로 답변에서 문구를 바꿀 것입니다.
s1mmel

0

시스템에 selinux가 있고 selinux가 강제 모드에 있고 selinux의 정책이 올바르게 설정되어 있음을 유의하십시오. 아무 일도 일어나지 않을 것입니다.

Selinux는 필수 액세스 제어입니다. 즉, 루트 사용자는 시스템의 다른 사용자보다 시스템을 파괴 할 수있는 권한이 실제로는 많지 않습니다.

Selinux는 커널에서 시행됩니다. 커널을 해결하려면 커널을 손상시켜야합니다.

좋은 Selinux 정책을 가진 잘 설계된 시스템에서 root는 시스템에서 많은 것을 할 수 없습니다.

안드로이드의 이후 개정판은 이런 이유로 Selinux를 적용했습니다.

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