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* ندارید.