최근 수정 시각 : 2024-04-06 12:44:32

rm -rf /

sudo rm -rf /에서 넘어옴
파일:sudo_rmrf.jpg
사진의 인물은 조너선 아이브로, sudo rm -rf / 명령어는 합성된 것이다.[1]

1. 개요2. 설명3. macOS의 경우4. 악마의 힘5. 여담6. 자매품

1. 개요

UNIX 계열의 운영체제에서 최상위 디렉토리 밑에 있는 모든 파일과 디렉토리를 삭제하고, 마지막으로 자기 자신까지 삭제하는 명령어.

2. 설명

유닉스의 rm(remove) 명령어는 파일을 삭제하는 명령어다. 위의 짤에 있는 sudo(super user do)는 뒤에 오는 명령어를 최고 관리자(root)의 권한으로 실행하는 명령어이며, rm 뒤의 -rf는 옵션이다.[2] -r(--recursive, 재귀)는 폴더를 삭제하기 위해 재귀적 삭제를 실행하도록 하는 옵션이고, -f(--force)는 읽기 전용처럼 액세스 권한이 없는 파일도 강제로 삭제하는 옵션이다. /는 리눅스 파일 시스템의 최상위 디렉토리, root이다. 즉, 윈도에서의 format c: 수준 이상. C를 포함한 모든 드라이브를 한꺼번에 포맷하는 것과 비슷하다.[3]

이 명령어를 root 권한으로 실행하는 순간 당신의 컴퓨터에 마운트된 대부분의[4] 저장 장치가 깨끗하게 비워진다. 거기다가 덮어쓰기까지 먹여주면 데이터 복구 가능성까지 희박해지게 된다.

유닉스 계열은 보조 기억장치를 연결할 때 윈도우처럼 드라이브 문자(C, D 등등)를 쓰지 않고 / 아래의 하위 디렉토리(폴더)에 마운트한다. 따라서 이 명령은 마운트하고 있던 모든 장치의 내용까지 날려버린다.[5]

요즘 하드는 LLF(Low-Level Format)을 거부하기 때문에 복구는 가능하지만, 로우 레벨 포맷이 시전되었다면 빠르게 전원을 끄고 디지털 포렌식 업체에 가져가야 한다.

3. macOS의 경우

macOS같은 경우는 OS X Yosemite (10.10)까지는 위 명령어가 통해서 전부 삭제가 가능했으나 OS X El Capitan (10.11)부터 루트리스(rootless)가 도입되어 전부 삭제까진 면하게 되었으나 그 이후의 버전도 루트리스를 해제하면 하나도 남김없이 삭제가 가능하다. 이렇게 내부가 완전히 삭제된 맥은 부팅 시 애플 로고조차 보이지도 않는다. 애플 로고 이미지는 물론 그걸 화면에 띄워줄 부트로더까지 전부 삭제되었기 때문. 단, Apple Silicon CPU가 탑재된 맥의 경우 시스템 무결성 보호를 끈 상태에서도 일부 파일은 시스템에서조차 접근이 불가능한 영역에 보존되기 때문에 남게 되는데, 따라서 처음에 애플 로고까진 보이긴 하나 거기서 무한로딩이 걸린다. 그래도 어차피 사용 불능 상태에 빠지는건 인텔맥이나 별반 다를 바 없다. 물론 시스템 무결성 보호의 해제가 훨씬 어려워진 상황이라 일반 사용자들은 물론이고 개발자들조차 거의 볼 수 없는 극단적인 예시이긴 하지만.

이 경우 인텔 맥과 애플실리콘 맥에서의 대응 방법이 다른데, 애플 실리콘의 경우 전원버튼(Touch ID 버튼)을 부팅 옵션이 표시될 때까지 길게 누르고 있으면 되고, 인텔 맥의 경우 부팅 직후 option(⌥) + command(⌘) + R[6] 키 조합을 통해 인터넷 복구모드로 진입, 해당 기기의 macOS 시동 이미지와 설치 이미지를 자동으로 다운로드, macOS 재설치가 가능하다. 해당 기능을 지원하지 않는 오래된 기기 등에서는 USB 부팅 디스크 이용, 제품과 동봉된 Mac OS 재설치 CD 사용 등의 다른 복구 방법이 필요할 수 있다.

