# 자주 묻는 질문

## Nix

### Nix 언어 코드를 자동으로 포맷하려면 어떻게 합니까?

[`nixfmt`](https://github.com/NixOS/nixfmt)는 {term}`Nix 언어 <Nix language>` 코드의 공식 포매터입니다. 설치 방법은 해당 소스 저장소를 참고하십시오.

`nixfmt`는 {term}`Nixpkgs`의 [모든 코드를 포맷하는 데 사용됩니다](https://github.com/NixOS/nixpkgs/blob/master/ci/default.nix).

### Nix 언어에서 경로와 문자열을 서로 변환하려면 어떻게 합니까?

[문자열 보간](https://nix.dev/manual/nix/2.19/language/string-interpolation)과 [경로 및 문자열 연산자](https://nix.dev/manual/nix/2.19/language/operators#string-concatenation)에 관한 Nix 참조 매뉴얼을 참고하십시오.

### 패키지의 역의존성을 빌드하려면 어떻게 합니까?

```shell-session
$ nix-shell -p nixpkgs-review --run "nixpkgs-review wip"
```

### Nix로 $HOME의 dotfile을 관리하려면 어떻게 합니까?

<https://github.com/nix-community/home-manager>를 참고하십시오.

### 사용자 정의 패키지를 빌드할 때 권장하는 절차는 무엇입니까?

[](packaging-tutorial) 문서를 읽어 보십시오.

### Nixpkgs 저장소의 클론으로 패키지를 업데이트하거나 새로 작성하려면 어떻게 합니까?

[](packaging-tutorial) 문서와 [Nixpkgs 기여 가이드](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md)를 읽어 보십시오.

## NixOS

### Nix가 아닌 실행 파일은 어떻게 실행합니까?

NixOS에서는 일반적인 Linux 환경용으로 만든 동적 링크 실행 파일을 별도 조치 없이 바로 실행할 수 없습니다. NixOS는 설계상 전역 라이브러리 경로가 없고 [파일시스템 계층 구조 표준](https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html)(FHS)도 따르지 않기 때문입니다.

실행 환경에 대한 기대가 이렇게 어긋나는 문제는 몇 가지 방법으로 해결할 수 있습니다.

- Nixpkgs에 패키지된 버전이 있다면 그것을 사용하십시오. 사용 가능한 패키지는 <https://search.nixos.org/packages>에서 검색할 수 있습니다.

- 프로그램의 Nix 표현식을 작성하여 자신의 설정 안에서 패키지하십시오.

  여기에는 여러 방법이 있습니다.
  - 소스에서 빌드하십시오.

    많은 오픈 소스 프로그램은 파일이 설치될 위치를 컴파일할 때 매우 유연하게 정할 수 있습니다. 이에 대한 소개는 [](packaging-tutorial) 문서를 참고하십시오.
  - [`autoPatchelfHook`](https://nixos.org/manual/nixpkgs/stable/#setup-hook-autopatchelfhook)을 사용하여 프로그램의 [ELF 헤더](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format)에 라이브러리 경로가 들어가도록 수정하십시오.

    소스에서 빌드할 수 없을 때 이 방법을 사용하십시오.
  - [`buildFHSEnv`](https://nixos.org/manual/nixpkgs/stable/#sec-fhs-environments)로 프로그램을 감싸 FHS와 비슷한 환경에서 실행하십시오.

    이 방법은 최후의 수단이지만 필요한 경우도 있습니다. 예를 들어 프로그램이 다른 실행 파일을 내려받아 실행하는 경우입니다.

- [`nix-ld`](https://github.com/Mic92/nix-ld)를 사용하여 패키지화되지 않은 프로그램에만 적용되는 라이브러리 경로를 만드십시오. `configuration.nix`에 다음을 추가하십시오:

  ```nix
    programs.nix-ld.enable = true;
    programs.nix-ld.libraries = with pkgs; [
      # Add any missing dynamic libraries for unpackaged programs
      # here, NOT in environment.systemPackages
    ];
  ```

  그런 다음 `nixos-rebuild switch`를 실행하고, 새 환경 변수가 적용되도록 로그아웃했다가 다시 로그인하십시오. (이 과정은 `nix-ld`를 활성화할 때만 필요하며, 포함된 라이브러리의 변경 사항은 다시 빌드하면 즉시 적용됩니다.)

  :::{note}
  `nix-ld`는 `x86_64` 머신의 32비트 실행 파일에서는 작동하지 않습니다.
  :::

- [`steam-run`](https://nixos.org/manual/nixpkgs/stable/#sec-steam-run)을 사용하여 Steam 패키지용으로 만들어진 FHS와 유사한 환경에서 프로그램을 실행하십시오:

  ```shell-session
  $ nix-shell -p steam-run --run "steam-run <command>"
  ```

### 나만의 ISO를 빌드하려면 어떻게 해야 합니까?

<http://nixos.org/nixos/manual/index.html#sec-building-image>를 참조하십시오.

### NixOS 테스트의 머신에 접속하려면 어떻게 해야 합니까?

다음 패치를 적용하십시오:

```diff
diff --git a/nixos/lib/test-driver/test-driver.pl b/nixos/lib/test-driver/test-driver.pl
index 8ad0d67..838fbdd 100644
--- a/nixos/lib/test-driver/test-driver.pl
+++ b/nixos/lib/test-driver/test-driver.pl
@@ -34,7 +34,7 @@ foreach my $vlan (split / /, $ENV{VLANS} || "") {
     if ($pid == 0) {
         dup2(fileno($pty->slave), 0);
         dup2(fileno($stdoutW), 1);
-        exec "vde_switch -s $socket" or _exit(1);
+        exec "vde_switch -tap tap0 -s $socket" or _exit(1);
     }
     close $stdoutW;
     print $pty "version\n";
```

그러면 vde_switch 네트워크에 로컬에서 접근할 수 있습니다.

### 기존 Linux 설치 환경 안에서 NixOS를 부트스트랩하려면 어떻게 해야 합니까?

사용할 수 있는 도구가 몇 가지 있습니다:

- <https://github.com/nix-community/nixos-anywhere>
- <https://github.com/jeaye/nixos-in-place>
- <https://github.com/elitak/nixos-infect>
- <https://github.com/cleverca22/nix-tests/tree/master/kexec>
