Installing NixOS on Raspberry Pi 4

Michael Lynch

라즈베리 파이 4에 NixOS 설치하기

Nix는 코드로 소프트웨어 환경을 정의할 수 있게 해주는 도구입니다. Nix는 여러 구성 요소로 이루어져 있는데, 그중 제가 가장 흥미롭게 느끼는 것은 NixOS입니다. Nix 툴링을 이용해 OS 전체 설정을 일반 텍스트 파일로 정의할 수 있습니다.

저는 얼마 전에 Nix를 실험하기 시작했으며, 배워야 할 것이 정말 많습니다. 가장 먼저 시도한 것 중 하나가 라즈베리 파이에 NixOS를 설치하는 것이었는데, 처음 몇 번의 시도는 모두 실패했습니다. 제가 찾을 수 있는 모든 NixOS 파이 튜토리얼은 내용이 불완전하거나 오래된 것이었습니다.

그래서 라즈베리 파이 4에 NixOS를 설치하는 완전하고 동작하는 가이드를 준비했습니다. 저 역시 NixOS 초보자이므로 이 가이드는 Nix 입문자를 대상으로 하며, 라즈베리 파이와 리눅스에 대한 기본적인 지식은 있다고 가정합니다.

준비물

이 튜토리얼을 따라 하려면 다음이 필요합니다:

  • RAM 2GB 이상인 라즈베리 파이 4
  • 8GB 이상 microSD 카드
  • microSD 리더기
  • microSD 카드를 플래싱할 별도의 컴퓨터

NixOS microSD 이미지 다운로드

먼저 아래 링크에서 NixOS microSD 이미지를 다운로드합니다:

더 최신 이미지는 Nix 빌드 서버에서 녹색 체크 표시가 있는 가장 최근 빌드를 확인하면 찾을 수 있습니다.

최근에 더 최신 빌드(nixos-image-sd-card-25.05beta741800.78886a72ed11, 2025-01-19 빌드)로 이 과정을 시도해 보았지만 설치에 실패했습니다. 이후 단계인 nixos-build에서 제 파이 4의 2GB RAM이 모두 소진되었기 때문입니다.

NixOS microSD 이미지 압축 해제

NixOS 팀은 microSD 이미지를 Zstandard라는 압축 형식으로 압축해 배포합니다. 페이스북에서 만든 오픈소스 형식입니다.

NixOS 이미지를 압축 해제하려면 사용 중인 플랫폼에 맞는 최신 Zstandard 릴리스를 다운로드합니다:

Zstandard 도구와 NixOS microSD 이미지를 모두 준비했다면 다음 명령으로 .img.zst 파일의 압축을 해제합니다:

zstd --decompress 'nixos-sd-image-23.11pre515819.8ecc900b2f69-aarch64-linux.img.zst'

Zstandard 파일의 압축을 해제하면 nixos-sd-image-23.11pre515819.8ecc900b2f69-aarch64-linux.img라는 파일이 생성됩니다.

NixOS microSD 이미지 플래싱

이미지 압축을 해제했다면 즐겨 사용하는 microSD 플래싱 유틸리티로 microSD에 이미지를 구워 넣습니다.

microSD를 플래싱할 때는 .img.zst 파일이 아니라 .img 파일을 선택하세요. 대부분의 플래싱 도구는 Zstandard 형식을 인식하지 못합니다.

방법 1: balenaEtcher

어떤 microSD 플래싱 도구를 써야 할지 모르겠다면 balenaEtcher를 추천합니다. 사용하기 쉽고 주요 OS에서 모두 동작합니다.

balenaEtcher 스크린샷

방법 2: caligula

balenaEtcher는 NixOS에서 사용할 수 없으므로, NixOS를 사용 중이라면 좋은 대안은 caligula입니다:

caligula burn \
  nixos-sd-image-23.11pre515819.8ecc900b2f69-aarch64-linux.img.zst

caligula는 Zstandard 압축을 기본으로 지원하므로 이미지를 먼저 압축 해제할 필요가 없습니다.

microSD 카드를 파이에 삽입하기

microSD 플래싱이 끝났다면 라즈베리 파이의 microSD 슬롯에 삽입합니다:

라즈베리 파이의 microSD 슬롯에 microSD가 삽입된 사진

플래싱한 microSD 카드를 파이의 microSD 슬롯에 삽입합니다.

파이에 디스플레이와 키보드 연결하기

대부분의 라즈베리 파이 이미지는 첫 부팅 시 네트워크로 장치에 접속할 수 있는 방법을 제공합니다. NixOS에서는 그런 방법을 찾지 못했으므로, 진행 상황을 확인하려면 키보드와 HDMI 디스플레이를 파이에 임시로 연결해야 합니다.

NixOS로 부팅 중인 라즈베리 파이에 HDMI 디스플레이와 키보드가 연결된 사진

NixOS는 완전한 네트워크 설치를 지원하지 않으므로 초기 설정 중에는 키보드와 HDMI 디스플레이를 연결해야 합니다.

