커널 역사 (Kernel History)
리눅스 커널의 역사를 1991년 탄생부터 현재까지 버전별 릴리즈 시기, 주요 변경사항, 코드베이스 성장 통계, VCS 변천사, 커널 거버넌스 구조, stable/longterm 프로세스, 서브시스템 메인테이너 트리, 개발 프로세스의 모든 것을 심층적으로 정리합니다.
1991년 탄생부터 현재까지, 리눅스 커널의 진화 과정을 버전별 릴리즈와 주요 변경사항으로 정리합니다.
핵심 요약
- Mainline -- Linus Torvalds가 주도하는 최신 개발 라인
- Stable -- 메인라인에서 분기된 버그/보안 수정 중심의 유지보수 라인
- LTS -- 장기간 지원되는 장기 유지보수 버전
- Merge Window -- 새 기능이 병합되는 초기 약 2주 구간
- Release Candidate (rc) -- 최종 릴리즈 전 주간 검증 빌드
단계별 이해
- 초기 버전 읽기
0.x~2.x에서 리눅스가 단일 아키텍처 실험 단계에서 범용 서버 OS로 확장된 흐름을 확인합니다. - 현대화 전환점 확인
3.x~5.x에서 cgroups, eBPF, io_uring 등 현재 운영환경에 직결되는 기능이 자리 잡는 과정을 봅니다. - 최신 6.x 변화 추적
실시간 지원, Rust 도입, 스케줄러 개선처럼 최근 설계 방향을 파악합니다. - 운영 관점으로 연결
stable/LTS 정책과 릴리즈 주기를 이해해 배포판 커널 선택과 업데이트 정책에 적용합니다.
개요 -- 리눅스 커널의 시작
1991년 8월 25일, 핀란드 헬싱키 대학교의 21세 학생 Linus Torvalds는 Usenet 뉴스그룹 comp.os.minix에 다음과 같은 역사적인 메시지를 남겼다:
이 "취미 프로젝트"는 Andrew Tanenbaum의 교육용 OS인 MINIX에서 영감을 받았지만, 처음부터 실용적인 목적으로 개발되었다. Linus는 386 프로세서의 태스크 스위칭 기능을 탐구하다가 터미널 에뮬레이터를 작성했고, 이것이 점차 운영체제 커널로 발전했다.
초기 리눅스는 GNU 프로젝트의 도구(GCC, Bash, coreutils 등)와 결합하여 완전한 운영체제를 구성했다. Richard Stallman이 1983년부터 추진한 GNU 프로젝트는 커널(GNU Hurd)을 제외한 대부분의 사용자 공간 도구를 이미 갖추고 있었기에, 리눅스 커널은 이 생태계에 완벽하게 들어맞았다.
리눅스는 GPLv2 라이선스를 채택하여 소스 코드를 자유롭게 사용, 수정, 재배포할 수 있게 했다. 이 결정은 전 세계 개발자들의 참여를 이끌어내며 오픈소스 소프트웨어 역사상 가장 성공적인 협업 프로젝트로 성장하는 기반이 되었다.
| 날짜 | 사건 | 의미 |
|---|---|---|
| 1983 | GNU 프로젝트 시작 | 자유 소프트웨어 운동의 시작, 사용자 공간 도구 개발 |
| 1985 | Intel 80386 출시 | 보호 모드, MMU, 태스크 스위칭 하드웨어 지원 |
| 1987 | MINIX 출시 | 교육용 마이크로커널 OS, Linux 개발의 영감 |
| 1991-08-25 | Linus의 Usenet 포스팅 | Linux 프로젝트 공식 시작 선언 |
| 1991-09 | Linux 0.01 공개 | 최초 소스 코드 배포 (10,239줄) |
| 1992-01 | GPLv2 라이선스 전환 | 자유로운 배포/수정 허용, 개발자 참여 폭발 |
| 1992-04 | Tanenbaum-Torvalds 논쟁 | 마이크로커널 vs 모놀리식 설계 철학 대립 |
| 1994-03-14 | Linux 1.0 릴리즈 | 첫 안정 릴리즈, TCP/IP 완전 통합 |
커널 버전 연대표
아래 표는 리눅스 커널의 주요 릴리즈를 시간순으로 정리한 것이다. 각 버전의 상세 내용은 이후 섹션에서 다룬다.
| 버전 | 릴리즈일 | 핵심 변경사항 |
|---|---|---|
| 0.01 | 1991-09 | 최초 공개, i386 전용, Minix 파일시스템 |
| 0.02 | 1991-10-05 | 첫 공식 발표, bash/gcc 실행 가능 |
| 0.12 | 1992-01 | GPLv2 라이선스 전환 |
| 1.0 | 1994-03-14 | 첫 안정 릴리즈, TCP/IP 네트워킹 |
| 1.2 | 1995-03-07 | Alpha/SPARC/MIPS 이식, IPX, AppleTalk |
| 2.0 | 1996-06-09 | SMP, 로더블 모듈, ELF, 다중 아키텍처 |
| 2.2 | 1999-01-25 | 개선된 SMP, IPv6 초기, 대용량 메모리 |
| 2.4 | 2001-01-04 | USB, ext3, iptables, LVM, Bluetooth |
| 2.6 | 2003-12-17 | O(1) 스케줄러, Preemptive kernel, NPTL, sysfs, udev |
| 3.0 | 2011-07-21 | 버전 번호 체계 변경 (2.6.39 -> 3.0) |
| 3.8 | 2013-02-18 | User namespace 완성, F2FS |
| 4.0 | 2015-04-12 | Live kernel patching (kpatch/kGraft) |
| 4.9 | 2016-12-11 | BBR 혼잡 제어, XDP (LTS) |
| 4.18 | 2018-08-12 | bpfilter, TLS offload |
| 5.0 | 2019-03-03 | Energy-Aware Scheduling, Adiantum 암호화 |
| 5.4 | 2019-11-24 | io_uring, virtio-fs, exFAT (LTS) |
| 5.6 | 2020-03-29 | WireGuard, USB4, time namespace |
| 5.10 | 2020-12-13 | Static calls, EXT4 fast commit (LTS) |
| 5.15 | 2021-10-31 | NTFS3, DAMON, KFENCE (LTS) |
| 6.0 | 2022-10-02 | Rust 인프라 초기 도입 |
| 6.1 | 2022-12-11 | Rust 공식 지원 시작, MGLRU (LTS) |
| 6.6 | 2023-10-29 | EEVDF 스케줄러, Intel shadow stack (LTS) |
| 6.12 | 2024-11-17 | 실시간(PREEMPT_RT) 메인라인 통합 (LTS) |
| 6.18 | 2025-08-03 | 최신 stable 계열의 기준 버전(2026-02-13 기준 stable: 6.18.10) |
| 6.19 | 2025-10-12 | 최신 mainline 버전(2026-02-13 기준) |
초기 개발 (0.x ~ 1.x)
0.01 (1991년 9월)
최초로 공개된 리눅스 커널 소스 코드. 약 10,239줄의 C 코드로 구성되었다. i386 전용이었으며, Minix 파일시스템을 사용했다. 프로세스 관리, 메모리 관리, 기본적인 파일시스템 지원만 포함되어 있었다.
- 지원 하드웨어: i386 CPU, AT 하드디스크
- 파일시스템: Minix FS (읽기/쓰기)
- 셸: Bourne Shell (bash는 0.02부터)
/* Linux 0.01 - main.c의 시작 (1991년) */
/*
* linux/init/main.c
*
* (C) 1991 Linus Torvalds
*/
#define __LIBRARY__
#include <unistd.h>
#include <time.h>
void main(void)
{
mem_init(main_memory_start, memory_end);
trap_init();
blk_dev_init();
chr_dev_init();
tty_init();
time_init();
sched_init();
buffer_init(buffer_memory_end);
hd_init();
floppy_init();
sti();
move_to_user_mode();
if (!fork()) {
init();
}
for(;;) pause();
}
boot/, fs/, include/, init/,
kernel/, lib/, mm/, tools/로 구성되었다.
현재 커널의 기본 구조가 이미 이 시기에 확립되었다는 점이 주목할 만하다.
0.02 (1991년 10월 5일)
Linus가 공식적으로 "발표"한 첫 번째 버전. bash와 gcc를 실행할 수 있었다. 아직 플로피 디스크 드라이버조차 없어서 Minix에서 하드 디스크로 복사한 후 부팅해야 했다.
0.12 (1992년 1월)
중요한 전환점: 라이선스를 자체 라이선스에서 GPLv2로 변경했다. 이전 라이선스는 상업적 배포를 금지했으나, GPL 전환으로 자유로운 배포가 가능해졌다. 가상 메모리(스왑) 지원이 추가되었다.
0.95 ~ 0.99 (1992 ~ 1993)
X Window System 지원, ext 파일시스템 도입, 네트워킹 스택 초기 구현 등 급속한 발전 기간. 전 세계 개발자들이 기여하기 시작하면서 코드 규모가 빠르게 성장했다.
- 0.95 (1992-03): X Window System 실행 가능
- 0.96 (1992-05): ext 파일시스템 도입
- 0.99 (1992-12): ext2 파일시스템 초기 지원, 네트워킹 개선
1.0 (1994년 3월 14일)
최초의 안정(stable) 릴리즈. 약 176,250줄의 코드로 성장했다. TCP/IP 네트워킹이 완전히 통합되어 인터넷 서버로 사용 가능해졌다.
- 네트워킹: TCP/IP 스택 완성 (BSD 소켓 인터페이스)
- 파일시스템: ext2, Minix, xiafs, MS-DOS FAT
- 아키텍처: i386 단일 아키텍처
- SCSI 지원, 가상 콘솔, 사운드 드라이버
1.2 (1995년 3월 7일)
최초로 다중 아키텍처를 지원한 릴리즈. Alpha, SPARC, MIPS 프로세서로 이식되었다.
- 네트워킹: IPX (Novell NetWare), AppleTalk 프로토콜
- 디바이스: 더 많은 SCSI 어댑터, 사운드 카드 지원
- 약 310,950줄의 코드
2.x 시대 -- 엔터프라이즈 진입
2.0 (1996년 6월 9일)
리눅스가 서버 시장에 진입하는 계기가 된 릴리즈. SMP(대칭형 다중 처리) 지원이 핵심이었다.
- SMP: 최대 16개 CPU 지원 (Big Kernel Lock 기반)
- 로더블 모듈: 런타임에 커널 기능을 동적 로드/언로드
- ELF 바이너리: a.out 포맷 대체
- 다중 아키텍처: x86, Alpha, SPARC, MIPS, m68k, PowerPC
- 약 780,000줄의 코드
2.2 (1999년 1월 25일)
확장성과 성능이 크게 개선된 버전. 엔터프라이즈 환경에서의 안정성이 입증되기 시작했다.
- 개선된 SMP: 세분화된 잠금(fine-grained locking) 도입
- IPv6 초기 지원 (실험적)
- 대용량 메모리 지원 개선 (2GB 이상)
- 향상된 네트워킹 성능
- 약 1,800,000줄의 코드
2.4 (2001년 1월 4일)
데스크탑과 서버 양쪽에서 리눅스의 실용성을 크게 높인 릴리즈.
- USB 서브시스템: 대중적인 USB 장치 지원
- ext3: 저널링 파일시스템 (ext2 호환)
- iptables / Netfilter: ipchains 대체, stateful 방화벽
- LVM (Logical Volume Manager): 논리 볼륨 관리
- Bluetooth 지원
- ISA Plug and Play
- 약 3,800,000줄의 코드
2.6 (2003년 12월 17일)
가장 오래 유지된 메이저 버전 시리즈(2003~2011). 현대 리눅스 커널의 기반이 되는 핵심 기능 대부분이 이 시기에 도입되었다.
2.6.0 핵심 기능:
- O(1) 스케줄러: 프로세스 수에 무관한 상수 시간 스케줄링
- Preemptive kernel: 커널 코드 실행 중 선점 가능
- NPTL (Native POSIX Thread Library): 1:1 스레딩 모델
- sysfs: 디바이스 모델을 파일시스템으로 노출
- udev: 사용자 공간 디바이스 관리
- ALSA 사운드 서브시스템 (OSS 대체)
2.6.x 주요 포인트 릴리즈:
| 버전 | 릴리즈일 | 주요 기능 |
|---|---|---|
| 2.6.12 | 2005-06-17 | Git으로 소스 관리 전환 (BitKeeper 대체) |
| 2.6.13 | 2005-08-28 | inotify, Voluntary Preemption |
| 2.6.16 | 2006-03-20 | High-resolution timers, ext3 online resize |
| 2.6.18 | 2006-09-19 | RHEL 6 기반 커널 |
| 2.6.23 | 2007-10-09 | CFS(Completely Fair Scheduler), LSM 개선 |
| 2.6.24 | 2008-01-24 | cgroups, 네임스페이스 확장, dynticks/tickless |
| 2.6.25 | 2008-04-16 | SMACK LSM, RCU preempt |
| 2.6.28 | 2008-12-24 | ext4 안정화, GEM(Graphics Execution Manager) |
| 2.6.29 | 2009-03-23 | Btrfs (실험적), KMS(Kernel Mode Setting) |
| 2.6.32 | 2009-12-02 | KSM, perf 도구 (LTS -- RHEL 7/CentOS 7 기반) |
| 2.6.36 | 2010-10-20 | AppArmor 통합, fanotify |
| 2.6.38 | 2011-03-14 | Transparent Huge Pages(THP), VFS scalability |
| 2.6.39 | 2011-05-18 | ipset, 마지막 2.6.x 릴리즈 |
3.x ~ 4.x -- 현대화
3.0 (2011년 7월 21일)
버전 번호 체계를 변경한 릴리즈. 2.6.39에서 곧바로 3.0으로 넘어갔으며, 기술적으로 혁명적인 변화보다는 리눅스 탄생 20주년을 기념하여 번호를 정리한 것이다. 이후 3.x, 4.x, 5.x, 6.x로 순차 증가하는 체계가 확립되었다.
3.x 주요 릴리즈 (2011 ~ 2015)
| 버전 | 릴리즈일 | 주요 기능 |
|---|---|---|
| 3.1 | 2011-10-24 | OpenRISC 아키텍처, NFC 서브시스템 |
| 3.2 | 2012-01-04 | ext4 block 할당 개선, Btrfs send/receive (LTS) |
| 3.4 | 2012-05-20 | x32 ABI, Btrfs 복구 도구 개선 (LTS) |
| 3.7 | 2012-12-10 | ARM multiplatform, NVMe 드라이버, 서명된 커널 모듈 |
| 3.8 | 2013-02-18 | User namespace 완성 (컨테이너 기반), F2FS |
| 3.10 | 2013-06-30 | timerfd 개선, perf trace (LTS -- RHEL 7.x 기반) |
| 3.14 | 2014-03-30 | deadline I/O 스케줄러 개선, ZRAM |
| 3.18 | 2014-12-07 | OverlayFS (union filesystem), bpf() 시스템 콜 (LTS) |
4.0 (2015년 4월 12일)
Live kernel patching이 도입된 릴리즈. 재부팅 없이 커널 코드를 패치할 수 있는 인프라로, Red Hat의 kpatch와 SUSE의 kGraft를 통합한 결과물이다.
4.x 주요 릴리즈 (2015 ~ 2018)
| 버전 | 릴리즈일 | 주요 기능 |
|---|---|---|
| 4.1 | 2015-06-21 | ext4 암호화(fscrypt), ACPI 개선 (LTS) |
| 4.4 | 2016-01-10 | eBPF 확장(cgroup, tracepoint), 3D 렌더링 개선 (LTS) |
| 4.7 | 2016-07-24 | Schedutil governor, 파일시스템 보안 개선 |
| 4.9 | 2016-12-11 | BBR TCP 혼잡 제어, XDP(eXpress Data Path) (LTS) |
| 4.11 | 2017-04-30 | Stateless 방화벽, SSD 멀티큐 개선 |
| 4.14 | 2017-11-12 | zstd 압축 지원, AMD Secure Memory Encryption (LTS) |
| 4.15 | 2018-01-28 | KPTI (Meltdown 완화), Retpoline (Spectre 완화) |
| 4.18 | 2018-08-12 | bpfilter, TLS offload, AMDGPU DC (RHEL 8 기반) |
| 4.19 | 2018-10-22 | Wi-Fi 6, CAKE qdisc, overlayfs 개선 (LTS) |
| 4.20 | 2018-12-23 | C-SKY 아키텍처, PSI(Pressure Stall Information) |
5.x -- 성숙기
5.0 (2019년 3월 3일)
4.20에서 이어진 릴리즈로, 번호 변경 자체에 기술적 의미는 없다. Linus는 "번호가 너무 커지면 변경한다"고 언급했다.
- Energy-Aware Scheduling (EAS): ARM big.LITTLE 등 비대칭 CPU 아키텍처에서 에너지 효율적 스케줄링
- Adiantum 암호화: 저성능 디바이스를 위한 빠른 스토리지 암호화
- AMD FreeSync 지원
5.x 주요 릴리즈 (2019 ~ 2022)
| 버전 | 릴리즈일 | 주요 기능 |
|---|---|---|
| 5.1 | 2019-05-05 | io_uring 초기 도입, pidfd |
| 5.2 | 2019-07-07 | Sound Open Firmware(SOF), BPF 트램폴린 |
| 5.3 | 2019-09-15 | umwait (x86), RISC-V 개선, AMD Navi GPU |
| 5.4 | 2019-11-24 | io_uring 확장, virtio-fs, exFAT 초기, Lockdown LSM (LTS) |
| 5.5 | 2020-01-26 | Airtime fairness (Wi-Fi), BPF 트램폴린 확장 |
| 5.6 | 2020-03-29 | WireGuard VPN, USB4/Thunderbolt 3, time namespace |
| 5.7 | 2020-05-31 | Split lock 검출, 온칩 ARM Mali GPU 드라이버 |
| 5.8 | 2020-08-02 | BPF 링 버퍼, shadow call stack (ARM64) |
| 5.9 | 2020-10-11 | dm-integrity inline, FSGSBASE 지원 |
| 5.10 | 2020-12-13 | Static calls, EXT4 fast commit, XFS 온라인 복구 (LTS) |
| 5.11 | 2021-02-14 | Intel SGX, Wi-Fi 6E |
| 5.12 | 2021-04-25 | id-mapped 마운트, AMDGPU 가상 디스플레이 |
| 5.13 | 2021-06-27 | Landlock LSM, Apple M1 초기 지원, FreeSync HDMI |
| 5.14 | 2021-08-29 | core scheduling, MEMFD_SECRET |
| 5.15 | 2021-10-31 | NTFS3 (Paragon), DAMON (Data Access Monitor), KFENCE (LTS) |
| 5.16 | 2022-01-09 | futex2 (futex_waitv), AMD P-State |
| 5.17 | 2022-03-20 | BPF CO-RE 개선, io_uring 제로카피 TX |
| 5.18 | 2022-05-22 | Random number generator 전면 리팩토링 |
| 5.19 | 2022-07-31 | LoongArch 아키텍처, PREEMPT_DYNAMIC |
6.x -- 현재
6.0 (2022년 10월 2일)
Rust 인프라가 커널에 초기 도입된 릴리즈. CONFIG_RUST 빌드 옵션이 추가되었으며, Rust로 커널 모듈을 작성할 수 있는 기반이 마련되었다.
- Rust 지원 인프라 초기 코드
- io_uring zero-copy 네트워킹 개선
- XFS Online Repair 확장
6.1 (2022년 12월 11일)
Rust 공식 지원이 안정화된 첫 번째 릴리즈. MGLRU(Multi-Gen LRU)도 포함되어 메모리 관리 성능이 크게 개선되었다.
- Rust: 커널 모듈 작성 지원 (실험적이지만 공식 통합)
- MGLRU: 새로운 페이지 교체 알고리즘, 기존 LRU 대비 성능 향상
- Maple Tree: VMA 관리용 새로운 자료구조
- User-space 스택 언와인딩 지원
- LTS 릴리즈
6.x 주요 릴리즈 (2023 ~ 현재)
| 버전 | 릴리즈일 | 주요 기능 |
|---|---|---|
| 6.2 | 2023-02-19 | Retbleed 완화 개선, 사용자 공간 발열 관리 |
| 6.3 | 2023-04-23 | HP(Huge Page) 마이그레이션 개선, Rust alloc 모듈 |
| 6.4 | 2023-06-25 | Intel LAM(Linear Address Masking), Confidential Computing 개선 |
| 6.5 | 2023-08-27 | User-space P-State, USB4v2, ACPI FFH |
| 6.6 | 2023-10-29 | EEVDF 스케줄러 (CFS 대체), Intel shadow stack, LTS |
| 6.7 | 2024-01-07 | Bcachefs 파일시스템, futex2, NTB 개선 |
| 6.8 | 2024-03-10 | Intel FRED, LAM 활성화, Zstd 업데이트 |
| 6.9 | 2024-05-12 | Rust로 작성된 첫 파일시스템(PuzzleFS), Intel TDX 게스트 |
| 6.10 | 2024-07-14 | mseal() 시스템 콜, NTSYNC |
| 6.11 | 2024-09-15 | sched_ext (확장 가능 스케줄러), copy_file_range 최적화 |
| 6.12 | 2024-11-17 | PREEMPT_RT 메인라인 통합, 실시간 커널 공식 지원, LTS |
| 6.13 | 2025-01-19 | Lazy preemption 모델, Arm CCA, AArch64 GCS, RTNL per-namespace 락, XFS atomic writes, Rust trace events, TX H/W shaping API |
| 6.14 | 2025-03-23 | ntsync, Btrfs RAID1 read balancing, uncached buffered I/O, FUSE io_uring, 4096 CPU 코어, DRM panic AMDGPU, SELinux extended permissions |
| 6.15 | 2025-06-01 | Rust hrtimer/ARMv7, sched_ext 이벤트 리포팅, HW 래핑 암호화 키, EROFS 48-bit 블록, io_uring LSM 훅 |
| 6.16 | 2025-07-27 | Intel TDX 호스트, Intel APX, USB 오디오 오프로드, device memory TCP TX, XFS 대형 atomic writes, EXT4 large folio |
| 6.17 | 2025-09-28 | CPU 버그 완화 선택 간소화(mitigations= 통합) |
| 6.18 | 2025-08-03 | SLUB sheaves, dm-pcache, stable 최신 계열 (2026-02-13 기준 stable: 6.18.10) |
| 6.19 | 2025-10-12 | mainline 최신 (2026-02-13 기준) |
스케줄러 변천사
리눅스 커널의 프로세스 스케줄러는 워크로드 변화에 맞춰 꾸준히 진화해왔다. 스케줄러 변천사는 커널 설계 철학의 변화를 가장 잘 보여주는 지표이다.
| 스케줄러 | 커널 버전 | 알고리즘 | 시간 복잡도 | 핵심 특성 |
|---|---|---|---|---|
| 초기 | 0.01~2.4 | 순차 탐색 | O(n) | 단순, 프로세스 수 증가 시 성능 저하 |
| O(1) | 2.6.0 | 비트맵 + 큐 | O(1) | 상수 시간 선택, 대화형 휴리스틱 |
| CFS | 2.6.23 | Red-Black Tree | O(log n) | 공정성 보장, vruntime 기반 |
| EEVDF | 6.6 | Augmented RB-Tree | O(log n) | 지연시간 보장, 공정성 유지 |
| sched_ext | 6.11 | BPF 정의 | 정책 의존 | 런타임 교체 가능 |
VCS(버전 관리 시스템) 변천사
리눅스 커널의 소스 코드 관리 방식은 프로젝트 규모의 성장과 함께 극적으로 변화해왔다. VCS 변천사는 오픈소스 개발 방법론의 진화를 직접적으로 반영한다.
| 시기 | 관리 방식 | 특성 | 한계 |
|---|---|---|---|
| 1991~2002 | Tarball + 메일 패치 | Linus가 수작업 병합 | 확장성 한계, 병합 충돌 관리 어려움 |
| 2002~2005 | BitKeeper (상용) | 분산 VCS, 효율적 병합 | 라이선스 분쟁, 커뮤니티 갈등 |
| 2005~현재 | Git (오픈소스) | Linus 직접 개발, SHA-1 해시, 분산 | 없음 (사실상 표준) |
# 커널 Git 저장소 통계 확인
# 전체 커밋 수
git rev-list --count HEAD
# 기여자 수
git shortlog -sn | wc -l
# 최근 릴리즈 태그
git tag --sort=-v:refname | head -10
# 특정 릴리즈 간 변경 통계
git diff --stat v6.1..v6.6 | tail -1
# 릴리즈별 커밋 수
git rev-list --count v6.5..v6.6
커널 개발 프로세스
릴리즈 사이클
리눅스 커널은 약 9~10주 주기로 새 버전을 릴리즈한다. 각 사이클은 다음 단계로 구성된다:
| 단계 | 기간 | 허용 사항 | 설명 |
|---|---|---|---|
| Merge Window | ~2주 | 새 기능 + 버그 수정 | 서브시스템 메인테이너가 준비한 변경사항을 Linus의 트리에 병합 |
| rc1 | merge window 종료 시 | 버그 수정만 | merge window 종료 선언, 안정화 시작 |
| rc2 ~ rc7 | ~7주 (매주) | 리그레션 수정만 | Release Candidate, 매주 일요일 릴리즈 |
| Final Release | 1일 | - | 마지막 rc가 충분히 안정적이면 최종 릴리즈 |
Stable/LTS 프로세스
LTS (Long Term Support) 정책
매년 1~2개의 릴리즈가 LTS로 지정되어 장기 지원을 받는다. 일반 릴리즈가 다음 버전 출시까지(약 2~3개월)만 지원되는 것과 달리, LTS는 최소 2년에서 최대 6년까지 보안 및 중요 버그 수정 패치를 받는다.
| LTS 버전 | 릴리즈일 | 예상 EOL | 주요 사용처 |
|---|---|---|---|
| 6.12 | 2024-11 | 2026~2028 | 최신 임베디드/서버, RT 요구 환경 |
| 6.6 | 2023-10 | 2026~2028 | Debian 13, Ubuntu 24.04 |
| 6.1 | 2022-12 | 2026~2028 | Debian 12, 범용 서버 |
| 5.15 | 2021-10 | 2026 | Ubuntu 22.04, 임베디드 |
| 5.10 | 2020-12 | 2026 | Android GKI, 임베디드 |
| 5.4 | 2019-11 | 2025 | Ubuntu 20.04, 구형 임베디드 |
Stable 패치 선정 기준
stable 트리에 백포트되는 패치는 엄격한 기준을 따른다:
# stable 패치 선정 기준 (Documentation/process/stable-kernel-rules.rst)
1. 메인라인에 이미 머지된 패치여야 한다
2. 실제 버그를 수정하거나 보안 문제를 해결해야 한다
3. 100줄 이하의 작은 패치여야 한다 (예외 가능)
4. 명확한 테스트를 거쳐야 한다
5. Cc: stable@vger.kernel.org 태그가 있어야 한다
# 패치에 stable 태그 추가 방법:
Cc: stable@vger.kernel.org
# 또는 특정 버전 지정:
Cc: <stable@vger.kernel.org> # v5.10+
커널 거버넌스
서브시스템 메인테이너 구조
리눅스 커널은 계층적 메인테이너 구조로 관리된다. 이 구조는 "신뢰의 사슬(web of trust)"이라고도 불린다:
# MAINTAINERS 파일 활용법
# 특정 파일의 메인테이너 확인
scripts/get_maintainer.pl -f drivers/net/dsa/mv88e6xxx/chip.c
# MAINTAINERS 엔트리 검색
grep -A 10 "DSA" MAINTAINERS
# 패치 제출 시 수신자 자동 확인
scripts/get_maintainer.pl 0001-fix-bug.patch
MAINTAINERS 파일에는 수천 개의 엔트리가 등록되어 있으며, 매 릴리즈마다 대규모 개발자 집단이 패치 리뷰와 병합에 참여합니다.
패치 제출 절차
# 패치 작성 및 제출 절차
# 1. 기능 브랜치 생성
git checkout -b fix/my-bug-fix origin/master
# 2. 코드 수정 및 커밋
git add drivers/net/dsa/my_fix.c
git commit -s # Signed-off-by: 자동 추가
# 3. 커밋 메시지 형식
# net: dsa: fix source port decode for multichip
#
# When using multichip cascade topology, the source
# device ID was not properly extracted from the DSA
# tag, causing packets to be delivered to wrong ports.
#
# Fixes: abc1234 ("net: dsa: add multichip support")
# Cc: stable@vger.kernel.org
# Signed-off-by: Developer Name <dev@example.com>
# 4. 패치 형식 검사
scripts/checkpatch.pl --strict 0001-*.patch
# 5. 메인테이너 확인
scripts/get_maintainer.pl 0001-*.patch
# 6. 패치 발송
git send-email --to=maintainer@kernel.org \
--cc=linux-kernel@vger.kernel.org \
0001-*.patch
커널 규모 변화
리눅스 커널의 소스 코드 규모는 약 30년간 꾸준히 성장해왔다. 아래는 주요 버전별 대략적인 코드 라인 수(LOC, drivers 포함)이다:
| 버전 | 연도 | 코드 라인 수 (약) | 파일 수 (약) | 디렉토리 비중 |
|---|---|---|---|---|
| 0.01 | 1991 | 10,000 | 88 | kernel/ 40% |
| 1.0 | 1994 | 176,000 | 561 | drivers/ 30% |
| 2.0 | 1996 | 780,000 | 2,100 | drivers/ 40% |
| 2.4.0 | 2001 | 3,800,000 | 8,200 | drivers/ 50% |
| 2.6.0 | 2003 | 5,900,000 | 15,000 | drivers/ 55% |
| 2.6.32 | 2009 | 12,600,000 | 28,000 | drivers/ 60% |
| 3.0 | 2011 | 14,600,000 | 37,000 | drivers/ 62% |
| 4.0 | 2015 | 19,500,000 | 49,000 | drivers/ 65% |
| 5.0 | 2019 | 26,100,000 | 63,000 | drivers/ 67% |
| 6.0 | 2022 | 30,400,000 | 74,000 | drivers/ 68% |
| 6.1 | 2022 | 31,000,000 | 76,000 | drivers/ 68% |
코드 증가의 대부분은 디바이스 드라이버(drivers/ 디렉토리)가 차지한다. 전체 코드의 약 60~70%가 드라이버 코드이며, 커널 핵심(코어 서브시스템)은 상대적으로 적은 비율을 차지한다.
# 전체 코드 라인 수
find . -name '*.[chS]' -not -path './tools/*' | xargs wc -l
# drivers/ 디렉토리 비율
find drivers/ -name '*.[chS]' | xargs wc -l
# 디렉토리별 코드 비중
for dir in drivers kernel mm net fs arch; do
echo "$dir: $(find $dir -name '*.[chS]' | xargs cat | wc -l) lines"
done
# 릴리즈 간 변경 통계
git diff --stat v6.1..v6.6 | tail -1
개발 통계
리눅스 커널은 세계에서 가장 활발하게 개발되는 오픈소스 프로젝트 중 하나이다. 매 릴리즈마다 수천 명의 개발자가 수만 건의 패치를 기여한다.
| 통계 항목 | 6.x 릴리즈 기준 (약) | 비고 |
|---|---|---|
| 릴리즈당 커밋 수 | 15,000~17,000 | rc 포함 |
| 릴리즈당 기여자 수 | 1,800~2,200 | Signed-off-by 기준 |
| 릴리즈당 기여 회사 수 | 200~250 | Linux Foundation 보고서 기준 |
| 하루 평균 커밋 | 약 200 | merge window 기간 더 높음 |
| 하루 평균 변경 라인 | 약 10,000+ | 추가+삭제 합산 |
| 전체 기여자 누적 | 20,000+ | git log 기준 |
| 전체 커밋 누적 | 1,000,000+ | git rev-list 기준 |
주요 기여 조직
| 조직 | 기여 비율 (약) | 주요 기여 영역 |
|---|---|---|
| Intel | 10~12% | x86, GPU(i915), 네트워킹, 보안 |
| Red Hat | 8~10% | 파일시스템, 가상화, 네트워킹 |
| 6~8% | Android, BPF, 메모리 관리 | |
| Linaro | 4~6% | ARM, 전원 관리, 부트 |
| SUSE | 3~5% | 파일시스템(Btrfs), 보안 |
| AMD | 3~5% | AMDGPU, 프로세서 지원 |
| Meta | 2~4% | BPF, 네트워킹, sched_ext |
| Huawei | 2~4% | 파일시스템, 스케줄링, ARM |
| 개인 기여자 | 10~15% | 다양한 영역 |
아키텍처 지원 역사
리눅스 커널은 i386 단일 아키텍처에서 시작하여 현재 30개 이상의 하드웨어 아키텍처를 지원한다.
| 아키텍처 | 최초 지원 버전 | 현재 상태 | 주요 사용처 |
|---|---|---|---|
| x86 (i386) | 0.01 (1991) | 활발 | 데스크탑, 서버 |
| x86_64 (AMD64) | 2.4.x (2001) | 활발 (주력) | 서버, 클라우드 |
| Alpha | 1.2 (1995) | 제거됨 (6.x) | 역사적 |
| SPARC | 1.2 (1995) | 유지보수 | 레거시 서버 |
| MIPS | 1.2 (1995) | 유지보수 | 네트워크 장비, 임베디드 |
| ARM (32-bit) | 2.0 (1996) | 유지보수 | 구형 임베디드 |
| PowerPC | 2.0 (1996) | 활발 | 서버 (IBM Power) |
| ARM64 (AArch64) | 3.7 (2012) | 활발 (주력) | 모바일, 서버, Mac |
| RISC-V | 4.15 (2018) | 활발 (성장) | 임베디드, 학술 |
| LoongArch | 5.19 (2022) | 활발 | Loongson 프로세서 |
보안 관련 주요 사건
리눅스 커널의 보안은 하드웨어 취약점 발견, LSM 프레임워크 발전, 커널 자체 방어 기능 강화를 통해 지속적으로 발전해왔다.
| 연도 | 사건 | 커널 대응 | 영향 |
|---|---|---|---|
| 2001 | LSM(Linux Security Module) 프레임워크 | SELinux, AppArmor 등 플러그인 보안 | 다양한 보안 정책 지원 |
| 2009 | SELinux 완전 통합 | NSA 개발 강제 접근 제어 | 서버 보안 표준 |
| 2012 | seccomp-bpf (3.5) | BPF 기반 시스템 콜 필터링 | 컨테이너 보안 기반 |
| 2016 | Dirty COW (CVE-2016-5195) | copy-on-write 레이스 컨디션 수정 | 권한 상승 취약점 |
| 2018 | Meltdown/Spectre | KPTI, Retpoline, IBRS/IBPB | CPU 하드웨어 취약점 시대 개막 |
| 2019 | Lockdown LSM (5.4) | 커널 무결성 보호 | Secure Boot 연동 강화 |
| 2021 | Landlock LSM (5.13) | 비특권 사용자 샌드박싱 | 프로세스별 접근 제어 |
| 2022 | Retbleed | return speculation 완화 | 추가 CPU 취약점 대응 |
| 2024 | Intel shadow stack (6.6) | 하드웨어 기반 ROP 방어 | 커널 제어 흐름 무결성 |
# 현재 커널의 보안 기능 확인
# LSM 모듈 확인
cat /sys/kernel/security/lsm
# KPTI 상태
dmesg | grep -i "page table isolation"
# Spectre/Meltdown 완화 상태
cat /sys/devices/system/cpu/vulnerabilities/*
# seccomp 상태
grep Seccomp /proc/self/status
# Lockdown 상태
cat /sys/kernel/security/lockdown
배포판과 커널 버전 관계
주요 Linux 배포판은 메인라인 커널을 기반으로 자체 패치를 적용하여 배포한다. 배포판 선택 시 커널 버전을 확인하는 것은 하드웨어 호환성과 기능 지원에 직접적인 영향을 미친다.
| 배포판 | 기반 커널 | 지원 기간 | 특성 |
|---|---|---|---|
| RHEL 7 | 3.10 | ~2024 (ELS) | 대규모 백포트, ABI 안정성 |
| RHEL 8 | 4.18 | ~2029 | BPF, TLS offload |
| RHEL 9 | 5.14 | ~2032 | core scheduling, io_uring |
| Ubuntu 20.04 LTS | 5.4 | ~2030 (ESM) | io_uring, WireGuard 백포트 |
| Ubuntu 22.04 LTS | 5.15 | ~2032 (ESM) | NTFS3, DAMON |
| Ubuntu 24.04 LTS | 6.8 | ~2034 (ESM) | Intel FRED, Rust 지원 |
| Debian 12 (Bookworm) | 6.1 | ~2028 (LTS) | MGLRU, Rust |
| Debian 13 (Trixie) | 6.6+ | ~2030 (예상) | EEVDF |
| SLES 15 SP5 | 5.14 | ~2031 | LTSS 추가 가능 |
| Android 14 GKI | 5.15/6.1 | 기기 의존 | Generic Kernel Image |
| Fedora (최신) | 최신 stable | ~13개월 | 빠른 업데이트 |
| Arch Linux | 최신 stable | 롤링 | 항상 최신 |
# 현재 커널 버전 확인
uname -r
# 상세 빌드 정보
cat /proc/version
# 배포판 커널 설정 확인
ls /boot/config-$(uname -r)
zcat /proc/config.gz 2>/dev/null || cat /boot/config-$(uname -r)
# 배포판별 커널 패키지 확인
# Debian/Ubuntu:
dpkg -l | grep linux-image
# RHEL/CentOS:
rpm -qa | grep kernel
# Arch:
pacman -Q | grep linux
uname -r 버전만으로 기능 지원 여부를 판단하면 안 된다.
예를 들어 RHEL 7의 3.10 커널에는 4.x/5.x에서 백포트된 수천 개의 패치가 포함되어 있다.
커널 라이선스와 법적 쟁점
리눅스 커널의 라이선스 역사는 오픈소스 소프트웨어 법률의 발전과 밀접하게 연관되어 있다.
| 시기 | 사건 | 의미 |
|---|---|---|
| 1991 | 자체 라이선스 (상업 배포 금지) | 초기 배포 제한 |
| 1992 | GPLv2 전환 | 자유로운 배포, 개발자 참여 폭발 |
| 2003~2007 | SCO vs IBM 소송 | Linux에 Unix 코드 포함 주장 -> 패소 |
| 2006 | GPLv3 발표, Linus 거부 | Linux는 GPLv2 유지 (DRM 조항 반대) |
| 2017 | SPDX 라이선스 태그 도입 | 모든 소스 파일에 기계 읽기 가능한 라이선스 표시 |
| 2018 | Contributor Covenant 채택 | 행동 강령(Code of Conduct) 공식화 |
| 2022 | Rust 코드 듀얼 라이선스 | GPL-2.0 OR Apache-2.0 (Rust 바인딩) |
/* SPDX 라이선스 태그 예시 (모든 커널 소스 파일 첫 줄) */
// SPDX-License-Identifier: GPL-2.0-only
/* 또는 */
// SPDX-License-Identifier: GPL-2.0-or-later
/* Rust 바인딩의 경우 */
// SPDX-License-Identifier: GPL-2.0 OR Apache-2.0
Rust in Kernel 역사
C 언어로만 작성되던 리눅스 커널에 Rust가 도입된 것은 30년 역사상 가장 큰 언어 변화이다.
| 시기 | 사건 | 의미 |
|---|---|---|
| 2020-07 | Rust for Linux RFC 제안 | Miguel Ojeda의 최초 제안 |
| 2021-04 | RFC v2 패치 시리즈 | 커뮤니티 피드백 반영 |
| 2022-10 | 6.0: Rust 인프라 초기 도입 | CONFIG_RUST 빌드 옵션 |
| 2022-12 | 6.1: 공식 통합 | Rust 커널 모듈 작성 가능 |
| 2023-04 | 6.3: Rust alloc 모듈 | 커널 메모리 할당자 바인딩 |
| 2024-05 | 6.9: 첫 Rust 파일시스템(PuzzleFS) | 실용적 Rust 드라이버 |
| 2025-01 | 6.13: Rust trace events | 트레이싱 연동 |
| 2025-06 | 6.15: Rust hrtimer/ARMv7 | 타이머/아키텍처 확장 |
# Rust 커널 빌드 설정
# Rust 도구 체인 설치 확인
rustup show
rustc --version
bindgen --version
# 커널 Rust 지원 확인
make rustavailable
# Rust 모듈 빌드
make menuconfig # General setup -> Rust support 활성화
make -j$(nproc)
/* 최소 Rust 커널 모듈 예시 */
// SPDX-License-Identifier: GPL-2.0
//! Rust 최소 커널 모듈
use kernel::prelude::*;
module! {
type: RustMinimal,
name: "rust_minimal",
author: "Developer",
description: "Rust minimal module",
license: "GPL",
}
struct RustMinimal;
impl kernel::Module for RustMinimal {
fn init(_module: &ThisModule) -> Result<Self> {
pr_info!("Rust minimal module loaded\n");
Ok(RustMinimal)
}
}
impl Drop for RustMinimal {
fn drop(&mut self) {
pr_info!("Rust minimal module unloaded\n");
}
}
서브시스템 메인테이너 트리
리눅스 커널의 개발은 수십 개의 서브시스템 트리로 분산되어 진행된다. 각 서브시스템 메인테이너는 자신의 Git 트리에서 패치를 관리하고, merge window 기간에 Linus에게 pull request를 보낸다.
| 서브시스템 트리 | 주 관리자 | Git URL | 범위 |
|---|---|---|---|
| net-next | David Miller, Jakub Kicinski | git.kernel.org/.../net-next.git | 네트워킹 신기능 |
| net | David Miller | git.kernel.org/.../net.git | 네트워킹 버그 수정 |
| mm | Andrew Morton | git.kernel.org/.../mm.git | 메모리 관리 |
| tip | Ingo Molnar, Thomas Gleixner | git.kernel.org/.../tip.git | x86, 스케줄러, 잠금 |
| block | Jens Axboe | git.kernel.org/.../block.git | 블록 I/O |
| bpf-next | Alexei Starovoitov, Daniel Borkmann | git.kernel.org/.../bpf-next.git | eBPF |
| drm | Dave Airlie 외 | git.kernel.org/.../drm.git | GPU/디스플레이 |
| kvm | Paolo Bonzini | git.kernel.org/.../kvm.git | 가상화 |
| driver-core | Greg Kroah-Hartman | git.kernel.org/.../driver-core.git | 드라이버 코어, USB |
| rust | Miguel Ojeda | git.kernel.org/.../rust.git | Rust 인프라 |
| sound | Takashi Iwai | git.kernel.org/.../sound.git | ALSA/ASoC |
| security | Paul Moore 외 | git.kernel.org/.../security.git | LSM, SELinux |
| arm-soc | Arnd Bergmann, Olof Johansson | git.kernel.org/.../arm-soc.git | ARM SoC |
# 서브시스템 트리 활용
# 특정 서브시스템 트리 추가
git remote add net-next https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
git fetch net-next
# 서브시스템 트리의 최신 패치 확인
git log --oneline net-next/main -20
# 서브시스템별 merge window 기여 확인
git log --oneline --merges v6.18..v6.19 | head -30
# 특정 서브시스템의 패치 수 통계
git log --oneline v6.18..v6.19 -- net/ drivers/net/ | wc -l
git log --oneline v6.18..v6.19 -- mm/ | wc -l
git log --oneline v6.18..v6.19 -- drivers/gpu/ | wc -l
linux-next 트리는 다음 merge window에 포함될
모든 서브시스템 트리의 통합 빌드입니다. 매일 업데이트되며, 서브시스템 간 충돌을 사전에 감지하는 역할을 합니다.
릴리즈별 주요 기능 상세
이 섹션에서는 커널 역사에서 특히 영향력이 컸던 기능들의 도입 배경, 설계 결정, 이후 발전 과정을 상세히 다룬다.
cgroups (2.6.24, 2008)
Control Groups는 Google 엔지니어들(Paul Menage, Rohit Seth)이 개발한 프로세스 자원 제어 메커니즘이다. 프로세스 그룹에 CPU, 메모리, I/O, 네트워크 대역폭 등의 자원 한도를 설정할 수 있다.
- cgroups v1 (2.6.24, 2008): 계층적 자원 제어, 각 컨트롤러 독립 계층
- cgroups v2 (4.5, 2016): 단일 계층 구조, 모든 컨트롤러 통합
- 컨테이너 기술(Docker, LXC, Kubernetes)의 핵심 기반
- systemd의 서비스 자원 관리 기반
eBPF (3.18~현재)
extended Berkeley Packet Filter는 커널 내에서 안전하게 실행되는 사용자 정의 프로그램 프레임워크이다. 원래 패킷 필터링용이었으나, 현재는 트레이싱, 보안, 네트워킹, 스케줄링 등 거의 모든 커널 서브시스템에서 사용된다.
| 버전 | eBPF 기능 | 의의 |
|---|---|---|
| 3.18 | bpf() 시스템 콜 도입 | 사용자 공간에서 BPF 프로그램 로드 |
| 4.1 | kprobes 연동 | 커널 함수 트레이싱 |
| 4.7 | cgroup BPF | cgroup 단위 네트워크 정책 |
| 4.9 | XDP (eXpress Data Path) | NIC 드라이버 레벨 패킷 처리 |
| 4.15 | BPF Type Format (BTF) | 타입 정보 기반 이식성 |
| 5.2 | BPF 트램폴린 | fentry/fexit 고성능 트레이싱 |
| 5.8 | BPF 링 버퍼 | 고성능 이벤트 전달 |
| 6.11 | sched_ext | BPF 기반 스케줄러 교체 |
io_uring (5.1~현재)
Jens Axboe가 개발한 io_uring은 비동기 I/O의 혁명적 개선이다. 기존 aio(Linux AIO)와 epoll의 한계를 극복하기 위해, 사용자-커널 간 공유 링 버퍼로 시스템 콜 오버헤드를 최소화했다.
- Submission Queue (SQ): 사용자가 I/O 요청을 넣는 링
- Completion Queue (CQ): 커널이 완료 결과를 넣는 링
- Polling 모드: 시스템 콜 없이 I/O 처리 (최대 성능)
- 지원 연산: read/write, send/recv, accept, connect, splice, 파일 관리 등
PREEMPT_RT (6.12, 2024)
약 20년간 out-of-tree로 유지된 실시간 스케줄링 패치가 드디어 메인라인에 통합되었다. Thomas Gleixner와 Peter Zijlstra의 주도로, 모든 스핀락을 RT-mutex로 대체하고 인터럽트를 스레드화하여 결정적(deterministic) 지연시간을 보장한다.
| 시기 | PREEMPT_RT 이정표 | 상세 |
|---|---|---|
| 2004 | PREEMPT_RT 패치 시작 | Ingo Molnar의 최초 패치 |
| 2006 | -rt 패치 시리즈 안정화 | 산업용 환경에서 채택 시작 |
| 2015 | Linux Foundation RT 프로젝트 | 기업 지원 시작 |
| 2024 | 6.12: 메인라인 통합 | CONFIG_PREEMPT_RT 공식 지원 |
# PREEMPT_RT 확인
uname -a | grep -i rt
cat /sys/kernel/realtime
# preemption 모델 확인
cat /sys/kernel/debug/sched/preempt
# cyclictest로 실시간 지연시간 측정
cyclictest -t1 -p 80 -n -i 1000 -l 10000
개발 통계 상세
리눅스 커널의 개발 활동을 정량적으로 분석하면, 이 프로젝트의 규모와 활력을 구체적으로 이해할 수 있다.
디렉토리별 코드 비중 변화
| 디렉토리 | 2.6.0 (2003) | 4.0 (2015) | 6.1 (2022) | 역할 |
|---|---|---|---|---|
drivers/ | 55% | 65% | 68% | 하드웨어 드라이버 |
arch/ | 18% | 14% | 12% | 아키텍처별 코드 |
fs/ | 8% | 6% | 5% | 파일시스템 |
net/ | 6% | 5% | 5% | 네트워크 스택 |
kernel/ | 3% | 3% | 3% | 코어 커널 |
mm/ | 1% | 1% | 1% | 메모리 관리 |
sound/ | 3% | 3% | 3% | 오디오 |
| 기타 | 6% | 3% | 3% | tools, docs 등 |
릴리즈 주기 통계
| 통계 | 2.6.x 시대 (2003~2011) | 3.x~5.x (2011~2022) | 6.x (2022~현재) |
|---|---|---|---|
| 릴리즈 주기 | 60~90일 | 63~70일 | 63~70일 |
| 릴리즈당 커밋 | 5,000~12,000 | 12,000~16,000 | 15,000~18,000 |
| 릴리즈당 기여자 | 500~1,500 | 1,500~2,000 | 1,800~2,200 |
| Merge Window 커밋 | ~70% | ~75% | ~75% |
| rc 기간 커밋 | ~30% | ~25% | ~25% |
# 릴리즈별 상세 통계 명령어
# 릴리즈 간 커밋 수
git rev-list --count v6.11..v6.12
# 릴리즈 간 기여자 수
git shortlog -sn v6.11..v6.12 | wc -l
# 릴리즈 간 변경 파일 수
git diff --stat v6.11..v6.12 | tail -1
# 릴리즈 간 추가/삭제 라인 수
git diff --shortstat v6.11..v6.12
# 상위 10 기여자
git shortlog -sn v6.11..v6.12 | head -10
# merge window 기간 커밋 (rc1까지)
git rev-list --count v6.11..v6.12-rc1
# rc 기간 커밋 (rc1~final)
git rev-list --count v6.12-rc1..v6.12
# 디렉토리별 변경 비중
git diff --stat v6.11..v6.12 -- drivers/ | tail -1
git diff --stat v6.11..v6.12 -- net/ | tail -1
git diff --stat v6.11..v6.12 -- mm/ | tail -1
Stable/Longterm 프로세스 상세
stable 트리의 패치 선정과 릴리즈 과정은 엄격한 규칙을 따른다. 이 프로세스를 이해하면 배포판 커널 업데이트의 배경을 알 수 있다.
LTS 정책 상세
| 항목 | 일반 Stable | LTS (Long Term Support) |
|---|---|---|
| 지원 기간 | 다음 릴리즈까지 (~2~3개월) | 최소 2년, 최대 6년 |
| 선정 기준 | 모든 메인라인 릴리즈 | 연 1~2개, 기술적 중요도 기준 |
| 패치 범위 | 버그 수정, 보안 수정 | 버그 수정, 보안 수정 (더 보수적) |
| 사용처 | 롤링 릴리즈 배포판 | 엔터프라이즈 배포판, 임베디드, Android |
| 릴리즈 빈도 | 주 1~2회 | 주 1~2회 |
| 관리자 | Greg KH, Sasha Levin | Greg KH (일부 위임) |
releases.json에서 각 LTS 커널의 EOL 예정일을 확인할 수 있다.
EOL 이후에도 해당 커널을 사용하는 배포판은 자체적으로 보안 패치를 관리해야 한다.
커널 거버넌스 구조 상세
리눅스 커널의 거버넌스는 공식적인 조직 구조 없이, 기술적 역량과 신뢰에 기반한 유기적 체계로 운영된다. 2018년 Code of Conduct 채택 이후 커뮤니티 운영 방식에도 변화가 있었다.
Technical Advisory Board (TAB)
Linux Foundation의 Technical Advisory Board는 커널 커뮤니티의 기술적 방향성을 논의하는 자문 기구이다. 구성원은 커뮤니티 선거로 선출되며, Code of Conduct 위반 사항 조정 역할도 수행한다.
| 역할 | 담당자/조직 | 권한 | 선출 방식 |
|---|---|---|---|
| BDFL (Benevolent Dictator) | Linus Torvalds | 최종 병합 결정권 | 창시자 |
| 대리 관리자 | Greg Kroah-Hartman | Linus 부재 시 관리 | Linus 지명 |
| 서브시스템 메인테이너 | ~1,700명 | 서브시스템 패치 리뷰/병합 | 기술적 역량 기반 |
| TAB 위원 | 선출직 10명 | 기술 자문, CoC 조정 | 커뮤니티 투표 |
| Stable 관리자 | Greg KH, Sasha Levin | stable/LTS 릴리즈 | 지명 |
| linux-next 관리자 | Stephen Rothwell | 통합 빌드 테스트 | 지명 |
MAINTAINERS 파일 구조
# MAINTAINERS 파일 엔트리 형식
NETWORKING [DSA]
M: Andrew Lunn <andrew@lunn.ch>
M: Florian Fainelli <f.fainelli@gmail.com>
M: Vladimir Oltean <olteanv@gmail.com>
L: netdev@vger.kernel.org
S: Maintained
F: net/dsa/
F: drivers/net/dsa/
F: include/net/dsa.h
F: include/linux/dsa/
# 필드 설명:
# M: = 메인테이너 (패치 리뷰 및 병합 권한)
# R: = 리뷰어 (Acked-by/Reviewed-by 제공)
# L: = 메일링 리스트
# S: = 상태 (Maintained, Supported, Orphan 등)
# F: = 파일/디렉토리 패턴
# T: = Git 트리 URL
# MAINTAINERS 활용 실전 명령어
# 특정 파일의 메인테이너 확인
scripts/get_maintainer.pl -f net/dsa/slave.c
# 특정 패치의 수신자 자동 확인
scripts/get_maintainer.pl 0001-net-dsa-fix-bug.patch
# 메인테이너 수 통계
grep "^M:" MAINTAINERS | sort -u | wc -l
# Orphan 상태 서브시스템 확인
grep -B1 "^S:.*Orphan" MAINTAINERS
# 전체 메일링 리스트 목록
grep "^L:" MAINTAINERS | sort -u
파일시스템 진화
리눅스 커널의 파일시스템 지원은 초기 Minix FS에서 현재의 ext4, Btrfs, XFS, F2FS, Bcachefs까지 지속적으로 발전해왔다. 파일시스템 변천사는 스토리지 기술 발전을 직접 반영한다.
| 파일시스템 | 최초 도입 | 현재 상태 | 핵심 특징 |
|---|---|---|---|
| Minix FS | 0.01 (1991) | 레거시 | 최초 지원, 교육용 |
| ext | 0.96 (1992) | 제거됨 | 최초 Linux 전용 FS |
| ext2 | 0.99 (1993) | 유지보수 | 저널링 없음, 단순/빠름 |
| ext3 | 2.4 (2001) | 유지보수 | 저널링 추가, ext2 호환 |
| ext4 | 2.6.28 (2008) | 활발 (기본 FS) | 엑스텐트, 48비트 블록, 대용량 |
| ReiserFS | 2.4 (2001) | 제거 예정 | tail packing, 소파일 최적화 |
| XFS | 2.6 (2003) | 활발 | 64비트, 병렬 I/O, 대용량 |
| Btrfs | 2.6.29 (2009) | 활발 | CoW, 스냅샷, RAID, 압축 |
| F2FS | 3.8 (2013) | 활발 | 플래시 최적화, Android 채택 |
| OverlayFS | 3.18 (2014) | 활발 | 유니온 마운트, 컨테이너 기반 |
| NTFS3 | 5.15 (2021) | 활발 | Windows NTFS 읽기/쓰기 |
| Bcachefs | 6.7 (2024) | 실험적 | CoW, 체크섬, 암호화, 압축 |
네트워킹 스택 진화
리눅스 네트워킹 스택은 단순한 TCP/IP 구현에서 세계에서 가장 기능이 풍부한 네트워크 OS로 발전했다.
| 시기 | 기능 | 커널 버전 | 영향 |
|---|---|---|---|
| 1994 | TCP/IP 스택 완성 | 1.0 | 인터넷 서버 가능 |
| 1999 | IPv6 초기 지원 | 2.2 | 차세대 인터넷 프로토콜 |
| 2001 | iptables/Netfilter | 2.4 | 방화벽 프레임워크 |
| 2001 | SCTP | 2.4 | 통신 프로토콜 |
| 2005 | NAPI | 2.6.x | 고속 패킷 처리 |
| 2006 | 네트워크 네임스페이스 | 2.6.24 | 컨테이너 네트워킹 |
| 2009 | Open vSwitch | 3.3 | SDN 가상 스위치 |
| 2013 | nftables | 3.13 | iptables 차세대 대체 |
| 2016 | XDP | 4.8 | 초고속 패킷 처리 |
| 2016 | BBR TCP 혼잡 제어 | 4.9 | Google 고성능 혼잡 제어 |
| 2018 | kTLS | 4.13 | 커널 TLS 오프로드 |
| 2020 | WireGuard | 5.6 | 현대적 VPN |
| 2020 | MPTCP | 5.6 | 다중 경로 TCP |
| 2024 | TCP 하드웨어 TX shaping | 6.13 | NIC 기반 트래픽 제어 |
커널 빌드 시스템 변천
커널 빌드 시스템도 코드베이스 성장에 맞춰 진화해왔다.
| 시기 | 빌드 시스템 | 특성 |
|---|---|---|
| 1991~2001 | 순수 Makefile + 쉘 스크립트 | 단순, 수동 의존성 |
| 2001 | Kconfig (menuconfig) 도입 | 대화형 설정 인터페이스 |
| 2002~2005 | Kbuild 시스템 현대화 | 재귀적 make, Sam Ravnborg 주도 |
| 2017 | GCC 플러그인 인프라 | 컴파일 시 보안 검증 |
| 2020 | Clang/LLVM 빌드 지원 | GCC 외 컴파일러 지원 |
| 2022 | Rust 빌드 통합 | rustc + bindgen + Kbuild 연동 |
| 2023 | 최소 GCC 버전 5.1 이상 | 레거시 컴파일러 지원 종료 |
# 커널 빌드 기본 명령어
# 설정
make defconfig # 기본 설정
make menuconfig # 대화형 설정
make olddefconfig # 기존 .config 유지 + 새 옵션 기본값
# 빌드
make -j$(nproc) # 병렬 빌드
make CC=clang -j$(nproc) # Clang으로 빌드
make LLVM=1 -j$(nproc) # 전체 LLVM 도구 체인
# Rust 지원 확인 및 빌드
make rustavailable # Rust 도구 체인 확인
make LLVM=1 -j$(nproc) # Rust는 LLVM 필수
# 크로스 컴파일
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
# 빌드 시간 프로파일링
make -j$(nproc) 2>&1 | ts '[%Y-%m-%d %H:%M:%S]'
미래 전망
리눅스 커널은 30년 이상의 역사를 통해 지속적으로 발전해왔으며, 앞으로도 여러 방향에서 진화가 예상된다.
기술적 방향성
| 영역 | 현재 상태 | 미래 방향 |
|---|---|---|
| Rust 확대 | 인프라 + 초기 드라이버 | 네트워크/파일시스템 드라이버, 핵심 서브시스템 |
| 스케줄링 | EEVDF + sched_ext | BPF 기반 워크로드 적응형 스케줄링 |
| 보안 | CFI, shadow stack, Landlock | 하드웨어 보안 기능 통합 확대 |
| 이기종 컴퓨팅 | GPU/NPU 드라이버 | 통합 메모리 모델, 가속기 스케줄링 |
| 실시간 | PREEMPT_RT 통합 | 더 세밀한 지연시간 보장 |
| 네트워킹 | XDP, AF_XDP, io_uring | 하드웨어 오프로드 확대, P4/eBPF 통합 |
| 에너지 효율 | EAS, CPUFreq/CPUIdle | 탄소 인식 스케줄링, 지속 가능성 |
| 아키텍처 | x86_64, ARM64, RISC-V | RISC-V 생태계 확대, 레거시 아키텍처 정리 |
거버넌스 과제
- 후계 구도: Linus Torvalds의 은퇴 후 커널 관리 체계에 대한 논의가 시작되고 있다
- 다양성: 기여자 다양성 확대(지역, 성별, 배경)를 위한 노력
- 개발 도구: 메일링 리스트 중심 워크플로우의 현대화 논의 (GitLab/Forge 등)
- AI 코드 기여: AI 생성 코드의 저작권, 라이선스, 품질 관리 정책 수립
- 보안 공개: 취약점 공개 프로세스 개선, CVE 할당 체계 정비
scripts/checkpatch.pl이 지적하는 코딩 스타일 수정이 좋은 진입점이다.
메모리 관리 진화
리눅스 커널의 메모리 관리 서브시스템은 초기 단순한 페이지 할당에서 현대의 정교한 다층 메모리 관리 체계로 발전했다. 이 변천사는 하드웨어 발전(대용량 메모리, NUMA, 영구 메모리)과 워크로드 변화(가상화, 컨테이너)를 반영한다.
| 시기 | 커널 버전 | 주요 변경 | 영향 |
|---|---|---|---|
| 1991 | 0.01 | 단순 페이지 할당 | 최대 16MB 메모리 지원 |
| 1995 | 1.2 | 버디 할당자(Buddy Allocator) 도입 | 외부 단편화 감소 |
| 1996 | 2.0 | SLAB 할당자 도입 | 커널 오브젝트 캐싱 |
| 1999 | 2.2 | highmem 지원 (896MB+) | 32비트에서 대용량 메모리 활용 |
| 2001 | 2.4 | ZONE_HIGHMEM, 리버스 매핑(rmap) | 페이지 회수 효율화 |
| 2003 | 2.6 | NUMA 정책, hugepages | 서버 워크로드 최적화 |
| 2004 | 2.6.7 | zone_reclaim, kswapd 개선 | 메모리 압력 대응 |
| 2007 | 2.6.23 | SLUB 할당자 (SLAB 대체) | 성능/디버깅 개선 |
| 2008 | 2.6.25 | cgroup 메모리 컨트롤러 (memcg) | 컨테이너 메모리 격리 |
| 2010 | 2.6.33 | Transparent Huge Pages (THP) | 자동 hugepage 활용 |
| 2012 | 3.2 | zswap (압축 스왑 캐시) | I/O 감소, 스왑 성능 향상 |
| 2013 | 3.11 | zram (압축 RAM 디스크) | 모바일/임베디드 메모리 확장 |
| 2014 | 3.15 | memfd_create() 시스템 콜 | 익명 공유 메모리 |
| 2017 | 4.14 | KASAN (Kernel Address Sanitizer) | 메모리 오류 탐지 프레임워크 |
| 2018 | 4.15 | KPTI (Meltdown 대응) | 커널/유저 페이지 테이블 분리 |
| 2019 | 5.1 | persistent memory (DAX/PMEM) 성숙 | 영구 메모리 파일시스템 지원 |
| 2020 | 5.8 | memcg v2 성숙, slab memcg 통합 | 정확한 컨테이너 메모리 계측 |
| 2022 | 5.16 | DAMON (Data Access MONitor) | 접근 패턴 기반 메모리 관리 |
| 2022 | 5.18 | Multi-gen LRU (MGLRU) | 페이지 회수 알고리즘 혁신 |
| 2023 | 6.1 | maple tree (VMA 자료구조 교체) | VMA 관리 성능 향상 |
| 2024 | 6.8 | large folio 일반화 | THP 유연화, 파일 I/O 최적화 |
MGLRU (Multi-gen LRU): 5.18의 혁신
전통적인 LRU(Least Recently Used) 알고리즘은 active/inactive 두 리스트만으로 페이지 노화를 추적했다. MGLRU는 세대(generation) 개념을 도입하여 페이지 접근 패턴을 더 정밀하게 추적하고, 불필요한 페이지 스캔을 줄여 메모리 압력 상황에서 성능을 크게 개선했다.
# MGLRU 활성화 확인/제어
cat /sys/kernel/mm/lru_gen/enabled
# 값: 0x0007 (기본) - 모든 기능 활성
# bit 0: MGLRU 코어
# bit 1: 런타임 페이지 테이블 young 비트 스캔
# bit 2: 비활성 세대 자동 노화
# MGLRU 통계 확인 (memcg별)
cat /sys/kernel/debug/lru_gen
# memcg 0 (type=anon)
# node 0
# gen 3 age 10s nr_pages 12345
# gen 2 age 30s nr_pages 8765
# gen 1 age 60s nr_pages 4321
# gen 0 age 120s nr_pages 2345
# DAMON 기반 선제적 회수 설정
echo "2000000 3000000 5 1000 10000" > /sys/kernel/debug/damon/target_ids
# min_sz max_sz min_nr_reg sample_intv aggr_intv (마이크로초)
대형 폴리오 (Large Folio): 6.x의 진화
folio는 5.16에서 도입된 페이지 캐시 관리 단위로, compound page를 대체한다. 6.x 시리즈에서 large folio가 일반화되면서 파일 I/O와 THP 모두에서 성능이 크게 향상되었다.
/* folio 도입 전후 비교 */
/* 5.15 이전: struct page 기반 */
struct page *page = find_get_page(mapping, index);
if (PageCompound(page))
page = compound_head(page); /* head page 필요 */
/* 5.16 이후: struct folio 기반 */
struct folio *folio = filemap_get_folio(mapping, index);
/* folio는 항상 head page → compound_head() 불필요 */
size_t size = folio_size(folio); /* 4KB, 16KB, 64KB, ... */
/* large folio 할당 (6.8+) */
struct folio *folio = filemap_alloc_folio(GFP_KERNEL, order);
/* order=0: 4KB, order=2: 16KB, order=4: 64KB */
디바이스 모델 진화
리눅스 커널의 디바이스 모델은 하드웨어 추상화와 드라이버 관리의 근간이다. 초기의 디바이스 번호(major/minor) 기반 모델에서 sysfs/udev 기반의 현대적 모델로 발전했다.
| 시기 | 커널 버전 | 변경 | 핵심 내용 |
|---|---|---|---|
| 1991 | 0.01 | 디바이스 번호 모델 | major/minor 번호로 장치 식별 |
| 1994 | 1.0 | /proc 파일시스템 | 커널 정보 노출 인터페이스 |
| 1999 | 2.2 | devfs (실험적) | 자동 디바이스 노드 생성 시도 |
| 2002 | 2.5 | 통합 디바이스 모델 | bus/device/driver 계층, Pat Mochel 설계 |
| 2003 | 2.6 | sysfs 도입 | 디바이스 트리를 /sys에 노출 |
| 2003 | 2.6 | udev 도입 | 유저 공간 디바이스 관리자 (devfs 대체) |
| 2005 | 2.6.13 | uevent | hotplug 이벤트 → udev 처리 |
| 2008 | 2.6.25 | Device Tree (ARM) | 하드웨어 기술 표준화 (Open Firmware) |
| 2011 | 3.x | Device Tree 의무화 (ARM) | 보드 파일 제거, DT 기반 프로빙 |
| 2012 | 3.5 | devlink 프레임워크 | 멀티포트 디바이스 통합 관리 |
| 2016 | 4.6 | ACPI + Device Tree 공존 | x86에서도 DT 사용 가능 |
| 2019 | 5.2 | auxiliary bus | 하나의 디바이스에서 여러 서브기능 분리 |
| 2021 | 5.15 | devlink 리로드/파라미터 확장 | NIC/스위치 런타임 재설정 |
| 2023 | 6.3 | Rust 드라이버 바인딩 | 안전한 드라이버 API 시작 |
# 디바이스 모델 탐색 명령어
# sysfs 디바이스 트리 탐색
ls /sys/bus/ # 등록된 버스 타입
ls /sys/class/ # 디바이스 클래스
ls /sys/devices/platform/ # 플랫폼 디바이스
# PCI 디바이스 계층
lspci -tv # PCI 토폴로지 트리
ls /sys/bus/pci/devices/ # sysfs에서 확인
# USB 디바이스 계층
lsusb -tv # USB 토폴로지 트리
ls /sys/bus/usb/devices/ # sysfs에서 확인
# Device Tree 확인 (ARM/ARM64)
ls /proc/device-tree/ # DT 노드 탐색
dtc -I fs /proc/device-tree/ # 런타임 DT 덤프
# udev 규칙 디버깅
udevadm info --query=all --name=/dev/sda
udevadm monitor --property # 실시간 uevent 모니터링
udevadm test /sys/class/net/eth0 # 규칙 시뮬레이션
# 드라이버 바인딩 수동 제어
echo "0000:00:1f.0" > /sys/bus/pci/drivers/lpc_ich/unbind
echo "0000:00:1f.0" > /sys/bus/pci/drivers/lpc_ich/bind
가상화 지원 변천
리눅스는 세계에서 가장 널리 사용되는 하이퍼바이저 호스트 OS이다. KVM의 메인라인 통합부터 컨테이너 격리, 마이크로VM까지 가상화 기술의 전 영역을 포괄한다.
| 시기 | 커널 버전 | 기술 | 영향 |
|---|---|---|---|
| 2002 | 2.4.x | User-mode Linux (UML) | 커널을 유저 프로세스로 실행 |
| 2003 | 2.6.0 | Xen 파라가상화 패치 | 초기 하이퍼바이저 지원 |
| 2006 | 2.6.20 | KVM (Kernel-based VM) | 하드웨어 가상화 (VT-x/AMD-V) 활용 |
| 2007 | 2.6.23 | cgroups | 리소스 격리 프레임워크 |
| 2008 | 2.6.24 | 네트워크 네임스페이스 | 컨테이너 네트워킹 기반 |
| 2008 | 2.6.26 | 완전한 네임스페이스 세트 | PID/UTS/IPC/mount/user NS |
| 2011 | 3.0 | Xen 메인라인 통합 | 외부 패치 불필요 |
| 2013 | 3.8 | user namespace 완성 | 비특권 컨테이너 가능 |
| 2016 | 4.7 | vhost-net 고성능 I/O | VM 네트워크 성능 향상 |
| 2019 | 5.1 | io_uring (VM I/O 활용) | 비동기 I/O 혁신 |
| 2020 | 5.6 | virtio-fs | 호스트-게스트 파일 공유 |
| 2020 | 5.10 | AMD SEV-ES 지원 | 기밀 컴퓨팅 (VM 암호화) |
| 2021 | 5.13 | Intel TDX 초기 지원 | 신뢰 실행 환경 |
| 2022 | 5.19 | Intel TDX 게스트 지원 | 하드웨어 기밀 VM |
| 2023 | 6.2 | AMD SEV-SNP 게스트 | 보안 중첩 페이징 |
| 2024 | 6.9 | guest_memfd | 게스트 전용 메모리 (기밀 컴퓨팅) |
전원 관리와 에너지 효율 역사
리눅스 커널의 전원 관리는 노트북 배터리 절약에서 시작하여 데이터센터 에너지 효율과 모바일 디바이스 최적화까지 광범위한 영역으로 확장되었다.
| 시기 | 커널 버전 | 기술 | 영향 |
|---|---|---|---|
| 1996 | 2.0 | APM (Advanced Power Management) | BIOS 기반 전원 관리 |
| 2002 | 2.4 | ACPI 지원 | OS 주도 전원 관리 |
| 2004 | 2.6.9 | cpufreq 프레임워크 | CPU 주파수 동적 조절 |
| 2006 | 2.6.21 | tickless kernel (NO_HZ) | 유휴 시 타이머 인터럽트 제거 |
| 2008 | 2.6.28 | runtime PM 프레임워크 | 디바이스별 동적 전원 관리 |
| 2009 | 2.6.32 | PM QoS (Quality of Service) | 전원/성능 요구사항 협상 |
| 2011 | 3.0 | cpuidle 거버너 개선 | C-state 선택 최적화 |
| 2014 | 3.16 | EAS (Energy Aware Scheduling) | 에너지 인식 태스크 배치 |
| 2016 | 4.7 | schedutil 거버너 | 스케줄러 기반 주파수 결정 |
| 2019 | 5.1 | Intel Speed Select (ISST) | 코어별 성능 프로파일 |
| 2020 | 5.7 | thermal pressure 통합 | 열 스로틀링 인식 스케줄링 |
| 2021 | 5.14 | Energy Model 개선 | OPP(Operating Performance Point) 정밀화 |
| 2023 | 6.3 | AMD P-State EPP 드라이버 | 하드웨어 자율 DVFS |
| 2024 | 6.8 | Intel HWP 개선 | 하드웨어-소프트웨어 협력 DVFS |
# 전원 관리 상태 확인 명령어
# cpufreq 현재 상태
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# 모든 CPU 주파수 한번에 확인
grep MHz /proc/cpuinfo
# cpuidle C-state 통계
cat /sys/devices/system/cpu/cpu0/cpuidle/state*/name
cat /sys/devices/system/cpu/cpu0/cpuidle/state*/time
cat /sys/devices/system/cpu/cpu0/cpuidle/state*/usage
# 거버너 변경
echo schedutil > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# Intel P-State 드라이버 상태
cat /sys/devices/system/cpu/intel_pstate/status # active/passive/off
cat /sys/devices/system/cpu/intel_pstate/min_perf_pct
cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
# runtime PM 상태 확인 (디바이스별)
cat /sys/bus/pci/devices/0000:00:00.0/power/runtime_status
# active / suspended / suspending
# 시스템 전체 에너지 소비 (RAPL)
cat /sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj
# turbostat으로 상세 분석
turbostat --Summary --show Busy%,Bzy_MHz,PkgWatt sleep 5
# 서스펜드/하이버네이트
cat /sys/power/state # freeze mem disk
echo mem > /sys/power/state # S3 서스펜드
echo freeze > /sys/power/state # s2idle (S0ix)
커널 디버깅 도구 변천
리눅스 커널 디버깅 도구는 printk에서 시작하여 현재의 정교한 트레이싱/프로파일링 프레임워크로 발전했다. 이 변천사는 커널 개발 문화와 소프트웨어 공학의 진보를 반영한다.
| 시기 | 도구 | 커널 버전 | 용도 |
|---|---|---|---|
| 1991 | printk | 0.01 | 커널 로그 출력 (가장 기본적인 디버깅) |
| 1995 | kgdb | 외부 패치 | 원격 GDB 디버깅 |
| 1999 | ksymoops | 2.2 | 커널 Oops 심볼 해석 |
| 2004 | kprobes | 2.6.9 | 동적 커널 계측점 삽입 |
| 2005 | SystemTap | 외부 도구 | 스크립트 기반 커널 프로빙 |
| 2008 | ftrace | 2.6.27 | 함수 트레이싱 프레임워크 |
| 2009 | perf | 2.6.31 | PMU 기반 성능 프로파일링 |
| 2009 | tracepoints | 2.6.28 | 정적 커널 트레이스포인트 |
| 2014 | BPF tracing (BCC) | 3.18+ | eBPF 기반 동적 트레이싱 |
| 2017 | KASAN | 4.0 | 커널 주소 살균기 (메모리 오류 탐지) |
| 2017 | UBSAN | 4.0 | 정의되지 않은 동작 탐지 |
| 2018 | bpftrace | 4.x+ | DTrace 스타일 고수준 BPF 트레이싱 |
| 2019 | KCSAN | 5.3 | 동시성 버그 (data race) 탐지 |
| 2020 | KMSAN | 5.x | 초기화되지 않은 메모리 탐지 |
| 2022 | KFENCE | 5.12 | 경량 메모리 오류 탐지 (프로덕션) |
| 2024 | perf mem / c2c | 6.x | 캐시 라인 경합 분석 |
# 주요 커널 디버깅 도구 사용 예시
# === ftrace: 함수 트레이싱 ===
cd /sys/kernel/tracing
echo function_graph > current_tracer
echo 'tcp_sendmsg' > set_graph_function
echo 1 > tracing_on
sleep 2
echo 0 > tracing_on
cat trace | head -50
# === perf: 성능 프로파일링 ===
# CPU 프로파일링 (플레임 그래프용)
perf record -g -a sleep 10
perf report --stdio
# 하드웨어 이벤트 카운팅
perf stat -e cycles,instructions,cache-misses,branches,branch-misses ./workload
# 스케줄러 지연시간 분석
perf sched record sleep 5
perf sched latency
# === bpftrace: 고수준 트레이싱 ===
# 프로세스별 시스콜 빈도
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
# 블록 I/O 지연시간 히스토그램
bpftrace -e 'tracepoint:block:block_rq_issue { @start[args->dev, args->sector] = nsecs; }
tracepoint:block:block_rq_complete /@start[args->dev, args->sector]/ {
@usecs = hist((nsecs - @start[args->dev, args->sector]) / 1000);
delete(@start[args->dev, args->sector]);
}'
# TCP 재전송 추적
bpftrace -e 'kprobe:tcp_retransmit_skb { printf("retransmit: %s:%d\n", comm, pid); }'
# === KASAN: 메모리 오류 탐지 (빌드 시 설정) ===
# .config에서 CONFIG_KASAN=y 설정 후 빌드
# 버그 발생 시 dmesg에 상세 리포트 출력
dmesg | grep -A 20 "BUG: KASAN"
# === crash: 커널 덤프 분석 ===
crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/vmcore
# crash> bt (backtrace)
# crash> ps (프로세스 목록)
# crash> vm (가상 메모리)
# crash> log (커널 로그)
커널 테스트 인프라 발전
리눅스 커널은 세계 최대 규모의 오픈소스 프로젝트답게 정교한 테스트 인프라를 구축해왔다. 초기에는 테스트가 거의 없었으나, 현재는 수십 개의 자동화된 CI 시스템이 매 패치를 검증한다.
| 테스트 시스템 | 시작 | 용도 | 운영 주체 |
|---|---|---|---|
| LTP (Linux Test Project) | 2001 | 시스콜, 파일시스템 회귀 테스트 | SGI → IBM → 커뮤니티 |
| kselftest | 2012 (3.7) | 서브시스템별 단위 테스트 | 커널 트리 내장 |
| 0-day (Intel) | 2012 | 빌드/부트/실행 테스트 자동화 | Intel |
| kernelci.org | 2014 | 다중 아키텍처 CI | Linux Foundation |
| syzbot (syzkaller) | 2017 | 커버리지 기반 커널 퍼징 | |
| KUnit | 2019 (5.5) | 커널 내 단위 테스트 프레임워크 | |
| LKFT | 2017 | 기능 테스트 자동화 | Linaro |
| CKI (CentOS) | 2019 | Red Hat 커널 CI | Red Hat |
| virtme-ng | 2023 | 빠른 커널 부팅/테스트 | 커뮤니티 |
# 커널 테스트 실행 예시
# === KUnit: 커널 단위 테스트 ===
# 모든 KUnit 테스트 실행 (UML 기반, 하드웨어 불필요)
./tools/testing/kunit/kunit.py run
# 특정 테스트 스위트만 실행
./tools/testing/kunit/kunit.py run --filter=kunit_example
# QEMU에서 실행 (ARM64)
./tools/testing/kunit/kunit.py run --arch=arm64 --cross_compile=aarch64-linux-gnu-
# === kselftest: 서브시스템 테스트 ===
# 전체 selftest 빌드 및 실행
make -C tools/testing/selftests run_tests
# 특정 서브시스템 테스트만
make -C tools/testing/selftests TARGETS=net run_tests
make -C tools/testing/selftests TARGETS=bpf run_tests
make -C tools/testing/selftests TARGETS=mm run_tests
# === syzkaller: 커널 퍼징 (로컬) ===
# syz-manager 설정 후 실행
./bin/syz-manager -config my.cfg
# === LTP: 회귀 테스트 ===
# 기본 시스콜 테스트
./runltp -f syscalls -z -o /tmp/ltp-results.log
# === virtme-ng: 빠른 커널 부팅 ===
# 현재 커널 소스로 빌드 후 즉시 부팅
vng --build --run
# 특정 명령 실행 후 종료
vng --run -- uname -r
커널 문서화 시스템 변천
커널 문서화 체계의 발전은 프로젝트 규모 성장과 개발자 온보딩의 필요성을 반영한다.
| 시기 | 시스템 | 특징 |
|---|---|---|
| 1991~2000 | 일반 텍스트 (Documentation/) | 형식 없는 .txt 파일 |
| 2000 | DocBook XML | 구조화된 API 문서 (xmlto 빌드) |
| 2004 | kernel-doc 주석 | 소스 코드 내 API 주석 자동 추출 |
| 2016 | Sphinx + reStructuredText | 현대적 문서 빌드 시스템으로 전환 |
| 2017 | docs.kernel.org | 온라인 문서 자동 배포 |
| 2019 | .rst 의무화 | 모든 새 문서는 RST 형식 |
| 2020 | MAINTAINERS에 문서 매핑 | 서브시스템별 문서 관리자 |
| 2022 | 번역 시스템 강화 | 중국어, 일본어, 한국어, 이탈리아어 문서 |
# 커널 문서 빌드
# HTML 문서 생성
make htmldocs
# 특정 서브시스템 문서만
make SPHINXDIRS=networking htmldocs
make SPHINXDIRS=driver-api htmldocs
# PDF 생성
make pdfdocs
# kernel-doc 추출 (특정 파일의 API 문서)
scripts/kernel-doc -man include/linux/skbuff.h
scripts/kernel-doc -rst include/linux/list.h
# 문서 검증 (스타일 체크)
make htmldocs 2>&1 | grep WARNING
# 번역 문서 빌드 (한국어)
make SPHINXDIRS=translations/ko_KR htmldocs
/**로 시작하는 주석은 kernel-doc 형식으로,
Sphinx가 자동으로 API 문서를 생성한다. 새 API를 추가할 때는 반드시 kernel-doc 주석을 작성해야
문서 빌드 경고 없이 통과할 수 있다. scripts/kernel-doc -none -Wall로 형식을 검증할 수 있다.
리눅스 커널의 문화와 커뮤니케이션
리눅스 커널 개발 커뮤니티는 독특한 문화와 커뮤니케이션 방식을 발전시켜왔다. 30년 이상 지속된 메일링 리스트 기반 워크플로우는 현재까지 커널 개발의 근간이다.
커뮤니케이션 채널
| 채널 | 용도 | 특징 |
|---|---|---|
| LKML (linux-kernel@) | 일반 커널 개발 토론 | 하루 500~1000건, 1991년부터 운영 |
| 서브시스템 리스트 | 영역별 개발 (netdev, linux-mm 등) | 40개 이상 활성 리스트 |
| lore.kernel.org | 메일 아카이브 | 모든 메일링 리스트 통합 검색 |
| IRC (#kernel, OFTC) | 실시간 토론 | 비공식 소통 채널 |
| Kernel Summit | 연간 개발자 회의 | 주요 방향 결정, 대면 토론 |
| LPC (Linux Plumbers) | 기술 컨퍼런스 | 서브시스템별 심층 기술 토론 |
| bugzilla.kernel.org | 버그 트래커 | 공식 버그 보고 채널 |
| patchwork | 패치 추적 | 메일 기반 패치의 상태 관리 |
패치 워크플로우
# 커널 패치 제출 전체 과정
# 1. 코딩 스타일 검증
scripts/checkpatch.pl --strict -f drivers/net/dsa/my_driver.c
# 2. 패치 생성
git format-patch -v2 --cover-letter -o /tmp/patches HEAD~3
# -v2: 두 번째 버전
# --cover-letter: 시리즈 설명
# 3. 수신자 자동 확인
scripts/get_maintainer.pl /tmp/patches/*.patch
# 4. 패치 전송
git send-email --to=maintainer@example.com \
--cc=linux-kernel@vger.kernel.org \
/tmp/patches/*.patch
# 5. 패치 상태 확인
# lore.kernel.org에서 Message-ID로 검색
# patchwork에서 상태 확인 (New/Under Review/Accepted 등)
# 6. 피드백 반영 후 재전송
git format-patch -v3 --cover-letter -o /tmp/patches_v3 HEAD~3
# v3 커버레터에 변경 이력(changelog) 포함
코드 리뷰 태그
| 태그 | 의미 | 누가 부여 |
|---|---|---|
| Reviewed-by | 코드를 상세히 리뷰함 | 리뷰어/메인테이너 |
| Acked-by | 변경에 동의함 (서브시스템 관리자) | 관련 서브시스템 메인테이너 |
| Tested-by | 실제 하드웨어/환경에서 테스트 | 테스터 |
| Reported-by | 버그를 보고한 사람 | 작성자가 추가 |
| Suggested-by | 아이디어를 제안한 사람 | 작성자가 추가 |
| Fixes: | 수정 대상 커밋 참조 | 작성자가 추가 |
| Cc: stable@ | stable 백포트 요청 | 작성자가 추가 |
| Signed-off-by | DCO(Developer Certificate of Origin) 서명 | 모든 기여자 필수 |
git commit -s로 자동 추가된다.
커널 주요 인물과 기여
리눅스 커널의 역사는 핵심 개발자들의 기여와 분리할 수 없다. 프로젝트 초기부터 현재까지 커널의 방향을 결정지은 주요 인물들을 정리한다.
| 인물 | 주요 기여 | 활동 시기 | 현재 역할 |
|---|---|---|---|
| Linus Torvalds | 커널 창시, Git 개발, 전체 관리 | 1991~현재 | BDFL / 최종 통합자 |
| Alan Cox | 네트워킹, TTY, 초기 SMP | 1991~2013 | 반은퇴 (Intel) |
| Andrew Morton | mm, -mm 트리, 통합 관리 | 2001~현재 | 부관리자 (Google) |
| David S. Miller | 네트워킹 스택, SPARC | 1996~현재 | net 메인테이너 (Oracle) |
| Greg Kroah-Hartman | 드라이버 코어, USB, stable 관리 | 2001~현재 | stable 관리자 (Linux Foundation) |
| Thomas Gleixner | 인터럽트, 타이머, PREEMPT_RT | 2003~현재 | x86 공동 메인테이너 |
| Ingo Molnar | 스케줄러(CFS), perf, RT | 2001~현재 | tip 트리 관리자 (Red Hat) |
| Tejun Heo | cgroups v2, workqueue, sata/libata | 2005~현재 | cgroup/workqueue (Meta) |
| Dave Airlie | DRM/GPU 서브시스템 | 2004~현재 | DRM 메인테이너 (Red Hat) |
| Jakub Kicinski | 네트워크 드라이버, BPF | 2016~현재 | net 공동 메인테이너 (Meta) |
| Miguel Ojeda | Rust for Linux | 2021~현재 | Rust 서브시스템 관리자 |
| Alexei Starovoitov | eBPF 확장 (프로그래머블 커널) | 2014~현재 | BPF 메인테이너 (Meta) |
| Jens Axboe | 블록 레이어, io_uring | 2001~현재 | block/io_uring (Oracle) |
| Ted Ts'o | ext2/3/4 파일시스템, e2fsprogs | 1991~현재 | ext4 메인테이너 (Google) |
| Chris Mason | Btrfs 개발 | 2007~현재 | Btrfs 원 저자 (Meta) |
| Christoph Hellwig | VFS, 블록 I/O, DMA API | 2000~현재 | 다수 서브시스템 리뷰어 |
기업별 기여 비중 (2024년 기준)
현대 리눅스 커널 개발은 기업 후원에 크게 의존한다. Linux Foundation의 분석에 따르면 전체 커밋의 약 85%가 기업 소속 개발자에 의해 이루어진다.
| 기업 | 기여 비중 (6.x) | 주요 관심 영역 |
|---|---|---|
| Intel | ~12% | x86, 드라이버, 보안, Wi-Fi |
| Red Hat | ~10% | 스케줄러, RHEL 커널, 가상화 |
| ~8% | Android, eBPF, 메모리, KVM | |
| Linaro | ~6% | ARM, Device Tree, 전원 관리 |
| AMD | ~5% | GPU(amdgpu), CPU, KVM |
| Meta | ~4% | eBPF, cgroups, 네트워킹 |
| NVIDIA | ~3% | GPU(nouveau/open), Tegra |
| Microsoft | ~3% | Hyper-V, WSL, Surface |
| Samsung | ~3% | ARM, 스토리지, F2FS |
| SUSE | ~2% | Btrfs, 엔터프라이즈 기능 |
| 개인/독립 | ~15% | 다양한 영역 |
주요 기술 논쟁과 분기점
리눅스 커널 30년 역사에서 커뮤니티를 뒤흔든 주요 기술 논쟁들은 프로젝트의 방향을 결정지었다. 각 논쟁의 배경, 결과, 교훈을 정리한다.
마이크로커널 vs 모놀리식 (1992)
Andrew Tanenbaum과 Linus Torvalds의 유명한 논쟁. Tanenbaum은 "Linux는 시대에 뒤떨어진 모놀리식 설계"라고 비판했으나, Linus는 실용적 성능을 이유로 모놀리식을 고수했다. 결과적으로 loadable module, 네임스페이스 등 모듈화 기법으로 모놀리식의 단점을 보완하며 현재에 이르렀다.
BitKeeper 논쟁과 Git 탄생 (2002~2005)
2002년 Linus가 상용 VCS인 BitKeeper를 채택하면서 오픈소스 커뮤니티 내 논란이 시작되었다. 2005년 BitKeeper의 무료 라이선스가 철회되자 Linus가 2주 만에 Git을 개발했다. 이 사건은 분산 VCS의 혁명을 일으켰고, Git은 현재 세계에서 가장 널리 쓰이는 VCS가 되었다.
스케줄러 전쟁: O(1) vs CFS (2007)
Con Kolivas의 RSDL/BFS 스케줄러와 Ingo Molnar의 CFS(Completely Fair Scheduler) 사이의 경쟁. 결과적으로 CFS가 2.6.23에 병합되어 2024년까지 17년간 기본 스케줄러로 사용되었다. 2024년 6.6에서 Peter Zijlstra의 EEVDF가 CFS를 대체하며 새로운 시대를 열었다.
GPL 전용 심볼 논쟁 (지속)
NVIDIA 등의 바이너리 전용 드라이버가 GPL 전용 심볼(EXPORT_SYMBOL_GPL)을 사용할 수 없는 문제는
커널 라이선스 정책의 핵심 논쟁이다. Linus의 유명한 "NVIDIA, f*** you" 발언(2012)은 이 갈등을 상징한다.
2022년 NVIDIA가 커널 모듈을 오픈소스화하면서 일부 해소되었다.
Rust 도입 논쟁 (2020~현재)
C 언어 30년 전통의 커널에 Rust를 도입하는 것은 커뮤니티 내 가장 뜨거운 논쟁 중 하나이다. 메모리 안전성(Rust 지지) vs 복잡성 증가/학습 곡선(반대)의 대립이 지속되고 있다. 2022년 6.1에서 Rust 인프라가 병합되었고, 2024년부터 실제 드라이버(nova-gpu)가 작성되고 있지만, 일부 메인테이너들의 반발도 여전하다.
코드 오브 컨덕트 도입 (2018)
Linus Torvalds가 일시적으로 커널 관리를 중단하고 Linux Foundation의 Contributor Covenant를 채택한 사건. 이전의 "Code of Conflict"를 대체하여 보다 포용적인 커뮤니티 문화로의 전환을 시도했다. Linus는 자신의 공격적인 커뮤니케이션 스타일을 반성하며 복귀했다.
커널과 산업 생태계
리눅스 커널은 세계 IT 인프라의 근간이다. 서버, 클라우드, 모바일, 임베디드, 슈퍼컴퓨터까지 거의 모든 컴퓨팅 영역에서 지배적 위치를 차지한다.
시장 점유율 (2024~2025)
| 분야 | 리눅스 점유율 | 비고 |
|---|---|---|
| 슈퍼컴퓨터 (Top500) | 100% | 2017년부터 전수 리눅스 |
| 클라우드 서버 | ~90% | AWS, GCP, Azure 기본 OS |
| 웹 서버 | ~80% | Apache, Nginx, Caddy 운영 |
| 모바일 (Android) | ~72% | Android 커널 = 리눅스 커널 |
| IoT/임베디드 | ~65% | 라우터, NAS, 산업 자동화 |
| 컨테이너 호스트 | ~95% | Docker/Kubernetes 표준 OS |
| 데스크톱 | ~4% | 지속적 성장 (Steam Deck 영향) |
주요 배포판 커널 정책
| 배포판 | 커널 정책 | 현재 커널 | 지원 기간 |
|---|---|---|---|
| RHEL 9 | 5.14 기반 + 백포트 | 5.14.0-xxx | 2032년 (10년) |
| Ubuntu 24.04 LTS | 6.8 기반 + HWE | 6.8.0-xxx | 2029년 (5년) |
| Debian 12 (Bookworm) | 6.1 LTS 기반 | 6.1.xxx | 2028년 (5년+) |
| Fedora 41 | 최신 안정 커널 | 6.11+ | ~13개월 |
| Arch Linux | 최신 릴리스 직후 | 항상 최신 | 롤링 릴리스 |
| Android 15 | GKI 2.0 (6.6 LTS) | 6.6.xxx | 기기 수명 |
| ChromeOS | LTS + 백포트 | 6.1/6.6 | 기기 AUE 날짜 |
| SLES 15 SP6 | 6.4 기반 + 백포트 | 6.4.xxx | 2031년 |
Android GKI (Generic Kernel Image)
Google의 GKI는 Android 커널 파편화 문제를 해결하기 위한 핵심 프로젝트이다. 기존에는 각 제조사(삼성, 퀄컴, 미디어텍 등)가 독자적으로 포크한 커널을 사용했으나, GKI 2.0(Android 12+)부터 Google이 단일 커널 바이너리를 제공하고 벤더 모듈만 별도로 로드하는 구조로 전환했다.
# Android GKI 커널 구조
# GKI 커널 (Google 제공, 공통)
boot.img
├── kernel (vmlinuz - GKI) # 모든 기기 공통
├── ramdisk.img # 초기 램디스크
└── dtb # Device Tree Blob
# 벤더 모듈 (제조사 제공, 기기별)
vendor_boot.img
├── vendor_ramdisk.img
└── dtb (추가 오버레이)
vendor_dlkm.img
└── lib/modules/ # 벤더 커널 모듈 (.ko)
├── qcom_xxx.ko # 퀄컴 SoC 드라이버
├── samsung_xxx.ko # 삼성 하드웨어 드라이버
└── camera_xxx.ko # 카메라 HAL 드라이버
# GKI 버전 확인 (Android 기기에서)
uname -r
# 예: 6.6.30-android15-6-gxxxxxxxx
# GKI 모듈 심볼 리스트 (ABI 안정성 보장)
# android/abi_gki_aarch64.stg 파일로 관리
클라우드 커널 커스터마이징
주요 클라우드 공급자들은 자체 커널을 운영하여 가상화 성능과 보안을 최적화한다.
| 클라우드 | 커널 | 특징 |
|---|---|---|
| AWS | Amazon Linux Kernel (5.10/6.1 LTS) | Nitro 하이퍼바이저 최적화, ENA 드라이버 |
| Google Cloud | GKE 커널 (COS) | Container-Optimized OS, eBPF 강화 |
| Azure | Microsoft Linux Kernel | Hyper-V 최적화, CBL-Mariner |
| Oracle Cloud | UEK (Unbreakable Enterprise Kernel) | DTrace, Btrfs 강화 |
| IBM Cloud | RHEL 커널 기반 | POWER/s390x 최적화 |
실시간 리눅스와 자동차/산업 분야
PREEMPT_RT의 메인라인 통합(6.12)은 자동차, 로봇, 산업 자동화 분야에서 리눅스 채택을 가속화하고 있다. 이전에는 별도의 RT 패치를 유지해야 했으나, 이제 표준 커널에서 하드 실시간을 달성할 수 있다.
| 표준 | 리눅스 활용 | 요구 지연시간 |
|---|---|---|
| AUTOSAR Adaptive | 자율주행 ECU의 OS 후보 | <1ms |
| AGL (Automotive Grade Linux) | IVI/클러스터/ADAS 플랫폼 | 5~50ms (IVI) |
| ROS 2 (Robot OS) | 로봇 제어 미들웨어 | <1ms (모터 제어) |
| EtherCAT/PROFINET | 산업용 실시간 이더넷 | <1ms (사이클 타임) |
| 5G RAN (O-RAN) | 기지국 L1/L2 처리 | <100us |
# PREEMPT_RT 커널 설정 및 검증
# RT 커널 빌드 설정
make menuconfig
# General setup → Preemption Model → Fully Preemptible Kernel (RT)
# CONFIG_PREEMPT_RT=y
# RT 커널 확인
uname -a
# ...SMP PREEMPT_RT...
# 최악 지연시간 측정 (cyclictest)
cyclictest -m -p 99 -t 4 -D 60 -q
# T: 0 Min: 2 Act: 5 Avg: 4 Max: 18
# T: 1 Min: 2 Act: 4 Avg: 4 Max: 22
# Max < 50us가 일반적인 RT 성능 기준
# IRQ 스레드 확인 (RT에서는 대부분의 IRQ가 스레드화)
ps -eo pid,cls,rtprio,comm | grep irq
# RT 태스크 우선순위 설정
chrt -f 80 ./my_realtime_app # SCHED_FIFO, 우선순위 80
chrt -r 50 ./my_realtime_app # SCHED_RR, 우선순위 50
# CPU isolation (RT 전용 코어 확보)
# 커널 부팅 파라미터: isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3
taskset -c 2 ./my_realtime_app # 격리된 CPU 2에서 실행
커널 참고 도서 (역사 이해에 도움)
| 도서 | 저자 | 연도 | 내용 |
|---|---|---|---|
| Just for Fun | Linus Torvalds | 2001 | 리눅스 탄생 스토리 (자서전) |
| Rebel Code | Glyn Moody | 2001 | 리눅스와 오픈소스 역사 |
| Understanding the Linux Kernel | Bovet, Cesati | 2005 | 2.6 커널 내부 구조 상세 |
| Linux Kernel Development | Robert Love | 2010 | 커널 개발 입문서 (3rd ed.) |
| Linux Device Drivers | Corbet, Rubini, Kroah-Hartman | 2005 | 드라이버 개발 바이블 (LDD3) |
| The Art of Linux Kernel Design | Lixin Yang | 2014 | 커널 설계 철학 |
| BPF Performance Tools | Brendan Gregg | 2019 | eBPF 기반 성능 분석 |
| Linux Observability with BPF | Calavera, Fontana | 2019 | BPF 관측 가능성 |
| Learning eBPF | Liz Rice | 2023 | 현대 eBPF 프로그래밍 |
관련 문서
커널 역사와 함께 이해하면 유용한 문서들입니다.