최근에 HackerNews에 busybox 메일링 리스트가 하나 올라왔다. 이 글에서는 /bin, /usr/bin, /home 등이 생긴 문맥을 다뤘다. 나도 저것들의 차이는 알고 있었으나 그렇게 나눈 이유는 몰랐었다. 국내 블로그에서도 차이점은 보여주지만, 그 이유를 다룬곳은 없었다. 그래서 알면 좋겠다는 생각에 해당 글을 간추려서 정리했다.

PDP-7 이미지 (위키피디아)

1969년도에 PDP-7이라는 장치 위에서 유닉스(Unix)가 만들어졌다. 그러다가 1971년도에 PDP-11로 기기를 업그레이드 했다. 이때 RK05 라는 디스크가 사용됐다. RK05는 디스크 하나당 1.5MB를 저장할 수 있었다. 이때 부터 실행 파일은 /bin, 관리 도구는 /sbin, 라이브러리들은 /lib, 임시 파일들은 /tmp에 저장을 했다.

처음에는 RK05 디스크 하나에 OS를 다 담을수 있었다. 그러나 시스템이 커지면서 1.5MB의 RK05 디스크에 모든것을 담기엔 힘들어졌다. 그래서 디스크를 두개로 나눠서 사용하기로 했다.

디스크 하나에 모든것을 저장함.
시스템에 필요한 파일도, 사용자가 사용하는 프로그램도, 사용자의 문서도 모두 한 디스크에 저장했음.

디스크를 두개로 나누면서 시스템에 꼭 필요한것은 그대로 냅두고, 사용자가 컴퓨터를 사용하는데 필요한 파일들을 두번째 디스크에 옮겼다. 사용자 파일을 두번째 디스크에 옮긴다는 기준에서 실행파일, 라이브러리, 관리도구들도 다 분리를 했다. 기존 시스템처럼 편하게 작업할 수 있게 원래 시스템에 사용했었던 디렉터리 구조를 똑같이 복제했다. (/bin, /sbin, /lib, tmp등)

알다시피, 연결한 디스크는 특정 마운트 지점으로 접근할 수 있다. 두번째 디스크는 “사용자가 사용하는 ~~~” 이라는 의미로 /usr (/user) 아래에 마운트 시켰다. 그래서 / (root)와 /usr 로 나뉘어 졌다.

디스크가 꽉 차면서 두개의 디스크로 파일을 나눔.
시스템에 꼭 필요한것을 첫번째 디스크에 넣고, 그 외 사용자가 필요한 파일은 두번째 디스크에 넣음.
두번째 디스크는 /usr 아래에 마운트 되도록 함.
두번째 디스크는 첫번째 디스크의 파일 구조를 그대로 복제해서 사용했음.

디스크를 두개 연결해서 2배 많은 용량을 확보했다. 첫번째 디스크에는 시스템이 돌아가는데 꼭 필요한것들이, 두번째 디스크에서는 사용자가 실행할·필요한 프로그램이나 파일들이 모여있었다. 그러나 두 디스크를 합쳐도 3MB밖에 용량이 되지 않는다. 시간이 지나면서 3MB로는 부족해 졌다. 그래서 또 새로운 디스크를 연결해야 했다.

새로 붙인 3번째 디스크에는 사용자가 작업하는데 필요한 파일들과 디렉토리를 옮겼다. (문서라던지, 소스코드라던지… 작업에 사용되는 파일들) 원래는 /usr를 홈 디렉터리 처럼 사용했지만, 용량이 부족해서 /usr 아래에 작업한다고 만든 파일과 디렉터리들을 전부 새 디스크에 옮긴 것이다. 그리고 이 디스크는 /home 에 마운트 하기로 했다.

이렇게 디스크가 추가되면서 /, /usr, /home 의 구조가 만들어졌다. 그래서 3개의 계층을 가지게 됐다. 시스템에 꼭 필요한것은 루트에, 사용자가 사용하는 프로그램이나 라이브러리는 /usr에, 그리고 문서나 기타 작업 파일은 /home에 집어넣게 바뀌었다. 어떻게 보면… 중요도에 따라 시스템에 가장 중요한건 1번에, 다음으로 중요한건 2번에, 가장 덜 중요한건 3번 디스크에 저장하게 됐다.

당연하게도, 부팅을 할 때 첫번째 디스크를 로딩하고, 두번째 디스크를 로딩하고, 마지막으로 다른 디스크를 로딩 한다. 그래서 “최초에 부팅을 할때 두번째 디스크를 /usr에 마운트 할 정도의 기능은 할 수 있어야 한다” 라는 규칙을 만들었다고 한다. 다시 말해서, 첫번째 디스크에는 /bin, 과 /sbin 에는 “/usr를 마운트 할 수 있을 정도의 프로그램들을 담았다.

이것이 /bin, /usr/bin, /home으로 파일 시스템 구조가 나뉘어진 이유이다. 하지만 시간이 지나면서 이렇게 구조를 나눌 필요가 없어졌다.

  1. 초기의 시스템은 “부팅에 선행적으로 필요한 파일들”을 따로 관리하지 못했다. 그래서 디스크를 나누고 필요할 만한 것들은 첫번째 디스크에 다 모았다. 하지만 요즘은 initrd, initramfs에서 부팅에 필요한 부분은 따로 관리한다.
  2. 요즘에는 공용 라이브러리를 쓴다.(shared library를 자주 쓴다) 과거에는 /usr/lib과 /lib이 독립적으로 있었고, 프로그램도 정적 로딩으로 구성되어 있었다. 그래서 두 폴더는 독립적이었고 상대쪽을 고려하지 않고 파일을 업그레이드 하거나 교체할 수 있었다. 하지만 다이나믹 링킹을 쓰면서 어느 한쪽이 업데이트 되면 (버전이 달라지면) 다른쪽이 작동이 안된다. /lib와 /usr/bin, /usr/lib 등이 상호종속적 구조로 바귀었다. 그래서 굳이 분리할 필요가 없어졌다. (이젠 분리하면 오류가 생긴다)
  3. 디스크 용량이 커지면서 애초에 나눌 필요가 사라졌다. 1990년대만 해도 100MB의 하드디스크를 쉽게 구할 수 있었다.

그럼에도 이 구조가 남은것은 관료적 이유(그냥… 이렇게 구조가 나뉘어 있으니까 이렇게 써라~)와 “왜 이렇게 파일구조가 나뉘어있는지” 생각·의견 제시하는 사람이 적어서 남겨졌다.

이렇게 파일구조가 나뉘어저 있기 때문에, 몇몇 사람들은 이 위에서 새로운 규칙을 만들었다. 그러면서 /usr/local이 생겨났다. 또 그러면서 /opt 같은게 생겨났다. 미래에는 /opt/local 같은게 생겨날 지도 모른다

30년이 지나면서 배포판 마다 다른 규칙도 추가됐다. 예를들어, /tmp는 부팅시 마다 초기화 되지만 (tmpfs), /usr/tmp는 부팅시에도 그대로 이다.

리눅스 공식 문서에서도 나뉘어져 있는것은 적혀있지만, 그 이유에 대해서는 이해하거나 언급되어 있지 않다.


글의 전체적인 내용은 위와 같다. 리눅스 파일구조를 검색해도 특별하게 이유를 언급한 글은 쉽게 보지 못했다. 위의 글을 읽으니 어느정도 구조가 왜 그렇게 됐는지~ 머리속에 그림이 그려지는듯 하다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

최신 글