Ubuntu 서버 한 대에서 두 이름이 함께 보일 때가 있다.
$ uname -s
Linux
$ cat /etc/os-release
NAME="Ubuntu"
ID=ubuntu
VERSION_ID="24.04"
...
첫 명령의 결과는 Linux다. 두 번째 파일은 같은 서버를 Ubuntu라고 설명한다. 여기서는 핵심 필드만 남겼으며 배포판과 버전에 따라 실제 값은 달라진다.
어느 쪽도 틀린 이름이 아니다. 서로 다른 층을 가리킨다.
uname은 Linux라고 말한다
uname -s가 보여주는 것은 운영체제의 핵심인 커널의 이름이다. Linux 커널은 CPU 시간을 나누고, 메모리를 보호하며, 파일과 네트워크 및 장치를 프로그램에 연결한다.
애플리케이션은 디스크나 네트워크 카드에 직접 명령하지 않는다. read() 같은 시스템 호출로 커널에 요청하고, 커널이 하드웨어와 자원의 경계를 관리한다.
Linux는 UNIX의 소스 코드를 이어받은 운영체제가 아니다. UNIX와 비슷한 인터페이스와 동작을 목표로 처음부터 새로 작성된 UNIX 계열 커널이다. 1991년 Linus Torvalds가 시작했고, 이후 여러 개발자가 함께 확장해 왔다.
리눅스가 가리키는 것은 커널
커널은 운영체제의 중심이지만 커널만으로 우리가 익숙한 서버 환경이 완성되지는 않는다.
로그인하고 명령을 입력하려면 셸이 필요하다. 프로그램을 실행하려면 시스템 라이브러리와 기본 도구가 필요하고, 서비스를 올리려면 초기화 시스템과 설정 파일이 필요하다. 소프트웨어를 설치하고 갱신하려면 패키지와 패키지 관리자도 있어야 한다.
Linux는 이 프로그램들이 CPU, 메모리와 장치를 사용할 수 있는 공통 기반을 제공한다. 그 위를 채우는 프로그램은 Linux 커널과 별개의 사용자 공간에서 실행된다.
배포판이 운영체제의 형태를 만든다
배포판은 Linux 커널과 시스템 라이브러리, 기본 명령어, 패키지 관리자와 각종 설정을 골라 하나의 설치 가능한 운영체제로 묶는다.
Ubuntu, Debian과 Fedora가 모두 Linux를 사용하면서도 설치 방법과 패키지 형식, 기본 설정 및 업데이트 정책이 다른 이유가 여기에 있다. 커널이라는 중심은 공유하지만 그 위에 어떤 도구를 놓고 어떻게 유지할지는 배포판이 정한다.
그래서 일상에서는 전체 운영체제를 짧게 Linux라고 부르기도 한다. 기술적인 경계를 분명히 할 때는 Linux 커널과 Linux 배포판을 구분하면 된다.
셸과 터미널은 리눅스가 아니다
Bash와 zsh는 사용자가 입력한 명령을 해석해 프로그램을 실행하는 셸이다. 터미널은 셸의 입력과 출력을 보여주는 통로다. ls, cat 같은 명령도 커널 기능 자체가 아니라 사용자 공간에서 실행되는 프로그램이다.
셸이 명령을 해석하면 프로그램이 실행되고, 그 프로그램이 필요한 작업을 시스템 호출로 커널에 요청한다.
터미널 → 셸 → 프로그램 → 시스템 호출 → Linux 커널 → 하드웨어
우리가 리눅스를 사용하며 직접 마주하는 것은 대부분 커널이 아니라 그 위에 놓인 도구다. 커널은 화면 뒤에서 프로그램의 요청과 실제 자원을 연결한다.
오픈소스는 규칙이 없는 소프트웨어가 아니다
Linux 커널은 GPL-2.0 라이선스로 배포된다. 소스 코드를 살펴보고 수정하거나 재배포할 수 있지만, 라이선스가 요구하는 조건까지 사라지는 것은 아니다.
공개된 소스와 공동 개발 방식 덕분에 다양한 회사와 개인이 같은 커널을 고치고 새로운 하드웨어를 지원할 수 있다. 특정 회사의 제품 하나라기보다 여러 참여자가 함께 유지하는 기반에 가깝다.
리눅스의 자유는 아무 제한이 없다는 뜻이 아니다. 코드를 사용할 권리와 그 권리를 다음 사용자에게 이어 주는 조건이 함께 있다는 뜻이다.
다시 두 정보를 보면 역할이 분명해진다.
uname -s
cat /etc/os-release
uname은 자원을 관리하는 커널이 Linux라고 말한다. os-release는 그 커널과 사용자 공간의 도구를 어떤 배포판이 하나의 운영체제로 묶었는지 알려준다.
결과적으로 Linux는 화면이나 명령어 묶음의 이름이 아니다. 프로그램이 하드웨어를 안전하고 일관된 방식으로 사용하게 만드는 커널이며, 배포판은 그 커널을 실제로 사용할 수 있는 운영체제로 완성한 구성이다.
