본문으로 건너뛰기
5분 AI.
GITHUB TRENDING SWIFT MONTHLY #1 딥다이브 · 2026-10-23 분석

tart 딥다이브
— 가상 Mac 한 대를 복제하고 배포하는 Swift 시스템 설계

가상머신 CLI

빠른 판단

무엇
Apple Silicon에서 macOS·Linux VM을 생성·복제·실행하고 OCI 레지스트리로 배포하는 Swift CLI
이럴 때
Xcode·개발 도구를 갖춘 VM 이미지를 준비해 CI 작업마다 같은 환경으로 복제·실행할 때
입력
기본 VM 이미지·게스트 설정 또는 OCI 이미지 참조
결과
복제·실행한 VM과 레지스트리로 배포할 이미지
tart는 macOS와 Linux 가상머신을 명령으로 만들고, 실행하고, 레지스트리로 옮기는 도구입니다. Apple의 가상화 API 위에 CLI·네이티브 화면·디스크 캐시·전송 프로토콜을 얹었습니다. 이 글은 명령 한 줄이 어떻게 가상 컴퓨터와 수십 GB의 이미지로 이어지는지를 따라갑니다. openai/tart · Swift · ⭐7,631 · 포크 411 · 최신 릴리스 2.41.1 · 2026-10-23 GitHub 기준. 소스 설명은 커밋 95a0dac 기준입니다.
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

가상머신을 CI에서 반복해서 쓰기 좋게 만드는 도구

tart는 Mac에서 가상머신의 생성·복제·실행·배포를 자동화하는 Swift 프로그램입니다. 주된 사용 환경은 Apple Silicon Mac이며, 게스트 운영체제로 macOS와 Linux를 다룹니다. 한 번 준비한 가상 컴퓨터를 이미지로 보관하고, 작업마다 복제해 같은 환경에서 시작하게 합니다.

예를 들어 Xcode와 빌드 도구가 설치된 VM을 준비해 두면, CI 작업마다 그 VM을 복제해 앱을 빌드할 수 있습니다. 다른 작업이 설치한 패키지나 남긴 파일 때문에 다음 빌드가 달라지는 문제를 줄이는 방식입니다. 작업 후 복제본을 정리하는 절차는 CI 스크립트나 외부 관리 도구가 구성해야 합니다.

용어
호스트와 게스트, 그리고 VM
실제 하드웨어에서 돌아가는 운영체제가 호스트, 그 안의 가상 컴퓨터에서 돌아가는 운영체제가 게스트입니다. VM은 가상의 CPU·메모리·디스크·네트워크 장치를 갖춘 컴퓨터입니다. 이 글에서는 실제 Mac이 호스트이고, VM 안의 macOS나 Linux가 게스트입니다.
한 문장 비유

실습실 컴퓨터를 매번 조립하는 대신, 준비된 책상을 복제해 나눠 줍니다

운영체제와 개발 도구 설치는 실습실 책상에 교재와 도구를 배치하는 일입니다. 준비된 VM 이미지는 그 배치의 기준본이고, tart clone은 새 수강생에게 전용 책상을 내주는 명령입니다.

각자 자기 복제본을 바꾸므로 기준 환경을 유지하기 쉽습니다. 다만 복제본이 쓰는 CPU·RAM·새 디스크 공간은 실제 Mac에서 나옵니다. 복제 명령이 빠르다고 컴퓨터 자원이 무한해지지는 않습니다.

명령 세 줄에 담긴 역할

다음은 README의 빠른 시작 예입니다. 이미지 다운로드 규모는 README 기준 약 25 GB입니다. 명령을 읽을 때는 설치 → 원격 이미지 확보와 로컬 복제 → VM 실행을 나누어 보세요.

# Homebrew로 배포된 실행 파일 설치
brew install openai/tools/tart

# 원격 VM 이미지를 가져와 tahoe-base라는 로컬 VM 생성
tart clone ghcr.io/cirruslabs/macos-tahoe-base:latest tahoe-base

# 로컬 VM 실행
tart run tahoe-base

clone은 원격 이미지를 필요할 때 먼저 가져옵니다. run은 저장된 VM 설정을 Apple의 VZVirtualMachineConfiguration으로 조립합니다. 이 연결을 이해하면 가상화 도구를 처음 접해도 소스를 따라갈 출발점이 생깁니다.

이 저장소에서 얻을 것
운영체제 API를 자동화 가능한 제품으로 묶는 법

가상 CPU 자체를 구현하는 프로젝트는 아닙니다. Apple의 실행 엔진을 활용하면서, 명령 검증·파일 배치·전송·복제·잠금·화면·오류 처리를 한 도구 안에서 연결하는 설계를 배울 수 있습니다.

코드 출발점: Sources/tart/Root.swift, Sources/tart/Commands/Clone.swift, Sources/tart/VM.swift. VM 구현은 Sources/tart/에 모여 있습니다.

2왜 주목받는가

순위라는 관찰과, 코드를 통해 설명할 수 있는 매력

2-1. 개발 환경도 배포 대상이 됩니다

2026-10-23 GitHub Trending Swift Monthly #1이라는 순위는 관심이 모였다는 신호입니다. 순위만으로 유입 원인이나 특정 사건의 효과를 확정할 수는 없습니다. 기술적으로 주목할 지점은 macOS 개발 환경을 반복해서 공급하는 작업을 명령과 이미지 배포로 다룬다는 데 있습니다.

Xcode 버전, 운영체제 버전, 설치된 도구가 달라지면 CI 결과도 달라질 수 있습니다. VM 기준본을 만들고 복제하면 이러한 차이를 줄일 수 있습니다. docs/quick-start.md에는 macOS 버전별 이미지와 Xcode 이미지, Linux 이미지가 구분되어 있습니다.

tart의 강점은 가상머신을 실행하는 기능과 이미 준비된 환경을 팀에 배포하는 기능을 한 흐름으로 연결한 데 있습니다.

2-2. 기존 레지스트리를 VM 배포 창구로 씁니다

README는 OCI 호환 레지스트리로 VM을 push/pull할 수 있다고 설명합니다. 실제 Sources/tart/VMDirectory+OCI.swift의 pushToRegistry()는 VM 설정, 디스크 청크, NVRAM을 올린 뒤 이들을 가리키는 manifest를 발행합니다. VM을 나눠 주기 위해 별도의 대용량 파일 다운로드 체계를 처음부터 만들 필요를 줄입니다.

용어
OCI 레지스트리
내용 파일과 그 목록을 저장하고 내려주는 배포 서버입니다. 컨테이너 이미지 배포에 널리 쓰이지만, tart는 같은 저장·전송 체계를 VM 디스크에 적용합니다. 같은 보관소를 쓴다고 VM 이미지가 일반 컨테이너 이미지처럼 실행되는 것은 아닙니다.

2-3. 무엇과 비교하면 성격이 분명해질까?

