Linux

NixOS — 처음 보는 사람용 정리

목차

요즘 NixOS 얘기가 자주 보여서 뭔지 정리했다. NixOS 를 VM 에 설치까지는 안 해봤다. 우분투 24.04 서버에 Nix 패키지 매니저만 깔고 NixOS 설정을 빌드하는데까지 해봤다. 버전은 NixOS 26.05, Nix 2.35.3 기준.

NixOS 가 뭔가

리눅스 배포판이다. Nix 라는 패키지 매니저 위에 만들어졌다.

보통 리눅스는 설치하고 나서 패키지 깔고, /etc 아래 설정 파일 고치고 하면서 서버를 만든다. NixOS 는 시스템 전체를 configuration.nix 파일 하나에 적어두고, 그 파일로 OS 를 빌드한다. 어떤 패키지가 깔려있고 어떤 서비스가 켜져 있는지 전부 이 파일에 있다.

  • Nix 는 2003년쯤 시작된 프로젝트. Eelco Dolstra 의 박사 논문이 출발점이다
  • 릴리즈는 1년에 두번, 5월하고 11월. 버전 이름이 연도.월 이다
  • 지금 최신은 26.05 “Yarara” (2026.5.30). 다음은 26.11 “Zokor”
  • 한 버전 지원 기간은 7개월. 26.05 는 2026.12.31 까지

Nix 패키지 매니저는 NixOS 가 아니어도 쓸 수 있다. 우분투, 맥에 Nix 만 깔아서 쓰는 사람도 많다.

기존 리눅스랑 다른 점

  • 패키지 위치: 우분투는 /usr/bin, /usr/lib. NixOS 는 /nix/store/<해시>-<이름>-<버전>
  • 설정: 우분투는 /etc 아래 파일을 직접 고친다. NixOS 는 configuration.nix 를 고치고 다시 빌드
  • 같은 패키지 여러 버전: 우분투는 어렵다. NixOS 는 그냥 같이 깔린다
  • 업데이트하다 망하면: 우분투는 백업에서 복구. NixOS 는 이전 세대로 롤백. 부팅 메뉴에서도 고를 수 있다
  • 서버 여러대 똑같이 맞추기: 우분투는 ansible 같은걸 쓴다. NixOS 는 같은 파일이면 같은 시스템이 나온다

아래는 하나씩 직접 해본 것.

설치

우분투에 Nix 만 깔았다. 보통은 아래처럼 데몬 모드로 깐다.

