Installing NixOS on Raspberry Pi 4

Michael Lynch

Raspberry Pi 4에 NixOS 설치하기

원문은 Michael Lynch님이 에 게재했습니다. 이 블로그 구독하기

Nix는 코드로 소프트웨어 환경을 정의할 수 있게 해주는 도구다. Nix는 여러 구성 요소로 이루어져 있는데, 개인적으로 가장 흥미로운 것은 NixOS다. Nix 툴체인을 이용해 OS 전체 설정을 텍스트 파일로 정의할 수 있기 때문이다.

나는 최근에야 Nix를 실험하기 시작했고, 배워야 할 것이 엄청나게 많다. 가장 먼저 시도한 것 중 하나가 Raspberry Pi에 NixOS를 설치하는 것이었는데, 처음 몇 번의 시도는 모두 실패했다. 내가 찾을 수 있었던 모든 NixOS Pi 튜토리얼은 내용이 불완전하거나 오래된 것이었다.

Raspberry Pi 4에 NixOS를 설치하는 완전하고 실제로 동작하는 가이드를 소개한다. 나 역시 NixOS 초보자이므로 이 가이드는 Nix 입문자를 위한 것이지만, Raspberry Pi와 Linux에 대한 기본적인 지식은 있다고 가정한다.

준비물

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

  • RAM 2GB 이상의 Raspberry Pi 4
  • 저장 공간 8GB 이상의 microSD 카드
  • microSD 리더/라이터
  • microSD 카드를 플래싱할 별도의 컴퓨터

NixOS microSD 이미지 다운로드

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

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

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

NixOS microSD 이미지 압축 해제

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

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 압축을 네이티브로 지원하므로 이미지를 미리 압축 해제할 필요가 없다.

Pi에 microSD 카드 삽입하기

microSD 플래싱이 끝났으면 Raspberry Pi의 microSD 슬롯에 삽입한다:

Raspberry Pi의 microSD 슬롯에 microSD가 삽입된 사진

플래싱한 microSD 카드를 Pi의 microSD 슬롯에 삽입한다.

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

대부분의 Raspberry Pi 이미지는 첫 부팅 시 네트워크를 통해 장치에 접속할 수 있는 방법을 제공한다. NixOS에서는 그런 방법을 찾지 못했기 때문에, 초기 상태를 확인하려면 키보드와 HDMI 디스플레이를 Pi에 임시로 연결해야 한다.

NixOS로 부팅 중인 Raspberry Pi에 HDMI 디스플레이와 키보드가 연결된 사진

NixOS는 네트워크만으로 설치를 완료할 수 없으므로 초기 설정 과정에서는 키보드와 HDMI 디스플레이를 연결해야 한다.

이 튜토리얼에서는 이런 상황을 위해 내가 만든 장치인 TinyPilot으로 Pi를 제어하고 있다(내가 바로 이런 상황을 위해 만들었다).

Raspberry Pi 4에 연결된 TinyPilot 사진Plasma 데스크톱 환경을 실행 중인 NixOS 시스템을 TinyPilot으로 제어하는 스크린샷

TinyPilot 장치를 이용해 Raspberry Pi에 NixOS를 설치했다. 키보드를 번갈아 사용할 필요가 없어 편리했다.

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

NixOS 시스템 부팅하기

이제 결과를 확인할 차례다. Raspberry Pi의 전원을 켠다.

모든 과정이 제대로 진행됐다면 다음과 같은 부팅 과정을 볼 수 있다:

Raspberry Pi 4에서 NixOS microSD 이미지가 성공적으로 부팅된 모습.

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

[nixos@nixos~:]$

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

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

Raspberry Pi로 작업할 때는 별도의 키보드로 입력하는 것보다 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라는 오류가 보인다면 Pi가 아직 시스템 시간을 동기화하고 있다는 뜻이다. 60초 정도 기다린 뒤 명령어를 다시 실행해 보자.

공개 SSH 키를 NixOS 시스템에 추가했다면 평소처럼 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, userpassword 값을 바꿔 보는 것도 좋다.

sudo nano /etc/nixos/configuration.nix

아직 설정 파일을 완벽하게 만들려고 애쓸 필요는 없다. NixOS에서는 언제든지 어떤 옵션이든 마음을 바꿀 수 있고, 설정 파일을 다시 편집하기만 하면 변경 사항이 적용된다.

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

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

재부팅이 완료되면 다음과 같은 화면이 보인다:

이제 Pi에서 Gnome 데스크톱 환경과 함께 NixOS가 실행되고 있다!

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

NixOS 이것저것 실험해 보기

이제 NixOS 시스템이 정상적으로 동작하고 있다.

원하는 대로 NixOS를 탐색해도 좋지만, 새 시스템에서 시도해 볼 만한 초보자용 실험 두 가지를 소개한다.

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

위의 configuration.nix 파일은 Gnome 데스크톱 환경을 사용한다고 가정하지만, 다른 환경을 선호할 수도 있다. Microsoft Windows와 디자인이 비슷한 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

재부팅하면 다음과 같은 데스크톱이 보인다:

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

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

문제 해결

최신 Pi 부트로더로 업그레이드하기

NixOS에서 부팅 문제가 발생한다면 Pi의 부트로더와 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

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

부록: 실패했던 시도들

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


Alex Groleau를 비롯한 NixOS 문서팀에서 이 가이드에 도움을 주고 공식 NixOS Raspberry Pi 튜토리얼을 작업해 주셔서 감사드린다.

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

댓글