선택지환경 준비·배포 방식tart에서 눈여겨볼 점
물리 Mac 유지같은 호스트에 도구와 작업 결과가 계속 쌓일 수 있음작업용 VM 복제본을 별도로 관리할 수 있음
Apple 예제 직접 확장가상화 API를 호출하고 운영에 필요한 기능을 직접 구현CLI·OCI 배포·캐시·잠금까지 이어지는 완성된 사례
Anka저장소 FAQ는 Anka Registry와 비교해 설명같은 FAQ가 내세우는 차별점은 범용 OCI 레지스트리 활용
tart + Orchardtart가 개별 VM을 관리하고 Orchard가 여러 Mac을 관리단일 호스트 실행기와 클러스터 관리 계층의 역할 분리

Anka 비교는 docs/faq.md의 설명 기준입니다. 이 문서는 Anka 3.0과 같은 기반 기술을 쓴다고 설명하므로, tart가 무조건 더 빠르다는 결론은 근거가 없습니다. 제품별 최신 기능·가격을 비교한 표로 읽기보다 배포와 운영 방식의 차이를 보는 표로 읽으세요.

2-4. 성능 주장과 측정 조건을 함께 읽습니다

README의 “네이티브에 가까운 성능”은 프로젝트의 주장입니다. benchmark/README.md에는 실제 호스트·게스트 비교 기록도 있지만, 모든 작업을 대표하지는 않습니다. 2024-03-27 기록의 M2 Pro·32 GB RAM·macOS 14.4.1 조건에서는 1 MB 무작위 쓰기가 호스트 2.6 GB/s, VM 2.5 GB/s인 반면, 1,000 MB 항목은 호스트 1.7 GB/s, VM 1.1 GB/s로 차이가 더 큽니다.

비유

자동차가 고속도로에서 빠르다는 기록이 골목길 주차 성능까지 증명하지는 않습니다. VM도 CPU 계산, 작은 파일 쓰기, 큰 디스크 쓰기, 이미지 다운로드를 각각 측정해야 합니다.

학습 근거: 저장소 FAQ, 조건이 명시된 벤치마크 기록, Apple의 macOS VM 예제.

3기술 스택 전체 지도

실행 엔진·사용자 화면·배포 도구를 구분해서 읽기

3-1. 백엔드 역할: Swift로 작성한 로컬 실행·관리 계층

여기서 백엔드는 웹 서버가 아니라 VM의 상태와 자원을 관리하는 로컬 프로그램입니다. Package.swift는 tart 실행 파일 하나와 TartTests 테스트 타깃을 정의합니다. 패키지 도구 선언은 swift-tools-version:5.10, 배포 대상은 .macOS(.v13)입니다.

도구 버전 선언을 현재 소스 전체의 빌드 가능 최소 컴파일러와 혼동하면 안 됩니다. 예를 들어 Sources/tart/Root.swift에는 nonisolated(unsafe)가 있고, CI의 실행 환경 이름은 xcode-27입니다. “Swift 5.10만 설치하면 현재 HEAD가 반드시 빌드된다”고 단정할 수 없습니다.

기술담당 기능확인 위치
Virtualization가상 CPU·메모리·디스크·그래픽·네트워크 구성Sources/tart/VM.swift
Foundation파일, JSON, URL, 비동기 HTTP 요청Sources/tart/Config.swift, Sources/tart/OCI/Registry.swift
CompressionLZ4로 디스크 청크 압축·복원Sources/tart/OCI/Layerizer/DiskV2.swift
CryptoKit내용 식별에 쓰는 해시 계산Sources/tart/OCI/Digest.swift
Darwin / System프로세스 신호·파일 잠금·파일 디스크립터Sources/tart/PIDLock.swift, Sources/tart/FileLock.swift

VM 구현 파일은 Sources/tart/ 아래에 있으며, 표의 경로는 저장소 루트 기준입니다. 위 Apple 프레임워크는 운영체제 SDK에 포함되며, 개별 SwiftPM 버전 번호를 가진 외부 패키지와 구분해야 합니다.

3-2. 의존성의 요구 범위와 실제 고정값

Package.swift는 허용하는 버전 범위를, Package.resolved는 선택된 버전과 커밋을 기록합니다. 의존성을 설명할 때는 최소 요구 버전과 실제 고정 버전을 함께 확인해야 재현 가능한 지식이 됩니다.

패키지Package.swiftPackage.resolved역할
swift-argument-parserfrom: 1.6.11.6.1명령·옵션·도움말
swift-algorithmsfrom: 1.2.01.2.0데이터 청크 분할
antlr4exact: 4.13.24.13.2원격 이미지 이름 문법
swift-atomics1.2.0 이상, 2.0.0 미만1.3.0원자적 상태 변경
Semaphorefrom: 0.0.80.1.0비동기 대기·통지
swift-retryfrom: 0.2.30.2.4실패한 전송 재시도
grpc-swift1.27.0 이상, 2.0.0 미만1.27.1게스트 에이전트 RPC
opentelemetry-swift-corefrom: 2.3.02.3.0추적 API와 SDK
SwiftFormatfrom: 0.53.60.54.5Swift 형식 검사
SwiftDatefrom: 7.0.07.0.0날짜 표현
swift-sysctlfrom: 1.8.01.8.0호스트 시스템 정보
SwiftRadix / swift-xattrfrom: 1.3.1 / 3.0.01.3.1 / 3.0.0진수 변환·확장 속성

브랜치를 지정한 의존성도 있습니다. Dynamic은 master의 772883073d04, TextTable은 master의 e03289289155, opentelemetry-swift는 main의 ed37be952508에 고정되어 있습니다. 게스트 에이전트 gRPC 패키지는 main의 4935078c2fe2입니다. 브랜치 이름은 움직이므로 고정 커밋도 함께 보는 습관이 필요합니다.

전이 의존성으로는 swift-nio 2.93.0, swift-protobuf 1.33.3, swift-system 1.4.2가 기록되어 있습니다. 실행 타깃의 직접 의존성과 잠금 파일에 등장하는 모든 패키지는 같은 목록이 아닙니다.

3-3. 프론트엔드 역할: SwiftUI와 AppKit

VM 화면은 웹 UI가 아닙니다. Sources/tart/Commands/Run.swift의 MainApp이 SwiftUI 창을 만들고, VMView: NSViewRepresentable이 AppKit 기반 VZVirtualMachineView를 감쌉니다. updateNSView()는 실제 vm.virtualMachine을 화면에 연결합니다.

즉 SwiftUI가 창과 메뉴를 맡고, 가상 화면 표시와 입력 처리는 Apple의 VM 뷰가 맡습니다. 같은 명령 파일 안에 CLI 옵션 해석과 화면 코드가 함께 있어, 초보자는 “명령부”와 “화면부”로 나눠 읽는 편이 좋습니다. 문서 사이트는 별도로 mkdocs.yml과 docs/가 관리합니다.

