rm -rf /

 

[image]
[1]
1. 개요
2. 설명
3. 악마의 힘
4. 여담
5. 자매품


1. 개요


유닉스 계열의 운영체제에서 최상위 디렉토리 밑에 있는 모든 파일과 디렉토리를 삭제하고, 마지막으로 자기 자신까지 삭제하는 포맷 명령어.
일단 아무 리눅스[2]기반 OS에서 root 권한을 얻고 쉘을 띄워서 이 명령어를 입력하는 순간 '''당신의 컴퓨터에 마운트된 대부분의'''[3]''' 저장 장치가 깨끗하게 비워진다.''' 거기다가 로우 레벨 포맷까지 먹여주면 그 컴퓨터는 이제 회생할 수 없다.
요즘 하드는 LLF(Low-Level Format)을 거부하기 때문에 '''복구'''는 가능하지만, 로우 레벨 포맷이 시전되었다면 빠르게 전원을 끄고 디지털 포렌식 업체에 가져가야 한다. 다행히 최신 macOS루트리스(rootless)가 적용되어 전부 삭제까진 면하게 되었다. 하지만 이것도 마음만 먹으면 해제할 수 있다.

2. 설명


유닉스의 rm(remove) 명령어는 파일을 삭제하는 명령어다. 위의 짤에 있는 sudo('''s'''uper '''u'''ser '''do''')는 관리자(root 계정)의 권한으로 실행한다는 말이며, 뒤의 -rf는 옵션이다.[4] -r(
--recursive
, 재귀)는 폴더를 삭제하기 위해 재귀적 삭제를 실행하도록 하는 옵션이고, -f
(--force)
는 읽기 전용처럼 액세스 권한이 없는 파일도 강제로 삭제하는 옵션이다. /는 리눅스 파일 시스템의 최상위 디렉토리, root이다. 즉, 윈도에서의 '''format c:''' 수준 이상. C를 포함한 모든 드라이브를 한꺼번에 포맷하는 것과 비슷하다.[5]
유닉스 계열은 보조 기억장치를 연결할 때 윈도우처럼 드라이브 문자(C, D 등등)를 쓰지 않고 / 아래의 하위 디렉토리(폴더)에 마운트한다. 따라서 이 명령은 '''마운트하고 있던 모든 장치의 내용까지 날려버린다.'''
단, 윈도우의 format c:와 유닉스/리눅스의 rm -rf는 개념이 다르다. rm은 삭제 명령어가 맞지만, format c:는 c 드라이브를 포맷하라는 명령어이지 삭제 명령이 아니다.[6] 포맷 과정에서 삭제가 이루어지기에 결과가 비슷해지는 것이다. 윈도우 커맨드 라인에서는 del /f /s /q c: 또는 rd /s /q c: 가 이와 비슷하다. 여기서 /s(remove '''S'''ubdirectories)는 rm의 -r('''R'''ecursive) 와 같이 하위의 폴더/파일을 모두 지우고, /q('''Q'''uiet)는 이 과정에서 사용자의 동의를 구하지 않는다.[7] /f('''F'''orce)는 rm의 -f와 같다. 하지만 이 명령어는 C 드라이브 외의 다른 드라이브는 건드리지 않는데, 윈도우는 드라이브 문자를 이용하여 개념적으로 보조 기억장치를 완전히 분리해 놓기 때문이다. DOS나 윈도우 95, 98, ME 같은 9x 계열에서는 저 옵션 스위치가 없기 때문에 del이나 rd 명령어로 완전삭제가 불가능하다. [8]

3. 악마의 힘


