فا نیکسی

راه‌اندازی ساخت‌های توزیع‌شده

نیکس می‌تواند با پخش کردن کار روی چندین کامپیوتر به‌طور هم‌زمان، سرعت ساخت‌ها را افزایش دهد.

مقدمه

در این آموزش، یک ماشین ساخت مجزا را راه‌اندازی می‌کنید و ماشین محلی خود را به‌گونه‌ای پیکربندی می‌کنید که ساخت‌ها را به آن محول کند.

چه چیزی خواهید آموخت؟

شما یاد خواهید گرفت که چگونه:

  • یک کاربر جدید برای دسترسی ساخت راه دور از یک ماشین محلی به سازنده راه دور ایجاد کنید
  • سازنده‌های راه دور را با یک پیکربندی پایدار تنظیم کنید
  • اتصال و احراز هویت سازنده راه دور را آزمایش کنید
  • ماشین محلی را برای توزیع خودکار ساخت‌ها پیکربندی کنید

به چه چیزهایی نیاز دارید؟

  • آشنایی با زبان Nix

  • آشنایی با module-system-tutorial

  • یک ماشین محلی (مثال نام هاست: localmachine)

    کامپیوتری که Nix روی آن نصب شده است و ساخت‌ها را بین ماشین‌های دیگر توزیع می‌کند.

  • یک ماشین راه دور (مثال نام هاست: remotemachine)

    کامپیوتری که NixOS را اجرا می‌کند و کارهای ساخت را از ماشین محلی می‌پذیرد. برای راه‌اندازی یک سیستم NixOS راه دور، provisioning-remote-machines-tutorial را دنبال کنید.

چقدر زمان می‌برد؟

  • ۲۵ دقیقه

ایجاد یک جفت کلید SSH

دیمن Nix در ماشین محلی به عنوان کاربر root اجرا می‌شود و برای احراز هویت خود در ماشین‌های راه دور به فایل کلید خصوصی نیاز دارد. ماشین راه دور برای تشخیص ماشین محلی به کلید عمومی نیاز خواهد داشت.

روی ماشین محلی، دستور زیر را به عنوان root اجرا کنید تا یک جفت کلید SSH ایجاد شود:

# ssh-keygen -f /root/.ssh/remotebuild

نکته

نام و محل قرارگیری فایل‌های جفت کلید را می‌توان به دلخواه انتخاب کرد.

راه‌اندازی سازنده راه دور

در پوشه پیکربندی NixOS ماشین راه دور، فایل remote-builder.nix را ایجاد کنید:

{
  users.users.remotebuild = {
    isSystemUser = true;
    group = "remotebuild";
    useDefaultShell = true;

    openssh.authorizedKeys.keyFiles = [ ./remotebuild.pub ];
  };

  users.groups.remotebuild = {};

  nix.settings.trusted-users = [ "remotebuild" ];
}

فایل remotebuild.pub را در این پوشه کپی کنید.

این ماژول پیکربندی یک کاربر جدید به نام remotebuild بدون پوشه خانه ایجاد می‌کند. کاربر root روی ماشین محلی قادر خواهد بود با استفاده از کلید SSH تولیدشده‌ی قبلی، از طریق SSH به سازنده راه دور وارد شود.

ماژول جدید NixOS را به پیکربندی موجودِ ماشین راه دور اضافه کنید:

{
  imports = [
    ./remote-builder.nix
  ];

  # ...
}

پیکربندی جدید را به عنوان کاربر root فعال کنید:

nixos-rebuild switch --no-flake --target-host root@remotemachine

تست احراز هویت

مطمئن شوید که اتصال SSH و احراز هویت به درستی کار می‌کنند. روی ماشین محلی، به عنوان root اجرا کنید:

# ssh remotebuild@remotemachine -i /root/.ssh/remotebuild "echo hello"
hello

اگر پیام hello قابل مشاهده باشد، احراز هویت بهران انجام شده است.