3-4. 인프라·빌드·테스트 지도

영역실제 설정학습할 점
Swift 빌드GitHub CI: swift build --build-system swiftbuild배포 대상 OS와 빌드 도구 환경을 구분
GitHub CI.github/workflows/ci.yml, runs-on: xcode-27, 제한 60분단위 테스트와 Go 통합 테스트의 실행 범위
Cirrus CI.cirrus.yml, dev-mini 작업자, Python·Go 통합 테스트실제 VM이 필요한 테스트를 별도 환경에 배치
배포.goreleaser.yml의 설정 버전 2, builder: prebuiltSwift로 빌드한 산출물을 GoReleaser로 포장
서명·공증.ci/sign-release.sh의 codesign, notarytool, stapler컴파일 이후의 macOS 배포 절차
문서mkdocs-material:latest, markdownlint-cli문서도 CI 검사·배포 대상

.goreleaser.yml의 version: 2는 설정 형식 버전이며 tart의 릴리스 버전이 아닙니다. arm64와 x86_64 Swift 실행 파일을 먼저 만들고 범용 바이너리로 묶습니다. 따라서 GoReleaser를 쓴다는 사실만으로 본체가 Go 프로그램이라고 판단하면 안 됩니다.

integration-tests/go.mod는 go 1.25, testify 1.11.1, otel 1.38.0, protobuf 1.36.11을 요구합니다. benchmark/go.mod는 go 1.23.0과 toolchain go1.24.1을 따로 선언합니다. Python integration-tests/requirements.txt의 pytest·testcontainers·paramiko 등은 버전이 고정되어 있지 않습니다.

읽는 요령

파일 이름만 보면 다국어 서비스처럼 보이지만, 중심은 Swift 실행 파일입니다. Go는 테스트·벤치마크, Python은 통합 테스트, 셸은 빌드·배포 자동화를 돕습니다.

버전 근거: Package.swift, Package.resolved, GitHub CI, Cirrus CI.

4아키텍처 심화 분석

명령에서 실행 엔진까지, 네 가지 설계 패턴으로 따라가기
사용자 / CI 작업 | v Root.main() : 명령 해석 + 실행 경로 선택 | +-- clone / pull / push / exec -----> 비동기 명령 경로 | | | | v +-- Registry <--> OCI 레지스트리 | VMStorageLocal / VMStorageOCI +-- DiskV2 : 분할·LZ4·재시도 | | +-- Guest Agent : 명령 실행 | v | VMDirectory : 설정·디스크·NVRAM·manifest | +-- run : MainThreadCommand | v Run.runOnMainThread() | +-- VMConfig + Platform + Network | | | v | VM.craftConfiguration() | | | v | VZVirtualMachineConfiguration.validate() | | | v | VZVirtualMachine --> 게스트 macOS / Linux | +-- MainApp / VMView --> VZVirtualMachineView +-- ControlSocket -----> VirtIO 소켓 --> 게스트 에이전트

VMDirectory는 파일의 위치와 배치를 알고, VM은 실행 중인 가상머신 객체를 다룹니다. “디스크에 저장된 VM”과 “지금 돌아가는 VM”의 역할이 구분된다는 점부터 잡으면 구조가 단순해집니다.

4-1. 패턴 ① 명령 분기와 메인 이벤트 루프 소유권

Sources/tart/Root.swift의 Root는 AsyncParsableCommand를 따릅니다. 그런데 진입점 main()은 의도적으로 동기 함수입니다. 먼저 parseAsRoot()로 명령을 해석한 뒤, MainThreadCommand인지 검사합니다.

// Root.main()의 핵심 분기 발췌
if let mainThreadCommand = command as? MainThreadCommand {
  MainActor.assumeIsolated {
    runOnMainThread(mainThreadCommand)
  }
} else {
  let task = Task.detached {
    await runInBackground(command)
  }
  // 원본에는 Ctrl+C를 task.cancel()로 연결하는 처리도 있음
  dispatchMain()
}

Sources/tart/Commands/Run.swift는 extension Run: MainThreadCommand {}로 이 경로에 참여합니다. 일반 명령은 비동기 실행 경로로 보내고, run은 메인 스레드 최상위에서 AppKit·SwiftUI의 이벤트 루프를 구동합니다. Sources/tart/Root.swift 주석은 Swift 6.4 이후 실행기와 중첩된 UI 루프 사이에서 VM 부팅이 멈추는 문제를 피하기 위한 설계라고 설명합니다.

이 설명은 해당 소스 주석에 기록된 배경입니다. 모든 Swift 프로그램에서 동기 진입점을 써야 한다는 일반 규칙은 아닙니다. MainActor.assumeIsolated 역시 실행을 다른 스레드로 보내는 명령이 아니라, 현재 격리 조건이 맞다는 전제 아래 실행합니다.

용어
이벤트 루프
키 입력, 창 닫기, 작업 완료 같은 사건을 받아 차례대로 처리하는 반복 구조입니다. UI 창이 보이는 것과 그 창의 사건을 처리할 루프가 정상적으로 도는 것은 서로 다른 조건입니다.

4-2. 패턴 ② 전략 객체를 조합하는 VM 구성

Sources/tart/Platform/Platform.swift는 OS마다 달라지는 부품을 프로토콜로 정의합니다. Darwin은 macOS용 부트로더·하드웨어 모델·화면을, Linux는 EFI 부트로더와 VirtIO 화면을 제공합니다. VM.craftConfiguration()은 그 결과를 모아 최종 설정을 만듭니다.

// VM.craftConfiguration()에서 발췌
configuration.bootLoader = try vmConfig.platform.bootLoader(nvramURL: nvramURL)
configuration.cpuCount = vmConfig.cpuCount
configuration.memorySize = vmConfig.memorySize
configuration.platform = try vmConfig.platform.platform(
  nvramURL: nvramURL, needsNestedVirtualization: nested)
configuration.graphicsDevices = [vmConfig.platform.graphicsDevice(vmConfig: vmConfig)]
// 원본은 오디오·입력·네트워크·디스크·공유 폴더도 구성
try configuration.validate()

전략 패턴은 “같은 작업을 다른 방식으로 수행하는 부품을 바꿔 끼우는 설계”입니다. 여기서는 OS별 분기문을 모든 장치 생성 위치에 흩뿌리는 대신, Platform 구현에 차이를 모읍니다. 최종 검증은 Apple 프레임워크의 validate()에 맡깁니다.

네트워크도 같은 발상입니다. Network 프로토콜은 attachments(), run(), stop()을 요구합니다. 기본 NetworkShared는 NAT 장치를 반환하고, NetworkBridged는 선택된 인터페이스에 연결합니다. Run.validate()는 bridged·Softnet·host·외부 FD 방식의 중복 선택을 차단합니다.

