Skip to content

프로파일

프로파일과 사용자 환경은 서로 다른 사용자가 서로 다른 설정을 유지하고 개별 업그레이드와 롤백을 가능케하는 닉스의 메커니즘입니다. 그런 일이 어떻게 가능한지 알려면, 우선 닉스 자체가 어떻게 작동하는지 알아야합니다. 닉스에서는, 패키지들이 고유의 위치인 닉스 저장소 (통상적으로, /nix/store)에 저장됩니다. 예를 들어, 특정 버전의 Subversion 패키지는 디렉터리 /nix/store/dpmvp969yhdqs7lm2r1a3gng7pyq6vy4-subversion-1.1.3/에, 반면 다른 버전은 /nix/store/5mq2jcn36ldlmh93yj1n8s9c95pj7c5s-subversion-1.1.2에 저장될 수 있습니다. 긴 알파벳과 숫자로 이루어진 이름은 암호화 해쉬값(정확히 말하자면, 베이스 32비트 표기로 암호화된 SHA-256의 160-비트 버림 버전) 입니다. 이 해쉬값에는 패키지를 빌드하는 과정에 필요한 모든 - 소스 코드, 의존성, 컴파일러 플래그 등이 포함됩니다. 결과적으로 서로 다른 두 패키지가 어떤 식으로든 다르다면, 결국 파일 시스템에서 존재하는 위치 자체가 달라지고 따라서 서로를 방해하지 않을 수 있게 됩니다. 아래는 통상적인 닉스 저장소의 모습입니다.

당연히, Subversion을 실행하고자 할때마다, 아래를 직접 타이핑하고 싶지는 않을겁니다.

$ /nix/store/dpmvp969yhdq...-subversion-1.1.3/bin/svn

당연히 PATH 환경 변수를 사용하고자 하는 패키지의 bin 디렉터리를 향하도록 설정할 수 있지만, 이는 이미 존재하는 프로세스에서 PATH가 변화하더라도 아무 영향이 없으므로 소용이 없습니다. 해결 방법은 닉스가 활용하기로 한 패키지들을 향하는 심볼릭 링크 트리를 담는 디렉터리르 생성하는 것입니다. 그리고 그것들을 사용자 환경으로 부르며 (nix-env에 의해 자동 생성되었지만) 그 자체도 패키지입니다. 따라서 그것들도 닉스 저장소 내부에 존재합니다. 예를 들어, 위의 그림을 보면, 사용자 환경 /nix/store/0c1p5z4kda11...-user-env는 단지 Subversion 1.1.2로 향하는 심볼릭 링크만 가집니다 (그림의 화살표는 심볼릭 링크를 의미함). 이는 우리가 Subversion 1.1.2를 포함하는 닉스 표현식 세트인 아래 명령을 수행했을 때 얻을 수 있는 결과입니다.

$ nix-env -i subversion

당연히, 이것만으로 문제가 해결되지는 않습니다; /nix/store/0c1p5z4kda11...-user-env/bin/svn또한 타이핑하기 싫으니까요. 이것이 저장소의 사용자 환경 자체를 가리키는 저장소 바깥의 심볼릭 링크를 갖게된 이유입니다. 예를 들어, 심볼릭 링크 default-42-linkdefault-43-link를 보세요. 이들은 nix-env를 수행할 때마다 생성되기 때문에 세대라고 불리며 새 사용자 환경은 현재 것을 기반으로하여 생성됩니다. 예를 들어, 43 세대는 42세대를 기반으로 하여, 파이어폭스와 Subversion을 갖는 닉스 표현식 세트인 아래 명령으로부터 생성됩니다.

$ nix-env -i subversion firefox

세대들은 프로파일로 그룹화하여 원하지 않는 경우 서로 다른 사용자와 방해가 되지 않도록 합니다. 예를 들어,

$ ls -l /nix/var/nix/profiles/
...
lrwxrwxrwx  1 eelco ... default-42-link -> /nix/store/0c1p5z4kda11...-user-env
lrwxrwxrwx  1 eelco ... default-43-link -> /nix/store/3aw2pdyx2jfc...-user-env
lrwxrwxrwx  1 eelco ... default -> default-43-link

위는 default라 불리는 프로파일을 보여줍니다. 이 파일 default 자체는 현 세대를 가리키는 심볼릭 링크에 불과합니다. nix-env를 수행하면, 새로운 사용자 환경과 세대 링크가 현재 것을 기반으로 생성되며 결과적으로 default 심볼릭 링크는 새 세대를 가리키도록 만들어집니다. 이 마지막 단계가 유닉스에서 개별로 이루어지며, 따라서 어떻게 개별 업그레이드가 가능할 수 있는지를 설명합니다. (새로운 패키지를 빌드하거나/설치하는 것이 구 패키지는 다른 위치의 닉스 저장소에 담겨있기 때문에 어떤 식으로든 이미 있는 패키지와 방해가 되지 않는 다는 점을 주목하시기 바랍니다.)

nix-env 수행 결괄르 되돌리고 싶다면, 아래와 같이 하면 됩니다.

$ nix-env --rollback

이는 단순히 현 세대를 이전 버전에 링크합니다. 예, defaultdefault-42-link를 가리키도록 변경됩니다. 또한 특정한 세대로 변경할 수도 있습니다:

$ nix-env --switch-generation 43

이 예에서는 43세대로 다시 되돌립니다. 가능한 세대들은 아래 명령을 통해 확인할 수 있습니다:

$ nix-env --list-generations

일반적으로 PATH/nix/var/nix/profiles/some-profile/bin을 가지고 있지 않을 겁니다. 오히려, ~/.nix-profile이 현 프로파일을 가리키는 심볼릭 링크일 겁니다. 이는 사용자의 PATH~/.nix-profile/bin을 기입해야함(이는 실제로, /nix/etc/profile.d/nix.sh라는 시작 스크립트가 하는 방법입니다)을 의미합니다. 이로써 서로 다른 프로파일로 변경하는 것이 쉬워집니다. 명령어 nix-env --switch-profile을 통해 확인할 수 있습니다:

$ nix-env --switch-profile /nix/var/nix/profiles/my-profile

$ nix-env --switch-profile /nix/var/nix/profiles/default

이 명령어들은 각각 my-profile로, 그리고 기본 프로파일로 변경합니다. 프로파일이 존재하지 않는다면, 자동적으로 생성됩니다. profiles 디렉터리 대신 다른 위치를 프로파일 저장에 사용하면 주의해야하는데, 그렇게 되는 경우 쓰레기 수집의 루트 경로에 사용되지 않을 수 있기 때문입니다.

모든 nix-env 기능은 ~/.nix-profile이 가리키는 프로파일에 동작하지만, 이는 --profile 옵션(약자 -p)을 통해 무시할 수 있습니다:

$ nix-env -p /nix/var/nix/profiles/other-profile -i subversion

이는 ~/.nix-profile 심볼릭 링크를 변경하지 않습니다.


Last update: November 4, 2021
Back to top