Nix - Arch Linux 中文维基

跳至內容

# Nix

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Nix，最近一次同步於 2025-01-16，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

Nix 是一個純函數式包管理器，旨在使包管理可重現、聲明式且可靠。

## 安裝

有四種安裝 Nix 的方法：

- 原生的 Arch Linux 包，
- 官方支持的 Nix 上游安裝腳本，
- 由 Determinate Systems 提供的 Zero to Nix 腳本，該公司為 Nix 提供第三方支援，
- 以及由熱情的 Nix 社區成員提供的 Lix 腳本，旨在通過提供 Nix 包管理器的硬分叉版本來改進 Nix 生態系統。

### 原生安裝

安裝 nix包。

### 上游安裝腳本

這一章節正在考慮移除。

原因: 上遊說明與 Arch 無關，如果人們想忽略官方包，我們不需要保留這些說明。 (在 Talk:Nix 討論)

使用 `curl --proto '=https' --tlsv1.2 -sSfL https://nixos.org/nix/install -o nix-install.sh` 下載文件，查看它：`less ./nix-install.sh`，然後運行腳本 `./nix-install.sh --daemon` 來開始安裝 Nix。

警告：運行 `curl some-url | sh`，如 Nix 文檔所建議的，被認為存在安全風險，因為它會執行未知代碼。因此建議在執行腳本前手動下載並檢查它。

### Zero to Nix 安裝腳本

這一章節正在考慮移除。

原因: Curl 管道用於「更簡單和更不複雜的設置」，但沒有說明這實際上意味著什麼，唯一的區別是它向公司發送遙測數據 (在 Talk:Nix 討論)

為了更簡單和更不複雜的 Nix 設置，您可以使用 Determinate Systems 提供的設置。使用 `curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix -o nix-install.sh` 下載文件，查看它：`less ./nix-install.sh`，然後運行腳本 `sh ./nix-install.sh install` 來開始安裝。

警告：運行 `curl some-url | sh`，如 Determinate Systems 所建議的，被認為存在安全風險，因為它會執行未知代碼。因此建議在執行腳本前手動下載並檢查它。
注意：安裝程序 默認會向 Determinate Systems 發送遙測數據。要手動禁用它，請使用 `sh ./nix-install.sh install --diagnostic-endpoint=""`。

更多信息請參閱 Determinate Systems 的手冊。

### Lix 安裝腳本

這一章節正在考慮移除。

原因: 另一個未打包的 nix 分叉，與 Arch Linux 無關 (在 Talk:Nix 討論)

使用 `curl --proto '=https' --tlsv1.2 -sSf -L https://install.lix.systems/lix -o lix-install.sh` 下載文件，查看它：`less ./lix-install.sh`，然後運行腳本 `sh ./lix-install.sh` 來開始安裝。

警告：運行 `curl some-url | sh`，如 Lix 所建議的，被認為存在安全風險，因為它會執行未知代碼。因此建議在執行腳本前手動下載並檢查它。

更多信息請參閱 Lix Installer 的手冊。

注意：如果您已經 uninstall 了原生的 nix包 包，您仍然會有一些用戶帳戶和組，這些會阻止 lix 完成安裝，因為該組已經存在且具有意外的編號。在運行 nix 之前刪除它們和該組，因為它會重新創建它們：

    uninstallnix.sh

    #!/bin/sh
    for i in {01..10}; do
      userdel "nixbld$i"
    +done
    +groupdel nixbld
    +

## 配置

要使 Nix 守護程序在系統啟動時啟動，啟用 `nix-daemon.service`。

將需要運行 Nix 的用戶添加到 `nix-users` 用戶組中以獲取與守護程序套接字連接的權限。重啟會話以使更改生效。

添加一個頻道並更新它。

    $ nix-channel --add https://nixos.org/channels/nixpkgs-unstable
    $ nix-channel --update

## 使用

注意：如果您從 官方倉庫 安裝了 Nix，您必須手動將 `~/.nix-profile/bin` 目錄添加到您的 PATH 中。

在 shell 配置完成後，以下內容應該將 hello 安裝到您已經更新過的 PATH 中：

    $ nix-env -iA nixpkgs.hello

