Compo 업데이트 및 구현 내용: Ruby 프로젝트의 원 바이너리화

[JA] The Ruby One-Binary Tool, Enhanced with Kompo / ahogappa @ahogappa

작성자
RubyKaigi
발행일
2025년 05월 27일

핵심 요약

  • 1 Compo는 Ruby 프로젝트를 단일 실행 파일(원 바이너리)로 만들어 추가 설치 없이 어디서든 빠르게 실행 가능하게 하는 도구입니다.
  • 2 이전 버전의 `require` 오버라이딩 방식은 `autoload` 및 파일 접근 제한 등의 문제로 Rails와 같은 대규모 프로젝트에 적용할 수 없었습니다.
  • 3 가상 파일 시스템(VFS) 구축과 `dlsym`을 활용한 `libc` 함수 랩핑을 통해 `Rails` 프로젝트의 원 바이너리화에 성공했으며, 향후 Gem화 및 크로스 플랫폼 지원을 목표로 합니다.

도입

본 발표는 Ruby 프로젝트를 단일 실행 파일(원 바이너리)로 변환하는 도구인 Compo의 최신 업데이트와 그 구현 내용을 다룹니다. 발표자는 RubyKaigi 2024에서 Compo를 처음 소개한 이래로, Ruby 프로젝트 배포 시 버전 불일치 문제, 복잡한 환경 설정 및 설치 과정의 어려움을 해결하고자 원 바이너리화의 필요성을 강조해왔습니다. 특히 Ruby 기반 게임 엔진 개발 경험을 통해 기존 원 바이너리 도구들의 한계를 인식하고, '어디서든 쉽고 빠르게 작동하는' Compo를 개발하게 된 배경을 설명합니다.

이전 Compo의 한계점 및 문제 해결

이전 Compo는 require 메서드를 오버라이딩하여 Ruby 스크립트와 확장 라이브러리를 단일 실행 파일에 결합하는 방식을 사용했으나, 다음과 같은 주요 문제에 직면했습니다. * autoload 충돌: require 오버라이딩 시 autoload가 내부적으로 require를 호출할 때 상수가 초기화되지 않아 대규모 프로젝트에서 예외를 발생시켰습니다. * 파일 접근 제한: 내장된 파일 데이터 접근이 require로만 제한되어 File.read 등 일반적인 파일 I/O 함수로는 리소스(설정 파일, 이미지 등)를 읽을 수 없었습니다. * 디렉터리 구조 미지원: 파일 단위 관리만 가능하여 디렉터리 순회 등 일반적인 파일 시스템 활용 패턴을 지원할 수 없었습니다.

새로운 Compo의 구현 전략

이러한 문제를 해결하기 위해 Compo는 두 가지 핵심 전략을 도입했습니다.

  1. 가상 파일 시스템 (Virtual File System, VFS) 구축:
    • 단일 바이너리 내부에 계층적 파일 및 디렉터리 구조를 표현하는 읽기 전용 VFS를 자체 구현했습니다.
    • 이를 통해 Ruby 스크립트 외 모든 종류의 리소스를 바이너리 내부에 포함하고 관리할 수 있게 되었습니다.
  2. libc 함수 랩핑을 통한 I/O 경로 스위칭:
    • Ruby가 read와 같은 libc의 파일 I/O 함수를 호출할 때, 실제 파일 시스템과 가상 파일 시스템 중 어느 곳에서 데이터를 읽을지 동적으로 선택하는 랩핑 계층을 도입했습니다.
    • dlsym(RTLD_NEXT, "read")를 활용하여 libc의 원본 함수 주소를 획득하고, Compo의 랩핑 함수 내에서 파일 경로(절대/상대) 및 Dir.chdir에 따른 현재 디렉터리 변경을 고려하여 적절한 I/O 소스로 요청을 전환합니다.

Rails 프로젝트 원 바이너리화 시연

발표에서는 Ruby가 설치되지 않은 Docker 환경에서 단일 Compo 실행 파일이 완전한 Rails 애플리케이션을 성공적으로 구동하고, 데이터베이스 연동까지 수행하는 모습을 시연하여 새로운 구현 방식의 성공을 입증했습니다.

결론

Compo는 `require` 오버라이딩의 한계를 극복하고 가상 파일 시스템 및 `libc` 함수 랩핑이라는 새로운 접근 방식을 통해 Rails와 같은 복잡한 Ruby 프로젝트도 원 바이너리화할 수 있는 강력한 도구로 발전했습니다. 이로써 Ruby 프로젝트 배포의 진입 장벽을 낮추고, 개발자에게 더욱 유연한 배포 옵션을 제공할 수 있게 되었습니다. 향후 Compo는 Gem화 작업을 통해 사용 편의성을 높이고, 크로스 플랫폼 지원을 확장하여 더 넓은 활용도를 목표로 하고 있습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!