GNU Guix

**GNU Guix**(; 가일과 닉스의 혼성어)는 닉스 패키지 관리자를 기반으로 하는 함수형 크로스 플랫폼 패키지 관리자이자 리스프 머신 및 유닉스 계열 운영 체제를 인스턴스화하고 관리하는 도구이다. 구성 및 패키지 레시피는 가일 스킴으로 작성된다. GNU Guix는 GNU Guix 시스템 배포판의 기본 패키지 관리자이다.

기존 패키지 관리자와는 달리 Guix는 (Nix처럼) 소프트웨어가 암호화 해시를 통해 생성된 고유 디렉터리에 설치되는 순수한 함수형 배포 모델을 사용한다. 각 소프트웨어의 모든 종속성은 각 해시의 입력에 포함된다. 이는 의존성 지옥 문제를 해결하여 동일한 소프트웨어의 여러 버전이 공존하도록 허용하여 패키지를 이식 가능하고 재현 가능하게 만든다. Guix 설정에서 과학적 계산을 수행하는 것은 복제 위기에 대한 유망한 대응으로 제안되었다.

GNU Guix의 개발은 Linux-libre 커널과 GNU Shepherd init 시스템을 사용하는 설치 가능한 운영체제 배포판인 GNU Guix 시스템과 밀접하게 관련되어 있다.

## 일반적인 기능
Guix 패키지는 패키지 관리를 위해 특별히 설계된 함수형 가일 스킴 API를 통해 정의된다.
종속성은 "파생"이라고 하는 특수 값을 통해 이 언어에서 직접 추적되며, 이는 Guix 데몬에 의해 느긋하게 평가된다.
Guix는 이러한 참조를 자동으로 추적하여 설치된 패키지가 다른 패키지에 종속되지 않을 때 가비지 컬렉션될 수 있도록 한다. 더 큰 저장 공간 요구 사항을 대가로, Guix의 모든 업그레이드는 원자적이며 롤백할 수 있다.

Guix의 롤백 기능은 Nix의 설계에서 상속되었으며 다른 운영체제에서는 거의 찾아볼 수 없는데, 이는 시스템이 작동하는 방식에 대한 이단적인 접근 방식(예: MicroOS)을 요구하기 때문이다.
Guix 패키지 관리자는 Nix와 마찬가지로 데비안 및 Parabola와 같은 많은 배포판에서 사용할 수 있다.
이를 통해 여러 사용자가 관리자 권한 없이 동일한 시스템에 소프트웨어를 안전하게 설치할 수도 있다.

기존 패키지 관리자와 비교할 때 Guix 패키지 스토어는 상당히 커질 수 있으므로 더 많은 대역폭을 필요로 한다. 그러나 의존성 지옥을 해결하는 데 일반적으로 사용되는 컨테이너 솔루션(예: 도커)과 비교할 때 Guix는 더 가볍고 중복배제 및 단일 진실 공급원과 같은 관행을 준수한다. 사용자가 모든 것을 소스에서 빌드하도록 선택하면 훨씬 더 많은 저장 공간과 대역폭이 필요하다.

## 저장소
Nix의 설계에서 상속된 대로, 패키지 관리자의 대부분의 내용은 Guix 데몬만이 쓰기 권한을 가지는 `/gnu/store` 디렉토리에 보관된다. 이는 특수 바인드 마운트를 통해 이루어진다. 이 마운트를 통해 스토어는 파일 시스템으로 읽기 전용으로 마운트되어 루트 사용자조차도 간섭할 수 없으며, Guix 데몬은 자체 프라이빗 네임스페이스에서 스토어를 읽기/쓰기 가능으로 다시 마운트한다. Guix는 이 데몬과 통신하여 스토어에 보관되는 항목을 빌드하거나 대체 항목을 가져온다. 사용자는 스토어를 쓰기 가능으로 다시 마운트하여 수동으로 만지는 것을 권장하지 않는다. 이는 스토어의 전체 목적을 상실시키기 때문이다.

### 가비지 컬렉션
Guix는 Nix와 마찬가지로 사용되지 않는 저장소 항목을 제거하고 활성 항목을 유지하는 데 도움이 되는 내장 가비지 컬렉션 기능을 가지고 있다.

## 패키지 정의
다음은 헬로 패키지에 대한 패키지 정의의 예시이다.