이 튜토리얼에서는 TinyPilot으로 파이를 제어하고 있습니다. 바로 이런 상황을 위해 제가 만든 장치입니다.

라즈베리 파이 4에 연결된 TinyPilot 사진Plasma 데스크톱 환경을 실행 중인 NixOS 시스템을 TinyPilot으로 제어하는 화면의 스크린샷

TinyPilot 장치를 이용해 라즈베리 파이에 NixOS를 설치했습니다. 키보드를 번갈아 가며 사용할 필요가 없어 편리했습니다.

이 튜토리얼을 따라 하는 데 TinyPilot이 꼭 필요한 것은 아니며, 일반 키보드와 HDMI 디스플레이로도 충분히 따라 할 수 있습니다.

NixOS 시스템 부팅하기

이제 진짜 순간입니다. 라즈베리 파이의 전원을 켭니다.

모든 과정이 잘 진행되었다면 다음과 같은 부팅 과정을 볼 수 있습니다:

라즈베리 파이 4에서 NixOS microSD 이미지를 성공적으로 부팅한 모습.

다음과 같은 NixOS 명령 프롬프트가 나타나면 부팅이 완료된 것입니다:

[nixos@nixos~:]$

부팅에 실패했다면 파이의 부트로더를 최신 버전으로 업데이트한 뒤 다시 시도해 보세요.

SSH 접속 활성화하기 (선택 사항)

라즈베리 파이를 다룰 때 저는 별도 키보드로 입력하는 것보다 SSH가 훨씬 편리하다고 생각합니다.

새로 설치한 NixOS 시스템에서 SSH 접속을 활성화하는 방법은 두 가지가 있습니다.

방법 1: 비밀번호 설정하기

NixOS 시스템에서 다음 명령을 실행하면 기본 nixos 사용자 계정에 비밀번호를 설정할 수 있습니다:

passwd

비밀번호를 설정한 뒤에는 평소처럼 NixOS 시스템에 SSH로 접속할 수 있습니다:

ssh [email protected]

방법 2: SSH 키 추가하기

시스템에 SSH 공개 키를 등록하여 인증 키로 추가할 수도 있습니다.

GitHub에 SSH 키로 인증한다면, GitHub에서 제공하는 편리한 방법으로 어떤 장치에서든 공개 SSH 키를 다운로드할 수 있습니다:

GITHUB_USERNAME='your-github-username' # Replace this.

mkdir -p ~/.ssh && \
  curl "https://github.com/${GITHUB_USERNAME}.keys" > ~/.ssh/authorized_keys

certificate is not valid yet이라는 오류가 표시된다면 파이가 아직 시스템 시간을 동기화 중인 것입니다. 60초 정도 기다린 뒤 다시 시도해 보세요.

NixOS 시스템에 공개 SSH 키를 추가한 뒤에는 평소처럼 SSH로 접속할 수 있습니다:

ssh [email protected]

NixOS 설정 파일 작성하기

이제 NixOS에 접속했습니다!

아직 최소한의 NixOS 환경이라 설치된 것이 거의 없어 할 수 있는 일이 많지 않습니다.

NixOS 경험을 더 흥미롭게 만들기 위해 데스크톱 GUI와 몇 가지 애플리케이션을 설치해 보겠습니다. 먼저 제 예제 NixOS 설정 파일을 다운로드합니다:

curl \
  --show-error \
  --fail \
  https://mtlynch.io/nixos-pi4/configuration.nix \
  | sudo tee /etc/nixos/configuration.nix

이 단계에서 nanovim을 이용해 /etc/nixos/configuration.nix를 수정할 수 있습니다. 파일 상단의 hostname, user, password 값을 원하는 대로 바꿔 보세요.

sudo nano /etc/nixos/configuration.nix

아직 설정 파일을 완벽하게 만들려고 너무 걱정하지 않아도 됩니다. NixOS에서는 언제든지 어떤 옵션이든 마음을 바꿀 수 있으며, 설정 파일을 다시 편집하기만 하면 변경 사항이 적용됩니다.

configuration.nix 파일이 마음에 들면 다음 명령을 실행해 시스템에 설정을 적용하고 재부팅합니다:

sudo nixos-rebuild boot && \
  echo "install complete, rebooting..." && \
  sudo poweroff --reboot

재부팅이 완료되면 다음과 같은 화면이 나타납니다:

이제 파이는 Gnome 데스크톱 환경을 갖춘 NixOS로 동작합니다!

위 기본 configuration.nix 파일을 그대로 사용했다면 사용자 이름은 tempuser, 비밀번호는 somepass입니다.

NixOS 실험해 보기

이제 NixOS 시스템이 정상적으로 구동되고 있습니다.

원하는 대로 NixOS를 탐색해도 좋지만, 새 시스템에서 시도해 볼 수 있는 초보자용 실험을 몇 가지 준비했습니다.

실험 1: 데스크톱 환경 변경하기

위의 configuration.nix 파일은 Gnome 데스크톱 환경을 사용한다고 가정하지만, 다른 환경을 선호할 수도 있습니다. Plasma라는 데스크톱 매니저도 있는데, 마이크로소프트 윈도우와 디자인이 유사합니다.