통신 경로쓰이는 기능혼동하지 않을 점
가상 네트워크SSH·게스트 인터넷 연결NAT와 브리지에 따라 IP 확인 방식이 달라짐
게스트 제어 경로tart exec, 에이전트 기반 IP 확인호스트 Unix 소켓에서 VirtIO 소켓으로 중계
화면 경로VMView, 선택적 VNC명령 실행 에이전트와 화면 표시 장치는 별개

Sources/tart/GuestAgentChannel.swift의 withGuestAgentChannel()은 gRPC 채널을 열고 성공·실패 양쪽에서 닫습니다. ControlSocket.handleClient()는 그 데이터를 기본 포트 8080의 게스트 VirtIO 소켓으로 중계합니다. 이 제어 경로는 macOS 14 이상의 호스트와 실행 중인 게스트 에이전트가 필요하며, 포트 8080은 게스트 VirtIO 소켓의 포트입니다.

4-3. 패턴 ③ 동시성을 제한한 대용량 전송 파이프라인

Sources/tart/OCI/Layerizer/DiskV2.swift의 push()는 디스크를 압축 전 최대 512 MiB 단위로 자르고 각 조각을 LZ4로 압축합니다. bufferSizeBytes와 holeGranularityBytes는 각각 4 * 1024 * 1024입니다. 이 크기들은 HTTP 업로드의 --chunk-size와 다른 계층의 설정입니다.

// DiskV2.push()의 작업 수 제한 부분 발췌
for (index, data) in mappedDisk.chunks(ofCount: layerLimitBytes).enumerated() {
  if index >= concurrency {
    if let (index, pushedLayer) = try await group.next() {
      pushedLayers.append((index, pushedLayer))
    }
  }
  // 원본은 이어서 group.addTask로 압축·업로드 작업 추가
}

한도에 도달하면 group.next()로 기존 작업 하나가 끝나기를 기다린 뒤 새 작업을 추가합니다. “512 MiB 조각이 천 개니까 작업도 천 개를 한꺼번에 실행”하는 식으로 메모리 사용량을 키우지 않습니다. Push와 Clone의 기본 concurrency는 4입니다.

전송 완료 순서는 원래 디스크 순서와 다를 수 있습니다. 그래서 push()는 각 결과에 원래 index를 붙이고 마지막에 정렬합니다. pull()은 각 청크의 쓰기 오프셋을 미리 정해, 완료 순서가 달라도 제자리로 복원합니다.

비동기 전송에서는 완료 순서와 데이터 순서를 분리하고, 동시에 진행할 작업 수를 제한하는 것이 핵심입니다.

압축 blob의 digest와 복원된 데이터의 digest도 구분합니다. 전자는 전송 객체를, 후자는 압축을 풀었을 때의 내용을 식별합니다. OCI의 descriptor가 종류·digest·크기를 함께 담는다는 원칙은 공식 OCI 명세에서 이어서 볼 수 있습니다.

4-4. 패턴 ④ 임시 저장·잠금·내용 주소로 안전하게 발행하기

Clone.run()은 목적지 이름을 검사하고 임시 VM 디렉토리에 파일을 준비한 뒤, VMStorageLocal.move()로 로컬 이름 아래에 배치합니다. 잠금은 다른 프로세스의 생성·실행·정리 작업과 충돌하지 않게 하는 장치입니다.

원격 이름 또는 로컬 이름 | v 필요한 이미지 확보 --> 임시 VM 디렉토리 잠금 | v 전역 저장소 잠금 --> 목적지 재검사 --> 파일 복제·식별자 조정 | v VMStorageLocal.move() --> 로컬 VM으로 발행 --> 공간 확보 판단 기본 배치: config.json + disk.img + nvram.bin 적층 배치: config.json + manifest.json + nvram.bin + overlay.asif 공유 내용: ~/.tart/cache/content/sha256/해시값 (기본 경로)

FileLock은 flock으로 파일·디렉토리 작업을 직렬화하고, PIDLock은 fcntl 잠금으로 실행 중인 프로세스를 추적합니다. VMDirectory.state()는 실행 잠금이 있으면 running, 저장 상태 파일이 있으면 suspended, 그 외에는 stopped로 판단합니다.

기본 복제는 VMDirectory.clone(to:generateMAC:)의 파일 복사로 이루어집니다. APFS에서는 쓰기 시 복사 덕분에 물리 공간을 즉시 전부 복제하지 않을 수 있습니다. MAC 주소는 같은 주소의 로컬 VM이 있고 원본이 일시 중단 상태가 아닐 때 새로 만듭니다. Linux 가상 하드웨어의 machine identifier도 원본이 일시 중단 상태가 아닐 때 재생성합니다.

적층 디스크는 한 단계 더 나갑니다. ContentStore는 복원된 전체 파일의 SHA-256을 이름으로 사용하고, install()에서 실제 해시를 검증한 뒤 저장합니다. 공유 기준 디스크와 발행된 읽기 전용 계층은 재사용하고, VM마다 쓰기 가능한 overlay.asif를 따로 둡니다.

비유

내용 주소 저장소는 파일 제목 대신 “내용 지문”으로 창고 칸을 정하는 방식입니다. 같은 내용이면 같은 칸을 쓸 수 있고, 개인 메모는 각자의 덧종이인 overlay에 적습니다.

다만 이 적층 경로는 DiskImageStack.requireSupport()가 검사하는 canImport(DiskImageKit)과 macOS 27 조건을 만족해야 합니다. clone --stacked로 새 적층 기준을 만드는 경로는 원격 macOS 이미지만 허용합니다. 기본 APFS 복제, ASIF 파일 형식, 적층 디스크는 서로 다른 기능입니다.

관련 소스: Sources/tart/OCI/Layerizer/DiskV2.swift, Sources/tart/VMDirectory.swift, Sources/tart/ContentStore.swift, Sources/tart/DiskImageStack.swift.

5디렉토리 구조 해부