```scheme
(use-modules
  (guix packages)
  (guix download)
  (guix build-system gnu)
  (guix licenses))

(define-public hello
  (package
   (name "hello")
   (version "2.10")
   (source (origin
            (method url-fetch)
            (uri (string-append "mirror://gnu/hello/hello-" version
                                ".tar.gz"))
            (sha256
             (base32
              "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
   (build-system gnu-build-system)
   (synopsis "Hello, GNU world: An example GNU package")
   (description
    "GNU Hello prints the message \"Hello, world!\" and then exits.  It
 serves as an example of standard GNU coding practices.  As such, it supports
 command-line arguments, multiple languages, and so on.")
   (home-page "https://www.gnu.org/software/hello/")
   (license gpl3+)))
```

이것은 Guile을 사용하여 작성되었다. 패키지 레시피는 Guix에서 쉽게 검사(예: `guix edit hello` 실행)하고 변경할 수 있어 시스템을 투명하고 쉽게 수정할 수 있다.

## 트랜잭션 업그레이드
Nix의 설계에서 상속된 대로, 저장소 항목의 모든 조작은 서로 독립적이며, 저장소의 디렉터리는 파생 소스 코드와 해당 입력의 base32 인코딩 해시로 시작한다.

## 프로필
Guix 패키지는 프로필 세대를 사용하는데, 이는 사용자가 프로필에 설치한 것을 모두 포함하는 특정 저장소 항목에 대한 심볼릭 링크("심링크"라고도 함) 모음이다. 패키지가 설치되거나 제거될 때마다 새 세대가 빌드된다. 예를 들어, GNU Hello만 설치한 사용자의 프로필에는 현재 사용 중인 Guix로 설치된 Hello 버전이 포함된 저장소 항목에 대한 링크가 포함되어 있다. Guix 버전 `c087a90e06d7b9451f802323e24deb1862a21e0f`에서는 이 항목이 `md2plii4g5sk66wg9cgwc964l3xwhrm9-hello-2.10`에 해당한다(위 레시피에서 빌드됨).

심볼릭 링크 외에도 Guix가 빌드하는 각 프로필에는 모든 인포 매뉴얼과 맨 페이지, 아이콘, 글꼴 등이 통합되어 있어 사용자가 문서를 탐색하고 설치된 모든 아이콘과 글꼴에 접근할 수 있다. 프로필 세대에 대한 기본 심볼릭 링크는 `/var/guix` 아래에 저장된다.

### 다중 사용자 프로필
사용자는 를 호출하여 원하는 수의 프로필을 생성할 수 있다. 그러면 현재 디렉토리에 프로필 이름과 프로필 세대 심링크가 있는 새 디렉토리가 생성된다.

## 롤백
Guix 패키지는 이전 프로필 세대로의 심링크를 변경하여 이전 프로필 세대로 즉시 롤백할 수 있다. 프로필은 또한 저장소에 저장된다. 예를 들어, 이 항목은 위에 있는 hello를 포함하는 프로필이다: /gnu/store/b4wipjlsapvnijmbawl7sh76087vpl4n-profile (guix install hello를 실행할 때 빌드 및 활성화됨).

## 셸 환경
Guix 셸을 사용하면 사용자는 여러 프로젝트의 종속성으로 인해 기본 프로필이 지저분해지지 않고도 소프트웨어 개발에 필요한 모든 패키지가 있는 환경에 쉽게 진입할 수 있다.

예를 들어, 를 실행하면 Guix에서 hello를 컴파일하는 데 필요한 모든 것(gcc, guile 등)이 존재하는 일회성 환경으로 진입한다.

 플래그 없이는 hello 패키지만 설치되고 빌드 종속성은 설치되지 않는다. 이는 패키지의 종속성을 기본적으로 설치하는  명령을 대체하는데, 이 명령은 기본적으로 지정된 패키지를 설치하고 개발 종속성은 플래그를 통해서만 설치하는 것이 더 직관적이라고 생각되었기 때문이다.

### 영구 개발 환경
사용자가 다음 Guix 가비지 컬렉터 실행 시 가비지 컬렉션되지 않는 영구적인 gc-루트 환경을 원하면 루트를 생성할 수 있다. 예를 들어, 를 실행하면 Guix를 컴파일하는 데 필요한 모든 것이 존재하는 환경으로 진입하며, 현재 디렉터리에 루트로 등록된다(저장소의 항목에 심링크를 통해).

## 팩
Guix pack을 사용하면 사용자가 저장소 항목을 묶어 도커 바이너리 이미지, 재배치 가능한 tarball, 데비안 패키지 파일, RPM 패키지 파일, AppImage 또는 squashfs 바이너리로 출력할 수 있다.

## 그래프
Guix 그래프 기능을 통해 사용자는 패키지와 해당 종속성의 다양한 그래프를 볼 수 있다.

## 타사 채널
Guix를 사용하면 사용자가 패키지 정의를 위한 추가 채널을 지정할 수 있다.

