Skip to content

소개

닉스는 순수 함수형 패키지 매니저 입니다. 이는 하스켈과 같은 순수 함수형 언어에서 값(value)을 다루듯이 패키지를 다룬다는 것을 의미합니다 - 패키지들은 부산물(side-effects)이 없는, 함수로 빌드되며 빌드된 이후에는 절대로 변경되지 않습니다.
닉스는 일반적으로 /nix/store에 존재하는 닉스 저장소 에 패키지들을 보관하는데, 해당 디렉터리는 각각의 패키지들을 위한 고유의 서브 디렉터리를 가지고 있습니다. 예를 들어,

/nix/store/b6gvzjyb2pg0kjfwrjmg1vfhh54ad73z-firefox-33.1/

여기서 b6gvzjyb2pg0… 는 해당 패키지의 의존성까지 모두 포괄하는 유일의 지칭값이 됩니다. (패키지의 빌드 의존성 그래프의 암호화 해쉬값입니다.) 이로써 강력한 기능들을 가능케 해줍니다.

다양한 버전

사용자는 다양한 버전이나 변형 패키지를 동시에 설치해둘 수 있게 됩니다. 이는 특히 서로 다른 어플리케이션이 서로 다른 버전의 동일 의존성을 가질 때 중요하게 작용합니다 - "DLL 지옥"을 피할 수 있게 해줍니다. 해쉬 구조를 통해 서로 다른 버전의 패키지들은 서로 다른 경로의 닉스 저장소에 저장되게 되고, 따라서 서로를 방해하지 않습니다.

중요한 결과물 중에 하나로 업그레이드나 어플리케이션 삭제 명령이 다른 어플리케이션을 부수지 않게 되는데, 이는 업데이트 과정이 "파괴적"으로 작동하거나, 혹은 다른 패키지에 의해 사용되야할 파일을 삭제하지 않기 때문입니다.

완전한 의존성

닉스는 패키지 의존성 제원이 완벽할 수 있도록 확신하는 것을 돕습니다. 일반적으로, RPM과 같은 패키지 관리 시스템에서 패키징을 할 때, 각각의 패키지의 의존성이 어떤 것인지를 밝혀야 합니다만, 이런 제원이 완벽하리라는 보장을 할 수는 없을 겁니다. 만약 일부 의존성을 잊어버리면, 우연히 의존성이 설치된 당신의 머신에서는 정상 작동하겠으나, 다른 사람의 기기에서는 그렇지 않게 됩니다.

반면에 닉스는 /usr/bin과 같은 "글로벌" 위치에 패키지를 설치하지 않고, 패키지 고유 디렉터리에 설치하게 됨으로써, 불완전한 의존성 위험이 확실히 줄어듭니다. 이는 컴파일러 같은 도구들이 /nix/store/5lbfaxb722zp…-openssl-0.9.8d/include와 같은 각 패키지 경로를 검색하지 않기 때문입니다. 따라서, 만약 당신의 시스템에 패키지가 정상적으로 빌드된다면, 의존성을 명시적으로 특정했기 때문입니다. 이 과정이 빌드-타임 의존성을 해결해줍니다.

한번 패키지가 빌드되면, 실행시 의존성은 닉스 저장소 경로의 해쉬 부분 바이너리 값을 스캔하여 발견됩니다(예를 들어 r8vvq9kq…). 이것이 위험하게 느껴질 수 있지만, 굉장히 잘 작동합니다.

다중 사용자 지원

닉스는 다중 사용자를 지원합니다. 이것은 비-권한 사용자들도 안전하게 소프트웨어를 설치할 수 있음을 의미합니다. 각 사용자는 해당 사용자의 PATH(경로)에 등장하는 패키지 세트를 담은, 서로 다른 프로파일 값을 가질 수 있습니다. 만약 사용자가 또 다른 사용자가 이전에 이미 설치한 패키지를 설치하고자 한다면, 패키지는 재차 다운로드 되거나 다시 빌드되지 않습니다. 마찬가지로, 타 사용자가 사용할 패키지에 트로잔 바이러스를 이식하는 것도 불가능합니다.

개별 업그레이드와 롤백

패키지 매니징 과정이 닉스 저장소에 있는 패키지를 절대 덮어쓰기하지 않고 서로 다른 버전을 서로 다른 경로에 추가만 하므로, 과정이 개별 로 작용합니다. 따라서 패키지 업그레이 과정에 구 버전의 일부 파일과 새로운 버전의 일부 파일이 공존하는 시점은 존재하지 않습니다 - 그런 일은 업그레이드 과정 중에 프로그램이 실행된다면 프로그램이 깨질 수 있기 때문에 매우 좋지 않습니다.

뿐만 아니라 패키지들이 덮어쓰기 되지 않기 때문에, 구 버전도 업그레이 이후 원래 있던 자리에 남아있습니다. 이것이 사용자가 구버전으로 롤백 할 수 있다는 의미입니다.

$ nix-env --upgrade some-packages
$ nix-env --rollback

쓰레기 수거(Garbage collection)

만약 사용자가 패키지를 이런 식으로 삭제하면...

$ nix-env --uninstall firefox