어디에 무엇이 있는지 알면, 필요한 부분부터 읽을 수 있습니다
tart/ ├── Package.swift / Package.resolved 의존성·실행 타깃·고정 버전 ├── Sources/tart/ │ ├── Root.swift 명령 등록과 실행 경로 │ ├── Commands/ create·clone·run·push·exec 등 │ ├── VM.swift / VMConfig.swift 실행 객체와 저장할 설정 │ ├── VMDirectory.swift 파일 배치·상태·복제 │ ├── VMDirectory+OCI.swift VM과 레지스트리 사이 변환 │ ├── VMDirectory+DiskImageStack.swift 적층 VM 처리 │ ├── VMStorageLocal.swift 로컬 VM 이름 관리 │ ├── VMStorageOCI.swift 원격 이미지 캐시 │ ├── ContentStore.swift 내용 주소 기반 공유 저장소 │ ├── Platform/ Darwin·Linux·Architecture │ ├── Network/ NAT·브리지·Softnet·외부 FD │ ├── OCI/ │ │ ├── Registry.swift HTTP·인증·blob·manifest │ │ ├── Manifest.swift 이미지 구성과 검증 │ │ ├── Layerizer/DiskV2.swift 압축·병렬 전송·복원 │ │ └── Reference/ 이름 문법과 생성된 파서 │ ├── Credentials/ 환경변수·Docker 설정·Keychain │ ├── MACAddressResolver/ DHCP·ARP·에이전트 기반 IP 확인 │ ├── ControlSocket.swift 호스트와 게스트 사이 중계 │ └── OTel.swift 조건부 추적 초기화 ├── Tests/TartTests/ Swift XCTest 테스트 ├── integration-tests/ Python·Go 통합 테스트 ├── benchmark/ Go 성능 비교 도구 ├── Resources/ 앱 정보·아이콘·권한 설정 ├── .github/workflows/ GitHub CI·빌드·릴리스 ├── .ci/ 빌드·서명·패키징 스크립트 ├── .cirrus.yml / .goreleaser.yml CI와 배포 설정 ├── docs/ / mkdocs.yml 문서 사이트 └── LICENSE FSL-1.1-ALv2 본문

이는 주요 경로를 추린 트리입니다. Sources/tart/VMDirectory+OCI.swift처럼 이름에 +가 붙은 파일은 같은 타입의 기능을 Swift extension으로 나눈 예입니다. 경로가 다르다고 별개의 VM 모델이 생기는 것은 아닙니다.

코드 규모: 줄 수를 읽는 기준도 함께 기록합니다

범위파일 수물리 줄 수포함 범위
Swift 전체13418,827구현·테스트·생성 코드·보조 파일
Sources/tart9914,279실행 타깃 Swift, 생성 코드 포함
ANTLR 생성 Swift41,185위 실행 타깃에 포함된 하위 집합
Tests/TartTests344,486Swift 테스트 코드
Go 전체211,455통합 테스트 453줄 + 벤치마크 1,002줄
Python 전체10305통합 테스트
셸 파일8152.sh 확장자 기준
HTML / CSS1 / 2325 / 339문서 화면과 스타일

커밋 95a0dac의 파일을 확장자별로 집계한 값이며 빈 줄과 주석을 포함합니다. 마지막에 개행이 없는 줄도 한 줄로 셉니다. .git 내부는 제외했습니다. 실행 타깃에서 생성 코드를 빼면 Swift 13,094줄입니다. 테스트 4,486줄은 전체 Swift의 약 23.8%이지만, 이 비율은 실행 커버리지나 품질 점수가 아닙니다.

처음 읽는 순서

  1. Sources/tart/Root.swift: 사용할 수 있는 명령과 실행 경로를 확인합니다.
  2. Sources/tart/Commands/Clone.swift: 입력 검증부터 저장까지 한 사용 사례를 따라갑니다.
  3. Sources/tart/VMDirectory.swift, Sources/tart/VMConfig.swift: 무엇을 저장하는지 이해합니다.
  4. Sources/tart/VM.swift, Sources/tart/Platform/: 저장한 값이 가상 하드웨어가 되는 지점을 봅니다.
  5. Sources/tart/OCI/Layerizer/DiskV2.swift: 마지막으로 전송 최적화와 동시성을 읽습니다.

테스트를 먼저 곁들이고 싶다면 Tests/TartTests/VMDirectoryLayoutTests.swift가 좋습니다. 필요한 파일 조합을 작은 사례로 만들고, 어떤 배치가 실행 가능한지 단언하므로 모델의 규칙이 드러납니다.

6학습 포인트 (기술별)

문법을 외우기보다, 어떤 문제 때문에 이 기술을 썼는지 찾기

6-1. Swift CLI: 입력도 타입으로 모델링합니다

Sources/tart/Commands/Create.swift의 @Argument, @Option, @Flag를 비교해 보세요. VM 이름은 위치 인자, 디스크 크기는 값이 있는 옵션, Linux 선택은 참·거짓 플래그입니다. 명령을 구조체로 표현하면 옵션 선언·도움말·검증·실행을 한 단위로 읽을 수 있습니다.

미니 실습: Push.validate()에서 concurrency가 0일 때와 chunkSize가 음수일 때를 찾아 입력·오류 표를 만드세요. 정상 경로를 읽기 전에 실패 입력을 정리하면 명령의 계약이 먼저 보입니다.

6-2. Codable: 오래된 설정을 계속 읽는 법

VMConfig.init(from:)는 빠진 os를 .darwin, 빠진 arch를 .arm64, 빠진 diskFormat을 raw로 읽습니다. 새 필드가 생겼어도 기존 설정 파일을 처리하려는 호환성 설계입니다. 반대로 잘못된 MAC 주소처럼 해석할 수 없는 값에는 디코딩 오류를 반환합니다.

미니 실습: “필드 누락”, “형식 오류”, “지원하지 않는 호스트”를 구분해 보세요. 어떤 입력을 기본값으로 보완하고 어떤 입력을 거절해야 하는지 근거를 붙이면, 설정 파일 설계 연습이 됩니다.

6-3. Swift 동시성: 작업 수·상태 격리·취소는 다른 문제입니다

DiskV2의 task group은 작업의 생명주기와 동시 진행 수를 다룹니다. Sources/tart/OCI/AuthenticationKeeper.swift의 actor는 인증 상태 접근을 보호합니다. Clone.run()의 withTaskCancellationHandler는 취소 시 임시 결과 정리를 시도합니다. 이 셋을 모두 “비동기라서 안전하다”로 뭉뚱그리면 설계 이유가 사라집니다.

미니 실습: 청크 A·B·C·D와 동시성 2를 놓고 B가 먼저 끝나는 일정을 종이에 그려 보세요. 작업 제출 순서, 완료 순서, manifest에 들어갈 최종 순서를 서로 다른 줄로 기록하세요.

6-4. 파일 시스템: 논리 크기와 실제 사용량을 구분합니다

VM 안에서 보이는 디스크 용량과 호스트에서 실제로 할당된 저장 공간은 다를 수 있습니다. Clone.run()은 두 크기의 차이를 계산해 공간 확보를 시도합니다. --prune-limit 기본값 100은 최대 100 GiB까지 공간 확보를 시도하도록 하는 계산 한도이며 VM 디스크 자체의 최대 크기가 아닙니다.

미니 실습: 기본 VM, 적층 로컬 VM, 적층 OCI 캐시에 대해 “파일이 존재한다”와 “지금 실행 가능하다”를 따로 표기하세요. VMDirectory.Layout의 세 경우와 isRunnable이 답의 근거입니다.

6-5. 네트워크·인증: 추상화 뒤에도 서로 다른 전제가 남습니다