이 기능은 주 프로젝트에 패키징할 수 없는 비자유 소프트웨어 및 펌웨어를 설치하는 데도 사용할 수 있다.

## GNU Guix 시스템 (운영체제)<span class="anchor" id="Guix System (operating system)"></span>

**GNU Guix 시스템** 또는 **Guix 시스템**(이전 이름 GuixSD)은 Nix를 중심으로 구축된 NixOS와 유사하게 Guix를 중심으로 구축된 롤링 릴리스 자유-오픈 소스 리눅스 배포판이다. 이는 선언적 운영 체제 구성을 가능하게 하고 사용자가 롤백할 수 있는 시스템 업그레이드를 허용한다. GNU Shepherd Init 시스템과 Linux-libre 커널을 사용하며, GNU Hurd 커널은 개발 중이다. 2015년 2월 3일, 자유 소프트웨어 재단은 이 배포판을 승인된 자유 리눅스 배포판 목록에 추가했다.

### 아키텍처 지원
다음 CPU 아키텍처가 지원된다.
* IA-32
* X86-64
* ARMv7
* AArch64
* POWER9
* RISC-V 64
* MIPS64

### 시스템 서비스
가일 스킴으로 정의된 시스템 서비스는 사용자가 데몬 및 백그라운드 서비스의 구성을 선언적으로 구성하고 구성을 지정할 수 있도록 한다. 이를 통해 사용자는 단일 구성 파일 또는 모듈화된 구성 내에서 전체 운영 체제를 구성할 수 있다(예: Tor 프록시, ssh 서버, 부팅 시 특정 포트에서 Nginx를 통해 guix-web을 제공하는 웹 서버). 다음을 수행할 수 있다.
* 파일 시스템에 파일 생성 (일부 애플리케이션에 필요, 예: /etc의 파일)
* 데몬 설정을 위한 모든 코드 실행
* 특정 사용자 및 그룹 계정 생성 (예: PostgreSQL용 데이터베이스 사용자)

### GNU Shepherd init 시스템
GNU Guix 시스템은 이전에 "dmd"("Daemon managing Daemons")로 알려졌던 GNU 데몬 셰퍼드를 Init 시스템으로 사용하며, 이는 Guix와 함께 개발되었고 가일로 작성되고 구성할 수 있다. 이는 사용자 공간 기능을 서비스로 비동기적으로 제공하며, Shepherd 하의 서비스는 제네릭 함수 및 객체 자료형으로, 정의된 방식으로 기본 운영 체제를 확장하는 데 사용한다. Systemd와 달리 사용자 공간 셰퍼드 프로세스는 사용자로 실행된다. Shepherd 모델의 사용자 공간 초기화의 핵심은 확장 개념으로, 서비스가 다른 서비스 위에 계층화되어 원하는 대로 더 정교하거나 전문화된 동작으로 증강되도록 설계되는 합성 가능성의 한 형태이다. 이는 많은 최신 초기화 시스템에서 발견되는 인스턴스화 기반 종속성 관계를 표현하지만, 또한 서비스가 다른 서비스와 가변적으로 임의의 방식으로 상호 작용할 수 있도록 한다. 예를 들어, 두 개의 다른 서비스를 확장하는 서비스는 하나만 존재하는 것을 요구하지만, 두 번째 서비스가 나중에 추가 구성이나 설정 없이 인스턴스화되면 쉽게 확장할 수 있다.

셰퍼드는 또한 시스템에 대한 메일 전송 에이전트(MTA)를 인스턴스화하는 모든 서비스와 같이 관련 서비스 객체 클래스에 대한 동적 디스패치를 허용하는 가상 서비스를 제공한다. 셰퍼드 데몬에 의해 관리되는 시스템은 사용자 공간을 유향 비순환 그래프로 표현할 수 있으며, 시스템 부팅 및 초기화의 초기 단계를 담당하는 "시스템 서비스"를 루트로, 그리고 이후에 초기화된 모든 서비스를 시스템 서비스 기능의 확장으로, 직접 또는 다른 서비스를 통해 간접적으로 표현할 수 있다.

시스템 관리자가 Guile Scheme을 사용하여 높은 프로그래밍 가능성을 제공하도록 의도되었지만, 비특권 데몬 및 서비스의 사용자별 프로필을 관리하는 데에도 사용할 수 있다. 해당 서비스와 구성은 스킴 코드로 통일된 객체 지향으로 저장되며, 기본 GNU Guix 시스템과 함께 핵심 서비스 세트가 제공되지만, 임의의 새로운 서비스를 유연하게 선언할 수 있으며, Guile의 객체 시스템, GOOPS를 통해 기존 서비스를 사용자의 재량에 따라 재정의할 수 있다. 이는 Shepherd에게 인스턴스화 시 지정된 방식으로 서비스를 동적으로 재작성하도록 요청하는 방식으로 이루어진다.