보통 터미널상에서 디렉토리를 삭제할 때 rm -rf를 사용한다. 예를 들어 rm -rf /home/usr/download/incoming 같이... 그런데 이 과정에서 까딱 잘못 치면 묻지도 따지지도 않고 안의 내용을 지워주면서 개념도 같이 포맷해준다. 잘못 사용하는 대표적인 예로는 이런 게 있다.
cd /home/user/test
rm -rf ./*
[9]
이런 식으로 치려다가 삐끗해서
rm -rf /*
혹은
rm -rf . /*
를 치면 '''정말 다 날아간다.''' 하드뿐만 아니라 EFI 이미지까지 날아가는, 완전 말 그대로 머리속까지 싸그리 포맷. 앞의 명령어는 /[10] 디렉토리 내의 * 모든 걸 삭제, 뒤의 명령어는 현재 디렉토리 . 와 / 디렉토리의 모든 내용 * 을 삭제한다.
그래서 리눅스 커널 2016-02-20 패치에선 바꾸지 않는 이상
/sys/firmware/efi/efivars/
를 rw(읽고 쓰기, '''r'''ead-'''w'''rite)가 아닌 ro(읽기만, '''r'''ead-'''o'''nly)로 마운트해서 efivars가 날라가는 일은 없다.
하지만 rw로 마운트하거나 패치 전 커널이면...[11] 그러니 필요없으면 sudo를 자제하자.
사족으로 이런 실수를 방지하기 위하여
rm -rf ./*
보다는
rm -rf *
가 선호된다. 의미는 똑같으면서 위와 같은 참사가 일어나지 않는다.

4. 여담


현재는 기본으로 '''
"--preserve-root"
'''스위치가 rm에 박혀있어, 저 짓을 해도 안 먹히지만 구형 커널이면 여전히 먹히는 놈이 있으니 주의할 것. 게다가 앞에 sudo가 붙었거나 root 계정으로 접속했을 때 스위치로 '''
"--no-preserve-root"
'''가 붙으면 끔살 확정이다. 정 저걸 다 적기 싫다면 rm -rf /* 라고 입력해주면 된다. 최고의 조합은 '''
"sudo rm --no-preserve-root -rf /*"
''' (#) macOSFreeBSD[12]의 경우 rm에서 '''
"--no-preserve-root"
'''를 지원하지 않으니 꼭 주의할 것!
저런 파괴성으로 인해서 보통 농담으로 쓰이기도 한다...
이걸로 러시안 룰렛해볼 수 있으며, 물론 결과는 참담하다. 사실 개념 없는 회사가 아니면 백업 시스템 같은 안전장치가 있어서 잘리는 대신 상사의 구박과 야근, 시말서로 땜빵은 가능할 것이다. 굳이 회사 내부에서 이런 일이 일어나지 않더라도 하드디스크가 고장나거나 외부에서 해킹을 당해 데이터가 홀랑 날아가는 일도 기업에서는 빈번하기 때문이다. 그러니까 회사 입장에선 좀 귀찮은 상황 하나 터진 것 뿐이다.
'''단, 백업 서버에까지 이 짓을 했다가는 재물손괴죄로 처벌받을 수도 있다.''' 그리고 개념이 '충만한' 회사는 이런 상황에서도 데이터를 복구해낸다고 한다. 테이프 백업, 지역 데이터 분산 같은 안전장치가 또 있다. 일일이 전 세계를 돌아다니면서 테이프를 소각하고 다니는 게 아닌 한 파괴가 안 된다.
유튜브 등에선 가상머신에 올린 리눅스나 macOS를 rm -rf / 하는 영상이 올라와 있다. 가상머신이니 망정이지 실제 머신이었으면...... 치고 바로 꺼도 시스템이 먹통이 되어버린다. 커널이고 뭐고 묻지도 따지지도 않고 깡그리 날려버리기 때문.
유닉스 기반의 프로그램으로 작업하던 픽사토이스토리 2가 이 명령어 때문에 완전히 날아갈 뻔했다. 다행히 자택근무를 하던 직원의 컴퓨터에 사본이 저장되어 있어 완전히 처음부터 시작하는건 면했다고... #[13]
2011년 rm.dd 라는 전혀 엉뚱한 명령어로 언론에 소개된 적이 있다. 자세한 내용은 농협 전산 사고 문서 참고.
2015년 1월 리눅스용 스팀에서 스팀의 유저 폴더를 다른 곳으로 이동시키고 클라이언트를 실행시킬 경우 매개 변수가 지정되지 않아 유저 파일을 지우는 버그가 발생했다. 다행히 시스템 파일은 손상이 없다지만, 유저 쪽 파일은 GG...
2015년 애플에서 새롭게 도입한 루트리스는 시스템에서 중요하다 싶은 폴더를 rm -rf /로도 삭제할 수 없게 바꾸었다.
참고로 안드로이드에서 루트 계정에 접근하기 어렵게 만든 이유이기도 하다. 일반 휴대폰을 사용하는 사람들이 아무 앱이나 다운받아 실행했는데 해당 앱이 제멋대로 rm -rf /를 실행하면 모든 자료가 날아가고 부팅 관련 파일 및 이미지까지 전부 날아가기 때문에 기기가 켜지지도 않아 아주 망하기 때문.
2017년 1월 31일에 한 실리콘밸리 기업에서 그것이 실제로 일어났습니다. GitHub의 대항마격인 Git 서비스 GitLab에서 6시간 가량의 데이터가 안드로메다로... 사실 정확하게는 rm -rf /가 아니라 rm -rf를 시전해서 시스템 전체가 날아간 것은 아니지만, 하필이면 '''데이터베이스''' 폴더에 시전하는 바람에 참사가 일어났다. 시전 후 바로 실수를 알아차리고 실행취소를 했지만 이미 상당 부분이 날라갔다. 해당 기업에서 공개한 사고 리포트. 그래도 GitLab이 해당 사고를 재빠르게 알렸고, 해당 사고를 수습하는 과정을 유튜브 라이브 스트리밍(타 링크로 대체)으로 생중계를 하는 투명성을 보여줘 적절한 사고 대응에 칭찬을 받았다.

5. 자매품


이하의 명령어들은 실수로 입력할 일은 없고 말 그대로 사보타주 전용 명령어라 할 수 있다. 하지만 하드디스크를 디가우저를 사용하지 않고 확실히 파괴하는 수단이기도 해서 일부 명령은 데이터 소거 목적으로 실제로 쓰인다.
  • dd if=/dev/zero of=/dev/sda
    또는
    cat /dev/zero > /dev/sda
하드디스크를 제로필 포맷하는 명령어.
/dev/sda
는 보통 사타 인터페이스로 통신하는 주 하드디스크의 장치 이름이다.[14] 다행히 이놈은 마운트한 다른 장치까지 날려먹진 않는다. 가끔 플래시 메모리의 경우와 같이
/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.
ntfs
mkfs.
hfsplus
같은 것도 가능. 리눅스를 젠투, LFS, 아치같은 걸로 깔아본 사람은 이 명령을 한 번은 입력해 봤을 것이다.
  • find / -type f -exec shred {} \;
rm
은 삭제 요청이 들어오면 inode를 끊기만 하기 때문에 복구할 수 있고 여타 삭제 명령어들은 데이터를 덮어쓰기만 한다. 하드디스크의 특성상 데이터를 덮어썼더라도 미세 자기가 남아 이를 이용하면 복구할 수 있는 경우가 많은데,
shred
를 이용하면 여러 번에 걸쳐 썼다 지웠다 하기 때문에 잔류 자기를 이용한 복구 방법은 사실상 불가능하다. 루트 디렉토리 아래 모든 파일을 갈아버리는 지옥의 명령어.
여담으로 1999년 문일현 기자가 이종찬 당시 국민회의 부총재에게 문건을 보냈다는 의혹이 제기되어 검찰에서 증거를 찾기 위해 하드디스크 복원을 시도했으나 이와 비슷한 원리로 자료가 삭제되어 있어서 복원에 실패한 예가 있다.
잘못된 명령어를 입력하면 바로
rm -rf /
를 실행한다. 위의 러시안 룰렛은 거의 100% 확인사살이지만 자살 리눅스는 그나마 생존할 가능성이 있기 때문에 담력시험이 따로 없다.
sel disk (디스크번호)

clean

명령줄도 있다. 역시 윈도우용이다.
cmd로 diskpart를 실행하고 n번째 디스크를 선택, clean으로 n번째 디스크의 설정(포맷 형식, 드라이브 문자 등)을 날려버린다는 뜻이다.
여기서
create partition primary
(주 파티션 생성, 다스크 전체 할당)를 입력하면 문제가 될 게 없지만 이걸 치지 않으면 복구불가능. 그것도 윈도우가 깔려있는 디스크에 시전하면 더욱. EFI 이미지까지 날려버린다!
그래도 여타 프로그램을 사용하면 복구는 할 수 있다. 디스크 번호는
list disk
명령어로 볼 수 있다.

[1] 사진의 인물은 조너선 아이브로, sudo rm -rf/ 명령어는 합성된 것이다.[2] 리눅스가 대표격으로 많이 알려져 있어서 그렇지, 유닉스 기반의 운영체제(ex. macOS, iOS, BSD, Solaris 등)라면 어쨌든 먹힌다고 생각하면 된다.[3] 하드디스크, SSD, 플래시 메모리, 플로피 디스크 등 읽기와 쓰기가 가능한 모든 저장 장치가 해당. 단, CD, DVD 등의 광매체는 매체 특성상 RW(Rewritable) 계열이 아닌 이상 한 번 기록하면 내용을 변경할 수 없으니 예외. 쓰기 금지 스위치가 켜진 SD카드도 예외긴 하지만 어디까지나 '''이론상'''이니 맹신은 금물[4] 분리해서 쓸 수도 있다. -r -f 이런 식으로.[5] 물론 NT 계열 윈도우에서는 명령이 제대로 동작한 경우 시스템 드라이브라는 오류를 뱉어내며 안 먹힌다. 사실 이것도 나중에 추가된 것이다. MS-DOS나 윈도우 9x 시절에는 그런 오류 없이 싹 지워버렸다. [6] 참고로 유닉스/리눅스는 mkfs라는 포맷 명령어가 따로 있다.[7] 유닉스 계열 명령어는 확인 절차가 없는 것이 기본값이기 때문에 해당 명령어가 없다. 확인 절차는 -i, 혹은 -I(3개 파일 이상일 경우 확인)로 켤 수 있다.[8] RD /S 명령과 비슷하기 때문에 전체 삭제가 가능하다.[9] 현재 디렉토리(./=/test)의 모든 내용(*)을 지운다는 의미다.[10] 유닉스 계열에서 / 디렉토리는 최상위인 root 디렉토리를 의미한다.[11] 사실 복구 방법이 있긴 있다. efi를 어떻게든 다시 플래싱하면 되긴 되는데 그것도 안 되면 '''그땐 정말로......'''[12] https://www.freebsd.org/cgi/man.cgi?query=rm&apropos=0&sektion=0&manpath=FreeBSD+10.3-RELEASE&arch=default&format=html [13] 다만 영상에 나온 명령어는 rm * 다.[14] SSD, 하드 등 여러 개를 달아놓으면
sdb
,
sdc
, ... 순으로 이름이 매겨진다.
sda0
,
sda1
등은 파티션을 가리키지, 저장장치를 가리키지 않는다.
hda
,
hdb
같은 것은 PATA 인터페이스로 연결된 하드일 경우 나온다.