Linux란 무엇인가: 커널부터 배포판까지 한눈에
Linux가 운영체제인지 커널인지부터 시작해, 5계층 아키텍처와 커널의 4가지 핵심 역할을 명확히 정리한다.
“Linux를 쓴다”는 말은 사람마다 다르게 들린다. 서버 관리자에게는 Ubuntu 서버를, 임베디드 개발자에게는 4MB짜리 커널 이미지를, 게이머에게는 Steam이 돌아가는 데스크톱을 의미한다. 이렇게 혼란스러운 이유는 “Linux”라는 단어가 두 가지를 동시에 가리키기 때문이다. 커널(kernel) 그 자체를 가리키기도 하고, 커널을 포함한 완전한 운영체제 배포판을 가리키기도 한다. 이 첫 번째 글에서는 그 경계를 명확히 하고, Linux가 실제로 어떤 구조로 동작하는지 살펴본다.
Linux = 커널이다
엄밀하게 말하면 Linux는 운영체제 커널이다. 1991년 핀란드 대학원생 리누스 토르발스(Linus Torvalds)가 처음 공개했고, 지금은 전 세계 수천 명의 개발자가 기여하는 오픈소스 프로젝트다. 커널은 하드웨어와 소프트웨어 사이에서 중개자 역할을 한다. CPU 스케줄링, 메모리 분배, 파일시스템 접근, 네트워크 통신 — 모든 저수준 작업이 커널을 통해 이뤄진다.
그러나 우리가 일상에서 “Linux를 설치했다”고 말할 때는 커널만 설치한 게 아니다. GNU 유틸리티, 패키지 관리자, 셸, 데스크톱 환경 등 수백 개의 소프트웨어가 함께 묶인 **배포판(distribution)**을 설치한 것이다.
5계층 아키텍처
Linux 시스템은 아래에서 위로 5개 계층으로 쌓여 있다.
| 계층 | 구성 요소 | 역할 |
|---|---|---|
| 1 (최상위) | 사용자 애플리케이션 | 웹 브라우저, 에디터, 서버 프로세스 |
| 2 | 셸 · 데몬 | 명령 해석, 백그라운드 서비스 |
| 3 | 시스템 라이브러리 | glibc 등 — 시스템 콜 래퍼 |
| 4 | Linux 커널 | 자원 관리, 하드웨어 추상화 |
| 5 (최하위) | 하드웨어 | CPU, RAM, 디스크, NIC |
사용자 앱은 커널을 직접 호출하지 않는다. glibc 같은 시스템 라이브러리가 시스템 콜(syscall) 인터페이스를 포장해 준다. 덕분에 앱 개발자는 하드웨어 세부 사항을 몰라도 된다.
// 사용자 코드: glibc의 write()를 호출
write(STDOUT_FILENO, "hello\n", 6);
// 내부에서는 커널의 sys_write 시스템 콜로 변환
// syscall(SYS_write, 1, "hello\n", 6);
커널의 4가지 핵심 역할
프로세스 관리: 커널은 모든 프로세스를 생성하고 종료하며, CFS(Completely Fair Scheduler)로 CPU 시간을 분배한다. 수백 개의 프로세스가 동시에 실행되는 것처럼 보이는 멀티태스킹도 실제로는 커널이 매우 빠르게 문맥 전환(context switch)을 반복하는 것이다.
메모리 관리: 각 프로세스는 자신만의 가상 주소 공간을 갖는다. 커널은 페이지 테이블을 관리해 가상 주소를 물리 주소로 변환하고, 프로세스 간 메모리 격리를 보장한다. 실제 물리 메모리가 부족하면 디스크의 스왑 공간을 활용한다.
파일시스템: VFS(Virtual File System) 추상화 덕분에 ext4, xfs, btrfs, NFS 등 다양한 파일시스템을 동일한 API로 다룰 수 있다. 후속 시리즈에서 자세히 다룰 “모든 것은 파일이다” 철학도 VFS가 있기에 가능하다.
네트워크 · 드라이버: TCP/IP 스택, 소켓, 넷필터(방화벽) 등이 커널 안에 구현되어 있다. 하드웨어 드라이버는 커널 모듈로 동적 로드/언로드할 수 있어, 장치를 연결할 때마다 재부팅할 필요가 없다.
커널 공간 vs 사용자 공간
Linux는 **Ring 0 (커널 모드)**와 **Ring 3 (사용자 모드)**를 엄격히 구분한다. 커널은 Ring 0에서 모든 하드웨어 명령에 직접 접근할 수 있지만, 사용자 앱은 Ring 3에서만 동작하며 커널에 요청(시스템 콜)을 통해서만 특권 작업을 수행할 수 있다.
# 어떤 시스템 콜이 호출되는지 확인하는 명령
strace ls /tmp
# 출력 예시 (일부)
# execve("/usr/bin/ls", ["ls", "/tmp"], envp) = 0
# openat(AT_FDCWD, "/tmp", O_RDONLY|O_DIRECTORY) = 3
# getdents64(3, /* 5 entries */, 32768) = 136
strace로 보면 ls처럼 단순한 명령도 수십 개의 시스템 콜을 발생시킨다는 걸 알 수 있다. 이런 구분 덕분에 사용자 프로그램이 오동작해도 커널이 보호되고 시스템 전체가 안정적으로 유지된다.
Linux가 어디에 쓰이나
Linux 커널은 지구상에서 가장 많은 장치에서 실행되는 소프트웨어다. 안드로이드 스마트폰, 슈퍼컴퓨터 Top 500 전부, AWS·GCP·Azure 클라우드 인프라 대부분, 라우터·스마트 TV·자동차 ECU까지 Linux 커널이 들어가 있다. 이 시리즈에서는 서버·데스크톱 사용자 관점에서 Linux를 처음부터 차근차근 탐구한다.
다음 글: Unix와 Linux의 역사: C언어, GNU, 그리고 Linus Torvalds
읽어주셔서 감사합니다. 😊