개요

NixOSNix 패키지 관리자 기반의 함수형·선언적 Linux 배포판. 시스템 전체를 코드로 정의하고, 언제든 결정적·재현 가능한 상태로 복원·롤백 가능. 일반 OS가 시간이 지나면서 불안정해지는 것과 달리, 상태를 정의하고 빌드할 수 있는 게 핵심.

  • 공식 사이트: https://nixos.org
  • 핵심: Nix DSL로 OS 전체를 함수형으로 기술
  • 출처 영감: birkey.co (NixOS를 사랑하는 이유)

핵심 철학

일반 OS:
  시간 경과 → 패키지 누적·설정 드리프트 → 불안정한 상태
  롤백? 어려움
  재현? 거의 불가능

NixOS:
  configuration.nix (선언적 정의)
    ↓ nixos-rebuild
  결정적 시스템 상태 (롤백·재현 가능)
  • 함수형 패키지 관리: 동일 입력 → 항상 동일 출력
  • 선언적: “어떻게(how)“가 아닌 “무엇을(what)”
  • 불변성: 패키지는 /nix/store/에 해시 기반 경로로 격리 저장
  • 롤백: 이전 generation으로 즉시 복귀

단일 소스 시스템 정의

# configuration.nix 예시
{ config, pkgs, ... }:
{
  # 호스트명·시간대
  networking.hostName = "my-laptop";
  time.timeZone = "Asia/Seoul";
 
  # 데스크탑 환경
  services.xserver.enable = true;
  services.xserver.desktopManager.gnome.enable = true;
 
  # 키보드 매핑
  services.xserver.layout = "us";
  services.xserver.xkbOptions = "ctrl:nocaps";
 
  # 시스템 패키지
  environment.systemPackages = with pkgs; [
    git
    vim
    firefox
    docker
    nodejs_20
  ];
 
  # 사용자
  users.users.bigstones = {
    isNormalUser = true;
    extraGroups = [ "wheel" "docker" ];
    shell = pkgs.zsh;
  };
 
  # 시스템 버전 (변경 금지)
  system.stateVersion = "24.11";
}

→ 새 PC에서도 이 한 파일로 완전히 동일한 시스템 재구축


주요 명령어

# 시스템 재빌드
sudo nixos-rebuild switch              # 즉시 적용
sudo nixos-rebuild boot                # 재부팅 후 적용
sudo nixos-rebuild test                # 임시 테스트 (재부팅 시 원복)
 
# 롤백
sudo nixos-rebuild switch --rollback   # 직전 상태로
sudo nix-env --list-generations        # 이전 generation 목록
 
# 패키지 검색
nix search nixpkgs firefox
 
# 임시 패키지 실행 (시스템 미설치)
nix-shell -p python3 nodejs
 
# 채널 업데이트
sudo nix-channel --update

안정성·업데이트

채널특징
stable6개월 주기 릴리스 (24.05, 24.11, 25.05, …)
unstable최신 패키지 (rolling release)
혼합stable 기본 + 일부만 unstable로 핀
  • 일반 OS 업그레이드의 불안정성·드리프트 최소화
  • HP 노트북 등 하드웨어 호환성 우수

격리된 개발 환경 (nix-shell / nix develop)

# 시스템에 설치하지 않고 임시 환경에서 사용
nix-shell -p rustc cargo
 
# 종료 시 환경 사라짐, 시스템 오염 ❌

flake.nix (재현 가능 프로젝트 환경)

{
  description = "Rust 음성-텍스트 에이전트";
 
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
 
  outputs = { self, nixpkgs }:
    let
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};
    in {
      devShells.${system}.default = pkgs.mkShell {
        buildInputs = with pkgs; [
          rustc
          cargo
          openssl
          pkg-config
        ];
      };
    };
}
nix develop      # flake 기반 개발 환경 진입
nix flake check  # 재현 가능성 검증

~/.cargo, ~/.rustup, PATH 등 시스템 환경 변경 ❌


LLM 코딩 시대와의 궁합

LLM 코딩 도구 특성:
  - 특정 버전 유틸리티·컴파일러·런타임 자주 교체
  - 새 도구 빠르게 시도·폐기 반복
  - 환경 오염이 누적되기 쉬움

Nix의 답:
  - 도구를 "선언적 입력"으로 취급
  - 각 프로젝트마다 격리된 환경
  - flake.nix로 임시 세션을 재현 가능 아티팩트로 고정
  • LLM 에이전트가 빌드한 환경을 그대로 동료에게 공유 가능
  • 실험 결과를 검증 가능한 빌드 단위로 보존

배포: Nix vs Docker

항목DockerNix
결정성Dockerfile 빌드마다 다를 수 있음동일 입력 → 항상 동일 출력
레이어순차적, 캐싱 한계콘텐츠 주소 기반 자동 공유
이미지 크기일반적으로 큼dockerTools.buildLayeredImage로 최소화
재현성베이스 이미지·apt-get 시점 의존락파일로 완전 고정
개발-배포 일관성Dockerfile 따로 관리동일 Nix 정의가 개발·CI·배포에 통용
# Nix로 Docker 이미지 빌드 예시
{ pkgs ? import <nixpkgs> {} }:
pkgs.dockerTools.buildLayeredImage {
  name = "my-app";
  tag = "latest";
  contents = [ pkgs.nodejs_20 pkgs.git ];
  config = {
    Cmd = [ "node" "/app/index.js" ];
    WorkingDir = "/app";
  };
}

크로스 플랫폼

  • Nix on macOS: 동일 패키지 관리자 사용 가능 (nix-darwin으로 시스템 관리도)
  • Nix on Linux (배포판): Ubuntu, Arch 등에 Nix만 설치해 사용 가능
  • NixOS: 전체 OS가 Nix 기반
  • FreeBSD: 커뮤니티 지원 존재

→ macOS·Linux 간 개발 환경 완전 일관성


NixOS의 단점·진입 장벽

✗ Nix DSL 학습 곡선 가파름 (함수형 + 도메인 특화)
✗ 에러 메시지 난해
✗ 일부 상용 소프트웨어 패키징 어려움 (예: Steam, 일부 게임)
✗ 비표준 디렉토리 구조 (FHS 미준수) → 일부 binary 직접 실행 안 됨
  → buildFHSUserEnv로 우회
✗ 문서가 흩어져 있음
✗ 처음엔 모든 게 어려움

누구에게 적합한가?

적합부적합
환경 재현·롤백 가치 인정”그냥 잘 작동하면 돼” 사용자
함수형 사고 익숙명령형 스크립트 선호
다중 PC·서버 동기화단일 PC 라이트 유저
개발자·DevOps일반 데스크탑 사용자
LLM 도구 자주 교체안정된 도구셋 사용

결론

“NixOS는 선언적, 재현 가능, 되돌릴 수 있고 안정적인 시스템의 구현체. 실험과 업그레이드를 두려움 없이 수행할 수 있고, 빠르게 변화하는 LLM 코딩 도구 환경에서도 시스템을 오염시키지 않는다.”

한 사고방식으로 노트북부터 셸·프로젝트 의존성·CI 파이프라인·배포 아티팩트까지 일관되게 관리하는 게 NixOS의 진짜 가치.


관련 항목