이 사이트는 의 를 yeokja로 기계 번역한 비공식 한국어판입니다. 정확한 내용은 원문을 확인하세요.

NixOS

Nix 패키지 관리자를 기반으로 하며 Nix의 핵심 원칙을 따르는 Linux 배포판

개념/NixOS

먼저 Nix 빠른 시작부터 따라가고, 개념 문서는 주로 보충 설명이 필요할 때 참고하기를 권합니다. 오른쪽의x를 누르면 모든 개념 문서에서 이 안내를 숨길 수 있습니다.

NixOS는 Nix를 기반으로 하는 Linux 배포판입니다. NixOS는 Nix 언어를 사용해 configuration.nix 파일에서 운영체제를 선언형으로 설정할 수 있다는 점에서 여러 배포판 가운데 독보적입니다. 그리고 이러한 설정 가능성은 상당히 깊은 곳까지 미쳐서, 시스템의 부트 로더, 파일 시스템, 윈도우 관리자, 커널 모듈, OpenSSH 같은 서비스를 비롯해 훨씬 더 많은 것을 포함합니다.

NixOS는 근본적으로 설정 가능한 배포판일 뿐만 아니라, Nix 덕분에 원자적 시스템 업데이트, 시스템 롤백, 견고한 다중 사용자 지원 등 다양한 고유 기능도 제공합니다.

Nix의 역할

NixOS 시스템의 모든 것은 Nix 언어와 NixOS 모듈 시스템을 사용해 설정됩니다. 그때그때 임시방편으로 패키지를 설치하고 시스템을 구성하는 대신, 네트워킹 스택, 파일 시스템, 사용자 등 원하는 구체적인 시스템을 선언할 수 있으며, 그러면 Nix가 필요한 모든 패키지를 설치하고, 필요한 설정 파일을 제공하고, 선언된 그 밖의 변경 사항을 적용하면서 시스템을 처음부터 빌드해 줍니다.

기능

NixOS는 APT, dpkg 또는 그 밖의 Linux용 선택지 대신 Nix를 패키지 관리자로 사용합니다. Nix 덕분에 NixOS는 다양한 고유 기능을 제공할 수 있습니다.

세대

다른 Linux 배포판과 달리, NixOS 시스템 상태에 대한 업데이트는 번호가 붙은 원자적 세대를 이룹니다. 원하는 시스템 설정을 적용하기 위해 nixos-rebuild switch를 실행할 때마다 Nix는 세대 번호를 하나씩 늘립니다. 세대의 핵심 이점 중 하나는 시스템 상태의 원자적 버전 사이를 자유롭게 전환할 수 있다는 점입니다.

원자적 시스템 업데이트

NixOS 설정을 변경할 때마다 nixos-rebuild switch를 실행하여 그 설정을 적용할 수 있습니다. 그렇게 하면 NixOS는 시스템 설정에 따라 설치하거나 업그레이드해야 하는 모든 패키지를 설치하거나 업그레이드합니다. 그리고 Nix에서 늘 그렇듯이, 각 패키지는 처음부터 실체화되어 파일 시스템 계층 구조 표준(Filesystem Hierarchy Standard)을 사용하는 시스템처럼 /bin이나 /usr/bin 같은 디렉터리에 저장되는 것이 아니라 Nix 스토어에 저장됩니다.

롤백

시스템 업데이트와 마찬가지로, NixOS에서는 nixos-rebuild switch --rollback을 사용해 시스템을 이전 세대로 롤백할 수 있습니다. 롤백은 완전히 원자적이며 패키지, 시스템 설정, 그리고 NixOS 설정에 지정된 그 밖의 모든 것을 포함합니다.

다중 사용자 지원

NixOS는 파일 시스템 계층 구조 표준(Filesystem Hierarchy Standard)을 따르지 않고, 패키지뿐만 아니라 derivation과 기타 산출물을 포함한 모든 것에 Nix 스토어를 사용합니다. 이를 통해 NixOS는 사용자 프로필을 개수 제한 없이 우아한 방식으로 지원할 수 있습니다. 예를 들어 같은 NixOS 호스트의 서로 다른 두 사용자가 서로 다른 버전의 Git을 사용할 수 있는데, 이는 /usr/bin/git 같은 위치에 있는 전역 git을 공유하는 대신 두 사용자가 각각 Nix 스토어 경로의 git 실행 파일을 사용할 수 있기 때문입니다:

  • /nix/store/sglc12hc6pc68w5ppn2k56n6jcpaci16-git-2.38.1/bin/git
  • /nix/store/8nwsswymka208dpmsy09aydgffvg4bbi-git-2.38.0/bin/git