این ورود آزمایشی همچنین کلید هاست سازنده راه دور را به فایل /root/.ssh/known_hosts ماشین محلی اضافه می‌کند. ورودهای بعدی توسط بررسی‌های کلید هاست متوقف نخواهند شد.

راه‌اندازی ساخت‌های توزیع‌شده

نکته

اگر ماشین محلی شما NixOS را اجرا می‌کند، از این بخش صرف‌نظر کنید و Nix را از طریق گزینه‌های ماژول پیکربندی کنید.

Nix را به عنوان کاربر root با افزودن موارد زیر به فایل پیکربندی Nix پیکربندی کنید تا از سازنده راه دور استفاده کند:

# cat << EOF >> /etc/nix/nix.conf
builders = ssh-ng://remotebuild@remotebuilder $(nix-instantiate --eval -E builtins.currentSystem) /root/.ssh/remotemachine - - nixos-test,big-parallel,kvm
builders-use-substitutes = true

توضیح مفصل خط اول ماشین راه دور را به عنوان یک سازنده راه دور با مشخص کردن موارد زیر ثبت می‌کند:

برای جزئیات بیشتر، مستندات مرجع مربوط به تنظیمات builders را ببینید.

خط دوم به تمام سازندگان راه دور دستور می‌دهد که وابستگی‌ها را به جای ماشین محلی، از کش‌های باینری خودشان دریافت کنند. این فرض در نظر گرفته می‌شود که سرعت اتصال به اینترنت سازندگان راه دور حداقل به اندازه سرعت اتصال به اینترنت ماشین محلی است.

برای فعال کردن این پیکربندی، خدمت پس‌زمینه Nix را مجدداً راه‌اندازی کنید:

Linux در لینوکس با systemd، به عنوان کاربر root اجرا کنید:

# systemctl restart nix-daemon.service

macOS در macOS، به عنوان root اجرا کنید:

# sudo launchctl stop org.nixos.nix-daemon
# sudo launchctl start org.nixos.nix-daemon

اگر ماشین محلی شما NixOS را اجرا می‌کند، در پوشه پیکربندی آن، فایل distributed-builds.nix را ایجاد کنید:

{ pkgs, ... }:
{
  nix.distributedBuilds = true;
  nix.settings.builders-use-substitutes = true;

  nix.buildMachines = [
    {
      hostName = "remotebuilder";
      sshUser = "remotebuild";
      sshKey = "/root/.ssh/remotebuild";
      system = pkgs.stdenv.hostPlatform.system;
      supportedFeatures = [ "nixos-test" "big-parallel" "kvm" ];
    }
  ];
}

توضیح تفصیلی این ماژول پیکربندی، بیلدهای توزیع‌شده را فعال کرده و سازنده راه دور را اضافه می‌کند و موارد زیر را مشخص می‌کند:

برای جزئیات بیشتر، به مستندات گزینه NixOS درمورد nix.buildMachines مراجعه کنید.

گزینه builders-use-substitutes به تمام سازنده‌های راه دور دستور می‌دهد تا به‌جای دریافت وابستگی‌ها از ماشین محلی، آن‌ها را از کش‌های باینری خودشان دریافت کنند. این فرض را در نظر می‌گیرد که اتصال اینترنت سازنده‌های راه دور حداقل به سرعت اتصال اینترنت ماشین محلی است.

ماژول جدید NixOS را به پیکربندی ماشین موجود اضافه کنید:

{
  imports = [
    ./distributed-builds.nix
  ];

  # ...
}

پیکربندی جدید را به عنوان root فعال کنید:

# nixos-rebuild switch

تست بیلدهای توزیع‌شده

تلاش برای ساخت یک درایویشن جدید روی ماشین محلی:

$ nix-build --max-jobs 0 -E "$(cat << EOF
(import <nixpkgs> {}).writeText "test" "$(date)"
EOF
)"
this derivation will be built:
  /nix/store/9csjdxv6ir8ccnjl6ijs36izswjgchn0-test.drv