IP.resolveIP()는 DHCP·ARP·agent 전략을 나눕니다. 기본 DHCP 경로는 호스트의 예약·임대 정보를 읽고, ARP 경로는 이웃 주소 정보를 이용하며, agent 경로는 게스트 에이전트가 있어야 동작합니다. 네트워크 모드를 바꾸면 IP를 알아내는 방법도 점검해야 합니다.

Sources/tart/OCI/Registry.swift의 기본 자격증명 공급자 순서는 환경변수 → Docker 설정 → Keychain입니다. HTTP 401을 받으면 WWW-Authenticate를 해석하고 인증을 거쳐 요청을 다시 시도합니다. “비밀번호를 어디서 가져오는가”와 “서버가 어떤 인증 방식을 요구하는가”가 분리되어 있습니다.

미니 실습: Run.userSpecifiedNetwork()의 findBridgedInterface()를 읽어 보세요. 커밋 95a0dac은 일치하지 않은 인터페이스 이름을 오류에 포함합니다. 같은 실패라도 입력값과 가능한 선택지를 함께 보여 주면 사용자가 문제를 해결하기 쉬워집니다.

6-6. 관측 가능성과 테스트: 정상 작동의 증거를 설계합니다

OTel.initializeTracing()은 TRACEPARENT가 있을 때만 추적을 초기화합니다. OTEL_EXPORTER_OTLP_TRACES_ENDPOINT가 있으면 해당 주소를 exporter에 사용합니다. Root.startCommandSpan()은 명령 이름과 명령행 인자를 span에 넣고, Sources/tart/VMDirectory+OCI.swift는 압축 디스크 바이트 수를 기록합니다.

테스트에서는 “통과했다”의 범위를 봐야 합니다. LayerizerTests.testDiskV2()는 1 GiB 무작위 데이터를 push/pull한 뒤 해시를 비교합니다. 하지만 레지스트리를 준비할 수 없으면 XCTSkip으로 건너뜁니다. .github/workflows/ci.yml도 VM을 부팅하는 Python 테스트는 실행하지 않는다고 명시합니다.

좋은 테스트를 읽을 때는 무엇을 검증하는지와 어떤 조건에서 실행되지 않는지를 함께 확인해야 합니다.

미니 실습: CommandBehaviorTests.testClonePreservesIncompleteDestination()를 읽고 불완전한 목적지 디렉토리라도 자동 덮어쓰면 안 되는 이유를 설명하세요. “VM으로 인식되지 않는다”와 “지워도 되는 데이터다”는 같은 뜻이 아닙니다.

7하드웨어 / 시스템 요구사항

기본 실행 조건과 기능별 추가 조건을 분리해서 확인하기
항목조건 또는 권장 범위근거와 해석
주 사용 호스트Apple Silicon Mac, macOS 13 이상README와 Package.swift의 배포 대상
Intel Mac소스에 x86_64 빌드와 Linux VM 경로 존재Create.validate()는 Intel의 macOS VM 생성을 거절
이미지 아키텍처호스트와 일치해야 함VM.init()의 CurrentArchitecture() 비교
Linux 생성 기본값vCPU 4개, 메모리 4 GiBVM.linux()의 명시적 설정
macOS 생성값복원 이미지가 요구하는 최소 메모리, CPU는 최소 4개mostFeaturefulSupportedConfiguration에서 요구사항 획득
학습용 RAM 계획VM 한 대부터, 호스트는 16 GB 이상을 권장공식 최소값이 아닌 여유 용량을 위한 학습용 권장
디스크 여유이미지·캐시·복제본 증가분을 합산README 예제 다운로드 약 25 GB, 생성 디스크 기본값 50 GB
파일 시스템APFS에서 쓰기 시 복사 장점 활용Clone의 설명과 파일 복사 구현
개발 빌드macOS SDK와 적합한 Swift 도구 모음현재 GitHub CI 실행 환경 이름은 xcode-27

“Linux VM 지원”은 Linux 호스트에서 tart 실행 파일을 돌린다는 뜻이 아닙니다. 이 패키지의 호스트 대상은 macOS입니다. 문서가 언급하는 Linux 호스트용 Vetu는 별도 프로젝트입니다.

기능마다 올라가는 OS 문턱

기능추가 조건소스 위치
tart execmacOS 14 이상 + 실행 중인 게스트 에이전트Sources/tart/Commands/Exec.swift
일시 중단 명령macOS 14 이상에서 명령 등록, 구성의 저장·복원 지원도 필요Root.main(), Sources/tart/Commands/Run.swift
중첩 가상화macOS 15 이상, 런타임 지원 확인, Linux 게스트Run.validate(), Sources/tart/Platform/Darwin.swift
ASIF 파일 형식macOS 26 이상DiskImageFormat.isSupported
--net-hostmacOS 26 이상Run.userSpecifiedNetwork()
적층 디스크macOS 27 이상 + DiskImageKit을 가져올 수 있는 빌드DiskImageStack.isSupported

중첩 가상화는 VZGenericPlatformConfiguration.isNestedVirtualizationSupported를 검사합니다. 소스 오류 문구는 M3 이상을 안내하고, 저장소 FAQ는 M3·M4와 Linux 게스트를 명시합니다. 최종 가능 여부는 실제 호스트의 프레임워크 지원으로 판단해야 합니다.

문서와 구현의 차이
기본 CPU 2개라는 안내를 현재 생성 코드에 그대로 적용하지 마세요

docs/quick-start.md는 기본값을 CPU 2개·메모리 4 GB로 설명합니다. 하지만 현재 VM.linux()는 CPU 4개·4 GiB이고, macOS 생성 경로도 CPU를 최소 4개로 올립니다. 이미 만들어진 이미지는 저장된 설정을 복제하므로 그 이미지의 실제 설정을 확인해야 합니다.

운영 환경에서는 서명 권한과 Keychain도 요구사항의 일부입니다. Resources/tart-dev.entitlements에는 가상화 권한이, 배포용 파일에는 추가 네트워크 권한이 있습니다. 헤드리스 Mac의 Keychain 조건은 docs/faq.md의 설명을 함께 확인하세요.

8직접 해볼 수 있는 실습 과제

명령을 따라 치는 것에서, 동작을 예측하고 검증하는 것으로
과제 1 · 입문

clone 한 줄의 호출 경로 그리기 20~30분

Sources/tart/Root.swift → Sources/tart/Commands/Clone.swift → Sources/tart/VMStorageHelper.swift → Sources/tart/VMDirectory.swift → Sources/tart/VMStorageLocal.swift를 읽고, 로컬 VM을 복제하는 경우의 흐름을 여섯 칸 이내로 그리세요.

제출물: 입력 검증, 임시 저장, 잠금, 식별자 변경, 최종 배치 위치를 표시한 그림. 원격 이미지일 때만 추가되는 경로는 다른 색의 메모로 덧붙이세요.

