root@(none) ~# cat /proc/1/comm

TARS

직접 빌드한 Linux 커널 위에, 직접 만든 init(PID 1)과 터미널을 올린 시스템.

셸까지 가는 길에 배포판의 부품을 쓰지 않는다. 커널이 어디까지 책임지고 어디서부터 우리 코드인지를 매 단계 확인하면서 만든다. 데스크톱도, X도, Wayland도 없다 — 프레임버퍼에 픽셀을 직접 찍는다.

qemu-system-x86_64 — virtio-gpu 1024×640실제 화면
01

전원에서 프롬프트까지, 여섯 칸

부팅은 사슬이다. 앞 칸은 다음 칸을 메모리에 올리고 손을 뗀다. 우리가 쓴 것은 주황색 칸이고, 파란 칸은 직접 빌드하고 설정하지만 코드는 남의 것이다.

image
ISO
xorriso hybrid. USB에 구워 노트북에서도 뜬다
bootloader
Limine
UEFI · BIOS 양쪽. 커널과 initrd를 올린다
kernel
Linux
직접 고른 config로 빌드. simpledrm · NVMe · USB · 무선
pid 1 · zig
init
설정 디스크, 네트워크, 서비스 감독, 전원 버튼
drm/kms · zig
terminal
PTY · 한글 조합 · 글리프 · 패널 · copy mode
shell
fish
bash · zsh도 된다. tars.conf가 고른다
우리가 쓴 코드 (Zig)빌드하고 설정하는 남의 코드VT 해석은 ghostty-vt, 이미지 디코딩은 stb_image를 쓴다
02

실제 화면

아래 영상은 전부 QEMU monitor의 sendkey로 키를 치고 screendump로 0.1초마다 뜬 프레임이다. 편집이나 합성은 없다 — 찍는 스크립트는 저장소의 site/capture.sh다.

BOOT4초 만에 프롬프트

QEMU에 커널과 initrd를 넘기고 녹화를 함께 시작했다. 커널 메시지는 시리얼로만 가고, 화면의 첫 픽셀은 우리 terminal이 찍는다.

  • PID 1은 /init — Zig로 쓴 우리 프로그램이다
  • 죽은 자식은 다시 띄운다. terminal도, 셸도, 서비스도
  • 맨 아래 줄은 상태 줄: 한/영 · 자판 · 라틴 배열 · 대문자 잠금

HANGUL한글은 터미널이 조합한다

입력기 데몬이 없다. evdev 키 코드를 받아 terminal 안의 오토마타가 자모를 모으고, 조합 중인 글자는 커서 아래에 그린다. 화면의 자판은 신세벌식 PCS.

  • Shift+Space · 한/영 키 · CapsLock 탭 · 왼쪽 Ctrl 탭으로 전환
  • 자판 넷 — 두벌식 · 공세벌 3-P3 · 신세벌 P2 · 신세벌 PCS
  • 상태 줄의 EN ↔ 한이 함께 바뀐다

COPY MODE스크롤백을 vim처럼

마우스 없이 화면 위로 올라가 찾고, 고르고, 붙인다. 매치는 앰버로, 지금 매치는 더 밝게. 검색창에는 /Freeing [3/4]처럼 위치가 뜬다.

  • ⌘⇧C 진입 · / 검색 · n N 왕복
  • v V 선택 · w b 단어 이동 · y 복사
  • ⌘V는 자식이 원하면 bracketed paste로 감싼다

VIM커서 모양 셋, Esc 하나

vim이 DECSCUSR로 부탁하는 모양을 그린다 — insert는 막대, normal은 블록, replace는 밑줄. 한글을 치다가 Esc를 누르면 조합을 끝내고 영문으로 돌아와서 다음 키가 명령이 된다.

  • esc_latin — tars.conf에서 끌 수 있다
  • 게스트 vimrc는 플러그인 없는 모던 설정 한 벌, mouse=a
  • bat · eza · rg · fd · fzf 등 도구가 기본
03

속도가 아니라 이해

TARS는 한 번 멈췄다. 이전 저장소에서 "이해 없이 코드만 쌓이는" 문제로 막혀 처음부터 다시 시작했다. 이번 재시작의 목표는 빨리 만드는 것이 아니라, 커널이 어디까지 하고 어디서부터 우리 몫인지를 매번 몸으로 확인하는 것이다.

설명 먼저

무엇을 왜 만드는지, 코드를 던지기 전에 말한다.

실행

빌드 · QEMU 부팅 · 게이트를 실제로 돌린다. 짐작하지 않고 잰다.

결과를 줄 단위로

로그가 왜 그렇게 나왔는지 읽는다. 실패가 정상인 단계는 왜 정상인지 짚는다.

게이트가 판정

체인마다 QEMU 안에서 화면 픽셀과 로그로 본다. 통과해야 다음으로 간다.

"init 없는 kernel panic"이 첫 milestone의 성공 조건이었다. 무엇이 없어서 멈추는지를 먼저 보고, 그 빈자리에 우리 코드를 하나씩 넣었다.— Boot Foundation, BF-M1
04

만든 순서

서브프로젝트마다 design doc과 milestone별 plan을 쓰고, 끝나면 무엇을 배웠는지 기록한다. 전부 docs/에 있다.

05

직접 띄워 보기

공개된 ISO를 받아 바로 띄우거나, 소스에서 직접 빌드한다. ISO는 x86_64 하나이고 BIOS · UEFI 양쪽으로 뜬다. 메모리는 1GB를 주고, 실기에서는 Secure Boot를 끈다. 자세한 절차는 docs/guides/running-tars.md.

받아서 띄우기


        

USB · 설치


        

빌드하고 띄우기

$ git clone https://github.com/soomtong/tars-linux
$ cd tars-linux
$ docker build -t tars-devcontainer -f devcontainer/Dockerfile .
$ make boot-qemu      # 전부 빌드하고 설정 디스크를 붙여 QEMU로
$ make run-qemu       # 빌드 없이 다시 띄우기

판정

$ make check CHAIN=config   # 체인 하나
$ make gate                  # 루트 게이트 — 전 체인

# 노트북: out/tars.iso를 USB에 굽고 UEFI로
# 깔기: tars-install <디스크>
06

전체 기능 목록