1
sh <(curl -L https://nixos.org/nix/install) --daemon

나는 root 로 컨테이너에서 해서 --no-daemon 으로 깔았다. root 로 하면 nixbld 그룹이 없다고 에러가 나서 /etc/nix/nix.conf 에 build-users-group = 을 넣고 다시 돌렸다.

nix run, nix shell 같은 새 명령어하고 flakes 는 아직 실험 기능이다. 설정에 켜줘야 한다.

1
2
# /etc/nix/nix.conf
experimental-features = nix-command flakes

안 켜면 이렇게 나온다.

1
error: experimental Nix feature 'nix-command' is disabled; add '--extra-experimental-features nix-command' to enable it

패키지는 /nix/store 에 들어간다

서버에 원래 깔려있던 python 은 3.11 이다. 여기에 3.12 랑 3.13 을 Nix 로 띄워봤다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ python3 --version
Python 3.11.15

$ nix shell nixpkgs/nixos-26.05#python312 -c python3 --version
Python 3.12.14
/nix/store/6jmqjw0f3s7kl7x4ps1abab1dpaxp3yj-python3-3.12.14/bin/python3.12

$ nix shell nixpkgs/nixos-26.05#python313 -c python3 --version
Python 3.13.15
/nix/store/jy00n3jp5xj8s40n1fbldmkcr5n7avxc-python3-3.13.15/bin/python3.13

$ python3 --version
Python 3.11.15
  • 버전마다 /nix/store 아래 다른 경로에 들어간다. 그래서 안 부딪힌다
  • 앞에 붙은 해시는 빌드에 들어간 재료(소스, 의존성, 옵션)로 만든다. 재료가 하나라도 다르면 경로가 달라진다
  • 원래 있던 3.11 은 그대로다

처음 받을때 python 3.12 는 의존성까지 23개, 74.7MB 를 받았다. 3.13 은 겹치는게 있어서 1개 54.1MB 만 받았다.

설치 안하고 잠깐 쓰기

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ nix shell nixpkgs/nixos-26.05#cowsay -c cowsay nix
 _____
< nix >
 -----
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

$ which cowsay
(없음)

한번 쓰고 끝이다. 시스템에 아무것도 안 남는다. 프로젝트마다 필요한 툴을 이렇게 띄우는게 편하다.

롤백

설치할때마다 “세대"가 하나씩 쌓인다. hello 깔고 jq 를 깔아봤다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ nix profile add nixpkgs/nixos-26.05#hello
$ nix profile add nixpkgs/nixos-26.05#jq
$ jq --version
jq-1.8.2

$ nix profile history
Version 1 (2026-10-21):
  nix: ∅ -> 2.35.3

Version 2 (2026-10-21) <- 1:
  flake:nixpkgs/nixos-26.05#legacyPackages.x86_64-linux.hello: ∅ -> 2.12.3

Version 3 (2026-10-21) <- 2:
  flake:nixpkgs/nixos-26.05#legacyPackages.x86_64-linux.jq: ∅ -> 1.8.2-bin, 1.8.2-man

한단계 되돌리기.

1
2
3
4
5
$ nix profile rollback
switching profile from version 3 to 2

$ jq --version
jq-1.7

Nix 로 깐 jq 1.8.2 가 빠지고 우분투에 원래 있던 jq 1.7 이 다시 잡혔다. 파일은 안 지워진다. /nix/store 에 그대로 있어서 다시 앞으로 가는것도 바로 된다.

1
2
3
4
5
$ nix profile rollback --to 3
switching profile from version 2 to 3

$ jq --version
jq-1.8.2

NixOS 에서는 이게 OS 전체 단위로 된다. 시스템을 바꿀때마다 세대가 생기고 부팅 메뉴에 남는다. 업데이트하고 부팅이 안 되면 부팅 메뉴에서 이전 세대를 고르면 된다고 한다. 이건 실제 NixOS 가 있어야 해서 안 해봤다.

시스템 전체를 파일 하나로

nginx, ssh 켜고 사용자 하나 만드는 설정이다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# configuration.nix
{ config, pkgs, ... }:

{
  boot.loader.grub.device = "/dev/sda";
  fileSystems."/" = { device = "/dev/sda1"; fsType = "ext4"; };

  networking.hostName = "paper-test";
  time.timeZone = "Asia/Seoul";

  users.users.paper = {
    isNormalUser = true;
    extraGroups = [ "wheel" ];
  };

  environment.systemPackages = with pkgs; [ git vim htop ];

  services.openssh.enable = true;
  services.nginx.enable = true;
  networking.firewall.allowedTCPPorts = [ 22 80 ];

  system.stateVersion = "26.05";
}

실제 NixOS 에서는 이 파일을 /etc/nixos/configuration.nix 에 두고 아래 한줄이면 적용된다.

1
sudo nixos-rebuild switch

우분투에서는 적용은 못 하니까 빌드만 해봤다.

1
nix-build -I nixpkgs=channel:nixos-26.05 -I nixos-config=./configuration.nix '<nixpkgs/nixos>' -A system
  • 처음 빌드: 465개 받고(487.5MB) 270개 빌드. 107초 걸렸다
  • 결과물 크기 1.2GB. 커널은 6.18.57

결과 폴더 안에 커널, initrd, /etc 가 다 들어있다.

1
2
3
4
5
$ ls result
activate  bin  boot.json  dry-activate  etc  firmware  init  initrd  kernel  kernel-modules  ...

$ cat result/nixos-version
26.05.12297.cd4ea8d57de1

nginx 설정 파일도 /etc/nginx 에 있는게 아니다. store 에 만들어지고 서비스가 그 경로를 바로 본다.

1
ExecStart=/nix/store/smpkfhyjj22b4zy1f0cprzfhr0nimllr-nginx-1.30.6/bin/nginx -c '/nix/store/biwy2jjqy6gvw5k9j41fg3c2y1kv996v-nginx.conf'

그래서 서버에 들어가서 설정 파일을 손으로 고치는 방식이 아니다. 고치려면 configuration.nix 를 고치고 다시 빌드한다.

바꾼 것만 다시 빌드된다

패키지에 tmux 하나 추가하고 다시 빌드했다. 11초.

1
2
3
4
$ nix store diff-closures ./result ./result2
libutempter: ∅ → 1.2.3, 38.6 KiB
tmux: ∅ → 3.7b, 1.4 MiB
utf8proc: ∅ → 2.11.3, 393.5 KiB

tmux 랑 tmux 가 쓰는 라이브러리 두개만 추가됐다. 나머지는 이미 있는걸 그대로 쓴다.

오타 내면

enable 을 enabel 로 쳐봤다.

1
2
error: The option `services.nginx.enabel' does not exist. Definition values:
- In `/.../typo.nix': true

적용 전에 빌드 단계에서 막힌다. 다만 진짜 에러 앞에 스택 트레이스가 길게 붙어서 처음엔 좀 당황스럽다.

처음 하면 힘든 점

Nix 언어

설정 파일이 Nix 라는 언어다. 문법은 짧은데 익숙해지는데 시간이 걸린다. 위에서 본것처럼 에러 메시지도 길다.

다른 리눅스용 실행파일이 그냥은 안 돈다

보통 리눅스 바이너리는 /lib64/ld-linux-x86-64.so.2 를 찾는다. Nix 로 빌드한건 store 경로를 본다.

1
2
3
4
5
# 우분투 /usr/bin/ls
interpreter: /lib64/ld-linux-x86-64.so.2

# nix 로 받은 jq
interpreter: /nix/store/fsd4vbp9zjd9iaicq2fb9lpc1h5j973y-glibc-2.42-100/lib/ld-linux-x86-64.so.2

NixOS 에는 저 /lib64 경로가 없다. 26.05 기본값이 environment.stub-ld.enable = true 라서 실행하면 안내 메시지가 뜨는 정도다. 외부 바이너리를 돌려야 하면 programs.nix-ld.enable = true 를 켜면 된다고 한다. 이건 안해봤다.

디스크

이것저것 테스트만 했는데 /nix/store 가 1.1GB 가 됐다. 옛날 세대를 안 지우면 계속 쌓인다. 가끔 정리해줘야 한다.

1
nix-collect-garbage -d

그 외

  • 문서가 여기저기 흩어져 있다. 공식 매뉴얼, nix.dev, 위키가 따로 있다
  • 26.05 부터 부팅 초기 단계(initrd)가 systemd 기반이 기본이다. 옛날 글 보고 따라하면 다를 수 있다

써보려면

  • 바로 NixOS 설치: https://nixos.org/download/ 에서 ISO. GUI 설치판하고 minimal 이 있다
  • 지금 쓰는 리눅스나 맥에 Nix 만 깔아서 nix shell 부터 써보는게 부담이 적다
  • 인텔 맥은 26.05 가 마지막이다. 26.11 부터는 인텔 맥용 패키지를 안 만든다

참고)