유닉스 ➤ UNIX
(+)분류 : 가져온 문서/자유인사전

현대 컴퓨터의 역사에 큰 줄기를 그은 운영체제(OS, Operating System). 아니 그냥 현대 컴퓨터 역사 자체이다. 유닉스를 위해 C언어가 만들어질 정도니. 현재 상표권은 오픈 그룹이라는, 미국방성, 나사와 민간 기업(후지쓰, 화웨이, IBM 등)이 결성한 컨소시엄이 상표권을 갖고 있으며, 유닉스와 완벽히 대응하는 형식의 운영체제를 유닉스로 인증해주기도 한다. 이렇게 인증된 OS 중 하나가 바로 macOS이다. macOS는 유닉스다.
1. 특징 ✎ ⊖
- 대화형 쉘 프롬프트:
- 멀티유저와 시분할 멀티태스킹
- 모든게 파일이다: 모든 장치는 파일로써 입출력 제어 된다. 파일로 디스크립트 된 장치들을 커널에서 열고 쓰고 지우고 대기시키고 닫고 죽인다.
- 범용성: C언어로 쓰여져 이론적으론 다양한 플랫폼에서 쓸 수 있다. 하지만 C언어 자체는 범용적일지 몰라도 결국 그 플랫폼을 위한 컴파일러가 준비되어 있지 않다면 범용성은 허상이다. 하지만 C언어의 훌륭한 직관성으로 UNIX를 따라한 여러가지 운영체제들이 여러 플랫폼을 위해 생겨났다. 대표적으로 x86을 위한 오픈소스 유사 유닉스인 리눅스가 있겠다.
2. 시작 ✎ ⊖
미국 국방성은 제네럴 일렉트로닉스, 메사추세츠 공대, 그리고 특히 AT&T의 벨 연구소에 시분할 시스템, 다시 말해 여러 작업을 동시에 처리하고, 서버의 기능을 하게 하는 멀틱스(Multics)라는 운영체제를 만들도록 지원했다. 하나의 큰 컴퓨터에 여러 작은 컴퓨터들을 연결해 동시에 사용하도록 하는 컴퓨팅은 당시로써는 너무 앞선 생각이였고, 결과물은 나왔지만 이게 씨발 시분할 처리는 커녕 제대로 작업자체가 안되니까 그만하라고 프로젝트를 빠개버렸다. 근데 AT&T 연구소의 데니스 리치를 중심으로 그 프로젝트를 부활시키니 그게 유닉스(Unics)의 최초이다. 그 당시 유닉스는 어셈블리로 짜놓은건데 이걸 간단한 코드로 알아보기 쉽게 작업하기 위해 켄 톰슨이 B를 만들어 유닉스를 다시 짰고, 그의 동료 데니스 리치가 브라이언 커니핸과 함께 B의 발전형 C를 다시 만들어 C로 유닉스(Unix)를 깔끔히 다시 빚었다.
2.1. 오픈소스 ✎ ⊖
그런데 전화설비 전매업체이던 AT&T는 컴퓨터의 OS를 돈받고 팔지 못했다. 전화설비 제공을 국가의 혜택을 받으며 그 넓고 넓은 국토를 대상으로 전매하는 업체가 소스코드에 저작권까지 붙여 팔 순 없는 노릇이였다. 미국 정부는 다른 소프트웨어를 연구하고 개발하는 회사들을 오히려 보호한 것이다. 이것을 팔지 못하니 팀원들은 유닉스의 소스코드를 대학 동문 후배들의 연구소 등에서 쓰도록 공유했을 것이고, C언어로 쓰여 범용성과 가독성까지 있었기 때문에 그야말로 컴퓨터의 굉장한 발전이 시작되었다. 특히 MIT 연구소에서 극적으로 발전했고, 유닉스는 메인프레임에서 PC로 활발하게 옮겨졌다. 개인용 PC인 IBM 호환 아키텍쳐에 맞는 교재용 미닉스부터 좀 더 쓸만하게 유닉스를 구현한 커널 리눅스, 켄 톰슨의 동문 후배들이 자기네 PDP-11 메인프레임에서 돌아가게 할 BSD를 만들고 그 프로젝트를 토대로 FreeBSD로 이어지며 오픈소스 운영체제의 시작을 열었으며, 이는 현재 쓰이는 OS X의 모태가 되기도 했다. 80년대부터 MIT에서 GUI를 위해 Xorg 프로젝트가 진행되게 되었으며 이로 애플 컴퓨터는 개인PC용으로 GUI 운영체제를 만들고, 이에 자극받은 마이크로소프트는 IBM 호환체계에서 DOS상의 쉘로라도 GUI를 구현한 마이크로소프트 윈도우즈를 만든다.
이런 상황에서 수익보다 자유로운 컴퓨터 사용을 위해 유닉스를 모델로 한 운영체제 만들기 운동이 리차드 스톨만을 중심으로 일어나니 그것이 GNU.
현재 연구소나 대학에서 메인프레임이나 서버 같은 대형 컴퓨터에 쓰이는 유닉스는 사유소스로 있다. 당연히 AT&T가 민영화되었기에 그렇다.
이런 상황에서 수익보다 자유로운 컴퓨터 사용을 위해 유닉스를 모델로 한 운영체제 만들기 운동이 리차드 스톨만을 중심으로 일어나니 그것이 GNU.
현재 연구소나 대학에서 메인프레임이나 서버 같은 대형 컴퓨터에 쓰이는 유닉스는 사유소스로 있다. 당연히 AT&T가 민영화되었기에 그렇다.
2.2. 멀티유저 ✎ ⊖
유닉스나 그와 유사한 시스템들이 서버용으로 쓰이는 가장 큰 이유는 바로 이 멀티유저(다중 사용자) 기능 때문이다. 당장 터미널을 열어보면 쉘 프롬프트에 나@컴퓨터$ 라고 뜨는데 '나' 와 내가 접속한 컴퓨터를 나타내는거다.
PC가 대중화 되기 전의 옛날에 대학에서 컴퓨터를 사용하는 방법은 이랬다. 거금을 들여 전산실에 메인프레임을 놓는다. 그 메인프레임의 기능을 건물의 각 연구실에서 사용하기 위해, 명령을 입력해서 보내고, 결과물을 받아서 브라운관에 출력하는 기계인 '단말기' 를 각 연구실에 설치하고, 메인프레임과 연결시켜서, 단말기에서 명령을 보내면 메인프레임에서 처리해서 출력결과를 단말기에 보내는 식이였다. 이때 메인프레임에서 쓰였던, 많은 단말기 연결을 지원하는 OS가 바로 UNIX이다.
유닉스의 멀티 유저 기능을 단적으로 예를 들면, 과거 PC통신 시대의 전화국 하이텔 BBS 서버를 들 수 있다. 존나 많은 선을 전화국 서버에 꽂고 가정에서 터미널에서 01410 등으로 서버에 전화를 걸어서 연결이 성공하면 비로소 로그인해서 접속이 되는 식인데, 그 전화국의 서버가 바로 유닉스이다.
이 외에 모든 서버-클라이언트 모델의 모든 조상이 유닉스이다.
다중 사용자 기능은 하드웨어의 발전으로 그 응용 발전 양상이 실로 대단한데, 가장 큰 예가 바로 우리들이 익히 알고 있는 클라우드 게이밍이다. 게임의 리소스와 클라이언트를 다운받아서 서버에 접속하는, 그래서 단말기의 하드웨어에 따라, 혹은 OS에 따라 실행여부가 다른 현재의 온라인 게임 체제는 이제 모든 리소스를 서버에 놓고 여러명의 유저가 중앙에 있는 리소스를 사용해 게임의 화면만 사용자의 단말기로 송출시켜 게임을 하는 쌈박한 체제의 시대로 변화할 준비를 하고 있다. 아직은 입력과 출력의 반응속도나 동시 접속자 수 등 극복해야 할 부분이 산적해 있고, 개선이 미미하지만 가까운 미래에 실현될 수 밖에 없는 것이다. 게임 개발사는 고객이 플스빠와 닌텐도빠의 구분이 없어지고, 리눅스 사용자들은 윈도우즈 게임을 운영체제의 제한 없이 할 수 있다.
PC가 대중화 되기 전의 옛날에 대학에서 컴퓨터를 사용하는 방법은 이랬다. 거금을 들여 전산실에 메인프레임을 놓는다. 그 메인프레임의 기능을 건물의 각 연구실에서 사용하기 위해, 명령을 입력해서 보내고, 결과물을 받아서 브라운관에 출력하는 기계인 '단말기' 를 각 연구실에 설치하고, 메인프레임과 연결시켜서, 단말기에서 명령을 보내면 메인프레임에서 처리해서 출력결과를 단말기에 보내는 식이였다. 이때 메인프레임에서 쓰였던, 많은 단말기 연결을 지원하는 OS가 바로 UNIX이다.
유닉스의 멀티 유저 기능을 단적으로 예를 들면, 과거 PC통신 시대의 전화국 하이텔 BBS 서버를 들 수 있다. 존나 많은 선을 전화국 서버에 꽂고 가정에서 터미널에서 01410 등으로 서버에 전화를 걸어서 연결이 성공하면 비로소 로그인해서 접속이 되는 식인데, 그 전화국의 서버가 바로 유닉스이다.
이 외에 모든 서버-클라이언트 모델의 모든 조상이 유닉스이다.
다중 사용자 기능은 하드웨어의 발전으로 그 응용 발전 양상이 실로 대단한데, 가장 큰 예가 바로 우리들이 익히 알고 있는 클라우드 게이밍이다. 게임의 리소스와 클라이언트를 다운받아서 서버에 접속하는, 그래서 단말기의 하드웨어에 따라, 혹은 OS에 따라 실행여부가 다른 현재의 온라인 게임 체제는 이제 모든 리소스를 서버에 놓고 여러명의 유저가 중앙에 있는 리소스를 사용해 게임의 화면만 사용자의 단말기로 송출시켜 게임을 하는 쌈박한 체제의 시대로 변화할 준비를 하고 있다. 아직은 입력과 출력의 반응속도나 동시 접속자 수 등 극복해야 할 부분이 산적해 있고, 개선이 미미하지만 가까운 미래에 실현될 수 밖에 없는 것이다. 게임 개발사는 고객이 플스빠와 닌텐도빠의 구분이 없어지고, 리눅스 사용자들은 윈도우즈 게임을 운영체제의 제한 없이 할 수 있다.
3. 시스템 구조 ✎ ⊖
유닉스 계열의 시스템의 주요 구조는 이렇다.
program files폴더에 애플리케이션별로 폴더가 나눠져 바이너리가 통으로 위치되는 윈도우와는 약간 다르다. 모든 바이너리는 /bin이나 /usr/bin에 위치되고 프로그램의 정보 등은 /share, /var 그리고 각 유저의 홈폴더에 따로따로 들어가기 때문에 삭제할 때는 grep이나 find 등으로 찾아 삭제해야 하는 복잡함이 있다. 이를 쉽게 하기 위해 BSD계열에는 ports라는게 있고 리눅스계열에는 패키지라는게 있다. Ports나 패키지 모두 한 소프트웨어를 실행, 관리하기 위해 필요한 바이너리와 스크립트 등을 모아주는 것이다. 어찌됐든 프로그램 파일즈에 있는 꾸러미폴더 싹 지워버리면 끝(은 아니고 레지스트리 정리+system32등에 홀로남은 .dll 파일들 정리 등 해야함)인 윈도우에 비해 입문자가 이해하고 적응하기엔 약간 어려움이 있긴 하다. 이렇게 되는 이유라면 이유가 뭐냐면 유닉스는 본디 소프트웨어를 필요한 라이브러리 등을 /lib 등에서 찾아 컴파일해서 바이너리를 생성한 후 bin폴더에 넣는것으로 설치하기 때문이다. 그렇기 때문에 리눅스에서 의존성 패키지(다른 패키지를 설치와 실행에 필요한 다른 패키지)라는 개념이 있는 것. 소스코드에서 진짜 프로그램을 만드는게 유닉스의 A요 Z인 특징. 이미 바이너리가 압축되어서 설치프로그램 실행으로 애플리케이션 실행에 필요한 각종 설정파일, 런타임, 실행파일들이 애플리케이션 단위로 관리하는 윈도우와는 그 개념이 궤를 달리한다.
- / : 최상위 디렉토리. 루트이다.
- /root : root 사용자의 home 디렉토리이다. 여기의 설정파일들이 sudo 실행에 영향을 준다. 만약 여기에 vim의 설정 스크립트 파일이 없는 상황이면 당연히 sudo vim 실행 시 vim의 기본 설정으로 실행이 된다.
- /home : 각 사용자들의 홈 디렉토리가 여기에 있다. 이것으로 사용자들이 한 컴퓨터에 접속 했을 때 제 각기 다른 설정으로 프로그램을 다룰 수 있다.
- /bin : Binary의 약자. ls, cd 등 시스템의 가장 기초적인 바이너리가 들어있다.
- /boot : 부트로더가 들어가는 위치. 커널, initrd 등이 들어간다.
- /dev : Device의 약자. 장치정보가 들어가 있다.
- /etc : 시스템 전체에 영향을 미치는 각 애플리케이션의 여러 설정파일이 들어간다. 예를 들면 /etc/nanorc 파일이나 /etc/locale.conf 등. 모든 시스템에 영향을 미치는 설정들이기 때문에 수정시 주의가 요구된다. 이름도 사용자의 홈디렉토리의 숨겨진 파일(.*.conf 등)의 이름도 다른 경우가 많아서 찾아보고 다뤄야 한다. 만약 bash의 설정 파일이 사용자 디렉토리에선 .bashrc 이지만 /etc 디렉토리 안에서는 /etc/bash.bashrc 이다.
- /lib : 프로그램들이 컴파일, 해석, 실행하기 위해 필요한 모든 라이브러리가 들어있다. 파이썬의 많은 모듈들도 /lib/python3.4 등에 설치된다. /usr/bin의 실행에 필요한 바이너리는 /usr/lib에 있다.
- /media, /mnt : 이동식 디스크나 하드디스크의 파티션 등을 마운트할 때 쓰이는 디렉터리. 예를들어 mount -o ntfs-3g /dev/sda3 /mnt 등으로 마운트 한다. USB가 자동으로 마운트가 된다면 /media에 마운트 되지만 수동으로 마운트 할때는 별로 상관없다.
- /usr : 유닉스 시스템 리소스. 실행파일, 라이브러리, 글꼴 등등이 위치한다. 여기 하위에 있는 bin, lib 디렉토리들이 /bin, /lib으로부터 심볼릭 링크 되어있다.
- /var : 수시로 변동되는 여러가지 로그와 시스템 정보, 임시파일 등이 들어있다. 갑자기 Xorg가 실행이 안된다! 싶으면 /var/log/xorg.0.log 등을 봄으로써 확인 할 수 있다.
program files폴더에 애플리케이션별로 폴더가 나눠져 바이너리가 통으로 위치되는 윈도우와는 약간 다르다. 모든 바이너리는 /bin이나 /usr/bin에 위치되고 프로그램의 정보 등은 /share, /var 그리고 각 유저의 홈폴더에 따로따로 들어가기 때문에 삭제할 때는 grep이나 find 등으로 찾아 삭제해야 하는 복잡함이 있다. 이를 쉽게 하기 위해 BSD계열에는 ports라는게 있고 리눅스계열에는 패키지라는게 있다. Ports나 패키지 모두 한 소프트웨어를 실행, 관리하기 위해 필요한 바이너리와 스크립트 등을 모아주는 것이다. 어찌됐든 프로그램 파일즈에 있는 꾸러미폴더 싹 지워버리면 끝(은 아니고 레지스트리 정리+system32등에 홀로남은 .dll 파일들 정리 등 해야함)인 윈도우에 비해 입문자가 이해하고 적응하기엔 약간 어려움이 있긴 하다. 이렇게 되는 이유라면 이유가 뭐냐면 유닉스는 본디 소프트웨어를 필요한 라이브러리 등을 /lib 등에서 찾아 컴파일해서 바이너리를 생성한 후 bin폴더에 넣는것으로 설치하기 때문이다. 그렇기 때문에 리눅스에서 의존성 패키지(다른 패키지를 설치와 실행에 필요한 다른 패키지)라는 개념이 있는 것. 소스코드에서 진짜 프로그램을 만드는게 유닉스의 A요 Z인 특징. 이미 바이너리가 압축되어서 설치프로그램 실행으로 애플리케이션 실행에 필요한 각종 설정파일, 런타임, 실행파일들이 애플리케이션 단위로 관리하는 윈도우와는 그 개념이 궤를 달리한다.
4. 권한 ✎ ⊖
유닉스 시스템은 다른 시스템과 마찬가지로 파일 등에 권한을 부여한다. 유닉스는 애초에 다중 사용자를 위해 만들어졌고, 관리자의 권한을 가진 사람이 사용자에게 어떤 파일을 읽거나, 쓰거나, 실행할 수 있을 지 없을 지를 결정 할 수 있게 만들어졌다. 여러분들이 $ ls -l /bin 라고 쳐보면, 쉘은 각 파일의 맨 처음 항목으로 -rwxr-xr-x 등을 쏟아 내는데, 이게 바로 권한이 어떻게 주어져 있는지에 대한 표시이다. 이것은 이진수로 표현이 가능하고 그 이진수를 팔진수로 표시하기도 가능하다. 왜 팔진수이냐는 아래를 보면 이해가 가능하다.
이걸 정리하면
이고, 이것을 이진수로 표현하면
이런 9자리 짜리 이진수가 나오는데, 이것이 3비트씩 분류가 되었으니(맨 앞의 3비트는 주인, 중간 3비트는 그룹 사용자, 마지막 3비트는 기타 사용자), 팔진수로 표현할 수가 있는데,
이다. 즉 권한을 부여하는 등의 명령어에서 755 라는 옵션이 붙는 것은 파일의 주인은 읽고, 쓰고, 실행하는 것이 가능하지만, 파일 주인이 속한 그룹의 사용자나, 다른 사용자는 파일에 추가로 작성하는 것은 불가능하고, 읽기와 실행만 가능하다는 것이다.
만약 파일의 주인만 읽고, 쓰고, 실행해야 한다면 rwx------라고 쓸 수 있고, 이는 다시 말하자면 111000000, 즉 700이다. 같은 아이디어로, 텍스트 파일이 주인을 제외하고 읽기 전용이라면 당연히 rw-r--r-- 일 것이고 이걸 팔진수로 표현하면 644이다.
주인 그룹 사용자 기타 사용자
r(읽기) w(쓰기) x(실행) r(읽기) w(쓰기) x(실행) r(읽기) w(쓰기) x(실행)
1(읽기 가능) 1(쓰기 가능) 1(실행 가능) 1(읽기 가능) 0(쓰기 불가) 1(실행 가능) 1(읽기 가능) 0(쓰기 불가) 1(실행 가능)
이걸 정리하면
rwxr-xr-x
이고, 이것을 이진수로 표현하면
111101101
이런 9자리 짜리 이진수가 나오는데, 이것이 3비트씩 분류가 되었으니(맨 앞의 3비트는 주인, 중간 3비트는 그룹 사용자, 마지막 3비트는 기타 사용자), 팔진수로 표현할 수가 있는데,
755
이다. 즉 권한을 부여하는 등의 명령어에서 755 라는 옵션이 붙는 것은 파일의 주인은 읽고, 쓰고, 실행하는 것이 가능하지만, 파일 주인이 속한 그룹의 사용자나, 다른 사용자는 파일에 추가로 작성하는 것은 불가능하고, 읽기와 실행만 가능하다는 것이다.
만약 파일의 주인만 읽고, 쓰고, 실행해야 한다면 rwx------라고 쓸 수 있고, 이는 다시 말하자면 111000000, 즉 700이다. 같은 아이디어로, 텍스트 파일이 주인을 제외하고 읽기 전용이라면 당연히 rw-r--r-- 일 것이고 이걸 팔진수로 표현하면 644이다.
5. 종류 ✎ ⊖
유닉스 구현을 위해 노력하던 사람들에 의해 유닉스와 유사한 시스템들이 나왔다.
5.1. MacOS ✎ ⊖
FreeBSD를 기반으로 한 다윈을 기반으로 애플 컴퓨터 전용 OS를 만들었고, 오늘날의 MacOS가 되었다.
5.2. BSD ✎ ⊖
미국 캘리포니아 대학 버클리 에서도 UNIX와 유사한 운영체제를 만드는데 그게 BSD이다. 빌 조이라는 버클리 컴공 대학원생이 1976년에 BSD에서 쓸 편집기를 만들었는데, 그게 vi이다.
BSD는 이후 개인용 컴퓨터 운영체제 프로젝트를 몇 개 파생시켰는데, 현재 FreeBSD와 NetBSD, OpenBSD 정도 남아있다. 그리고 FreeBSD는 위의 MacOS를 파생시켰다.
BSD는 소프트웨어 라이센스의 일종이기도 하다. BSD 라이센스는 한 마디로, 최초 원작자를 앞세워 홍보하지 말고, 원작자에게 소스를 써서 피해를 봤다고 따지지만 않으면 어떻게 쓰든 뭐라고 안하니까 가져다 써서 재배포 하게 되면 약관을 토씨 하나 틀리지말고 소스코드에 복붙하거나 바이너리 안에서 볼 수 있게 하라는 것이다.
BSD는 이후 개인용 컴퓨터 운영체제 프로젝트를 몇 개 파생시켰는데, 현재 FreeBSD와 NetBSD, OpenBSD 정도 남아있다. 그리고 FreeBSD는 위의 MacOS를 파생시켰다.
BSD는 소프트웨어 라이센스의 일종이기도 하다. BSD 라이센스는 한 마디로, 최초 원작자를 앞세워 홍보하지 말고, 원작자에게 소스를 써서 피해를 봤다고 따지지만 않으면 어떻게 쓰든 뭐라고 안하니까 가져다 써서 재배포 하게 되면 약관을 토씨 하나 틀리지말고 소스코드에 복붙하거나 바이너리 안에서 볼 수 있게 하라는 것이다.
5.3. 리눅스 ✎ ⊖
핀란드의 평범한 공돌이 리누스 토르발스는 그저 재미로 유닉스를 개인용 컴퓨터에 돌아가게 한 운영체제를 구현 해 자기 이름을 따 리눅스라고 짓는다. 유닉스를 본 땄다고는 하지만 IBM PC에서 작동 가능케 한 커널 자체는 이 양반이 자체 구현했고, 이 OS는 GNU 프로젝트의 시작은 아니지만 기둥이 된다.
6. 쓰임새 ✎ ⊖
상용 유닉스로만 따진다면 서버, 메인프레임 컴퓨터, 대형컴퓨터에서 실험 자료 처리에 사용되고 특히 이런 과학 분야에 아주 보편적으로 쓰인다. 이것은 유닉스가 유일하게 윈도우를 앞지르는 것으로, 특히 천문같은 경우에는 윈도우에선 쓸만한 툴이 없고, 유닉스용, 그것의 타 POSIX OS에 포팅된 것이 쓰인다.