GNU Shepherd는 원래 GNU Hurd와 함께 작동하도록 설계되었으며, 이후 GNU Guix 시스템에 채택되었다.

### 롤백
Nix의 롤백 기능과 유사하게, 시스템 업데이트로 인해 사용자의 시스템이 손상된 경우, 사용자는 단일 명령 `guix package --roll-back`으로 개별 패키지뿐만 아니라 전체 시스템 상태를 쉽게 롤백할 수 있다. 이는 guix pull을 통해 업데이트하려 할 때 버그를 보고하고 몇 분을 기다릴 의향이 있는 사용자에게는 다른 리눅스 배포판에서 매우 흔한 안정 채널이 더 이상 필요하지 않다는 것을 의미한다. 이는 각 패키지와 시스템 구성을 불변하고 재현 가능한 엔티티로 취급하는 Guix의 함수형 패키지 관리자와 시스템 구성의 이력을 "세대"로 유지하는 세대 시스템의 조합으로 달성된다. 이러한 세대는 별도의 프로필로 저장되어 사용자가 이전 구성으로 롤백할 수 있도록 하며, 이러한 세대는 `guix package --list-generations`로 볼 수 있다.

### 평가

DistroWatch Weekly의 제시 스미스는 GNU Guix 시스템 0.15.0(당시 GuixSD로 명명)을 검토하고 "GuixSD는 마음에 드는 패키지 관리자를 가지고 있다"고 말했지만, 제한적인 하드웨어 지원과 제한적인 문서화를 비판했다. 그 이후로 문서화는 비디오와 튜토리얼, 사용 방법 가이드 및 예시가 포함된 6개 언어의 요리책으로 확장 및 개선되었다.

## 재현 가능한 과학적 워크플로우

Guix가 기존 패키지 관리자에 비해 사용자에게 개선된 점을 제공하고자 하는 특정 영역 중 하나는 주로 고성능 컴퓨팅 분야의 재현 가능한 과학적 워크플로우이다. 이러한 방식으로 Guix는 재현 가능한 계산 환경을 공유하는 방법을 제공한다. 즉, 특정 과학 소프트웨어/환경에 대한 레시피를 사용하는 Guix는 해당 소프트웨어를 빌드하고 실행하는 데 필요한 종속성 트리를 고유하게 설명하는 데 필요한 모든 정보를 제공한다. 이는 예를 들어 각 프로그래밍 언어에 대해 여러 패키지 관리자가 있는 다른 혼합 시스템에서는 쉽게 달성할 수 없을 것이다. 그러나 이것은 과학적 워크플로우가 재현 가능하기 위한 필요 조건일 뿐 충분 조건은 아니다. 데이터 수집 및 처리를 워크플로우에 통합해야 하며, 이것이 Guix 레시피의 일부로 추가되면 엄격한 재현성 요구 사항을 충족할 수 있다.

## 역사
이 프로젝트는 GNU Guile 해커 중 한 명인 루도비크 쿠르테에 의해 2012년 6월에 시작되었다.

GNU 프로젝트는 2012년 11월에 Nix를 기반으로 하는 함수형 패키지 관리자인 GNU Guix의 첫 번째 릴리스를 발표했으며, 이는 가일 스킴 API 등을 제공한다.

2015년 8월 20일, Guix가 GNU Hurd로 이식되었다고 발표되었다.

## 릴리스
이 프로젝트는 정해진 릴리스 일정이 없으며 지금까지 약 6개월마다 릴리스되었다.

1.4.0 릴리스 이후 2년 이상 공백이 있었기 때문에 곧 1.5.0 릴리스가 있을 예정이다.

이 프로젝트는 2025년 5월 25일에 GNU 사바나에서 Codeberg로 마이그레이션되었다.

### 버전 역사

## 같이 보기

* 데비안 GNU/Hurd
* NixOS – GNU Guix에 영감을 준 유사한 운영체제
* 리눅스 배포판 비교

## 각주

## 외부 링크

* 
* 
* Guix 패키지 목록

분류:함수형 프로그래밍
분류:GNU 프로젝트 소프트웨어
분류:자유 패키지 관리 시스템
분류:리스프로 작성된 자유 소프트웨어
분류:리눅스 패키지 관리 관련 소프트웨어
분류:2013년 소프트웨어
분류:GPL 라이선스 소프트웨어