완료 기준: “다운로드 없이도 clone이 가능한 이유”와 “왜 임시 디렉토리를 먼저 만드는가”를 설명할 수 있습니다.

과제 2 · 입문

기준 VM과 실습 VM을 구분하기 환경 준비 후 30분

요구사항을 만족하는 Mac과 설치된 배포판이 있다면, 기준 이미지를 복제하고 CPU·메모리 설정을 확인하세요. 아래 명령은 실행 순서를 보여 주는 예입니다. 다운로드 시간과 저장 공간을 먼저 계획하세요.

tart clone ghcr.io/cirruslabs/macos-tahoe-base:latest study-base
tart clone study-base study-work
tart get study-work
tart set study-work --cpu 4 --memory 4096
tart run study-work

제출물: 두 VM의 이름·CPU·메모리·디스크 설정 표. 실제 디스크 점유량이 가상 디스크 용량과 다른 이유도 한 문장으로 적으세요.

완료 기준: get으로 확인한 값과 VMConfig 필드를 연결할 수 있습니다. 실습 이름이 이미 있다면 다른 이름을 쓰고, 덮어쓰기 옵션을 습관적으로 붙이지 마세요.

과제 3 · 중급

VM 파일 배치 판정기 설계하기 45~60분

VMDirectory.layout을 읽고 파일 존재 여부만 입력으로 받는 판정 함수를 별도 연습 프로젝트에 설계하세요. 가상머신을 부팅할 필요는 없습니다. Tests/TartTests/VMDirectoryLayoutTests.swift를 참고하세요.

# 손으로 먼저 풀어 볼 입력 표
config + nvram + disk                    : standalone
config + nvram + manifest + overlay      : stackedLocal
config + nvram + manifest                : stackedOCIRecord
config + nvram + disk + manifest + overlay : 유효하지 않음

제출물: 정상 사례 세 개와 모호한 사례 두 개의 기대 결과. VM 디렉토리에 설정·NVRAM·manifest만 있는 적층 OCI 캐시가 곧바로 실행 가능한 VM은 아닌 이유를 적으세요.

완료 기준: “캐시로 유효함”과 “로컬 실행 가능함”을 서로 다른 조건으로 표현합니다.

과제 4 · 중급

청크 전송 스케줄러를 작은 데이터로 재현하기 1~2시간

별도 연습 코드에서 청크 다섯 개에 서로 다른 지연 시간을 주고 동시성 한도를 2로 설정하세요. DiskV2.push()처럼 원래 인덱스를 결과에 붙이고, 끝난 뒤 인덱스로 정렬합니다. 실제 레지스트리나 VM 디스크는 사용하지 않아도 됩니다.

제출물: 제출 순서·완료 순서·최종 정렬 순서와 최대 실행 중 작업 수. 일부 작업을 의도적으로 실패시켰을 때 전체 호출이 어떻게 끝나야 하는지도 정하세요.

완료 기준: 완료 순서가 뒤섞여도 결과는 원래 순서이고, 실행 중 작업 수가 2를 넘지 않습니다. 전체 작업을 미리 모두 만든 뒤 마지막에 기다리는 구현과 차이를 설명할 수 있습니다.

과제 5 · 고급

데이터를 지키는 실패 시나리오 리뷰하기 2~3시간

CommandBehaviorTests의 목적지 보존 테스트와 ContentStore.install()을 읽으세요. “기존 목적지 있음”, “해시 불일치”, “다른 프로세스가 같은 내용을 저장 중” 세 상황의 기대 결과를 설계합니다.

제출물: 각 상황의 시작 상태, 실패 지점, 남아야 할 파일, 사용자 오류 메시지를 정리한 리뷰 문서. 테스트가 통과해도 증명하지 못하는 조건도 하나씩 쓰세요.

완료 기준: 성공한 파일만 최종 이름으로 발행하고, 기존 데이터와 사용 중인 공유 디스크를 보존하는 규칙을 설명합니다. 적층 디스크 실동작 검증은 macOS 27·DiskImageKit 조건을 갖춘 별도 환경이 필요합니다.

학습의 중심

실습 1·3·5는 소스와 상태표만으로도 진행할 수 있습니다. 하드웨어가 없어도 “입력 → 상태 변화 → 실패 시 보존할 것”을 정리하면 시스템 설계 연습이 됩니다.

9관련 기술 심화 학습 로드맵

6주 동안 작은 모델에서 시스템 경계로 넓혀 가기

Swift를 처음 접한다면 문법을 완벽히 끝낸 뒤 읽겠다고 미루기보다, 작게 이해할 수 있는 타입부터 시작하세요. 매주 소스 한 부분을 읽고, 그 동작을 작은 표나 연습 코드로 다시 표현하면 이해를 확인할 수 있습니다.

주차배울 기술과 읽을 소스확인 가능한 결과물
1주차Swift의 struct·enum·Optional·throws. VMDirectory.Layout, DiskImageFormatVM 배치 상태표와 잘못된 조합의 설명
2주차ArgumentParser·프로퍼티 래퍼·Codable. Create, Set, VMConfig입력·검증 오류 표와 이전 설정 호환성 규칙
3주차프로토콜·전략·구성 조립. Platform, Network, VM.craftConfiguration()macOS와 Linux의 공통 장치·서로 다른 장치 비교
4주차async/await·actor·task group·취소. DiskV2, AuthenticationKeeper동시성 2 스케줄러와 실패·취소 시나리오
5주차OCI·HTTP 인증·LZ4·내용 해시. OCIManifest, Registry, ContentStoremanifest → 청크 → 복원 파일의 관계도
6주차POSIX 잠금·테스트·추적·배포. PIDLock, OTel, CI 설정동시 실행 실패 사례와 빌드·서명·공증 흐름 문서

단계별로 던질 질문

그다음 확장은 관심에 따라 나누면 됩니다. 화면 개발이 궁금하면 VMView와 SwiftUI·AppKit 연결을, 인프라가 궁금하면 OCI 배포와 Orchard 문서를, 시스템 프로그래밍이 궁금하면 파일 잠금·희소 파일·VirtIO 소켓을 더 읽으세요. ANTLR 생성 코드는 손으로 전부 따라 읽기보다 Sources/tart/OCI/Reference/Reference.g4의 14줄 문법에서 시작하는 편이 효과적입니다.

10핵심 키워드 사전

