فا نیکسی

buildFHSEnv

buildFHSEnv روشی برای ساخت و اجرای یک محیط ایزوله (sandbox) سبک و سازگار با FHS ارائه می‌دهد. این ابزار یک سیستم‌فایل ریشه ایزوله همراه با /nix/store سیستم هاست ایجاد می‌کند، بنابراین ردپای آن از نظر فضای دیسک بسیار کوچک است. این موضوع به شما امکان می‌دهد نرم‌افزارهایی را اجرا کنید که پچ کردن آن‌ها برای NixOS دشوار یا غیرممکن است؛ برای نمونه، درخت‌های کد منبع شخص ثالث با فرض وجود FHS، بازی‌های توزیع‌شده به صورت فایل‌های tarball، نرم‌افزارهایی با بررسی یکپارچگی داده‌ها و/یا باینری‌های خارجی با قابلیت به‌روزرسانی خودکار. این ابزار از ویژگی namespaces لینوکس برای ایجاد محیط‌های سبک و موقتی استفاده می‌کند که پس از خروج تمام فرآیندهای فرزند از بین می‌روند، بدون اینکه به دسترسی‌های ویژه نیاز داشته باشند. این ابزار شبیه به فناوری‌های کنتینرسازی مانند Docker یا FlatPak عمل می‌کند اما هیچ جداسازی امنیتی نسبت به سیستم هاست ارائه نمی‌دهد.

آرگومان‌های قابل قبول عبارتند از:

  • name نام محیط.
  • pname مقدار pname محیط.
  • version نسخه محیط.
  • executableName نام فایل اجرایی wrapper. در صورت تنظیم، پیش‌فرض pname و در غیر این صورت name است.
  • targetPkgs بسته‌هایی که برای معماری اصلی هاست نصب می‌شوند (مثلاً x86_64 در نصب‌های x86_64). همراه با کتابخانه‌ها، باینری‌ها نیز نصب می‌شوند.
  • multiPkgs بسته‌هایی که برای تمام معماری‌های پشتیبانی‌شده توسط هاست نصب می‌شوند (مثلاً i686 و x86_64 در نصب‌های x86_64). به طور پیش‌فرض فقط کتابخانه‌ها نصب می‌شوند.
  • multiArch آیا multiPkgsهای ۳۲ بیتی در محیط‌های ۶۴ بیتی درون FHSEnv نصب شوند یا خیر
  • extraBuildCommands دستورات اضافی جهت اجرا برای نهایی‌سازی ساختار پوشه.
  • extraBuildCommandsMulti مانند extraBuildCommands، اما فقط در معماری‌های multilib اجرا می‌شود.
  • extraOutputsToInstall خروجی‌های اضافی derivation که باید برای هر دو بسته‌های هدف و چندمعماری پیوند داده شوند.
  • extraInstallCommands دستورات اضافی جهت اجرا برای نهایی‌سازی derivation با اسکریپت اجراکننده.
  • runScript یک دستور شل (Shell) که باید داخل محیط ایزوله (sandbox) اجرا شود. مقدار پیش‌فرض آن bash است. آرگومان‌های خط فرمان ارسالی به wrapper حاصل، به طور پیش‌فرض به این دستور پیوست می‌شوند. این دستور باید اسکیپ (escape) شود؛ مانند "foo app" --do-stuff --with "some file". بخش lib.escapeShellArgs را ببینید.
  • profile اسکریپت اختیاری برای /etc/profile درون محیط ایزوله.

می‌توانید با استفاده از یک shell.nix محیطی ساده به شکل زیر ایجاد کنید:

{
  pkgs ? import <nixpkgs> { },
}:

(pkgs.buildFHSEnv {
  name = "simple-x11-env";
  targetPkgs =
    pkgs:
    (with pkgs; [
      udev
      alsa-lib
      libx11
      libxcursor
      libxrandr
    ]);
  multiPkgs =
    pkgs:
    (with pkgs; [
      udev
      alsa-lib
    ]);
  runScript = "bash";
}).env

اجرای nix-shell روی آن، شما را وارد یک شل (Shell) درون یک محیط FHS می‌کند که در آن، آن کتابخانه‌ها و باینری‌ها در مسیرهای مطابق با FHS در دسترس هستند. برنامه‌هایی که انتظار ساختار FHS را دارند (یعنی باینری‌های انحصاری) می‌توانند بدون تغییر درون این محیط اجرا شوند. شما می‌توانید با اجرای باینری خود در runScript (برای مثال ./bin/start.sh) یک wrapper بسازید. مسیرهای نسبی همان‌طور که انتظار می‌رود کار می‌کنند.

علاوه بر این، سازنده (Builder) FHS تمام gsettings-schemas جابه‌جاشده را (که setup-hook مربوط به glib آن‌ها را به share/gsettings-schemas/${'{'}'{'{'}'{'}'}name{'{'}'{'}'}'{'}'}/glib-2.0/schemas منتقل می‌کند) به مکان استاندارد FHS آن‌ها پیوند می‌دهد. این بدان معناست که نیازی به کپسوله‌سازی باینری‌ها با قلاب wrapGApps* ندارید.