[[파일:sudo_rmrf.jpg|width=600]] ~~[[UNIX]] [[컴퓨터]]를 혁신적으로 새롭게 창조하는 방법.jpg~~[* 사진의 인물은 [[조너선 아이브]]로, sudo rm -rf/ 명령어는 합성된 것이다.] [목차] == 개요 == [[유닉스]] 계열의 [[운영체제]]에서 최상위 디렉토리 밑에 있는 모든 파일과 디렉토리를 삭제하고, 마지막으로 [[동반자살|자기 자신까지 삭제]]하는 포맷 명령어. 일단 아무 [[리눅스]][* 리눅스가 대표격으로 많이 알려져 있어서 그렇지, [[유닉스]] 기반의 운영체제(ex. [[macOS]], [[iOS]], [[BSD]], [[Solaris]] 등)라면 어쨌든 먹힌다고 생각하면 된다.]기반 OS에서 [[root]] 권한을 얻고 쉘을 띄워서 이 명령어를 입력하는 순간 '''당신의 컴퓨터에 마운트된 대부분의'''[* [[하드디스크]], [[SSD]], [[플래시 메모리]], [[플로피 디스크]] 등 읽기와 쓰기가 가능한 모든 저장 장치가 해당. 단, [[CD]], [[DVD]] 등의 광매체는 매체 특성상 RW(Rewritable) 계열이 아닌 이상 한 번 기록하면 내용을 변경할 수 없으니 예외. 쓰기 금지 스위치가 켜진 SD카드도 예외긴 하지만 어디까지나 '''이론상'''이니 맹신은 금물]''' 저장 장치가 깨끗하게 비워진다.''' 거기다가 로우 레벨 포맷까지 먹여주면 그 컴퓨터는 이제 회생할 수 없다. 요즘 하드는 LLF(Low-Level Format)을 거부하기 때문에 '''복구'''는 가능하지만, 로우 레벨 포맷이 시전되었다면 빠르게 전원을 끄고 디지털 포렌식 업체에 가져가야 한다. 다행히 최신 [[macOS]]는 [[루트리스]](rootless)가 적용되어 전부 삭제까진 면하게 되었다. 하지만 이것도 마음만 먹으면 해제할 수 있다. == 설명 == 유닉스의 rm(remove) 명령어는 파일을 삭제하는 명령어다. 위의 짤에 있는 sudo('''s'''uper '''u'''ser '''do''')는 관리자(root 계정)의 권한으로 실행한다는 말이며, 뒤의 -rf는 옵션이다.[* 분리해서 쓸 수도 있다. -r -f 이런 식으로.] -r({{{--recursive}}}, 재귀)는 폴더를 삭제하기 위해 재귀적 삭제를 실행하도록 하는 옵션이고, -f{{{(--force)}}}는 읽기 전용처럼 액세스 권한이 없는 파일도 강제로 삭제하는 옵션이다. /는 리눅스 파일 시스템의 최상위 디렉토리, root이다. 즉, 윈도에서의 '''format c:''' 수준 이상. C를 포함한 모든 드라이브를 한꺼번에 포맷하는 것과 비슷하다.[* 물론 NT 계열 윈도우에서는 명령이 제대로 동작한 경우 시스템 드라이브라는 오류를 뱉어내며 안 먹힌다. 사실 이것도 나중에 추가된 것이다. [[MS-DOS]]나 윈도우 9x 시절에는 그런 오류 없이 싹 지워버렸다. --[[끔살|SYSTEM 계정을 사용할 수 있게 되면 9x든 NT이든 명령이 정상 동작하게 될 것이다]](...)--] 유닉스 계열은 보조 기억장치를 연결할 때 윈도우처럼 [[드라이브 문자]](C, D 등등)를 쓰지 않고 / 아래의 하위 디렉토리(폴더)에 마운트한다. 따라서 이 명령은 '''마운트하고 있던 모든 장치의 내용까지 날려버린다.''' 단, 윈도우의 format c:와 유닉스/리눅스의 rm -rf는 개념이 다르다. rm은 삭제 명령어가 맞지만, format c:는 c 드라이브를 포맷하라는 명령어이지 삭제 명령이 아니다.[* 참고로 유닉스/리눅스는 mkfs라는 포맷 명령어가 따로 있다.] 포맷 과정에서 삭제가 이루어지기에 결과가 비슷해지는 것이다. 윈도우 커맨드 라인에서는 del /f /s /q c: 또는 [[ \cmd /c rd /s /q c:\\ |rd /s /q c:]] 가 이와 비슷하다. 여기서 /s(remove '''S'''ubdirectories)는 rm의 -r('''R'''ecursive) 와 같이 하위의 폴더/파일을 모두 지우고, /q('''Q'''uiet)는 이 과정에서 사용자의 동의를 구하지 않는다.[* 유닉스 계열 명령어는 확인 절차가 없는 것이 기본값이기 때문에 해당 명령어가 없다. 확인 절차는 -i, 혹은 -I(3개 파일 이상일 경우 확인)로 켤 수 있다.] /f('''F'''orce)는 rm의 -f와 같다. 하지만 이 명령어는 C 드라이브 외의 다른 드라이브는 건드리지 않는데, 윈도우는 드라이브 문자를 이용하여 개념적으로 보조 기억장치를 완전히 분리해 놓기 때문이다. DOS나 윈도우 95, 98, ME 같은 9x 계열에서는 저 옵션 스위치가 없기 때문에 del이나 rd 명령어로 완전삭제가 불가능하다. --그 대신 deltree /y C:가 있다.--[* RD /S 명령과 비슷하기 때문에 전체 삭제가 가능하다.] == 악마의 힘 == 보통 터미널상에서 디렉토리를 삭제할 때 rm -rf를 사용한다. 예를 들어 rm -rf /home/usr/download/[[incoming]] 같이... 그런데 이 과정에서 까딱 잘못 치면 묻지도 따지지도 않고 안의 내용을 지워주면서 개념도 같이 포맷해준다. 잘못 사용하는 대표적인 예로는 이런 게 있다. {{{cd /home/user/test rm -rf ./* }}}[* 현재 디렉토리(./=/test)의 모든 내용(*)을 지운다는 의미다.] 이런 식으로 치려다가 삐끗해서 {{{rm -rf /*}}} 혹은 {{{rm -rf . /*}}}를 치면 '''정말 다 날아간다.''' 하드뿐만 아니라 EFI 이미지까지 날아가는, 완전 말 그대로 머리속까지 싸그리 [[포맷]]. 앞의 명령어는 /[* 유닉스 계열에서 / 디렉토리는 최상위인 root 디렉토리를 의미한다.] 디렉토리 내의 * 모든 걸 삭제, 뒤의 명령어는 현재 디렉토리 . 와 / 디렉토리의 모든 내용 * 을 삭제한다. 그래서 리눅스 커널 [[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0389075ecfb6231818de9b0225d3a5a21a661171|2016-02-20]] 패치에선 바꾸지 않는 이상 {{{/sys/firmware/efi/efivars/}}}를 rw(읽고 쓰기, '''r'''ead-'''w'''rite)가 아닌 ro(읽기만, '''r'''ead-'''o'''nly)로 마운트해서 efivars가 날라가는 일은 없다. 하지만 [[망했어요|rw로 마운트하거나 패치 전 커널이면...]][* 사실 복구 방법이 있긴 있다. efi를 어떻게든 다시 플래싱하면 되긴 되는데 그것도 안 되면 '''[[망했어요|그땐 정말로......]]'''] 그러니 필요없으면 sudo를 자제하자. 사족으로 이런 실수를 방지하기 위하여 {{{rm -rf ./*}}}보다는 {{{rm -rf *}}}가 선호된다. 의미는 똑같으면서 위와 같은 참사가 일어나지 않는다. == 여담 == 현재는 기본으로 '''{{{"--preserve-root"}}}'''스위치가 rm에 박혀있어, 저 짓을 해도 안 먹히지만 구형 커널이면 여전히 먹히는 놈이 있으니 주의할 것. 게다가 앞에 sudo가 붙었거나 [[root]] 계정으로 접속했을 때 스위치로 '''{{{"--no-preserve-root"}}}'''가 붙으면 [[끔살]] 확정이다. 정 저걸 다 적기 싫다면 rm -rf /* 라고 입력해주면 된다. 최고의 조합은 '''{{{"sudo rm --no-preserve-root -rf /*"}}}''' ([[https://gist.github.com/NaniteFactory/55fb811480d52353d5cf1fc68715c5e8|#]]) [[macOS]]나 [[FreeBSD]][* [[https://www.freebsd.org/cgi/man.cgi?query=rm&apropos=0&sektion=0&manpath=FreeBSD+10.3-RELEASE&arch=default&format=html]] ]의 경우 rm에서 '''{{{"--no-preserve-root"}}}'''를 지원하지 않으니 꼭 주의할 것! 저런 파괴성으로 인해서 보통 농담으로 쓰이기도 한다... 이걸로 [[러시안 룰렛]]도 [[http://todayhumor.com/?humorbest_835182|해볼 수 있으며]], 물론 [[http://todayhumor.com/?humorbest_835778|결과는 참담하다.]] 사실 개념 없는 회사가 아니면 [[백업]] 시스템 같은 안전장치가 있어서 잘리는 대신 상사의 구박과 [[야근]], [[시말서]]로 땜빵은 가능할 것이다. 굳이 회사 내부에서 이런 일이 일어나지 않더라도 [[하드디스크]]가 고장나거나 외부에서 [[해킹]]을 당해 데이터가 홀랑 날아가는 일도 기업에서는 빈번하기 때문이다. 그러니까 회사 입장에선 좀 귀찮은 상황 하나 터진 것 뿐이다. '''단, 백업 서버에까지 이 짓을 했다가는 [[재물손괴죄]]로 처벌받을 수도 있다.''' 그리고 개념이 '충만한' 회사는 이런 상황에서도 데이터를 복구해낸다고 한다. 테이프 백업, 지역 데이터 분산 같은 안전장치가 또 있다. 일일이 전 세계를 돌아다니면서 테이프를 소각하고 다니는 게 아닌 한 파괴가 안 된다. ~~이쯤 되면 작정하고 회사 날릴려는건데~~ 유튜브 등에선 가상머신에 올린 리눅스나 macOS를 rm -rf / 하는 영상이 올라와 있다. 가상머신이니 망정이지 실제 머신이었으면...... 치고 바로 꺼도 시스템이 먹통이 되어버린다. 커널이고 뭐고 묻지도 따지지도 않고 깡그리 날려버리기 때문. 유닉스 기반의 프로그램으로 작업하던 [[픽사]]의 [[토이스토리 시리즈#s-2.2|토이스토리 2]]가 이 명령어 때문에 완전히 날아갈 뻔했다. 다행히 자택근무를 하던 직원의 컴퓨터에 사본이 저장되어 있어 완전히 처음부터 시작하는건 면했다고... [[https://www.youtube.com/watch?v=8dhp_20j0Ys|#]][* 다만 영상에 나온 명령어는 rm * 다.] 2011년 rm.dd 라는 전혀 엉뚱한 명령어로 언론에 소개된 적이 있다. 자세한 내용은 [[농협 전산 사고]] 문서 참고. 2015년 1월 리눅스용 [[스팀(플랫폼)|스팀]]에서 스팀의 유저 폴더를 다른 곳으로 이동시키고 클라이언트를 실행시킬 경우 매개 변수가 지정되지 않아 유저 파일을 지우는 [[버그]]가 발생했다. 다행히 시스템 파일은 손상이 없다지만, 유저 쪽 파일은 GG... 2015년 애플에서 새롭게 도입한 [[루트리스]]는 시스템에서 중요하다 싶은 폴더를 rm -rf /로도 삭제할 수 없게 바꾸었다. 참고로 [[안드로이드(운영체제)|안드로이드]]에서 루트 계정에 접근하기 어렵게 만든 이유이기도 하다. 일반 휴대폰을 사용하는 사람들이 아무 앱이나 다운받아 실행했는데 해당 앱이 제멋대로 rm -rf /를 실행하면 모든 자료가 날아가고 부팅 관련 파일 및 이미지까지 전부 날아가기 때문에 기기가 켜지지도 않아 아주 망하기 때문. 2017년 1월 31일에 한 실리콘밸리 기업에서 [[그것이 실제로 일어났습니다]]. [[GitHub]]의 대항마격인 [[Git]] 서비스 [[GitLab]]에서 6시간 가량의 데이터가 [[안드로메다]]로... 사실 정확하게는 rm -rf /가 아니라 rm -rf를 시전해서 시스템 전체가 날아간 것은 아니지만, 하필이면 '''데이터베이스''' 폴더에 시전하는 바람에 참사가 일어났다. 시전 후 바로 실수를 알아차리고 실행취소를 했지만 이미 상당 부분이 날라갔다. [[https://about.gitlab.com/blog/2017/02/01/gitlab-dot-com-database-incident/|해당 기업에서 공개한 사고 리포트]]. 그래도 GitLab이 해당 사고를 재빠르게 알렸고, 해당 사고를 수습하는 과정을 [[https://www.youtube.com/watch?v=v0TRHLvYGE0|유튜브 라이브 스트리밍(타 링크로 대체)]]으로 생중계를 하는 투명성을 보여줘 적절한 사고 대응에 칭찬을 받았다. == 자매품 == 이하의 명령어들은 실수로 입력할 일은 없고 말 그대로 [[사보타주]] 전용 명령어라 할 수 있다. 하지만 하드디스크를 [[디가우저]]를 사용하지 않고 확실히 파괴하는 수단이기도 해서 일부 명령은 데이터 소거 목적으로 실제로 쓰인다. * {{{dd if=/dev/zero of=/dev/sda}}} 또는 {{{cat /dev/zero > /dev/sda}}} [[하드디스크]]를 제로필 포맷하는 명령어. {{{/dev/sda}}}는 보통 사타 인터페이스로 통신하는 주 하드디스크의 장치 이름이다.[* SSD, 하드 등 여러 개를 달아놓으면 {{{sdb}}}, {{{sdc}}}, ... 순으로 이름이 매겨진다. {{{sda0}}}, {{{sda1}}} 등은 '''파티션'''을 가리키지, '''저장장치'''를 가리키지 않는다.{{{hda}}}, {{{hdb}}}같은 것은 PATA 인터페이스로 연결된 하드일 경우 나온다.] 다행히 이놈은 마운트한 다른 장치까지 날려먹진 않는다. 가끔 플래시 메모리의 경우와 같이 {{{/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|{{{ntfs}}}]]나 {{{mkfs.}}}[[HFS#s-2|{{{hfsplus}}}]] 같은 것도 가능. 리눅스를 젠투, LFS, [[아치 리눅스|아치]]같은 걸로 깔아본 사람은 이 명령을 한 번은 입력해 봤을 것이다. * {{{find / -type f -exec shred {} \; }}} {{{rm}}}은 삭제 요청이 들어오면 inode를 끊기만 하기 때문에 복구할 수 있고 여타 삭제 명령어들은 데이터를 덮어쓰기만 한다. 하드디스크의 특성상 데이터를 덮어썼더라도 미세 자기가 남아 이를 이용하면 복구할 수 있는 경우가 많은데, {{{shred}}}를 이용하면 여러 번에 걸쳐 썼다 지웠다 하기 때문에 잔류 자기를 이용한 복구 방법은 사실상 불가능하다. 루트 디렉토리 아래 모든 파일을 갈아버리는 지옥의 명령어. 여담으로 1999년 문일현 기자가 [[이종찬(1936)|이종찬]] 당시 국민회의 부총재에게 문건을 보냈다는 의혹이 제기되어 검찰에서 증거를 찾기 위해 하드디스크 복원을 시도했으나 이와 비슷한 원리로 자료가 삭제되어 있어서 복원에 실패한 예가 있다. * [[https://qntm.org/suicide|자살 리눅스]] 잘못된 명령어를 입력하면 바로 {{{rm -rf /}}}를 실행한다. 위의 러시안 룰렛은 거의 100% 확인사살이지만 자살 리눅스는 그나마 생존할 가능성이 있기 때문에 담력시험이 따로 없다. * [[Microsoft Windows|윈도우]] 버전으로는 [[cmd /c rd /s /q c:\\]]가 있다. * {{{cmd /c diskpart}}} {{{sel disk (디스크번호)}}} {{{clean}}} 명령줄도 있다. 역시 윈도우용이다. cmd로 diskpart를 실행하고 n번째 디스크를 선택, clean으로 n번째 디스크의 설정(포맷 형식, 드라이브 문자 등)을 날려버린다는 뜻이다. 여기서 {{{create partition primary}}} (주 파티션 생성, 다스크 전체 할당)를 입력하면 문제가 될 게 없지만 이걸 치지 않으면 복구불가능. '''그것도 윈도우가 깔려있는 디스크에 시전하면 더욱.''' EFI 이미지까지 날려버린다! 그래도 여타 프로그램을 사용하면 복구는 할 수 있다. 디스크 번호는 {{{list disk}}} 명령어로 볼 수 있다. [[분류:UNIX]][[분류:리눅스]]