최근에 HackerNews에 busybox 메일링 리스트가 하나 올라왔다. 이 글에서는 /bin, /usr/bin, /home 등이 생긴 문맥을 다뤘다. 나도 저것들의 차이는 알고 있었으나 그렇게 나눈 이유는 몰랐었다. 국내 블로그에서도 차이점은 보여주지만, 그 이유를 다룬곳은 없었다. 그래서 알면 좋겠다는 생각에 해당 글을 간추려서 정리했다.
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 로 나뉘어 졌다.
디스크를 두개 연결해서 2배 많은 용량을 확보했다. 첫번째 디스크에는 시스템이 돌아가는데 꼭 필요한것들이, 두번째 디스크에서는 사용자가 실행할·필요한 프로그램이나 파일들이 모여있었다. 그러나 두 디스크를 합쳐도 3MB밖에 용량이 되지 않는다. 시간이 지나면서 3MB로는 부족해 졌다. 그래서 또 새로운 디스크를 연결해야 했다.
새로 붙인 3번째 디스크에는 사용자가 작업하는데 필요한 파일들과 디렉토리를 옮겼다. (문서라던지, 소스코드라던지… 작업에 사용되는 파일들) 원래는 /usr를 홈 디렉터리 처럼 사용했지만, 용량이 부족해서 /usr 아래에 작업한다고 만든 파일과 디렉터리들을 전부 새 디스크에 옮긴 것이다. 그리고 이 디스크는 /home 에 마운트 하기로 했다.
이렇게 디스크가 추가되면서 /, /usr, /home 의 구조가 만들어졌다. 그래서 3개의 계층을 가지게 됐다. 시스템에 꼭 필요한것은 루트에, 사용자가 사용하는 프로그램이나 라이브러리는 /usr에, 그리고 문서나 기타 작업 파일은 /home에 집어넣게 바뀌었다. 어떻게 보면… 중요도에 따라 시스템에 가장 중요한건 1번에, 다음으로 중요한건 2번에, 가장 덜 중요한건 3번 디스크에 저장하게 됐다.
당연하게도, 부팅을 할 때 첫번째 디스크를 로딩하고, 두번째 디스크를 로딩하고, 마지막으로 다른 디스크를 로딩 한다. 그래서 “최초에 부팅을 할때 두번째 디스크를 /usr에 마운트 할 정도의 기능은 할 수 있어야 한다” 라는 규칙을 만들었다고 한다. 다시 말해서, 첫번째 디스크에는 /bin, 과 /sbin 에는 “/usr를 마운트 할 수 있을 정도의 프로그램들을 담았다.
이것이 /bin, /usr/bin, /home으로 파일 시스템 구조가 나뉘어진 이유이다. 하지만 시간이 지나면서 이렇게 구조를 나눌 필요가 없어졌다.
- 초기의 시스템은 “부팅에 선행적으로 필요한 파일들”을 따로 관리하지 못했다. 그래서 디스크를 나누고 필요할 만한 것들은 첫번째 디스크에 다 모았다. 하지만 요즘은 initrd, initramfs에서 부팅에 필요한 부분은 따로 관리한다.
- 요즘에는 공용 라이브러리를 쓴다.(shared library를 자주 쓴다) 과거에는 /usr/lib과 /lib이 독립적으로 있었고, 프로그램도 정적 로딩으로 구성되어 있었다. 그래서 두 폴더는 독립적이었고 상대쪽을 고려하지 않고 파일을 업그레이드 하거나 교체할 수 있었다. 하지만 다이나믹 링킹을 쓰면서 어느 한쪽이 업데이트 되면 (버전이 달라지면) 다른쪽이 작동이 안된다. /lib와 /usr/bin, /usr/lib 등이 상호종속적 구조로 바귀었다. 그래서 굳이 분리할 필요가 없어졌다. (이젠 분리하면 오류가 생긴다)
- 디스크 용량이 커지면서 애초에 나눌 필요가 사라졌다. 1990년대만 해도 100MB의 하드디스크를 쉽게 구할 수 있었다.
그럼에도 이 구조가 남은것은 관료적 이유(그냥… 이렇게 구조가 나뉘어 있으니까 이렇게 써라~)와 “왜 이렇게 파일구조가 나뉘어있는지” 생각·의견 제시하는 사람이 적어서 남겨졌다.
이렇게 파일구조가 나뉘어저 있기 때문에, 몇몇 사람들은 이 위에서 새로운 규칙을 만들었다. 그러면서 /usr/local이 생겨났다. 또 그러면서 /opt 같은게 생겨났다. 미래에는 /opt/local 같은게 생겨날 지도 모른다
30년이 지나면서 배포판 마다 다른 규칙도 추가됐다. 예를들어, /tmp는 부팅시 마다 초기화 되지만 (tmpfs), /usr/tmp는 부팅시에도 그대로 이다.
리눅스 공식 문서에서도 나뉘어져 있는것은 적혀있지만, 그 이유에 대해서는 이해하거나 언급되어 있지 않다.
글의 전체적인 내용은 위와 같다. 리눅스 파일구조를 검색해도 특별하게 이유를 언급한 글은 쉽게 보지 못했다. 위의 글을 읽으니 어느정도 구조가 왜 그렇게 됐는지~ 머리속에 그림이 그려지는듯 하다.
답글 남기기