다음은 위의 첫 번째 경로를 나타낸 다이어그램입니다:

        
/nix/store/ 1. Nix 스토어 접두사
sglc12hc6pc68w5ppn2k56n6jcpaci16 2. 해시 부분
-
git-2.38.1 3. 패키지 이름
/
bin/git 4. 프로그램 경로

스토어 경로를 구성 요소별로 나누어 살펴봅시다:

  1. 루트 경로는 기본적으로 /nix/store입니다.
  2. 해시는 패키지를 빌드하는 데 사용된 derivation에서 파생됩니다.
  3. 패키지 이름은 패키지 제작자가 지정하는 임의의 슬러그입니다.

설정

대부분의 Linux 배포판에서는 셸 스크립트와 apt-get install 같은 임시방편적인 명령을 사용하여 원하는 시스템을 절차적으로 구성합니다. 이와 달리 NixOS에서는 Nix 언어를 사용하여 원하는 시스템을 정의할 수 있습니다. 기본적으로 이 정의는 /etc/nixos에 저장된 configuration.nix 파일에 들어 있습니다. 다음은 설정 예시입니다:

/etc/nixos/configuration.nix
{ pkgs, ... }: # A pinned version of Nixpkgs passed to the configuration by Nix
{
# Enable Nix flakes and the unified Nix CLI
nix.settings = {
experimental-features = "nix-command flakes";
};
# Networking configuration
networking.hostName = "justme-dev-box";
# Enable OpenSSH
services.openssh.enable = true;
# Root filesystem
fileSystems."/" = {
device = "/dev/sda1";
fsType = "ext4";
};
# Create a user
users.users.justme = {
isNormalUser = true;
initialPassword = "changemeplz";
};
# CLI tools, language runtimes, shells, and other desired packages
environment.systemPackages = with pkgs; [
curl
jq
wget
git
python
openssl
zsh
];
}

다음 명령은 위 설정을 적용합니다:

Rebuild your NixOS system
nixos-rebuild switch

복잡한 셸 스크립트도, 일련의 설치 명령이나 빌드 명령도 필요 없습니다. 명령 하나만으로 지정한 사양에 따라 시스템 전체를 빌드합니다.

모듈

모듈은 설정을 만들어 내도록 구성할 수 있는 Nix 코드 조각입니다. NixOS에서 모듈은 속성 집합을 받아 또 다른 속성 집합을 반환하는 함수입니다. 모듈의 기본 구조는 다음 코드 조각에서 확인할 수 있습니다:

/etc/nixos/configuration.nix
{ lib, config, pkgs, ... }:
{
imports = [];
config = {};
options = {};
}
제 configuration.nix는 왜 다르게 생겼습니까?

NixOS를 처음 살펴보면 /etc/nixos/에 있는 configuration.nix 파일을 틀림없이 보게 됩니다. 또한 다른 사람의 NixOS 설정을 보면 이와 똑같은 구조가 아닐 수도 있습니다.

우선 입력 집합은 짧게 줄여 쓸 수 있습니다(가장 극단적인 경우 { ... }까지 줄일 수 있습니다). 이것이 어떤 역할을 하는지에 대한 자세한 내용은 Nix 구문 섹션을 참고하십시오.

또한 NixOS 모듈에는 몇 가지 문법적 편의 기능이 있어서, 모듈이 options를 하나도 선언하지 않는다면 config 키를 생략할 수 있습니다. 예를 들어 다음 두 모듈은 서로 동등합니다.

Equivalent NixOS modules
# Module 1
{ ... }:
{
imports = [ ./my-fish-config.nix ];
programs.fish.enable = true;
}
# Module 2
{ ... }:
{
imports = [ ./my-fish-config.nix ];
config = {
programs.fish.enable = true;
};
}

모듈 사용 방법

먼저 NixOS 모듈 검색에서 사용할 모듈과 그 사용 방법을 찾을 수 있습니다. Nix 모듈은 일반적으로 선언형 원칙을 따릅니다. 즉, 모듈이 실행되는 정해진 순서가 없습니다. 대신 시스템에서 원하는 결과를 기술하면 Nix가 그 결과를 만들어 줍니다.

다음은 nginx 웹 서버를 설치하고 설정하는 방법의 예시입니다.

nginx web server example
{ ... }:
{
services.nginx = {
enable = true;
virtualHosts."default" = {
forceSSL = true; # Redirect HTTP clients to an HTTPs connection
default = true; # Always use this host, no matter the host name
root = /var/www/my-website; # Set the web root to serve
};
};
}

릴리스

NixOS는 매년 두 차례 주요 릴리스를 냅니다. 릴리스 슬러그는 {year}.{month} 형식이므로 22.05는 2022년 5월, 20.09는 2020년 9월에 해당하는 식입니다. NixOS는 Nix로 설정하므로 특정 패키지와 의존성을 원하는 리비전으로 언제든지 고정할 수 있습니다.