패키지는 시스템에서 당장 삭제되지 않습니다 (결국은 사용자가 롤백을 원할 수도 있고, 타 사용자의 포르파일에 존재할 수도 있으므로). 대신, 쓰레기 수거 명령을 통해 안전하게 사용하지 않는 패키지들을 제거할 수 있습니다.

$ nix-collect-garbage
이 명령을 통해 어떤 사용자에 의해서도 사용되지 않거나, 현재 실행중이지 않은 프로그램이 삭제됩니다.

함수형 패키지 언어

패키지들은 단순한 함수형 언어인 닉스 표현식 으로 빌드됩니다. 닉스 표현식을 통해 다른 패키지들, 소스 코드, 빌드 스크립트, 빌드 스크립트를 위한 환경 변수값과 같은 빌드 명령("derivation")을 위한 모든 것을 묘사합니다. 닉스는 표현식이 완결적 (deterministic)이라고 확신할 수 있도록 모든 노력을 다합니다. 완결적 이라는 말은 닉스 표현식이 재차 빌드되더라도 완벽히 동일한 결과가 발생해야 함을 의미합니다.

닉스가 함수형 언어이기 때문에 다양한 변이 패키지를 빌드하는 것을 지원하기 용이합니다: 닉스 표현식을 함수로 전환하고 적절한 인자로 몇 번이고 호출하면 됩니다. 해쉬 구조 덕분에, 변이들은 닉스 저장소에 있는 서로 다른 패키지와 충돌하지 않습니다.

투명한 소스/바이너리 배포

닉스 표현식은 일반적으로 소스로부터 패키지를 어떻게 빌드하는지를 묘사합니다. 따라서 아래와 같은 설치 과정은

$ nix-env --install firefox
이미 닉스 저장소에 있지 않다면, 파이어폭스 뿐만 아니라 모든 의존성 (맨 끝의 C 라이브러리부터 컴파일러까지)을 빌드해야하므로, 약간의 빌드 과정을 유발 할수도 있습니다. 대부분의 유저에게 소스 코드를 통해 빌드하는 과정은 시간이 너무 소모되므로 그다지 즐거운 과정이 아닙니다. 그런, 닉스는 자동적으로 소스 코드로부터 빌드화는 과정을 생략하고 대신에 이미 빌드된 바이너리를 제공하는 웹 서버로부터, 바이너리 캐시 를 사용할 수 있습니다. 예를 들어, /nix/store/b6gvzjyb2pg0…-firefox-33.1를 소스코드부터 빌드하라고 요청받은 경우, 닉스는 우선 파일 https://cache.nixos.org/b6gvzjyb2pg0….narinfo이 존재하는지 체크하고, 만약 그렇다면, 이미 빌드된 바이너리를 다운로드 받습니다; 그렇지 않다면, 소스 코드로부터 빌드하는 것으로 전환합니다.

닉스 패키지 모음

우리는 닉스 패키지 모음 (Nixpkgs)라고 불리는, 수백개의 유닉스 패키지를 포함하는 닉스 표현식을 제공합니다.

빌드 환경 관리

닉스는 패키지 빌드 환경 세팅을 매우 쉽게 자동화할 수 있게 만들어주기 때문에 개발자들에게 굉장히 유용합니다. 만들고자 하는 패키지의 의존성이 적힌 닉스 표현식이 있다고 가정하면, nix-shell 명령어를 통해 빌드하거나, 만약 의존성이 이미 닉스 저장소에 존재하지 않는다면 해당 의존성들을 다운로드 받습니다. 그리고 필요한 모든 환경 변수( 예를 들어, 컴파일러 탐색 경로 )가 설정된 배쉬 쉘을 시작합니다.

예를 들어, 다음 명령어는 적혀있는 직스 표현식에 따라 판 뉴스리더(Pan newsreader)의 모든 의존성을 확보합니다:

$ nix-shell '<nixpkgs>' -A pan

이후, 패키지를 수정, 빌드, 테스트할 수 있는 쉘 환경에 놓여집니다.

[nix-shell]$ unpackPhase
[nix-shell]$ cd pan-*
[nix-shell]$ configurePhase
[nix-shell]$ buildPhase
[nix-shell]$ ./pan/gui/pan

이식성

닉스는 리눅스와 맥OS에서 작동합니다.

NixOS

NixOS는 닉스를 바탕으로 하는 리눅스 배포판입니다. 닉스를 패키지 매니저로써만이 아니라 시스템 설정(예를 들어, /etc에 있는 빌드 설정 파일)을 관리하는 데에도 활용합니다. 이는, 다른 것 보다도, 시스템 전체를 이전 상태로 롤백하는 것이 매우 쉬움을 뜻합니다. 또한, 사용자들은 루트 권하닝 엇ㅂ이도 소프트웨어를 설치할 수 있게 됩니다. 더 많은 정보나 다운로드는, NixOS 홈페이지를 참조하세요.

License

Nix is released under the terms of the GNU LGPLv2.1 or (at your option) any later version.

라이선스

닉스는 GNU LGPLv2.1 이나 (선택에 따라) 그 이후 버전의 라이선스로 배포됩니다.


Last update: November 4, 2021
Back to top