Nix/NixOS Reference
Nix 패키지 매니저, Flake, NixOS 모듈 빠른 참조
Nix/NixOS Reference 소개
Nix / NixOS 레퍼런스는 재현 가능한 빌드와 개발 환경을 위한 권장 워크플로가 된 Flake 중심의 현대적인 Nix 생태계를 다룹니다. CLI 섹션은 핵심 nix 명령어를 문서화합니다: 플레이크 출력에서 패키지를 컴파일하는 nix build, 재현 가능한 개발 셸에 진입하는 nix develop, 설치 없이 패키지를 실행하는 nix run, 임시로 PATH에 패키지를 추가하는 nix shell, 사용자 수준 패키지 관리를 위한 nix profile install, nixpkgs 검색을 위한 nix search가 있습니다. 이 명령어들은 구식 nix-env, nix-build, nix-shell 워크플로를 대체합니다.
Flake 섹션은 inputs와 outputs를 가진 flake.nix 구조, nixos-unstable 같은 특정 채널로 nixpkgs를 고정하는 방법, 여러 시스템 아키텍처를 위한 패키지와 devShell 정의 방법을 설명합니다. nix flake update와 nix flake lock은 모든 의존성을 정확한 커밋 해시로 고정해 비트 단위로 완벽한 재현성을 보장하는 flake.lock 파일 관리를 문서화합니다. 패키지 섹션은 소스에서 빌드하는 stdenv.mkDerivation, 런타임 의존성을 위한 buildInputs, cmake·pkg-config 같은 빌드 시간 호스트 도구를 위한 nativeBuildInputs, 기존 패키지 커스터마이징을 위한 override/overlay를 다룹니다.
NixOS 시스템 관리와 Home Manager가 레퍼런스를 완성합니다. nixos-rebuild 명령어(switch, test, boot)는 롤백 지원과 함께 시스템 설정 변경을 원자적으로 적용하는 방법을 설명합니다. configuration.nix 섹션은 서비스 활성화, environment.systemPackages를 이용한 시스템 패키지 선언, 방화벽 포트 선언적 개방 방법을 보여줍니다. Home Manager 항목은 zsh, git, tmux, starship 같은 사용자 dotfile과 프로그램을 재현 가능하고 버전 관리되는 방식으로 관리하는 방법을 보여줍니다. 이 레퍼런스는 선언적 인프라를 도입하는 시스템 엔지니어, Nix 애호가, 재현 가능한 CI 파이프라인을 구축하는 개발자가 사용합니다.
주요 기능
- 핵심 Nix CLI — nix build, nix develop, nix run, nix shell, nix profile install, nix search
- flake.nix 구조 — inputs, outputs, nixpkgs 채널 고정, 멀티 아키텍처 devShell
- nix flake update와 nix flake lock으로 재현 가능한 의존성 고정
- buildInputs와 nativeBuildInputs를 포함한 stdenv.mkDerivation 패키지 빌드 예제
- nixpkgs 파생물 커스터마이징을 위한 패키지 override와 overlay
- 선언적 configuration.nix 예제와 함께 nixos-rebuild switch/test
- configuration.nix에서 서비스 활성화와 방화벽 설정 선언
- zsh, git, tmux, starship 등을 위한 Home Manager programs.* 선언
자주 묻는 질문
Nix란 무엇이고 다른 패키지 매니저와 어떻게 다른가요?
Nix는 모든 입력의 암호화 해시를 기반으로 /nix/store 아래의 불변 경로에 패키지를 저장하는 순수 함수형 패키지 매니저입니다. 같은 패키지의 여러 버전이 공존할 수 있고, 설치는 원자적이며 롤백이 가능하고, 빌드는 머신 간에 재현 가능합니다. apt나 brew와 달리 Nix는 공유 라이브러리 디렉토리를 변경하지 않으므로 한 패키지를 설치하거나 업그레이드해도 다른 패키지가 망가지지 않습니다.
Nix Flake란 무엇이고 왜 사용해야 하나요?
Flake는 Nix 프로젝트를 구성하는 현대적 표준입니다. flake.nix 파일은 inputs(nixpkgs 같은 다른 플레이크)와 outputs(패키지, 개발 셸, NixOS 설정)를 선언합니다. 함께 생성되는 flake.lock 파일은 모든 입력을 정확한 git 커밋 해시로 고정해 다른 머신과 다른 시간에도 빌드가 완벽하게 재현됩니다. Flake는 표준 출력 스키마를 강제해 nix run github:user/repo로 서드파티 저장소의 패키지를 쉽게 사용할 수 있습니다.
buildInputs와 nativeBuildInputs의 차이는 무엇인가요?
buildInputs는 파생물이 대상 플랫폼에서 런타임에 필요한 패키지를 나열합니다 — 예를 들어 컴파일된 바이너리가 링크할 openssl 같은 공유 라이브러리입니다. nativeBuildInputs는 빌드 과정 중 호스트에서 실행되는 도구를 나열합니다 — cmake, pkg-config, 코드 생성기 등입니다. 이 구분은 크로스 컴파일에서 중요합니다: 네이티브 도구는 빌드 머신에서 실행되어야 하고, 일반 입력은 대상 아키텍처용으로 컴파일되어야 합니다.
nixos-rebuild switch는 어떻게 동작하나요?
nixos-rebuild switch는 /etc/nixos/configuration.nix(또는 플레이크)를 읽고, 새 시스템 설정을 파생물로 빌드하고, 심볼릭 링크를 전환해 즉시 활성화하고, 부트 항목으로 등록합니다. 이전 설정은 롤백을 위해 남아 있습니다. nixos-rebuild test는 기본 부트 항목으로 만들지 않고 설정을 활성화합니다 — 변경사항을 확정하기 전에 테스트할 때 유용합니다. 모든 변경은 원자적입니다: 새 설정 전체가 적용되거나 시스템이 그대로 유지됩니다.
Home Manager란 무엇이고 NixOS와 어떤 관계인가요?
Home Manager는 사용자 수준 설정 파일과 패키지를 선언적으로 관리하는 Nix 기반 도구입니다. NixOS가 configuration.nix로 시스템 전체 서비스와 패키지를 관리하는 반면, Home Manager는 사용자별 프로그램, dotfile, 셸 설정을 다룹니다. NixOS 모듈로 사용하거나, NixOS가 아닌 Linux의 독립형 도구로 사용하거나, macOS에서도 사용할 수 있습니다. zsh, git, tmux, neovim 같은 프로그램은 원시 dotfile 대신 구조화된 옵션을 가진 전용 Home Manager 모듈을 가지고 있습니다.
Nix Flake로 재현 가능한 개발 환경을 만드는 방법은?
flake.nix에서 packages 목록과 함께 pkgs.mkShell을 사용해 devShells.${system}.default 출력을 정의합니다. nix develop을 실행하면 시스템 전체 설치와 관계없이 정확히 그 도구들을 사용할 수 있는 셸에 진입합니다. flake.lock은 모든 팀원과 모든 CI 실행이 동일한 도구 버전을 얻도록 보장합니다. direnv와 nix-direnv를 사용하면 프로젝트 디렉토리로 cd할 때 개발 셸이 자동으로 활성화됩니다.
Nix overlay는 어떻게 동작하나요?
Overlay는 최종 패키지 셋과 이전 패키지 셋을 받아 재정의나 추가의 속성 셋을 반환하는 함수입니다. nixpkgs를 import할 때 overlays 인수로 전달해 추가합니다. 패치된 버전으로 패키지를 교체하거나, nixpkgs에 없는 새 패키지를 추가하거나, 버전이나 빌드 플래그 같은 패키지 속성을 전역으로 수정할 수 있습니다. 각 overlay가 이전 모든 overlay의 결과를 볼 수 있으므로 깔끔하게 합성됩니다.
macOS에서도 Nix를 사용할 수 있나요?
네. Nix는 Determinate Systems 인스톨러나 공식 인스톨러로 macOS에 설치할 수 있습니다. Linux에서와 동일하게 nix develop, nix shell, nix run을 사용할 수 있습니다. Home Manager도 macOS에서 동작합니다. NixOS와 유사한 완전한 선언적 macOS 시스템 설정을 원한다면 nix-darwin이 macOS 시스템 환경 설정, Homebrew 패키지, launch daemon 관리를 위한 configuration.nix 스타일 모듈 시스템을 제공합니다.