이에 대한 Apple의 공식 지원 문서도 존재하는데, Mac 시동 중에 문제가 있는 경우 도움말 페이지 중, Mac 시동 시 빈 화면이 나타나는 경우 페이지가 그것이다.

일부 사용자들은 자신의 맥에 애플 케어 플러스를 들어놓고 보증 막바지에 데이터를 백업해놓고 루트리스를 강제로 해제한 다음 위 명령어를 실행하여 맥을 의도적으로 고장내어 리퍼제품으로 교환 시도를 하기도 하고 이렇게 교환에 성공한 사례가 많다. 하지만 워낙 이런 꼼수를 부려 교환받은 사례도 많자 직원도 이런 배경을 알고 있는 경우가 많아 직원이 꼼꼼하거나 부팅 불능의 경우 높은 확률로 깔끔하게 OS 재설치해주고(...) 되돌려 보내는데다 2023년 1월부터 이런식으로 고의파손했다는 사실이 적발될 경우 보험사기로 입건되어 인생에 빨간줄이 그일 수 있으니 쓸데없는 시도는 하지 않길 권장한다.

4. 악마의 힘

보통 터미널상에서 디렉토리를 삭제할 때 rm -rf를 사용한다. 예를 들어 rm -rf /home/usr/download/incoming 같이... 그런데 이 과정에서 까딱 잘못 치면 묻지도 따지지도 않고 안의 내용을 지워주면서 개념도 같이 포맷해준다. 잘못 사용하는 대표적인 예로는 이런 게 있다.
#!syntax sh
cd /home/user/test
rm -rf ./*
[7]
이런 식으로 치려다가 삐끗해서 rm -rf /* 혹은 rm -rf . /*를 치면 정말 다 날아간다. 하드뿐만 아니라 EFI 이미지까지 날아가는, 완전 말 그대로 머리속까지 싸그리 포맷. 앞의 명령어는 /[8] 디렉토리 내의 * 모든 걸 삭제, 뒤의 명령어는 현재 디렉토리 . 와 / 디렉토리의 모든 내용 * 을 삭제한다.

그래서 리눅스 커널 2016-02-20 패치에선 바꾸지 않는 이상 /sys/firmware/efi/efivars/를 rw(읽고 쓰기, read-write)가 아닌 ro(읽기만, read-only)로 마운트해서 efivars가 날라가는 일은 없다.

하지만 rw로 마운트하거나 패치 전 커널이면...[9] 그러니 필요없으면 sudo를 자제하자.

사족으로 이런 실수를 방지하기 위하여 rm -rf ./*보다는 rm -rf *가 선호된다. 의미는 똑같으면서 위와 같은 참사가 일어나지 않는다.

이런 이유 때문에 rm 명령어를 사용하기 전에 재차 확인하여 대형 참사를 방지하기도 한다.

5. 여담

윈도우의 format c:와 유닉스/리눅스의 rm -rf는 개념이 다르다. rm은 삭제 명령어가 맞지만, format c:는 c 드라이브를 포맷하라는 명령어이지 삭제 명령이 아니다.[10] 포맷 과정에서 파일이 삭제되는 것과 같은 효과가 발생되기 때문에 결과가 비슷해지는 것이다. 윈도우 커맨드 라인에서는 del /f /s /q c: 또는 rd /s /q c: 가 이와 비슷하다. 여기서 /s(remove Subdirectories)는 rm의 -r(Recursive) 와 같이 하위의 폴더/파일을 모두 지우고, /q(Quiet)는 이 과정에서 사용자의 동의를 구하지 않는다.[11] /f(Force)는 rm의 -f와 같다. 하지만 이 명령어는 C 드라이브 외의 다른 드라이브는 건드리지 않는데, 윈도우는 드라이브 문자를 이용하여 개념적으로 보조 기억장치를 완전히 분리해 놓기 때문이다. DOS나 윈도우 95, 98, ME 같은 9x 계열에서는 저 옵션 스위치가 없기 때문에 del이나 rd 명령어로 완전삭제가 불가능하다. 그 대신 deltree /y C:가 있다.[12]

현재는 기본으로 "--preserve-root"스위치가 rm에 박혀있어, 저 짓을 해도 안 먹히지만 구형 커널이면 여전히 먹히는 놈이 있으니 주의할 것. 게다가 앞에 sudo가 붙었거나 root 계정으로 접속했을 때 스위치로 "--no-preserve-root"가 붙으면 끔살 확정이다. 정 저걸 다 적기 싫다면 rm -rf /* 라고 입력해주면 된다. 최고의 조합은 "sudo rm --no-preserve-root -rf /*" (#) macOSFreeBSD[13]의 경우 rm에서 "--no-preserve-root"를 지원하지 않으니 꼭 주의할 것!

rm -rf /를 실행하는 유튜브 영상은 대부분 보는 재미를 위해 파일과 디렉토리가 삭제될 때마다 삭제되었다는 메시지를 실시간으로 출력하는 v(verbose) 옵션[14]을 준다. 이 옵션을 주지 않으면 긴 시간 동안 화면에 아무런 변화가 없어서 지루하다.

이걸로 러시안 룰렛해볼 수 있으며, 물론 결과는 참담하다.[15] 사실 개념 없는 회사가 아니면 백업 시스템 같은 안전장치가 있어서 잘리는 대신 상사의 구박과 야근, 시말서로 땜빵은 가능할 것이다. 굳이 회사 내부에서 이런 일이 일어나지 않더라도 하드디스크가 고장나거나 외부에서 해킹을 당해 데이터가 홀랑 날아가는 일도 기업에서는 빈번하기 때문이다. 그러니까 회사 입장에선 좀 귀찮은 상황 하나 터진 것 뿐이다.

대학이나 학원에서 리눅스를 배울때 교수나 강사에 따라 이놈을 시험해보는 시간을 가지기도 한다. 어차피 가상머신으로 하기 때문에 시전해봤자 가상 드라이브만 날아가므로 별 문제가 없기 때문. 이런식으로 이 명령어가 얼마나 강력한지 미리 체험해보게 하는 셈.

단, 백업 서버에까지 이 짓을 했다가는 재물손괴죄로 처벌받을 수도 있다. 그리고 개념이 '충만한' 회사는 이런 상황에서도 데이터를 복구해낸다고 한다. 테이프 백업, 지역 데이터 분산 같은 안전장치가 또 있다. 일일이 전 세계를 돌아다니면서 테이프를 소각하고 다니는 게 아닌 한 파괴가 안 된다. 뭐 이쯤 되면 아예 사보타주의 영역이다.

군대에서는 영창확정이다. 정작 저 사연의 주인공은 영창 대신 말뚝을 선택했다

유튜브 등에선 가상머신에 올린 리눅스나 macOS를 rm -rf / 하는 영상이 올라와 있다. 가상머신이니 망정이지 실제 머신이었으면 치고 바로 꺼도 시스템이 먹통이 되어버린다. 커널이고 뭐고 묻지도 따지지도 않고 깡그리 날려버리기 때문.

유닉스 기반의 프로그램으로 작업하던 픽사토이 스토리 2가 이 명령어 때문에 완전히 날아갈 뻔했다. 다행히 자택근무를 하던 직원의 컴퓨터에 사본이 저장되어 있어 완전히 처음부터 시작하는건 면했다고... #[16]

2011년 rm.dd 라는 전혀 엉뚱한 명령어로 언론에 소개된 적이 있다. 자세한 내용은 농협 전산 사고 문서 참고.

2011년 한 오픈소스에서 이 명령어를 쓴 상태로 공백문자 하나를 실수로 집어넣는 바람에, 우분투 사용자의 시스템 디렉토리(/usr)를 날려버리는 버그가 발생했다. 더 가관이었던 것은 버그를 고칠 때 정작 f 옵션은 지우지 않고 공백만 지워 전세계 개발자들의 웃음거리가 되었다.[17] 모든 과정이 투명하게 남는 git의 특성상 영구 박제를 당해버린 해당 이슈는 성지가 되었고, 10여년이 지난 이후에도 여러 프로그래밍 커뮤니티에서 회자되었다.

2015년 1월 리눅스용 스팀에서 잘못된 로직으로 이 명령어를 사용하는 바람에, 스팀의 유저 폴더를 다른 곳으로 이동시키고 클라이언트를 실행시킬 경우 유저 파일을 지우는 버그가 발생했다. 시스템 파일은 손상이 없었으나, 유저 쪽 파일은 GG... 해당 유저는 최소 3TB에 달하는 파일을 잃었지만 다행히 클라우드 백업을 해두었다고 전했다.

2015년 애플에서 새롭게 도입한 루트리스는 시스템에서 중요하다 싶은 폴더를 sudo rm -rf /로도 삭제할 수 없게 바꾸었다. 자매품으로 읽기 전용 시스템 파티션이 있다.

안드로이드에서 root 권한에 접근하기 어렵게 만든 이유이기도 하다. 일반 휴대폰을 사용하는 사람들이 아무 앱이나 다운받아 실행했는데 해당 앱이 제멋대로 rm -rf /를 실행하면 모든 자료가 날아가고 부팅 관련 파일 및 이미지까지 전부 날아가기 때문에 기기가 켜지지도 않아 아주 망하기 때문.

2017년 1월 31일에 한 실리콘밸리 기업에서 그것이 실제로 일어났습니다. GitHub의 대항마격인 Git 서비스 GitLab에서 6시간 가량의 데이터가 유실되었다. 사실 정확하게는 rm -rf /가 아니라 rm -rf를 시전해서 시스템 전체가 날아간 것은 아니지만, 하필이면 데이터베이스 폴더에 시전하는 바람에 참사가 일어났다. 시전 후 바로 실수를 알아차리고 실행취소를 했지만 이미 상당 부분이 날라갔다. 해당 기업에서 공개한 사고 리포트. 그래도 GitLab이 해당 사고를 재빠르게 알렸고, 해당 사고를 수습하는 과정을 유튜브 라이브 스트리밍(타 링크로 대체)으로 생중계를 하는 투명성을 보여줘 적절한 사고 대응에 칭찬을 받았다.

6. 자매품

이하의 명령어들은 실수로 입력할 일은 없고 말 그대로 사보타주 전용 명령어라 할 수 있다. 하지만 하드디스크를 디가우저를 사용하지 않고 확실히 파괴하는 수단이기도 해서 일부 명령은 데이터 소거 목적으로 실제로 쓰인다.
  • dd if=/dev/zero of=/dev/sda 또는 cat /dev/zero > /dev/sda
    하드디스크를 제로필 포맷하는 명령어. /dev/sda는 보통 사타 인터페이스로 통신하는 주 하드디스크의 장치 이름이다.[18] 다행히 이놈은 마운트한 다른 장치까지 날려먹진 않는다. 가끔 플래시 메모리의 경우와 같이 /dev/zero로는 쓰지도 않고 썼다고 사기를 치는 경우가 있어서 확실한 파괴를 원할 경우 대신 /dev/urandom을 쓰면 랜덤 필을 한다.
  • mv * /dev/null
    현재 디렉토리의 모든 파일과 디렉토리를 null 장치, 즉 뭐든 받아먹기만 하고 저장하지도 출력하지도 않는 무간지옥으로 보내버린다. 휴지통보다는 소각로에 가깝다. 단 루트 디렉토리에서 실행하려고 하면 /proc 디렉토리와 /dev 디렉토리 같은 특수 디렉토리에서 에러가 나기 때문에 명령이 실패할 수도 있다.
  • find / -type f -exec cp /trololo.txt {} \;
    루트 디렉토리부터 파일 타입이 일반 파일인 모든 파일을 찾아내서 해당 파일의 내용을 /trololo.txt내용으로 바꾼다. 파일명은 온전히 남아있지만 그 내용이 전부 다른 것으로 치환되어 있기에 당연히 해당 실행도 인식도 불가능.
  • mkfs.(소문자 파일 시스템 이름) /dev/sda
    이건 정식 포맷 명령어. 보통 해당 OS의 주 파일 시스템(주로 ext4)을 사용하지만, 별의 별 파일 시스템이 다 가능하고, 심지어 mkfs.ntfsmkfs.hfsplus 같은 것도 가능. 리눅스를 젠투, LFS, 아치같은 걸로 깔아본 사람은 이 명령을 한 번은 입력해 봤을 것이다.
  • find / -type f -exec shred {} \;
    rm은 삭제 요청이 들어오면 inode를 끊기만 하기 때문에 복구할 수 있고 여타 삭제 명령어들은 데이터를 덮어쓰기만 한다. 하드디스크의 특성상 데이터를 덮어썼더라도 미세 자기가 남아 이를 이용하면 복구할 수 있는 경우가 많은데, shred를 이용하면 여러 번에 걸쳐 썼다 지웠다 하기 때문에 잔류 자기를 이용한 복구 방법은 사실상 불가능하다. 루트 디렉토리 아래 모든 파일을 갈아버리는 지옥의 명령어.
    여담으로 1999년 문일현 기자가 이종찬 당시 국민회의 부총재에게 문건을 보냈다는 의혹이 제기되어 검찰에서 증거를 찾기 위해 하드디스크 복원을 시도했으나 이와 비슷한 원리로 자료가 삭제되어 있어서 복원에 실패한 예가 있다.[19]
  • 자살 리눅스
    잘못된 명령어를 입력하면 바로 rm -rf /를 실행한다. 위의 러시안 룰렛은 거의 100% 확인사살이지만 자살 리눅스는 그나마 생존할 가능성이 있기 때문에 담력시험이 따로 없다.
  • 윈도우 버전으로는 cmd /c rd /s /q c:\가 있다. 단 마운트된 모든 저장장치를 날려버리는 rm -rf /와는 달리 특정 드라이브(해당 코드에서는 C드라이브)에 저장되어 있는 데이터만 지울 수 있다.
  • cmd /c diskpart

    • sel disk (디스크번호)
      clean

    명령줄도 있다. 역시 윈도우용이다.
    cmd로 diskpart를 실행하고 n번째 디스크를 선택, clean으로 n번째 디스크의 설정(파티션(볼륨), 포맷 형식, 드라이브 문자 등)을 날려버린다는 뜻이다. diskpart 에서 clean 의 정확한 의미는 역시 도움말RTFM에 가장 잘 설명되어 있다.[20]
    이때 새로 파일을 저장하지 않았다면 testdisk 등의 프로그램으로 복구가 가능하지만, 이 디스크에 새로 파일을 만들면 복구 가능성이 낮아진다.
    EFI 이미지까지 날려버린다!
    그래도 덮어쓰기가 되지 않았다면 데이터 복구의 가능성은 존재한다. 디스크 번호는 list disk 명령어로 볼 수 있다.
    디스크의 구조 자체는 위 명령어와 같이 디스크가 선택(sel disk (디스크번호)된 상태에서 create partition primary - format quick - assign (문자열 할당) 등의 명령어를 순차적으로 실행하여 새롭게 생성할 수 있다.
    반대로 이 명령어는 리눅스나 그 설치 디스크를 제작하는데 사용되었던 USB드라이브의 EFI 파티션을 지워 원래대로 사용할 수 있도록 하는 은근히 자주 쓰는 명령어니 select 할 때 더더욱 주의가 필요하다.


[1] 원본은 2012년에 출시된 맥북 프로 레티나 디스플레이를 소개하는 영상이다.[2] -r -f처럼 분리해서 쓸 수도 있다.[3] 물론 NT 계열 윈도우에서는 명령이 제대로 동작한 경우 시스템 드라이브라는 오류를 뱉어내며 안 먹힌다. 사실 이것도 나중에 추가된 것이다. MS-DOS나 윈도우 9x 시절에는 그런 오류 없이 싹 지워버렸다. SYSTEM 계정을 사용할 수 있게 되면 9x든 NT이든 명령이 정상 동작하게 될 것이다(...)[4] 하드디스크, SSD, 플래시 메모리, 플로피 디스크 등 읽기와 쓰기가 가능한 모든 저장 장치가 해당. 단, CD, DVD 등의 광매체는 매체 특성상 RW(Rewritable) 계열이 아닌 이상 한 번 기록하면 내용을 변경할 수 없으니 예외. 쓰기 금지 스위치가 켜진 SD카드도 예외긴 하지만 어디까지나 이론상이니 맹신은 금물[5] WSL 의 경우 윈도우에 연결된 모든 드라이브가 \/mnt\/c 등의 파일로 연결되기 때문에 wsl 안 리눅스에서 실행할 경우 윈도우까지 통째로 날릴 수 있다.[6] 일부 인텔맥의 경우 shift(⇧) + option(⌥) + command(⌘) + R.[7] 현재 디렉토리(./=/test)의 모든 내용(*)을 지운다는 의미다.[8] 유닉스 계열에서 / 디렉토리는 최상위인 root 디렉토리를 의미한다.[9] 사실 복구 방법이 있긴 있다. efi를 어떻게든 다시 플래싱하면 되긴 되는데 그것도 안 되면 그땐 정말로 날려야한다.[10] 참고로 유닉스/리눅스는 mkfs라는 포맷 명령어가 따로 있다.[11] 유닉스 계열 명령어는 확인 절차가 없는 것이 기본값이기 때문에 해당 명령어가 없다. 확인 절차는 -i, 혹은 -I(3개 파일 이상일 경우 확인)로 켤 수 있다.[12] RD /S 명령과 비슷하기 때문에 전체 삭제가 가능하다.[13] https://www.freebsd.org/cgi/man.cgi?query=rm&apropos=0&sektion=0&manpath=FreeBSD+10.3-RELEASE&arch=default&format=html[14] 예: rm -rvf /[15] 현재는 해당 글이 삭제되었다.[16] 다만 영상에 나온 명령어는 rm * 다.[17] 지금이야 저장소 전체가 밈이 되어버려 유머성 글 중 하나처럼 보이지만, 당시만 하더라도 은근히 사람들이 쓰던 멀쩡한 오픈소스 프로젝트였다.[18] SSD, 하드 등 여러 개를 달아놓으면 sdb, sdc, ... 순으로 이름이 매겨진다. sda0, sda1 등은 파티션을 가리키지, 저장장치를 가리키지 않는다.hda, hdb같은 것은 PATA 인터페이스로 연결된 하드일 경우 나온다. nvme0n1, nvme1n1, nvme2n1 등은 NVMe SSD일 경우 나온다. 이때 파티션은 nvme0n1p1, nvme0n1p2 등으로 뜬다.[19] 다만 완전히 실패한 건 아니고 일부 파일은 복원되었다고 한다.[20] diskpart clean 도움말 :
포커스가 있는 디스크에서 일부 또는 모든 파티션이나 볼륨 포맷을 제거합니다.

구문: CLEAN \[ALL\]

ALL 디스크의 각 바이트 섹터를 0으로 설정하여 디스크에 저장된 모든 데이터를 완전히 삭제합니다.

MBR(마스터 부트 레코드) 디스크에서는 MBR 분할 정보와 숨겨진 섹터 정보만 덮어씁니다. GPT(GUID 파티션 테이블) 디스크에서는 보호 MBR을 포함하여 GPT 분할 정보를 덮어씁니다. ALL 매개 변수가 사용되지 않는 경우 디스크의 첫 1MB와 마지막 1MB가 0이 됩니다. 이로 인해 이전에 디스크에 적용되었던 디스크 포맷이 지워집니다. 디스크 정리 후 디스크의 상태는 'UNINITIALIZED'입니다.