개요
NixOS는 Nix 패키지 관리자 기반의 함수형·선언적 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안정성·업데이트
| 채널 | 특징 |
|---|---|
| stable | 6개월 주기 릴리스 (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
| 항목 | Docker | Nix |
|---|---|---|
| 결정성 | 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의 진짜 가치.