NixOS 시스템을 Gnome 대신 Plasma를 사용하도록 바꾸려면 텍스트 편집기에서 configuration.nix 파일을 엽니다:

sudo nano /etc/nixos/configuration.nix

파일에서 다음 줄을 찾습니다:

    displayManager.gdm.enable = true;
    desktopManager.gnome.enable = true;

이 줄들을 다음과 같이 바꿉니다:

    displayManager.sddm.enable = true;
    desktopManager.plasma5.enable = true;

변경 사항을 적용하려면 파일을 저장하고 nano를 종료한 뒤 다음 명령을 실행합니다:

sudo nixos-rebuild boot && sudo reboot

재부팅하면 다음과 같은 데스크톱이 나타납니다:

Plasma 데스크톱 환경을 실행 중인 NixOS 시스템을 TinyPilot으로 제어하는 화면의 스크린샷, 로그인 화면Plasma 데스크톱 환경을 실행 중인 NixOS 시스템을 TinyPilot으로 제어하는 화면의 스크린샷, 데스크톱 화면

NixOS에서는 단 두 줄만 바꾸면 Gnome에서 Plasma로 데스크톱 매니저를 전환할 수 있습니다.

데스크톱 환경 전체를 바꾸는 데 필요한 것은 단 두 줄 수정뿐이었습니다.

실험 2: 임시 소프트웨어 환경 만들기

제가 찾은 Nix 도구 중 가장 접근하기 쉬운 것은 nix-shell입니다. 지정한 소프트웨어 패키지로 즉석에서 소프트웨어 환경을 만들 수 있습니다.

nix-shell은 시스템의 다른 설정에 영향을 주지 않으므로 다른 무언가를 망가뜨릴 걱정 없이 새로운 도구를 자유롭게 시도해 볼 수 있습니다.

저는 가끔 몇 년 전에 작성한, 구버전 Node.js에 의존하는 프로젝트를 다시 열곤 합니다. nvm 같은 도구로 Node 버전을 나란히 설치해 보기도 했지만, nvm 사용법과 올바른 설정 방법을 기억해 내는 데만 20분을 허비하곤 했습니다.

nix-shell은 패키지를 설치하는 범용 도구이지만, 저는 nvm 같은 언어 전용 개발 도구보다도 더 편리하다고 느낍니다.

Node.js 18.x로 nix-shell 환경을 만드는 방법은 다음과 같습니다:

$ nix-shell --packages nodejs-18_x
these paths will be fetched (11.25 MiB download, 52.36 MiB unpacked):
  /nix/store/87kgx3ym4kgmqwaijckqvbfrkzm8ax75-nodejs-18.2.0
copying path '/nix/store/87kgx3ym4kgmqwaijckqvbfrkzm8ax75-nodejs-18.2.0' from 'https://cache.nixos.org'...

[nix-shell:~]$ node --version
v18.2.0

[nix-shell:~]$ npm --version
8.9.0

환경 사용을 마치면 Ctrl+D를 누르거나 exit를 입력하면 됩니다.

같은 방법으로 Node.js 16.x 환경을 만드는 방법은 다음과 같습니다:

$ nix-shell --packages nodejs-16_x
these paths will be fetched (10.77 MiB download, 50.24 MiB unpacked):
  /nix/store/1ba3sqw3rkadg2ksywqc85lq2hvx9fvk-nodejs-16.15.0
copying path '/nix/store/1ba3sqw3rkadg2ksywqc85lq2hvx9fvk-nodejs-16.15.0' from 'https://cache.nixos.org'...

[nix-shell:~]$ node --version
v16.15.0

[nix-shell:~]$ npm --version
8.5.5

문제 해결

최신 파이 부트로더로 업그레이드

NixOS 부팅에 문제가 있다면 파이의 부트로더와 EEPROM을 업데이트해야 할 수도 있습니다.

최신 빌드의 Raspberry Pi OS(일명 “Raspbian”)로 부팅한 뒤 다음 명령을 실행해 최신 부트로더를 설치합니다:

sudo raspi-config nonint do_boot_rom E1 && \
  sudo reboot

EEPROM을 업데이트하려면 다음 명령을 실행합니다:

sudo apt update && \
  sudo apt install --yes rpi-eeprom && \
  sudo rpi-eeprom-update -a && \
  sudo reboot

제가 테스트한 파이 4 장치에서는 NixOS 23.11 디스크 이미지가 별다른 조치 없이 바로 부팅되었기 때문에 위 단계가 필요하지 않았습니다.

부록: 실패한 시도들

이 튜토리얼을 만드는 과정에서 동작하지 않는 수많은 경로를 겪었습니다. 같은 단계를 다시 시도하며 시간을 낭비하지 않도록 여기에 모아 두었습니다.


NixOS 문서화 팀의 Alex Groleau에게 이 가이드를 도와주고 공식 NixOS 라즈베리 파이 튜토리얼을 작업해 준 것에 대해 감사드립니다.

원문은 Michael Lynch님이 에 게재했습니다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.