二進制文件本身將位於 `/nix/store/[hash]-hello-[version]/bin/hello`。

運行 `hello` 並確保它在正確的 PATH 中。如果它工作正常，您可以卸載它：

    $ nix-env --uninstall hello

或者您可以檢查已安裝的程序列表：

    $ nix-env --query

您還可以列出迭代版本：

    $ nix-env --list-generations

更多詳細信息請參閱 nix-env(1) 手冊。

## 提示與技巧

### 最大任務數

nix 默認只同時進行一個構建。以下內容將可以使 nix 同時進行與 CPU 數量相同的構建：

    /etc/nix/nix.conf

    max-jobs = auto

### 圖形加速

要運行 OpenGL 和 Vulkan 應用程式，請使用 NixGL。

### 桌面集成

要將 Nix 應用程式與您的桌面環境集成，請將 `~/.nix-profile/share` 目錄添加到您的 `$XDG_DATA_DIRS` 中，例如使用 `export XDG_DATA_DIRS=$HOME/.nix-profile/share:$XDG_DATA_DIRS`。

### Zsh 集成用於 nix-shell

`nix-shell` 默認啟動 Bash。zsh-nix-shellAUR 允許您在 `nix-shell` 環境中使用 Zsh 作為默認 shell。一些提示插件如 zsh-theme-powerlevel10kAUR 和 zsh-pure-promptAUR 提供了 `nix-shell` 指示器。

## 命令補全

### Zsh

nix-zsh-completionsAUR 提供了 Zsh 對 nix 命令的補全，如 `nix-env` 和 `nix-shell`。

## 故障排查

### 打開的文件太多

一些構建可能會遇到類似如下的問題：

    error: opening directory '/nix/store/...': Too many open files

編輯 `nix-daemon.service` 並增大文件限制：

    [Service]
    LimitNOFILE=65536

### 關於 root 用戶更新頻道的警告

如果在使用 Nix 時出現以下錯誤：

    warning: Nix search path entry '/nix/var/nix/profiles/per-user/root/channels' does not exist, ignoring

root 用戶需要更新他們的頻道：

    # nix-channel --update

### 用戶相關的 Nix 搜索路徑條目不存在，忽略

    warning: Nix search path entry '/nix/var/nix/profiles/per-user/<USER>/channels' does not exist, ignoring

參見 FS#78828。或者，您可以使用 #上游安裝腳本或 #Zero to Nix 安裝腳本，它們不會出現此問題。

### 錯誤：在 Nix 搜索路徑中未找到文件 'nixpkgs'（使用 $NIX_PATH 或 -I 添加它）

參見 FS#78828。或者，您可以使用 #上游安裝腳本或 #Zero to Nix 安裝腳本，它們不會出現此問題。

### 沙盒構建問題

#### 其他沙盒問題

    error: while setting up the build environment: mounting /proc: Operation not permitted
    error: program '/usr/bin/nix-env' failed with exit code 1

    1: package 'utils' in options("defaultPackages") was not found
    2: package 'stats' in options("defaultPackages") was not found
    Error: .onLoad failed in loadNamespace() for 'utils', details:
     call: system(paste(which, shQuote(names[i])), intern = TRUE, ignore.stderr = TRUE)
     error: cannot popen '/nix/store/fnkvlbls29d01jcx3wsdnhykyrl7087r-which-2.21/bin/which 'uname' 2>/dev/null', probable reason 'Cannot allocate memory'

這是已知的上游問題：#2311、#3000 和 #4636。

警告：通常不建議禁用沙盒，因為這會污染構建環境，且可能導致更多的構建錯誤。`nixpkgs` 中的所有內容都指望在啟用沙盒的情況下構建。

最常見的解決方法是在配置文件中禁用沙盒：

    /etc/nix/nix.conf

    # 禁用沙盒
    sandbox = false

然後重啟 `nix-daemon` 服務。

### 區域設置警告

Nixos wiki 建議運行 `export LOCALE_ARCHIVE=/usr/lib/locale/locale-archive`。或者，導出環境變量 `LC_ALL=C`。

## 參見

- 上游 Wiki
- Nix 包管理器指南

分類：​

- 函數式包管理器
- 使用「模板:Remove」標記的章節

Nix
新增話題