永远不要使用NixOS

2021-01-23 21:17:26

我将从关于NixOS的最大神话开始。很快您就会知道为什么。

对DevOps友好。声明性的规范和安全的升级使NixOS成为DevOps使用的出色系统。 NixOS云部署工具NixOps允许您在Amazon EC2和VirtualBox等环境中配置和管理NixOS计算机网络。 (c)NixOS.org

每当我遇到一项新的怪异而富挑战性的任务时,我都会不断更新本文,如果您使用的是NixOS而不是传统的Linux发行版,则会使您的生活变得更加艰难。

好吧,我是个幸运的人……我现在别无选择,必须将大部分工作时间都花在NixOS自动化上。到目前为止,我已有10多年使用不同Linux发行版的经验,以及超过6个月的NixOS经验。而且我在NixOS上的大部分经历都是糟糕的经历。

我会在这里尝试写些东西。希望,我能够...

系统设计声明并提供给您,您将从该衍生版本中获得任何软件包的相同版本。谎言!

它所具有的确定性就是确定性地给您带来许多问题,您需要在没有任何支持的情况下手动解决这些问题。

例如,您可以在Linux和OS X上安装Nix工具。但是,它并不总是在Linux和NixOS本身上构建相同的推导结果。因此,它与操作系统无关。此类行为的例子很多,例如fetchgit和fetchFromGitHub函数:

同时,在当前最新版本的官方手册-18-09-1373-50fb6820759中,他们仍在使用fetchgit。

在这里,我将把我所有的日常痛苦集中在一个地方,希望这可以帮助人们不要犯别人的错误。这是我对问题空间的个人看法,不能与我现在正在工作的公司或项目有任何关系。

当然,有很多发烧友通过在虚拟机的工作站上安装NixOS来玩,但是与Ubuntu,CentOS,Debian或RedHat相比:

官方文档太糟糕了。或者只是不存在。 NixOS比Docker更旧。他们正在解决相同的任务,但是NixOS不太受欢迎。试着想为什么。

NIX配置语言它是功能语言,名称也叫Nix,它是此系统配置的核心。如果您来自OOP世界,那么很难理解这种“语言”。您必须吞咽Nix药丸,甚至试图了解它。

软件管理“派生”是描述NixOS中软件分发的一种方式。每个派生表示软件,插件或库。描述它的通用语法如下所示(nginx派生示例):