building '/nix/store/9csjdxv6ir8ccnjl6ijs36izswjgchn0-test.drv' on 'ssh://remotebuilder'...
copying 0 paths...
copying 1 paths...
copying path '/nix/store/hvj5vyg4723nly1qh5a8daifbi1yisb3-test' from 'ssh://remotebuilder'...
/nix/store/hvj5vyg4723nly1qh5a8daifbi1yisb3-test

درایویشن حاصل با هر بار فراخوانی تغییر می‌کند؛ زیرا به زمان فعلی سیستم وابسته است و بنابراین هرگز نمی‌تواند در کش محلی وجود داشته باشد. آرگومان خط فرمان --max-jobs 0 باعث می‌شود Nix آن را روی سازنده راه دور بسازد.

آخرین خط خروجی حاوی مسیر خروجی است و نشان می‌دهد که توزیع ساخت همان‌طور که انتظار می‌رود کار می‌کند.

بهینه‌سازی پیکربندی سازنده راه دور

برای به حداکثر رساندن موازی‌سازی، فعال کردن جمع‌آوری زباله (garbage collection) خودکار، و جلوگیری از مصرف تمام حافظه توسط ساخت‌های Nix، خطوط زیر را به ماژول پیکربندی remote-builder.nix خود اضافه کنید:

 {
   users.users.remotebuild = {
     isNormalUser = true;
     createHome = false;
     group = "remotebuild";

     openssh.authorizedKeys.keyFiles = [ ./remotebuild.pub ];
   };

   users.groups.remotebuild = {};

-  nix.settings.trusted-users = [ "remotebuild" ];
+  nix = {
+    nrBuildUsers = 64;
+    settings = {
+      trusted-users = [ "remotebuild" ];
+
+      min-free = 10 * 1024 * 1024;
+      max-free = 200 * 1024 * 1024;

+      max-jobs = "auto";
+      cores = 0;
+    };
+  };

+  systemd.services.nix-daemon.serviceConfig = {
+    MemoryAccounting = true;
+    MemoryMax = "90%";
+    OOMScoreAdjust = 500;
+  };
}

راهنمایی

برای کسب اطلاعات بیشتر درباره گزینه‌های موجود در nix.settings، به راهنمای مرجع Nix مراجعه کنید.

سازنده‌های راه دور می‌توانند ویژگی‌های عملکردی متفاوتی داشته باشند. برای هر مورد در nix.buildMachines، صفت‌های maxJobs، speedFactor و supportedFeatures را برای هر سازنده راه دور به درستی تنظیم کنید. این کار به Nix روی ماشین محلی کمک می‌کند تا ساخت‌ها را بهینه‌ترین شکل ممکن توزیع کند.

راهنمایی

برای جزئیات بیشتر به مستندات گزینه NixOS درباره nix.buildMachines مراجعه کنید.

فیلد nix.buildMachines.*.publicHostKey را روی کلید هاست عمومی هر سازنده راه دور تنظیم کنید تا توزیع ساخت در برابر سناریوهای حمله مرد میانی ایمن شود.

گام‌های بعدی

برای راه‌اندازی چندین سازنده، دستورالعمل‌های بخش set-up-remote-builder را برای هر سازنده راه دور تکرار کنید. تمام سازنده‌های راه دور جدید را به صفت nix.buildMachines که در بخش set-up-distributed-builds نشان داده شده است، اضافه کنید.

راهنمایی

ماشین‌های ساخت راه دور را به گونه‌ای پیکربندی کنید که میزبانی یک کش باینری را بر عهده داشته باشند و از آن‌ها به عنوان کش‌های باینری ترجیحی برای کاهش ترافیک خارجی خود استفاده کنید.

جایگزین‌ها

  • nixbuild.net - سازنده‌های راه دور Nix به عنوان یک سرویس
  • Hercules CI - ادغام مداوم با توزیع خودکار ساخت
  • garnix - ادغام مداوم میزبانی‌شده با توزیع ساخت

مراجع

nix.dev/tutorials/nixos/distributed-builds-setup

نیکسی · یادداشت‌های فارسی Nix local fonts