본문을 읽다가 막히면 돌아올 수 있는 짧은 설명
용어쉬운 설명
호스트 / 게스트실제 컴퓨터의 운영체제 / VM 안의 운영체제.
VM / 가상화컴퓨터 자원을 나눠 가상의 컴퓨터를 구성하고 운영체제를 실행하는 방식.
vCPU게스트에 보이는 가상 CPU. 물리 코어를 새로 만드는 것이 아니라 호스트 계산 자원을 사용합니다.
VirtualizationApple이 제공하는 VM 구성·실행 프레임워크. tart가 가상 하드웨어를 조립할 때 사용합니다.
CI코드 변경 때 빌드·테스트 등을 자동으로 수행하는 절차. 반복 가능한 실행 환경이 중요합니다.
이미지 / 복제본준비된 VM의 저장 형태 / 그 환경을 바탕으로 만든 개별 작업용 VM.
OCI / 레지스트리이미지 배포 형식·통신 생태계 / 이미지 목록과 내용 파일을 보관하는 서버.
manifest이미지를 이루는 설정과 레이어의 종류·크기·digest를 모은 목록.
blob / layer내용이 담긴 바이트 묶음 / manifest가 가리키는 구성 조각. tart에서는 디스크 청크 등입니다.
tag / digestlatest 같은 변경 가능한 이름 / 내용으로 계산한 식별자. tag가 같아도 내용은 바뀔 수 있습니다.
SHA-256바이트 내용에서 일정 길이의 지문을 계산하는 해시 알고리즘. 암호화와는 역할이 다릅니다.
LZ4tart의 디스크 청크 전송에서 쓰는 압축 방식. 전송량과 압축·복원 비용을 함께 고려합니다.
APFS / 쓰기 시 복사Apple 파일 시스템 / 처음에는 데이터를 공유하다 변경된 부분에 새 공간을 사용하는 방식.
희소 파일논리적으로 큰 파일이라도 비어 있는 구간은 물리 공간을 적게 차지하도록 표현한 파일.
ASIFApple Sparse Image Format. 현재 소스에서 기본 RAW와 구분되는 디스크 형식입니다.
overlay / 적층 디스크기준 디스크 위에 변경분을 기록하는 계층 / 기준과 계층들을 합쳐 보는 가상 디스크.
NVRAM / IPSWVM 부팅 등에 필요한 비휘발성 상태 / macOS 복원·설치에 쓰는 이미지 파일.
VirtIO게스트와 가상 장치가 효율적으로 통신하도록 정한 인터페이스 계열.
NAT / 브리지호스트 쪽 주소 변환을 거쳐 통신 / VM을 선택한 네트워크 인터페이스에 연결하는 방식.
DHCP / ARPIP 주소 할당을 다루는 프로토콜 / 같은 네트워크에서 IP와 링크 계층 주소를 연결하는 프로토콜.
Unix 소켓 / gRPC로컬 프로세스의 통신 창구 / 구조화된 원격 호출과 스트림 통신을 제공하는 체계.
actor / task group공유 상태 접근을 격리하는 Swift 타입 / 여러 비동기 자식 작업을 묶어 수명과 결과를 관리하는 구조.
파일 잠금다른 프로세스가 같은 자원을 동시에 바꾸지 못하게 조율하는 운영체제 기능.
span / OpenTelemetry한 작업 구간의 추적 기록 / 이런 기록을 수집·전송하는 공통 체계.
entitlements / 공증앱에 부여할 권한 선언 / Apple의 배포 검사를 거치는 절차. 컴파일 성공과는 별개입니다.

11참고 링크

제품 문서, 소스 근거, 기반 기술을 연결해서 읽기

공식 저장소와 사용 문서

소스 분석에 직접 연결되는 링크

관련 기술의 공식 자료

현재 상태 (2026-10-23 확인)

항목상태와 출처
선정 기준GitHub Trending Swift Monthly #1, 2026-10-23 분석
스타 / 포크7,631 / 411 — 2026-10-23 GitHub 기준
주 언어Swift — GitHub 기준
생성일2022-02-01 — GitHub 기준
최근 push2026-10-23 — GitHub 기준
최신 릴리스2.41.1, 2026-10-15 — GitHub 기준
분석 커밋95a0dac, 2026-10-23 15:25:17 KST — 브리지 오류에 일치하지 않은 이름 표시, #1385
코드 규모Swift 18,827줄 / Go 1,455줄 / Python 305줄. 빈 줄·주석 포함, 세부 범위는 5절
추적 파일 수296개 — 분석 커밋의 Git 추적 파일 기준
테스트Swift 34개 파일·4,486줄, 별도 Python·Go 통합 테스트. 실행 커버리지 수치와는 다름
라이선스 표시GitHub API: NOASSERTION. 실제 LICENSE: FSL-1.1-ALv2
버전 구분본문의 구현 분석은 95a0dac 기준. 릴리스 2.41.1의 기능 전체와 동일하다고 전제하지 않음

커밋 시각은 한국 표준시 기준입니다. 같은 순간이 커미터의 -07:00 시간대에서는 2026-10-22로 보입니다. 날짜만 비교하기보다 시간대까지 확인해야 합니다.

소스에서 보이는 기능, 릴리스에 포함된 기능, 내 컴퓨터에서 사용할 수 있는 기능은 각각 확인해야 합니다.

쓰기 전에 알아둘 한계
공개된 소스와 간단한 명령만으로 운영 조건이 모두 해결되지는 않습니다

버전과 검증 범위: HEAD에는 macOS 27·DiskImageKit 조건부 코드가 있습니다. 존재하는 코드가 곧 모든 배포판에서 사용 가능한 기능이라는 뜻은 아닙니다. 동작 설명은 소스와 설정에 근거하며, 이 글은 실기 실행 성공이나 전체 성능을 보증하지 않습니다.

재현성과 캐시: latest는 바뀔 수 있습니다. Clone.run()은 사용 가능한 캐시가 있으면 원격 manifest 확인 없이 재사용할 수 있으므로, “clone을 다시 하면 최신 이미지가 된다”고 가정하지 마세요. CI에서는 고정된 digest와 이미지 갱신 절차를 함께 관리해야 합니다.

자원과 접근 범위: CPU·RAM·디스크는 호스트 자원입니다. 공개 이미지의 기본 계정은 문서 기준 admin / admin이고, 공유 폴더는 지정 방식에 따라 게스트에서 쓰기가 가능합니다. 외부에 노출하거나 실제 자료를 연결하기 전에 계정·공유 범위·네트워크 모드를 환경에 맞게 설정하세요.

라이선스: NOASSERTION은 라이선스가 없다는 뜻이 아닙니다. 실제 FSL 본문은 내부 사용·비상업 교육·비상업 연구 등을 허용 목적으로 명시하고, 상업적 경쟁 사용을 제한합니다. 각 버전 공개일의 두 번째 기념일부터 Apache-2.0이 적용되는 미래 라이선스 조항도 있습니다. 프로젝트 생성일을 기준으로 모든 최신 코드가 이미 Apache-2.0이라고 판단하면 안 됩니다.

측정과 테스트: README의 성능 표현은 특정 환경의 기록과 구분해서 읽으세요. 레지스트리 준비 실패로 건너뛰는 테스트와 VM 부팅이 제외된 CI 경로가 있으므로, 필요한 호스트·게스트·네트워크 조합은 해당 환경에서 별도 검증해야 합니다.