ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

比Arch还难装的Linux发行版:Gentoo、NixOS与LFS深度对比

比Arch还难装的Linux发行版:Gentoo、NixOS与LFS深度对比 很多人聊到 Linux 发行版的安装难度张口就是 Arch Linux 怎么怎么折腾仿佛装过一遍 Arch 就算通关了。我前几年也是这么想的直到我实在闲得慌把 Gentoo、NixOS 和 Linux From ScratchLFS各完整装了不止一遍之后才敢说一句实话Arch 那套流程充其量算“轻度 DIY”真正让人头皮发麻的是下面要说的这三位。这篇文章不打算劝退谁也不是晒痛苦。我就想从安装和维护两个维度把这几个系统到底难在哪、为什么难、以及有没有办法少吃点苦掰开揉碎讲清楚。不管你是刚接触 Linux 的新手还是已经在用 Arch 自我折磨了一段时间的老伙计看完应该都能明白一件事难度这种东西分很多种有的难在操作有的难在思维方式有的难在根本没有捷径。1. 先把 Arch 从“地狱难度”的神坛上拉下来1.1 Arch 的“难”更多是自由带来的陌生感Arch 的安装难难在它不给图形安装器让你手动分区、手动挂载、手动写引导。但只要照着 wiki 一步步来其实没有哪个步骤是真正无法逾越的障碍。archinstall脚本出现之后连基础安装都可以半自动完成你只需要在菜单里选一选内核、文件系统、桌面环境。很多人觉得 Arch 难是因为第一次上手时对 Linux 的启动流程、分区表、引导程序这些概念没什么概念。一旦你搞清楚fdisk、mkfs.ext4、mount、arch-chroot分别干了什么Arch 的安装本质就是“把一个二进制系统装进硬盘然后自己设定启动方式”。它再怎么说用的也是现成的pacman软件包装完就能跑不需要你亲手编译。真正让 Arch 显得“硬核”的是它的 DIY 哲学从内核参数到桌面组件全要自己选。但这种选择不构成技术壁垒数据库级的依赖解析、二进制的软件包格式已经帮你省掉了 80% 的麻烦。1.2 安装难和维护难其实是两回事在比较三个比 Arch 更难的系统之前得先建立一套评判维度。我实际折腾下来觉得“难”至少要分成四类安装投入的时间、包管理的工作方式、升级时翻车的概率以及思维方式需要做出的转变。维度Arch LinuxGentooNixOSLinux From Scratch安装耗时30 分钟到 2 小时半天起步1 到 3 小时一整天到好几天软件包形态二进制包为主全部源码编译二进制包加缓存全部源码手工编译依赖管理pacman 自动解析Portage 自动但受 USE 影响Nix 自动且可回滚完全没有升级风险中等AUR 可能出问题高USE 变化会引发连锁重建低可回滚到旧版本极高经常升级一次就废概念门槛一般贴近传统 Linux需要懂编译和依赖机制需要接受声明式系统需要完整理解工具链从这张表能看出Arch 是“看起来烦实际有条理”而接下来要盘点的这三款各有各的“反人类”之处而且全都是在维护阶段才开始真正发力的。2. 真正难到让我自闭的三位选手2.1 Gentoo如果你有耐心在编译中度过一生Gentoo 和 Arch 一样是滚动发行版但它的包管理走的是源码路线。安装的时候先下载一个 stage3 基础镜像解压到分区里然后 chroot 进去配置/etc/portage/make.conf写清楚 CPU 指令集、编译线程数、USE 标记接着用emerge命令把整个系统重新编译一遍最后还要自己编译内核。这个流程意味着你安装的不是一个“开箱即用的系统”而是一堆源代码和一份构建计划。USE 标记是 Gentoo 的灵魂也是很多人的噩梦。改一个全局 USE 标记比如给某个软件加上vulkan支持Portage 会自动检查依赖关系然后把所有相关的包重新编译一遍。我的机器编译一个完整系统大概四五个小时这还只是安装到后期维护时一次日常更新可能就会触发几十个包的源码重编。最要命的是依赖冲突。当两个包互相要求不同的 USE 组合时Portage 会抛出一堆 block 信息你得手工去写package.accept_keywords、package.use、package.mask而不是像 Arch 那样直接pacman -Syu完事。Gentoo 的难是那种让你觉得“我明明照做了为什么还要再编一遍”的难。2.2 NixOS不是操作难是世界观难NixOS 在安装阶段反而比 Arch 轻松。你用nixos-generate-config生成一个基础配置改一改分区挂载和网络设置然后nixos-install一路执行系统就装好了整个过程可能只需要一两个小时。但别高兴太早真正的坎在安装完之后。NixOS 的核心是“声明式系统”——你不直接修改/etc下的配置文件而是在/etc/nixos/configuration.nix里声明整个系统的目标状态然后运行nixos-rebuild switch让系统严格按照声明生成。这个思路和传统的 Linux 管理方式完全不同以前你改一个sshd_config重启服务就行在 NixOS 里你得理解 Nix 这门函数式配置语言知道怎么写services.sshd.enable true再把整个配置重新构建一次。维护 NixOS 的时候你还会接触到 generation 这个概念。每次switch都会生成一个新的“世代”系统状态就像 Git 提交一样被记录下来。出问题可以回滚这是它最大的优点但如果你想临时改个文件、调试个服务却会发现文件系统里很多东西是只读的符号链接指向 nix store 里的哈希目录手动改完重启就被覆盖。这种“绕不开的声明式约束”才是 NixOS 劝退大多数人的真正原因。2.3 LFS严格说它不是发行版却是最难的无冕之王Linux From Scratch一般缩写为 LFS严格意义上不叫发行版它是一份教你从零开始组装 Linux 系统的文档。没有安装器没有包管理器你需要自己去下载内核源码、GCC、binutils、glibc 等一大堆软件包然后按章节手工编译、安装、配置。LFS 的安装过程就像修一门“计算机系统原理”的实验课先分区挂载再建立一个临时工具链第一遍编译 binutils 和 gcc 只是为了构造一个隔离环境然后 chroot 进去重新构建一遍真正的工具链再依次编译基础库最后编译内核、安装 GRUB 引导程序。任何一个版本的细微差别或者编译参数写错都会导致后面某个步骤出现玄学报错。维护 LFS 更是离谱因为它连依赖管理都得自己手工完成。想升级一个软件你得先搞清楚它依赖哪些库再一个个处理。我折腾 LFS 最大的感受是其他系统崩溃是因为某个 bugLFS 崩溃往往是因为你动了某个不该动的库而系统没有任何自动工具来告诉你“这个库不能单独升级”。3. 安装阶段的真实体感跑一次就知道差距3.1 顺着 Arch 的安装流程看 Gentoo 多出来的工作量Arch 的基础安装只需要几条命令先分区挂载然后pacstrap /mnt base linux linux-firmware生成 fstab 后arch-chroot /mnt进去配置时区、语言、密码和引导程序。这一套做完重启就是一个可以进命令行的系统。Gentoo 的流程开头还比较像但分区分完、stage3 解压完、chroot 进去之后画风就变了。你要先运行emerge-webrsync同步软件仓库再用mirrorselect选择镜像源还要打开/etc/portage/make.conf配置CFLAGS、MAKEOPTS和USE。接着需要eselect profile list选一个配置文件再emerge --ask --update --deep --newuse world把整个基础系统重新编译一遍。这一步一旦开始就要看机器性能吃饭了。编译玩不要紧紧接着还要编译内核。你可以直接emerge gentoo-sources然后cd /usr/src/linux配置内核选项、make make modules_install make install。整个过程中最让人心累的不是命令多而是很多选择是有多重选项的你选了 A 方案后面就可能要处理 A 方案带来的副作用。3.2 NixOS 的安装反差太快快得心里没底NixOS 安装会给你一种“就这”的错觉。你得先用parted或fdisk分区挂载好以后运行nixos-generate-config --root /mnt它会自动检测文件系统、网络设备和硬件信息生成一份包含基础配置的configuration.nix。接下来你只需要在配置文件里改一改用户、网络和桌面环境然后执行nixos-install。命令少不代表理解成本低。我记得第一次装的时候看到configuration.nix里用缩进和属性列表表示配置整个人是懵的。为什么boot.loader.grub.device /dev/sda要用等号为什么会有一个叫system.stateVersion的东西这些概念在 Arch 的安装流程里根本不会出现。NixOS 的安装过程说白了就是“用模板先生成一个配置然后让系统自动化运行”但模板背后的声明式模型才是真正需要花时间啃的东西。3.3 LFS 的安装每一步都是一道题LFS 的安装没有捷径。官方手册会把整个过程拆成几十个章节每个章节都在告诉你下载哪个压缩包、执行什么编译命令、检查哪些输出结果。单看每一步都不难难的是任何一步的校验结果不符合预期你都很难判断到底是命令敲错了还是依赖关系缺了。举个例子构建临时工具链时第一遍编译 binutils需要确认ld程序是否带上了正确的搜索路径。如果你漏掉了某个配置参数第二遍编译 GCC 时就会报“找不到头文件”之类的错误而这种错误一般不会直接告诉你“你上一章的 binutils 编坏了”只会让你对着日志发呆。LFS 后续还需要手动绑定挂载/proc、/sys、/dev到 chroot 环境少挂一个后面的编译可能就会出现诡异的权限或设备访问错误。我用主力机折腾 LFS 的时候前后花了两天才进到一个能登录的纯命令行系统。那个过程最大的收获是搞懂了 Linux 的启动链路内核、init、glibc、bash 到底是怎么协作的但如果你只是想快速得到一个自用系统这种“修行式”的安装体验很可能直接把你劝退。4. 维护才真正拉开差距4.1 pacman -Syu 的便利是相对的Arch 的日常维护本质上就是运行pacman -Syu同步更新系统。虽然偶尔会遇到内核更新、引导程序版本变化之类的问题但绝大多数情况下pacman 的依赖解析能把事情理顺出问题也有arch-chroot和 wiki 兜底。我在 Arch 上踩的坑大多来自 AUR 里的第三方软件包只要用yay这类工具多留个心眼整体可控。但当你习惯了这种“更新一下世界继续转”的模式再切到 Gentoo 或 LFS心理落差会非常大。尤其是源码编译型系统一次更新不再是一两分钟下载完二进制包而是要看着终端里一屏一屏的输出等上几个小时甚至一整晚。4.2 Gentoo 更新一次 USE 改动引发的“连锁反应”Gentoo 的维护命令其实不复杂emerge --sync同步仓库然后emerge -uDN world升级整个世界。复杂的是升级过程里随时可能出现的依赖变化。我有一回只是想在某个软件里加一个功能顺手改了一个全局 USE 标记结果 Portage 告诉我有一百多个包需要重新编译磁盘剩余空间还不够缓存最后只能临时把MAKEOPTS调低、换了个大分区才算跑完。更折磨人的是依赖冲突block。Portage 会提示某个包被另两个包同时要求而且要求的版本还不一样这时候你需要手工做决定是给某个包添加package.accept_keywords还是用package.mask屏蔽掉其中一个版本。每一步都必须想清楚否则编译到一半才发现冲突没解决浪费的时间全白费。所以 Gentoo 的维护难点并不在于命令本身而在于你时刻要维护一个“依赖关系脑内图景”。这也是为什么很多 Gentoo 用户会把/etc/portage目录整个备份到版本控制里——硬件换了无所谓但依赖决策丢了才是真的难受。4.3 NixOS 的配置漂移和回滚双刃剑NixOS 的维护可以用nixos-rebuild switch --upgrade一句话概括。升级后系统会生成一个新的 generation如果新配置导致你进不了桌面重启时在引导菜单里选上一个 generation 就能回到可用状态。这个回滚能力比 Arch 和 Gentoo 都强因为它是系统级别的“后悔药”。但问题在于回滚是建立在“你理解每个 generation 干了什么”这个前提上的。如果你一晚上连续改了多次配置、多次 switch最后发现显示器输出信号没有了你很难精确地知道该回滚到哪一步。更麻烦的是NixOS 的很多系统路径是只读的你不能随便在/etc底下放一个自定义脚本然后指望它永远生效你需要把它写进configuration.nix重新 switch 才有效。这种“所有改动都要走声明式流程”的做法对习惯手动调系统的人来说适应成本极高。4.4 LFS你本身就是包管理器LFS 的维护思路一句话自己看着办。官方手册里没有“升级软件包”这一节因为 LFS 是一个用来学习的系统不是用来长期服役的系统。你想升级 bash、glibc、openssl 之类的核心软件得先去查它依赖哪些库和编译工具然后逐个编译安装还要小心不要覆盖掉正在运行的程序文件。我见过不少人把 LFS 装完之后直接把它当“展示品”平时用 Arch 或者 Debian 做主力机。原因很简单LFS 没有一个包管理器来告诉你“你升级的这个库会被哪些程序使用”一旦升级了某个 ABI 不兼容的库整个系统里的二进制可能全都跑不起来你只能靠备份或者重新构建工具链来救援。这种维护方式已经超出了“管理软件”的范畴更像是在维护一个小型发行版。5. 常见翻车现场与排查技巧实录5.1 高频问题速查表下面这些坑基本是我自己踩过或者看朋友踩过的按发行版分类整理出来供参考系统典型症状排查思路避坑经验Gentoo编译时提示undefined reference先看依赖是否完整再检查 USE 组合用emerge -pv预览依赖树再动手Gentoo编译中途内存不足被 kill临时调低MAKEOPTS线程数增加 swap大包编译前预留足够磁盘空间NixOSnixos-rebuild switch后没有网络检查配置里 NetworkManager 是否开启首次配置就把网络工具加入systemd.networkNixOS桌面进不去重启后还是失败在引导菜单选择上一代 generation 回滚大改动前先nixos-rebuild dry-runLFSchroot 里运行程序提示No such file or directory检查动态链接器路径是否正确重建工具链时严格按手册校验LFS重启后 GRUB 找不到内核检查/boot挂载和 root 参数安装内核后确认/boot/vmlinuz*存在5.2 保命心得第一Gentoo 的/var/lib/portage/world文件一定要定期备份里面记录了你要安装的“世界软件集合”丢了它系统看起来还在但 Portage 就不知道你到底想要什么了。我一般会把整个/etc/portage目录丢进 Git 仓库改一个标记、加一个 keyword 都留档。第二NixOS 再怎么急也不要跳过nixos-rebuild build或者dry-run直接 switch。我在一个生产环境上演示配置拆分时就因为少写了一个括号导致桌面模块加载失败惨痛教训。先构建、后切换能省掉大量回滚时间。第三LFS 第一次构建时不要试图“优化”书里的命令。很多人都觉得可以少编几遍工具链或者跳过某个验证步骤结果后面遇到问题都不知道是哪儿埋的雷。按部就班走一遍比反复试错要快得多。6. 到底谁适合碰这些东西6.1 人群画像适合 Gentoo 的是那种对软件依赖关系有强烈好奇心、愿意看到系统完全按自己需求定制的人。它最迷人的地方在于所有东西都能通过 USE 标记和编译选项精确控制。适合 NixOS 的是正在做开发环境管理、需要可复现构建、喜欢用“代码描述一切”的工程师。它能让你的开发环境像项目仓库一样被管理和分享。适合 LFS 的是想把 Linux 启动流程、工具链、动态链接这些底层机制彻底搞懂的学生和极客。装一次 LFS比看十遍教程都管用。不适合这三者的是那些只是想快点开个浏览器、写个文档、跑个服务的普通用户。浪费时间在这上面不如装个开箱即用的发行版把精力留给自己的正事。6.2 我的个人建议我自己现在的分工是日常主力用 Arch 或 Debian 系稳定省心想研究系统底层时开一台虚拟机装 Gentoo 或者 LFS在里面随便折腾坏了删掉重来。NixOS 我更多把它当成一个“配置工具”来用适合管理服务器和统一定制环境但没必要强行当入门系统。如果你已经在用 Arch并且觉得没什么挑战了我建议从 Gentoo 开始而不是直接跳 LFS。Gentoo 能让你体会“从源码构建”的滋味同时还有一个相对成熟的包管理工具帮你兜底LFS 是终极副本适合当作学期项目一样慢慢啃不适合拿来当日常系统。反正我折腾完这三样之后再回看 Arch感觉安装 Linux 已经没有所谓的“难”只有“你愿不愿意花时间去理解”。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进