리눅스는 1991년에 개발된 Unix 계열의 오픈 소스 운영 체제(OS)다.
유닉스는 1970년대 초에 개발되었으며,
리눅스가 Unix 계열이라는 말은 리눅스가 유닉스와의 호환을 목표로
유닉스의 설계 원칙을 따르고 유사한 환경을 제공하도록 개발되었다는 것을 의미한다.
따라서 기존에 유닉스에서 사용하던 많은 프로그램과 도구들을 리눅스에서도 쉽게 사용할 수 있다.
그러나 리눅스의 코드 자체는 유닉스와 별개로 작성되었다.
또 다른 유닉스 계열 운영체제로는 BSD, Solaris 등이 있다.
리눅스의 핵심이 되는 리눅스 커널에 대해 알아보자.
커널은 실제 컴퓨터의 하드웨어를 제어하는 역할을 하며,
프로세스 관리, 메모리 관리, 파일 시스템 관리, 장치 드라이버를 통한 장치 제어 등의 일을 한다.
커널의 핵심기능은 프로세스 관리와 메모리 관리이며,
커널에서 분리할 수 없는 그 자체이다.
나머지 파일 시스템 드라이버나 장치 드라이버, 네트워크 프로토콜 등은
커널 모듈로써, 뗐다 붙이거나 다른 모듈로 교체할 수 있다.
이러한 구조 덕분에
새로운 장치를 연결하거나 다른 파일 시스템으로 변경하는 등의 작업이 가능해져,
다양한 하드웨어 환경에서도 유연하게 동작할 수 있게 된다.
두 기능들은 시스템 부팅과 기본적인 운영에 필수적인 기능들이여서
이를 모듈로 제공할 경우, 모듈의 로드/언로드 과정에서 발생할 수 있는 오류가
시스템 전체의 안정성에 큰 영향을 미칠 수 있기 때문이다.
하지만 커널을 사용자가 직접 다루기엔 어려웠고,
시스템 안정성에 있어서도 취약할 수 있기 때문에
중간에 쉘이라는 프로그램을 둬서
사용자가 입력한 고수준의 명령어를 시스템 콜로 변환하여
커널을 제어하게 하였다.
그리고 이 쉘의 인터페이스가 바로 터미널이다.
즉, 터미널에 명령을 입력하면 쉘이 이를 해석해서 커널을 호출하고,
커널의 응답을 쉘이 터미널을 통해 사용자에게 보여주는 것이다.
터미널은 그저 단순한 입/출력 장치에 불과하다.
따라서 본체는 커널이고
이 커널을 쉽고 안전하게 다루기 위해
쉘이라는 중간 프로그램을 둔 것이다.

응당 개발자라면 쉘 스크립트를 한 번쯤은 작성해보았을 것이다.
쉘 스크립트란 별 거 없고
쉘에서 실행할 명령어들을 순차적으로 작성한 텍스트 파일에 불과하다.
단지 쉘 스크립트 언어(echo, ls 등)로 프로그래밍을 하는 것으로
마치 C언어로 프로그래밍을 하는 것과 비슷하다.
실제로 쉘 스크립트를 작성하는 것을 쉘 프로그래밍이라고 부른다.
물론 C나 Java같은 언어는 프로그래밍 언어로
스크립트 언어와는 차이점이 있다.
스크립트 언어와 프로그래밍 언어
초기에는 이 둘의 차이점이 명확했지만 점점 그 경계가 모호해지고 있다.
많은 스크립트 언어들이 복잡한 애플리케이션 개발에도 사용되고,
많은 프로그래밍 언어들이 간단한 스크립트 작업에도 사용된다.
현대에는 이 둘을 명확하게 구분 짓기는 어렵고
보통 인터프리터로 바로 실행되냐 컴파일이 필요하냐에 기준을 둔다.
리눅스 배포판은 리눅스 커널에
패키지 관리 시스템, 사용자 인터페이스, 응용 프로그램 등을 포함한 완전한 운영 체제다.
대표적인 배포판으로는 우분투, 데비안 등이 있다.
Torvalds씨가 처음 배포한 리눅스 버전은 리눅스 커널에
쉘, GNU 유틸리티(ls, mv, grep 등), 컴파일러, vi 등을 포함한 형태였다.
여기까지 리눅스 커널에 대해 알아 보았고
다음 편은 유닉스 및 리눅스의 다중 사용자 기능에 대해 알아 보겠다.