우분투 에서이 명령을 시도하지 않았으므로 (확실한 이유로) 우분투가 실행을 허용하는지 확실하지 않습니다. 그러나 모든 것을 삭제하는 것으로 유명합니다. 호기심 때문에 커널과 /bin
삭제 시 어떤 일이 발생 합니까? rm
런타임 스택 은 어떻게 유지됩니까? rm
파일 시스템과 통신하고 삭제를 완료하려면 어떻게 해야합니까? 하드웨어와 어떻게 통신합니까?
우분투 에서이 명령을 시도하지 않았으므로 (확실한 이유로) 우분투가 실행을 허용하는지 확실하지 않습니다. 그러나 모든 것을 삭제하는 것으로 유명합니다. 호기심 때문에 커널과 /bin
삭제 시 어떤 일이 발생 합니까? rm
런타임 스택 은 어떻게 유지됩니까? rm
파일 시스템과 통신하고 삭제를 완료하려면 어떻게 해야합니까? 하드웨어와 어떻게 통신합니까?
답변:
/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/
마지막으로 입력 한 디렉토리 있었다, 이러한 방법은 수 작동합니다.
/bin/rm
마지막 배치에 도달 하기에 충분히 가까워 지지 않는 한 성공하지 못할 것이다 ; -exec ... {} +
(백 슬래시 이스케이프는 필요하지 않음) 여전히 여러 번 실행됩니다. 파일 당 하나가 아니라 ARG_MAX에 들어갈 수있는 인수 수에 따라 배치 당 하나입니다.
우분투 에서이 명령을 시도하지 않았으므로 (분명한 이유로) 우분투가 실행을 허용하는지 확실하지 않습니다.
나는했다. 루트 계정을 사용하여 다른 컴퓨터에서 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로 데이터를 복구하는 것이 훨씬 쉽습니다.
rm
은 하드 드라이브에서 실제로 내용을 지우는 것이 아니라 파일 시스템 트리에서 디스크의 실제 데이터를 "연결 해제"(연결 해제)하여 사용 가능한 것으로 표시합니다 (일반적인 컴퓨터 사용을 통해 결국 덮어 쓸 수 있음). 따라서 rm -rf ~
예를 들어와 같이 빠르게 행동하는 한 모든 것이 손실되는 것은 아닙니다 extundelete
. 사서함에서 "삭제 된"폴더의 더 신뢰할 수없는 버전으로 생각할 수 있습니다. 너무 오래 기다리지 않으면 다시 가져올 수 있지만 결국 제거됩니다.
rm
하지만 shred
당신은 아마 당신의 실수를 깨닫고 분쇄가 더 오래 걸립니다 이후 중단 시간을해야하지만, 그것은 거의 게임은 끝났어.
ls
사라지는 동안 for i in /*; do echo $i; done
작동해야합니다. 그리고 바꾸 cat
려면 다음과 같은 명령을 사용할 수 있습니다 while read i; do echo $i; done < /proc/self/maps
.
그 이유는 파일 이름 지정 계층 (으로 표시되는 항목 ls
)이 실제로는 편의를위한 것입니다. 파일 시스템 드라이버와 커널은 inode 만 관리합니다. 파일이 이름으로 참조되면 권한, 디스크의 데이터 블록, 소유자 ID, 그룹 ID 및 링크 수를 포함한 모든 메타 데이터를 포함하는 inode로 즉시 변환됩니다.
링크 수는 여기서 정말로 중요합니다. UNIX 시스템에서 파일을 삭제하면 실제 시스템 호출은입니다 unlink
. 실제로 발생하는 것은 해당 inode를 가리키는 링크 수 (파일 이름 지정 계층의 파일 이름 수)가 감소한다는 것입니다. 파일 시스템은 링크 수가 0에 도달하면 파일이 삭제됨을 알고 있습니다.
파일이 삭제 rm
되면 디렉토리 파일도 편집됩니다 (예, 파일 이름과 inode를 포함하는 파일 일뿐 아니라이 답변에 중요하지 않은 몇 가지 다른 비트 일뿐입니다). 그러나 실제로 디스크 리소스를 해제하는 것은 연결 해제입니다.
이것은 다른 흥미로운 효과로 이어집니다. 먼저, 링크 카운트가 0 인 파일을 열 수 있습니다. 에 rm -rf /
대한 항목을 삭제할 때 발생 합니다 /bin/rm
. 파일이 열려 있지만 (파일 핸들이 있지만) inode가 삭제 된 것으로 표시됩니다 (링크 수 = 0). 파일 핸들이 닫힐 때까지 디스크 리소스가 해제되어 재사용되지 않습니다.
또 다른 흥미로운 효과는 링크 개수가 0보다 큰 아이 노드가 있지만 파일 명명 레이어에 아무것도없는 경우에 발생합니다. 이것은 어떤 의미에서 매우 숨겨진 파일입니다 :). 그것에 접근하려면 이름이 아닌 inode 번호로 참조하기 위해 낮은 수준의 무언가를 사용해야하거나 (16 진수 편집기를 사용하여 inode를 가리 키도록 디렉토리 항목을 편집해야합니다.)
세 번째 흥미로운 효과는 링크 수를 0으로 줄이지 만 어쨌든 디렉토리 항목을 inode로 지정하면 발생하는 현상입니다. 원한다면 실험 해 보도록하겠습니다. 그러나이 마지막 두 파일 모두 파일 시스템이 일관성이없는 상태가되게합니다.
이전 답변은 좋지만 세부 사항을 명확히하고 싶습니다.
rm
단순한 명령이 아닙니다. 에있는 프로그램입니다 PATH
.
따라서 실행할 때 발생하는 상황은 다음과 같습니다.
rm -rf /
rm
인수 -rf
와 함께 메모리에로드 되고/
rm
은 작업을 시작합니다 (마운트 / 파티션의 모든 것을 거치고 참조를 재귀 적으로 제거합니다 (기술적으로 죄송합니다))).rm
프로그램 인스턴스 가 언로드됩니다.작동 방식을 이해하기 위해 Ubuntu (Virtualbox), 일부 스크립트 및 PHP opcode 캐시에 LAMP를 설치 한 다음이 사악한 명령을 호출하십시오. 놀랍게도 (만약 운이 좋고 opcode 캐시가 PHP 파일 삭제를 알지 못하는 경우) 아파치 웹 서버를 통해 외부에서 PHP 스크립트에 계속 액세스 할 수 있습니다!
추신 :이 악의적 인 명령은 root wont delete로 실행되었으므로 everything
커널 특권 프로세스를 /proc
삭제할 수 없으며 /dev
시스템에 파일로 나타나는 장치 에서 일부 항목을 삭제할 수 없습니다 . 사실, 루트는 우리가 생각하는 것처럼 전능하지 않습니다. 반면에 커널은 그렇습니다.
PPS : 또한 두 번째 생각 locked
으로 삭제 시도시 다른 프로세스에 의한 파일이 여전히 있습니다 .
/proc
읽기 전용 파일 시스템이므로 아무것도 삭제할 수 없습니다 . 마찬가지로 /sys
. 마운트 포인트도 삭제할 수 없다고 생각합니다.
cd
,이 이름으로 내장 된 쉘을 호출합니다. 이 명령은 커널이 아니라 쉘에 내장되어 있습니다.) Alt + SysRq "명령"을 의미합니까?
/dev/pts
마운트 포인트이므로 제거 할 수 없다고 생각합니다 . (또한 읽기 전용 파일 시스템도 있습니다.)
하드 드라이브에서 모든 것이 지워지면 커널은 여전히 작동하지만 장치와 프로그램, 명령 등이 남아 있지 않아 일종의 붙어 있습니다.
OS가 더 이상 작동하지 않습니다.
그리고 Oli가 말한 것은 사실입니다. 명령이 메모리에로드 / 실행 되며이 프로세스를 종료하지 않으면 (물론 kill 명령이 여전히 존재하는 경우 ^^) 아무것도 멈추지 않습니다.
시스템에 selinux가 있고 selinux가 강제 모드에 있고 selinux의 정책이 올바르게 설정되어 있음을 유의하십시오. 아무 일도 일어나지 않을 것입니다.
Selinux는 필수 액세스 제어입니다. 즉, 루트 사용자는 시스템의 다른 사용자보다 시스템을 파괴 할 수있는 권한이 실제로는 많지 않습니다.
Selinux는 커널에서 시행됩니다. 커널을 해결하려면 커널을 손상시켜야합니다.
좋은 Selinux 정책을 가진 잘 설계된 시스템에서 root는 시스템에서 많은 것을 할 수 없습니다.
안드로이드의 이후 개정판은 이런 이유로 Selinux를 적용했습니다.
rm -rf /
가 없으면 아무 것도 삭제하지 않습니다--no-preserve-root
.