NixOS와 비 Nix 빌드 공간의 호환성 문제 해결

몇 주 전에 NixOS로 완전히 전환했습니다. 이전에는 Ubuntu 위에 Nix 스토어를 사용했습니다. 잘 작동하지만 여전히 Nix용 호스트 OS를 구성해야 했습니다. 저는 선언적이고 재현 가능한 시스템의 열렬한 팬이므로 Nix는 저에게 천국입니다 :)

NixOS란 무엇입니까?



프로그래밍 언어, 빌드 시스템, 패키지 관리자, 마지막으로 다른 모든 것을 기반으로 하는 Linux 운영 체제이기 때문에 정의하기가 약간 어렵습니다.

모든 것은 .nix 파일에 정의되어 있습니다. Nix 언어는 소프트웨어 구축을 위해 설계된 기능적 프로그래밍 언어입니다. 각 프로그램은 빌드 중에 정확한 종속성을 정의하므로 스토어에서 패키지를 다운로드할 때 항상 올바른 버전의 종속성을 다운로드합니다. 이 때문에 Nix는 다른 Linux 배포판과 약간 다릅니다. 일반 Linux에서는 많은 종속성이 배포판과 함께 제공되므로 배포 관리자가 종속성을 가질 수 있습니다hard code. 정말 좋은 예는 ELF 바이너리에 대한 기본 인터프리터입니다. 더 알고 싶다면 내 이전 을 따르십시오.

이슈가 뭐야?



예를 들어 /lib64/ld-linux-x86-64.so.2는 NixOS에 존재하지 않습니다. 이 파일은 glibc 패키지의 일부이지만 각 바이너리에는 버전이 있기 때문입니다. Nix 패키지는 이러한 철학에 따라 컴파일되었기 때문에 문제가 되지 않지만 일단 Nix 생태계에서 무언가를 다운로드하면 문제가 발생합니다.

또 다른 문제는 /bin/bash도 존재하지 않는다는 것입니다 :). 이게 왜 안 좋은 일인지 굳이 깊게 설명할 필요는 없을 것 같습니다.

커널 모듈은 잘 알려진 위치가 아닌 Nix 스토어에도 있습니다.

예를 들어 VS Code 원격 언어 서버와 같은 일부 다른 라이브러리도 node가 특정.so 파일을 찾지 못하기 때문에 시작할 수 없습니다.

이 모든 것을 해결하는 방법?



나는 거기에있는 모든 주제를 다루는 좋은 방법을 찾았습니다. 기본 NixOS 구성/etc/nixos/configuration.nix에서 다음과 같이 변경했습니다.

  environment.variables = {
    LD_LIBRARY_PATH = "$(cat ${pkgs.gcc.outPath}/nix-support/cc-ldflags | cut -dL -f2 | sed 's/.$//'):/run/current-system/sw/lib:/run/current-system/kernel-modules/lib";
  };


라이브러리 검색 경로를 구성합니다. 첫 번째 부분은 정말 못 생겼습니다 (VS Code 특정). 멋지게 해결하는 방법을 알려주십시오. 그러나 운 좋게도 NixOS는 /run/current-system에서 시스템의 주요 종속성을 참조하기 때문에 나머지는 괜찮습니다.

  system.activationScripts.nonposix.text = ''
    ln -sf /run/current-system/sw/bin/bash /bin/bash
    rm -rf /lib64 ; mkdir /lib64 ; ln -sf ${pkgs.glibc.outPath}/lib/ld-linux-x86-64.so.2 /lib64
  '';


bash용 심볼릭 링크와 기본 인터프리터용 심볼릭 링크를 만듭니다.

이런 식으로 우리는 일반 Linux처럼 보이도록 Nix를 속입니다.

내 개인 script-kiddie Nix 구성here을 찾을 수 있습니다.

그러나 록스타 솔루션을 찾고 있다면 다음 리포지토리를 확인하는 것이 좋습니다.

  • https://github.com/michojel/NixOS by Michal Minář

  • https://github.com/sagikazarmark/nix-config by Márk Sági-Kazár

  • (영감을 주셔서 감사합니다)

    좋은 웹페이지 즐겨찾기