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 만 깔았다. 보통은 아래처럼 데몬 모드로 깐다.
| |
나는 root 로 컨테이너에서 해서
--no-daemon으로 깔았다. root 로 하면nixbld그룹이 없다고 에러가 나서/etc/nix/nix.conf에build-users-group =을 넣고 다시 돌렸다.
nix run, nix shell 같은 새 명령어하고 flakes 는 아직 실험 기능이다. 설정에 켜줘야 한다.
| |
안 켜면 이렇게 나온다.
| |
패키지는 /nix/store 에 들어간다
서버에 원래 깔려있던 python 은 3.11 이다. 여기에 3.12 랑 3.13 을 Nix 로 띄워봤다.
| |
- 버전마다
/nix/store아래 다른 경로에 들어간다. 그래서 안 부딪힌다 - 앞에 붙은 해시는 빌드에 들어간 재료(소스, 의존성, 옵션)로 만든다. 재료가 하나라도 다르면 경로가 달라진다
- 원래 있던 3.11 은 그대로다
처음 받을때 python 3.12 는 의존성까지 23개, 74.7MB 를 받았다. 3.13 은 겹치는게 있어서 1개 54.1MB 만 받았다.
설치 안하고 잠깐 쓰기
| |
한번 쓰고 끝이다. 시스템에 아무것도 안 남는다. 프로젝트마다 필요한 툴을 이렇게 띄우는게 편하다.
롤백
설치할때마다 “세대"가 하나씩 쌓인다. hello 깔고 jq 를 깔아봤다.
| |
한단계 되돌리기.
| |
Nix 로 깐 jq 1.8.2 가 빠지고 우분투에 원래 있던 jq 1.7 이 다시 잡혔다.
파일은 안 지워진다. /nix/store 에 그대로 있어서 다시 앞으로 가는것도 바로 된다.
| |
NixOS 에서는 이게 OS 전체 단위로 된다. 시스템을 바꿀때마다 세대가 생기고 부팅 메뉴에 남는다. 업데이트하고 부팅이 안 되면 부팅 메뉴에서 이전 세대를 고르면 된다고 한다. 이건 실제 NixOS 가 있어야 해서 안 해봤다.
시스템 전체를 파일 하나로
nginx, ssh 켜고 사용자 하나 만드는 설정이다.
| |
실제 NixOS 에서는 이 파일을 /etc/nixos/configuration.nix 에 두고 아래 한줄이면 적용된다.
| |
우분투에서는 적용은 못 하니까 빌드만 해봤다.
| |
- 처음 빌드: 465개 받고(487.5MB) 270개 빌드. 107초 걸렸다
- 결과물 크기 1.2GB. 커널은 6.18.57
결과 폴더 안에 커널, initrd, /etc 가 다 들어있다.
| |
nginx 설정 파일도 /etc/nginx 에 있는게 아니다. store 에 만들어지고 서비스가 그 경로를 바로 본다.
| |
그래서 서버에 들어가서 설정 파일을 손으로 고치는 방식이 아니다. 고치려면 configuration.nix 를 고치고 다시 빌드한다.
바꾼 것만 다시 빌드된다
패키지에 tmux 하나 추가하고 다시 빌드했다. 11초.
| |
tmux 랑 tmux 가 쓰는 라이브러리 두개만 추가됐다. 나머지는 이미 있는걸 그대로 쓴다.
오타 내면
enable 을 enabel 로 쳐봤다.
| |
적용 전에 빌드 단계에서 막힌다. 다만 진짜 에러 앞에 스택 트레이스가 길게 붙어서 처음엔 좀 당황스럽다.
처음 하면 힘든 점
Nix 언어
설정 파일이 Nix 라는 언어다. 문법은 짧은데 익숙해지는데 시간이 걸린다. 위에서 본것처럼 에러 메시지도 길다.
다른 리눅스용 실행파일이 그냥은 안 돈다
보통 리눅스 바이너리는 /lib64/ld-linux-x86-64.so.2 를 찾는다. Nix 로 빌드한건 store 경로를 본다.
| |
NixOS 에는 저 /lib64 경로가 없다. 26.05 기본값이 environment.stub-ld.enable = true 라서 실행하면 안내 메시지가 뜨는 정도다.
외부 바이너리를 돌려야 하면 programs.nix-ld.enable = true 를 켜면 된다고 한다. 이건 안해봤다.
디스크
이것저것 테스트만 했는데 /nix/store 가 1.1GB 가 됐다. 옛날 세대를 안 지우면 계속 쌓인다. 가끔 정리해줘야 한다.
| |
그 외
- 문서가 여기저기 흩어져 있다. 공식 매뉴얼, nix.dev, 위키가 따로 있다
- 26.05 부터 부팅 초기 단계(initrd)가 systemd 기반이 기본이다. 옛날 글 보고 따라하면 다를 수 있다
써보려면
- 바로 NixOS 설치: https://nixos.org/download/ 에서 ISO. GUI 설치판하고 minimal 이 있다
- 지금 쓰는 리눅스나 맥에 Nix 만 깔아서
nix shell부터 써보는게 부담이 적다 - 인텔 맥은 26.05 가 마지막이다. 26.11 부터는 인텔 맥용 패키지를 안 만든다
참고)