{stdenv,fetchurl,openssl,zlib,pcre,libxml2,libxslt,gd,geoip和withDebug?假,withStream?是的,withMail?错误,模块? [],版本,sha256,...}:带有stdenv .lib; stdenv .mkDerivation {name =" nginx- $ {version}&#34 ;; src = fetchurl {url =" https://nginx.org/download/nginx- $ {version} .tar.gz&#34 ;;继承sha256; }; buildInputs = [openssl zlib pcre libxml2 libxslt gd geoip] ++ concatMap(mod:mod .inputs或[])模块; configureFlags = ["-with-http_ssl_module" "-with-http_v2_module" "-with-http_realip_module" "-with-http_addition_module" "-with-http_xslt_module" "-with-http_geoip_module" "-with-http_sub_module" "-with-http_dav_module" "-with-http_flv_module" "-with-http_mp4_module" "-with-http_gunzip_module" "-with-http_gzip_static_module" "-with-http_auth_request_module" "-with-http_random_index_module" "-with-http_secure_link_module" "-with-http_degradation_module" "-with-http_stub_status_module" "-带线程" "-with-pcre-jit" #安装目标问题#"-with-http_perl_module" ] ++可选withDebug ["-with-debug" ] ++可选withStream ["-with-stream" "-with-stream_geoip_module" "-with-stream_realip_module" "-with-stream_ssl_module" "-with-stream_ssl_preread_module" ] ++可选withMail ["-with-mail" "-with-mail_ssl_module" ] ++可选(gd!= null)"-with-http_image_filter_module" ++可选(带有stdenv .hostPlatform; isLinux || isFreeBSD)"-with-file-aio" ++ map(mod:"-add-module = $ {mod .src}")模块; NIX_CFLAGS_COMPILE = [" -I $ {libxml2 .dev} / include / libxml2" ] ++可选stdenv .isDarwin" -Wno-error = deprecated-declarations&#34 ;; preConfigure =(concatMapStringsSep" \ n"(mod:mod .preConfigure或"")模块); hardeningEnable =可选(!stdenv .isDarwin)" pie&#34 ;; enableParallelBuilding = true; postInstall ='' mv $ out / sbin $ out / bin'&#39 ;; meta = {description ="反向代理和轻量级Web服务器&#34 ;;主页= http://nginx.org;许可证=许可证.bsd2;平台=平台.all;维护者=与维护者一起; [thinkpolice raskin fpletz]; };}

如果是,请做好准备,否则您将无法在系统中生存,而无需编写类似的代码。 Nix Packages GitHub存储库将是您的第二个家,您将在其中查找Nix表达式,配置方法和其他示例。

系统状态和配置在特殊文件configuration.nix中描述。这就像是您的操作系统无穷无尽的功能和依赖关系的切入点。

要自定义操作系统中的某些内容,请准备好,您需要编写自定义的systemd服务来完成此操作。 Aaand,是的,还需要使用Nix表达式语言声明服务配置文件。

例如,所有标准系统配置文件(例如/ etc / fstab)都是由奇怪的代码生成的,并且是只读的。

不能仅将内核从“ ver1”升级到“ ver2”。新内核将带来整套系统软件包及其依赖性。不知道它是否安全。即将测试。

Nix还没有准备好云。完全没有在NixOS 18.03上,我总是遇到以下情况:

NixOS 18.03在启动时并不总是能够调整硬盘的大小。

甚至不要尝试在Auto Scaling组中使用它,并通过用户数据传递configuration.nix内容。您可能会很容易陷入循环,当实例在启动过程中开始从派生版本构建新内容时,100%的CPU利用率将要求AutoScaling Group启动也会创建内容的其他实例,所有实例都不正常,而Auto Scaling组将开始在循环中终止第一个实例。您的服务将永远不会开始。

为了加快NixOS中的软件安装速度,社区为您提供了Nix Binary Cache,他们将成功构建的所有内容放入其中。每个派生的每个版本。

当您增加个人缓存时,就会开始出现问题,例如,用于存储专有构建工件的个人缓存。您始终需要密切注意用作构建基础的社区频道版本。是的,您自己的缓存大小也会非常快!

一些非常有才华的开发人员开始使用Nix二进制缓存来缓存所有可能的内容。例如NPM或Yarn包。祝好运!

人们认为,NixOS确定性的软件处理方法非常安全。也许是的,一旦派生bin生成,就不可能劫持生成结果。但是...您总是需要为此付出代价...

在从18.03升级到18.09的过程中,Nix社区决定更改已用于处理Docker映像的派生校验和的Docker工具。

结果,我们重写了所有基于Docker的派生声明,并重新构建了所有声明。 这确实是痛苦且不受管理的迁移。 它需要大量的CPU能力来构建它的内容,并且确实需要大量空间来存储其多个版本。 远远超出了传统Linux发行版中所需要的。 而且,天哪,请勿尝试在Docker中运行Nix! 真的,不是,真的是个坏主意! 当您尝试总结您想在帖子中涉及的主题的所有想法时,您将从简单的Google搜索开始。 我的“ nixos优缺点”查询的结果之一:NixOS替代品。 有点开玩笑,但实际上,当您决定投资时间或金钱时,请三思。 我还要三思而后行为什么向我建议。 链接在上一段中。 您的选择是传统的Linux和Docker! 是的,您将获得相同的确定性和安全性结果,而痛苦和乐趣却多得多。