
包管理器操作系统【免费下载链接】nixpkgsNix Packages collection NixOS项目地址https://gitcode.com/GitHub_Trending/ni/nixpkgs点击查看免费下载本指南基于 NixOS 手册Package Management章节系统讲解 NixOS 添加软件的两种包管理风格以configuration.nix为载体的声明式管理以及以nix-env命令为核心的临时Ad Hoc管理。读完本文你将掌握environment.systemPackages选项的底层原理、nix-env的安装/升级/卸载/回滚操作以及两者的适用场景与本质区别并能在 Nixpkgs 仓库中追踪到对应实现源码。NixOS 的两种软件包管理风格在 NixOS 中为系统添加软件包有两种截然不同的方式见 package-mgmt.chapter.md声明式Declarative在configuration.nix中声明你想要的软件包。每次执行nixos-rebuildNixOS 都会确保你获得一组与配置规范完全一致的、可复现的二进制软件集。临时Ad hoc通过nix-env命令安装、升级和卸载软件包。这种方式允许混合使用不同 Nixpkgs 版本的软件包而且它是非 root 用户唯一可用的方式。两种方式对应手册中的两个独立小节声明式软件包管理 与 临时软件包管理。下面分别深入讲解。声明式软件包管理一切由 configuration.nix 决定声明式管理的核心是配置选项environment.systemPackages。例如在/etc/nixos/configuration.nix中加入下面一行即可启用 Mozilla Thunderbird 邮件客户端{ environment.systemPackages [ pkgs.thunderbird ]; }其效果是每当你运行nixos-rebuild switchThunderbird 包就会作为系统构建的一部分被编译或下载并进入系统环境。要卸载某个包只需把它从environment.systemPackages中移除然后再次执行nixos-rebuild switch——系统会自动切换到不含该包的下一代配置。底层实现system-path 与 /run/current-system/sw从源码层面看该选项定义在 nixos/modules/config/system-path.nixenvironment.systemPackages lib.mkOption { type lib.types.listOf lib.types.package; default [ ]; example lib.literalExpression [ pkgs.firefox pkgs.thunderbird ]; description The set of packages that appear in /run/current-system/sw. These packages are automatically available to all users, and are automatically updated every time you rebuild the system configuration. ; };关键信息有两点该选项类型是package 列表默认值为空示例写法[ pkgs.firefox pkgs.thunderbird ]与手册中的用法完全一致。所有列入该选项的包最终都会出现在/run/current-system/sw目录对所有用户自动可用并且在每次系统重建时自动更新——这正是它与默认 profile 安装/nix/var/nix/profiles/default的本质区别。在配置装配阶段system-path.nixsystemPackages还会自动叠加内置的corePackages与defaultPackagesenvironment.systemPackages config.environment.corePackages config.environment.defaultPackages;随后整个包集被交给pkgs.buildEnv构建成system.path即/run/current-system/sw并按 pathsToLink 的默认设置将/bin、/sbin、/etc/xdg、/lib等目录软链接进系统环境见 system-path.nix。这就是重启后软件对所有人可见的实现机制。注意事项并非所有包都能只靠 systemPackages 工作手册特别提醒某些软件包还需要额外的全局配置例如 D-Bus 服务或 systemd 服务的注册。仅仅把它们加入environment.systemPackages可能不够。建议先在 NixOS 模块选项列表 中查一下该软件是否已存在对应的 NixOS 模块如programs.firefox、services.*等。这类带模块的包通常应该用模块启用以获得完整的集成。查询可用软件包你可以用nix-env列出 Nixpkgs 中所有可用软件包及其描述$ nix-env -qaP * --description nixos.firefox firefox-23.0 Mozilla Firefox - the browser, reloaded ...输出中第一列是属性名attribute name例如nixos.thunderbird。请注意前缀语义nixos前缀表示从nixos渠道获取该包它只在命令行工具中有效在声明式配置configuration.nix中必须改用pkgs前缀pkgs是配置文件中的内置变量写成pkgs.thunderbird。临时Ad Hoc软件包管理用 nix-env 即时操作对于不需要声明进配置、只想临时使用的软件nix-env是更灵活的手段。它也非 root 用户唯一可用的安装方式。安装软件包安装 Mozilla Thunderbird$ nix-env -iA nixos.thunderbird这里的关键在于-A标志带-A时按属性名attribute name精确指定软件包不带-A时则按包名package name例如thunderbird在所有 Nix 包中做匹配。这种方式更慢需要对全部包做匹配而且存在歧义风险——若有多个同名包会无法确定装哪个。安装位置与可见性nix-env将软件装进 Nix profile安装位置取决于执行用户身份执行身份安装位置可见性root/nix/var/nix/profiles/default系统所有用户可见普通用户/nix/var/nix/profiles/per-user/用户名/profile仅该用户可见升级软件包临时安装的包来自 NixOS 渠道。典型的升级流程是先把 NixOS 渠道更新到最新$ nix-channel --update nixos然后重新执行nix-env -i重新安装目标包。此过程不会影响 profile 中的其他包——这是与声明式管理的决定性差异声明式下执行nixos-rebuild switch会把所有包都同步到 NixOS 渠道中的当前版本而nix-env是各装各的。若想一次性升级 profile 中所有有新版可用的包可执行$ nix-env -u *卸载与回滚卸载某个包用-e标志按包名指定$ nix-env -e thunderbird最后如果某次nix-env操作结果不理想可以一键回滚$ nix-env --rollbacknix-env还支持更多标志完整说明见nix-env(1)手册页。由于 Nix 的 store 天然保留历史世代generations回滚几乎是即时且无损的。软件包不够用怎么办添加自定义软件包当 Nixpkgs 中没有你需要的软件时手册提供了两条出路详见 添加自定义软件包用 Nix 打包或使用上游预编译二进制。由于 NixOS 的文件系统布局与主流发行版差异较大从源码构建往往比使用预编译可执行文件更容易成功。在 Nixpkgs 树内打包in-tree克隆 Nixpkgs 仓库把新包加入自己的克隆可选地向主仓库提交补丁或 Pull Request。完成后把它加入environment.systemPackages{ environment.systemPackages [ pkgs.my-package ]; }重建时用-I指定自己的 Nixpkgs 树# nixos-rebuild switch -I nixpkgs/path/to/my/nixpkgs在 configuration.nix 中直接打包out-of-tree也可以直接在configuration.nix里用stdenv.mkDerivation定义构建例如构建 GNU Hello{ environment.systemPackages let my-hello pkgs.stdenv.mkDerivation (finalAttrs: { pname hello; version 2.8; src pkgs.fetchurl { url mirror://gnu/hello/hello-${finalAttrs.version}.tar.gz; hash sha256-5rd/gffPfa761Kn1tl3myunD8TuM66oy1O7XqVGDXM; }; }); in [ my-hello ]; }更优雅的做法是把包定义抽到独立文件如my-hello.nix再通过callPackage引入{ environment.systemPackages [ (pkgs.callPackage ./my-hello.nix { }) ]; }其中my-hello.nix的内容为{ stdenv, fetchurl }: # declare dependencies as arguments stdenv.mkDerivation (finalAttrs: { pname hello; version 2.8; src fetchurl { url mirror://gnu/hello/hello-${finalAttrs.version}.tar.gz; hash sha256-5rd/gffPfa761Kn1tl3myunD8TuM66oy1O7XqVGDXM; }; })这样还可以在不重建整个系统的情况下单独测试该包$ nix-build -E with import nixpkgs { }; callPackage ./my-hello.nix { } $ ./result/bin/hello Hello, world!预编译可执行文件的两个例外大多数预编译可执行文件无法直接在 NixOS 上运行但有两类例外Flatpak 与 AppImage。AppImage 在 NixOS 上可以原样运行前提是先启用支持{ programs.appimage.enable true; programs.appimage.binfmt true; }之后可直接运行foo.appimage或用appimage-run foo.appimage。若缺少共享库可通过覆盖补充{ programs.appimage.package pkgs.appimage-run.override { extraPkgs pkgs: [ # missing libraries here, e.g.: pkgs.libepoxy ]; }; }其他预编译程序则需用autoPatchelfHook或buildFHSEnv等工具配合 Nix 打包才能运行过程复杂往往不如直接源码构建。小结如何选择包管理方式维度声明式environment.systemPackages临时nix-env配置载体/etc/nixos/configuration.nix命令行生效方式nixos-rebuild switch即时生效版本一致性每次重建时整组同步到渠道当前版本各包独立可混用不同版本可见性所有用户可见装入/run/current-system/swroot 装全局普通用户仅自己可见非 root 用户不可用唯一选择卸载/回滚从配置中移除后重建nix-env -e/nix-env --rollback两种方式各有用武之地追求可复现、可审计的系统配置优先声明式临时试用、非 root 环境、希望混用不同版本则使用nix-env。掌握二者并结合 添加自定义软件包 与 自定义软件包 中的技巧即可在 NixOS 上从容应对绝大多数软件安装场景。赞分享包管理器操作系统【免费下载链接】nixpkgsNix Packages collection NixOS项目地址https://gitcode.com/GitHub_Trending/ni/nixpkgs点击查看免费下载相关推荐NixOS 容器管理完全指南命令式与声明式两种方案实战NixOS 容器管理完全指南命令式与声明式两种方案实战 NixOS 提供了轻量级的虚拟化方案——容器Containers让宿主系统与容器共享 Nix s包管理器操作系统NixOS 临时包管理Ad-Hoc实战指南使用 nix-env 安装、升级与回滚软件包NixOS 临时包管理Ad Hoc实战指南使用 nix env 安装、升级与回滚软件包 导读 在 NixOS 中软件包管理存在两种并行的风格声明式d包管理器操作系统NixOS 声明式包管理实战environment.systemPackages 选项与系统路径实现的深度解析NixOS 声明式包管理实战environment.systemPackages 选项与系统路径实现的深度解析 在 NixOS 中管理系统装了哪些软件有包管理器操作系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考