Every package is already installed
모든 패키지가 이미 설치되어 있다
omnibin은 Nixpkgs의 바이너리를 FUSE 파일시스템으로 노출하고, 실제 파일을 읽을 때만 Nix 캐시에서 내려받습니다. 88만 개가 넘는 바이너리를 설치 과정 없이 쓸 수 있으며, 첫 실행 때 다운로드와 압축 해제가 발생합니다.
- 주제
AI 요약
omnibin은 Nixpkgs가 빌드한 바이너리를 하나의 FUSE 파일시스템에 모아 PATH에서 바로 찾게 합니다. 패키지를 미리 설치하거나 빌드할 필요는 없습니다. 파일 목록과 색인은 미리 준비하고, 실제 파일을 읽을 때만 필요한 NAR 아카이브를 Nix 캐시에서 가져와 풉니다. 저자는 이 방식으로 “왜 패키지를 하나씩 골라 설치해야 하느냐”는 질문을 던집니다.
무엇이 보이나요
nix run github:fzakaria/omnibin을 실행하면 /run/user/1000/omnibin에 파일시스템을 마운트하고 캐시를 설정합니다. /omnibin/bin에는 최신 버전을 기준으로 5만 1,468개 이름이 보입니다. 버전을 붙인 이름도 쓸 수 있어 python3는 최신 Python 3.14.6을 가리키고, [email protected]는 2017년 버전을 실행합니다. 전체 트리에는 88만 1,933개 바이너리가 있지만, 오래된 버전까지 모두 목록에 늘어놓지는 않습니다.
Docker에서도 fmzakari/omnibin:latest 이미지를 베이스로 삼으면 Python, jq, GCC 같은 도구를 필요할 때 불러올 수 있습니다. NixOS에서는 모듈을 가져와 services.omnibin.enable = true;로 활성화합니다. 따라서 환경 설정에 패키지를 하나씩 적는 대신, 실행 시점에 원하는 바이너리를 찾는 방식입니다.
파일 목록을 미리 만드는 방법
Nix 캐시인 cache.nixos.org에는 각 narinfo 옆에 아카이브 내용을 설명하는 .ls 파일이 있습니다. JSON 형식의 이 메타데이터에는 디렉터리 항목과 파일 종류, 실행 가능 여부 등이 담깁니다. omnibin은 이를 색인으로 활용해 파일을 실제로 내려받지 않고도 디렉터리 조회에 답합니다. 저자는 .ls 파일 전체를 12분도 안 되어 수집했다고 설명합니다.
또 다른 구성 요소는 nixpkgs-multiverse입니다. 이 프로젝트는 Nixpkgs의 과거 버전에서 (속성, 버전)에 해당하는 저장소 경로를 찾습니다. 두 색인을 결합하면 [email protected]에 맞는 Nix 저장 경로를 알아내고, 실행할 때 그 패키지만 캐시에서 가져올 수 있습니다. 예시에서는 CPython 3.6.2가 들어 있는 디렉터리를 ls로 확인해도 다운로드가 일어나지 않습니다.
대규모 트리와 첫 실행 비용
88만 개 항목을 전부 나열하거나 각각 stat하면 탐색이 느려집니다. 그래서 /omnibin/bin에는 실행 파일마다 최신 버전 이름 하나만 노출하고, 버전 지정 경로는 목록에 나타내지 않습니다. 전체 버전은 /omnibin/index.db의 SQLite 색인에서 검색하거나 omnibin which --all python3 같은 CLI 명령으로 조회합니다. 탐색 도구가 파일시스템 전체를 훑지 않도록 /omnibin/README.md도 데이터베이스를 조회하라고 안내합니다.
비용은 처음 파일에 접근할 때 발생합니다. 저자가 측정한 Python 3.6.2의 첫 실행은 NAR 다운로드와 압축 해제에 2.7초가 걸렸고, 저장 경로가 준비된 뒤 두 번째 실행은 0.035초였습니다. 오래 실행하는 시스템이라면 자주 쓰는 패키지가 이미 캐시에 쌓이므로 첫 접근 지연이 줄어든다는 설명입니다. 이 도구는 Nix의 저장소와 캐시를 바탕으로 패키지 선택과 사전 설치를 생략하는 실험입니다.
원문: fzakaria.com / 번역·요약: Trawling