بهروزرسانیهای قابل اعتماد و اتمی
مدل مبتنی بر سورس با کش باینری
دستور nix-env: یک راهنمای جامع با مثالها
توزیع NixOS
NixOS یک توزیع لینوکس آزاد و متنباز است که بر پایه مدیر بستهی Nix ساخته شده است. NixOS از طراحی ایمنناپذیر (immutable) و مدل بهروزرسانی اتمی استفاده میکند. استفاده از سیستم پیکربندی توصیفی (declarative) امکان تکرارپذیری و قابلیت انتقال را فراهم میکند. NixOS با استفاده از ماژولهای ترکیبی پیکربندی میشود و به بستههایی که در پروژه Nixpkgs تعریف شدهاند، وابسته است. دستورالعملها و پیکربندیهای بستهها با زبان اختصاصی “Nix” نوشته میشوند که همراه با مدیر بستهی Nix عرضه میشود.
تاریخچه
این بخش نیاز به گسترش دارد. شما میتوانید با افزودن به آن کمک کنید. (دسامبر ۲۰۲۳) در سال ۲۰۰۳، Eelco Dolstra پروژه Nix را بهعنوان یک پروژه تحقیقاتی آغاز کرد. Dolstra میگوید هدف از این پروژه دستیابی به سیستمی برای استقرار صحیح نرمافزار بوده است. تأثیرات او شامل Eelco Visser بود که در دانشگاه اوترخت بر روی پایاننامه دکترای او نظارت داشت. در سال ۲۰۰۶، Armijn Hemel NixOS را بهعنوان نتیجه پایاننامه کارشناسی ارشد خود در اوترخت ارائه کرد. در سال ۲۰۱۵، بنیاد NixOS در هلند تأسیس شد با هدف حمایت از پروژههایی مانند NixOS که مدل استقرار کاملاً تابعی را اجرا میکنند.
مقدمه ای بر Nix و NixOS
Nix یک مدیر بسته اعلامی است که به کاربران امکان می دهد وضعیت سیستم مورد نظر را در فایل های پیکربندی (پیکربندی اعلامی) اعلام کنند و مسئولیت دستیابی به آن وضعیت را بر عهده می گیرد.
به عبارت ساده، “پیکربندی اعلامی” به این معنی است که کاربران فقط باید نتیجه مورد نظر را اعلام کنند. به عنوان مثال، اگر اعلام کنید که میخواهید مدیریت پنجره i3 را با sway جایگزین کنید، Nix به شما در دستیابی به این هدف کمک میکند. لازم نیست نگران جزئیات اساسی باشید، مانند اینکه کدام بستهها برای نصب نیاز دارند، کدام بستههای مربوط به i3 باید حذف شوند، یا تنظیمات لازم برای پیکربندی سیستم و متغیرهای محیطی برای sway. Nix به طور خودکار این جزئیات را برای کاربر مدیریت می کند (به شرطی که بسته های Nix مربوط به sway و i3 به درستی طراحی شده باشند).
NixOS، یک توزیع لینوکس که بر روی مدیر بسته Nix ساخته شده است، می تواند به عنوان “OS به عنوان کد” توصیف شود. از فایل های پیکربندی اعلامی Nix برای توصیف کل وضعیت سیستم عامل استفاده می کند.
یک سیستم عامل از بسته های نرم افزاری مختلف، فایل های پیکربندی و داده های متنی/دودویی تشکیل شده است که همگی نشان دهنده وضعیت فعلی سیستم هستند. پیکربندی اعلانی می تواند تنها بخش استاتیک این حالت را مدیریت کند. دادههای پویا، مانند دادههای PostgreSQL، MySQL، یا MongoDB را نمیتوان به طور مؤثر از طریق پیکربندی اعلامی مدیریت کرد (حذف تمام دادههای PostgreSQL جدید که در پیکربندی در طول هر استقرار اعلام نشدهاند، امکانپذیر نیست). بنابراین، NixOS در درجه اول بر مدیریت بخش ایستا از وضعیت سیستم به شیوه ای اعلامی تمرکز می کند. دادههای پویا، همراه با محتویات فهرست اصلی کاربر، هنگام بازگشت به نسل قبلی، تحت تأثیر NixOS قرار نمیگیرند.
اگرچه ما نمی توانیم به قابلیت تکرارپذیری کامل سیستم دست یابیم،/خانهدایرکتوری که یک دایرکتوری مهم کاربر است، حاوی بسیاری از فایل های پیکربندی ضروری است –Dotfiles. یک پروژه اجتماعی مهم به ناممدیر خانهبرای مدیریت بستههای سطح کاربر و فایلهای پیکربندی در فهرست اصلی کاربر طراحی شده است.
با توجه به ویژگیهای Nix، مانند بیانی و تکرارپذیر بودن، Nix به مدیریت محیطهای دسکتاپ محدود نمیشود، بلکه به طور گسترده برای مدیریت محیطهای توسعه، محیطهای کامپایل، ماشینهای مجازی ابری و ساخت تصویر کانتینر استفاده میشود.NixOps(یک پروژه رسمی Nix) وکلمنا(یک پروژه اجتماعی) هر دو ابزار عملیاتی مبتنی بر Nix هستند.
چرا NixOS؟
من اولین بار چندین سال پیش در مورد مدیر بسته Nix یاد گرفتم. از زبان Nix برای توصیف پیکربندی سیستم استفاده می کند. NixOS، توزیع لینوکس که در بالای آن ساخته شده است، امکان بازگرداندن سیستم را به هر حالت قبلی فراهم میکند (اگرچه فقط وضعیت اعلام شده در فایلهای پیکربندی Nix قابل برگشت است). در حالی که به نظر چشمگیر به نظر می رسید، یادگیری یک زبان جدید و نوشتن کد برای نصب بسته ها برایم مشکل بود، بنابراین در آن زمان آن را دنبال نکردم.
با این حال، اخیراً در حین استفاده از EndeavourOS با مسائل زیست محیطی متعددی مواجه شدم و حل آنها مقدار قابل توجهی از انرژی من را مصرف کرد و من را خسته کرد. پس از بررسی دقیق، متوجه شدم که عدم کنترل نسخه و مکانیسمهای برگشتی در EndeavourOS باعث میشود در هنگام بروز مشکلات نتوانم سیستم را بازیابی کنم.
این زمانی بود که تصمیم گرفتم به NixOS سوئیچ کنم.
برای خوشحالی من، NixOS از انتظارات من فراتر رفته است. شگفتانگیزترین جنبه این است که من اکنون میتوانم کل محیط i3 و تمام بستههای رایج مورد استفاده خود را در یک هاست جدید NixOS تنها با یک دستور بازیابی کنم.sudo nixos-rebuild switch –flake .. واقعا فوق العاده است!
قابلیت بازگشت و تکرارپذیری NixOS اعتماد به نفس زیادی را در من القا کرده است – دیگر از شکستن سیستم نمی ترسم. من حتی به آزمایش چیزهای جدید در NixOS، مانند hyprland compositor، جرأت کرده ام. پیش از این، در EndeavourOS، جرأت نمیکردم با چنین ترکیبکنندههای جدیدی دست و پنجه نرم کنم، زیرا هر گونه اشتباه در سیستم مستلزم عیبیابی دستی قابل توجهی با استفاده از راهحلهای مختلف بود.
همانطور که بیشتر و بیشتر با NixOS و Nix درگیر میشوم، آن را برای مدیریت همزمان پیکربندی چندین میزبان نیز بسیار مناسب میدانم. در حال حاضر شخصی منnix-configبه طور همزمان پیکربندی بسیاری از هاست ها را مدیریت می کند:
- کامپیوترهای رومیزی
- 1 Macbook Pro 2020 (Intel amd64).
- 1 مک بوک پرو 2022 (M2 aarch64).
- 1 رایانه رومیزی NixOS (amd64).
- سرورها
- 3 ماشین مجازی NixOS (amd64).
- چندین برد توسعه برای aarch64 و riscv64.
محیط توسعه سه رایانه رومیزی توسط Home Manager مدیریت می شود، پیکربندی اصلی کاملاً به اشتراک گذاشته شده است و پیکربندی اصلاح شده در هر میزبانی می تواند به طور یکپارچه با میزبان های دیگر از طریق Git همگام شود.
Nix تقریباً به طور کامل از من در برابر تفاوتهای بین سیستمعامل و معماری در پایین این سه ماشین محافظت کرد و تجربه بسیار روان بود!
مزایا و معایب NixOS
مزایای NixOS
- پیکربندی اعلامی، سیستم عامل به عنوان کد
- NixOS از پیکربندی اعلامی برای مدیریت کل محیط سیستم استفاده می کند. این پیکربندیها را میتوان مستقیماً با Git مدیریت کرد و به سیستم اجازه میدهد تا زمانی که فایلهای پیکربندی حفظ میشوند (به شرطی که حالتهای مورد نظر در پیکربندی Nix اعلام شده باشند) به هر وضعیت تاریخی بازیابی شود.
- Nix Flakes با استفاده از aپوسته پوسته شدن.قفلفایل قفل نسخه، که آدرس های منبع داده، مقادیر هش و سایر اطلاعات مرتبط را برای همه وابستگی ها ثبت می کند. این طراحی قابلیت تکرارپذیری Nix را تا حد زیادی بهبود می بخشد و نتایج ساخت ثابت را تضمین می کند. از طراحی های مدیریت بسته در زبان های برنامه نویسی مانند Cargo و npm الهام می گیرد.
- قابلیت سفارشی سازی سیستم بسیار راحت
- تنها با چند تغییر پیکربندی، می توان اجزای مختلف سیستم را به راحتی تعویض کرد. Nix تمام عملیات پیچیده زیربنایی را در بسته های Nix محصور می کند و مجموعه مختصری از پارامترهای اعلامی را در اختیار کاربران قرار می دهد.
- تغییرات ایمن هستند و جابجایی بین محیطهای دسکتاپ مختلف (مانند GNOME، KDE، i3 و sway) ساده و با حداقل مشکلات است.
- قابلیت بازگشت به عقب
- بازگشت به هر حالت قبلی سیستم امکان پذیر است و NixOS حتی تمام نسخه های قدیمی را به طور پیش فرض در گزینه های بوت گنجانده است و از توانایی برگرداندن آسان تغییرات اطمینان می دهد. در نتیجه، Nix به عنوان یکی از پایدارترین رویکردهای مدیریت بسته در نظر گرفته می شود.
- بدون مسائل مربوط به تعارض وابستگی
- هر بسته نرم افزاری در Nix دارای یک هش منحصر به فرد است که در مسیر نصب آن گنجانده شده است و اجازه می دهد چندین نسخه با هم وجود داشته باشند.
- انجمن با طیف متنوعی از پروژه های شخص ثالث فعال است
- مخزن رسمی بسته، nixpkgs، مشارکت کنندگان متعددی دارد و بسیاری از افراد تنظیمات Nix خود را به اشتراک می گذارند. کاوش در اکوسیستم NixOS یک تجربه هیجان انگیز است، شبیه به کشف یک قاره جدید.
معایب NixOS
- منحنی یادگیری بالا:
- دستیابی به قابلیت تکرارپذیری کامل و اجتناب از مشکلات مرتبط با استفاده نادرست، مستلزم یادگیری در مورد کل طراحی Nix و مدیریت سیستم به صورت اعلامی است، نه اینکه کورکورانه با استفاده از دستوراتی مانندnix-env -i(شبیه بهapt-get نصب کنید).
- اسناد نامرتب:
- در حال حاضر، Nix Flakes یک ویژگی آزمایشی باقی مانده است و اسناد محدودی وجود دارد که به طور خاص روی آن متمرکز شده است. بیشتر اسناد انجمن Nix در درجه اول کلاسیک را پوشش می دهد/etc/nixos/configuration.nix. اگر می خواهید مستقیماً از Nix Flakes شروع به یادگیری کنید (flake.nix، باید به مقدار قابل توجهی از اسناد قدیمی مراجعه کرده و اطلاعات مربوطه را استخراج کنید. علاوه بر این، برخی از ویژگی های اصلی Nix، مانندوارداتو سیستم ماژول Nixpkgs فاقد مستندات رسمی دقیق هستند و نیاز به توسل به تجزیه و تحلیل کد منبع دارند.
- افزایش استفاده از فضای دیسک:
- برای اطمینان از توانایی بازگرداندن سیستم در هر زمان، Nix به طور پیشفرض تمام محیطهای تاریخی را حفظ میکند و در نتیجه استفاده از فضای دیسک را افزایش میدهد.
- در حالی که این استفاده از فضای اضافی ممکن است در رایانه های رومیزی نگران کننده نباشد، می تواند در سرورهای ابری با محدودیت منابع مشکل ساز شود.
- پیام های خطا مبهم:
- با توجه بهالگوریتم ادغام پیچیدهازسیستم ماژول Nixpkgs، پیام های خطای NixOS بسیار ضعیف هستند. در بسیاری از موارد، صرف نظر از اینکه اضافه کنید یا خیر– نشان دادن-ردیابی، فقط به شما می گوید که یک خطا در کد وجود دارد (شایع ترین و گیج کننده ترین پیام خطا این استبازگشت بی نهایت مواجه شد) اما خطا دقیقا کجاست؟ سیستم نوع می گوید نمی داند پس باید خودتان آن را پیدا کنید. طبق تجربه من، ساده ترین و موثرترین راه برای مقابله با این پیام های خطای بی معنی، استفاده از “جستجوی باینری” برای بازیابی تدریجی کد است.
- این مشکل احتمالاً بزرگترین نقطه درد NixOS در حال حاضر است.
- پیاده سازی زیربنایی پیچیده تر:
- انتزاع اعلامی Nix پیچیدگی بیشتری را در کد زیربنایی در مقایسه با کد مشابه در ابزارهای ضروری سنتی معرفی می کند.
- این پیچیدگی دشواری پیاده سازی را افزایش می دهد و ایجاد تغییرات سفارشی در سطح پایین تر را چالش برانگیز می کند. با این حال، این بار در درجه اول بر دوش نگهبانان بسته Nix است، زیرا کاربران عادی با پیچیدگی های زیربنایی مواجه هستند و بار آنها را کاهش می دهد.
خلاصه
به طور کلی، من معتقدم که NixOS برای توسعه دهندگانی با سطح مشخصی از تجربه استفاده از لینوکس و دانش برنامه نویسی مناسب است که خواهان کنترل بیشتر بر روی سیستم های خود هستند.
من به تازه واردان بدون تجربه استفاده از لینوکس توصیه نمی کنم که مستقیماً به NixOS شیرجه بزنند، زیرا ممکن است به یک سفر خسته کننده منجر شود.
مبانی زبان Nix
زبان Nix برای اعلام تنظیماتی که باید توسط Nix ساخته شوند ضروری است. برای بهره مندی کامل از مزایای NixOS و Flakes، لازم است اصول این زبان را درک کنید.
زبان Nix یک زبان کاربردی ساده است. اگر کمی تجربه برنامه نویسی دارید، کمتر از 2 ساعت طول می کشد تا اصول آن را درک کنید.
انجمن در حال حاضر تعداد زیادی آموزش زبان Nix خوب دارد، بنابراین من چرخ را دوباره اختراع نمی کنم. برای شروع، خواندن منابع زیر را برای آشنایی سریع با زبان Nix توصیه می کنم:
- مبانی زبان Nix – nix.dev: این آموزش یک نمای کلی از اصول اولیه زبان Nix ارائه می دهد که برای مبتدیان توصیه می شود.
- تور نیکس: یک آموزش تعاملی آنلاین بر ساختارهای زبان برنامه نویسی و نحوه استفاده الگوریتمی Nix برای حل مسائل تمرکز دارد.
- Nix Language – Nix Reference Manual: مستندات رسمی زبان Nix.
- nix.dev و سایر آموزشهای کاربرپسند فقط برای شروع خواندن مناسب هستند و هیچ یک از آنها به طور کامل نحو کامل Nix را معرفی نمیکنند. اگر با نحو جدیدی مواجه شدید که قبلاً با آن برخورد نکرده اید، لطفاً به این سند رسمی مراجعه کنید.
- https://noogle.dev/یک موتور جستجوی کتابخانه تابع Nix است که می تواند به شما در یافتن سریع توابع مورد نیاز و استفاده از آنها کمک کند که بسیار کاربردی است.
اشکالی ندارد که در حال حاضر تصوری کلی از نحو داشته باشیم. بعداً وقتی چیزی را پیدا کردید که متوجه نمیشوید، میتوانید برای بررسی نحو بازگردید.
Release version history
Name | Date |
NixOS 13.10 “Aardvark” | October 2013 |
NixOS 14.04 “Baboon” | April 2014 |
NixOS 14.12 “Caterpillar” | December 2014 |
NixOS 15.09 “Dingo” | September 2015 |
NixOS 16.03 “Emu” | March 2016 |
NixOS 16.09 “Flounder” | September 2016 |
NixOS 17.03 “Gorilla” | March 2017 |
NixOS 17.09 “Hummingbird” | September 2017 |
NixOS 18.03 “Impala” | March 2018 |
NixOS 18.09 “Jellyfish” | September 2018 |
NixOS 19.03 “Koi” | March 2019 |
NixOS 19.09 “Loris” | September 2019 |
NixOS 20.03 “Markhor” | March 2020 |
NixOS 20.09 “Nightingale” | September 2020 |
NixOS 21.05 “Okapi” | May 2021 |
NixOS 21.11 “Porcupine” | November 2021 |
NixOS 22.05 “Quokka” | May 2022 |
NixOS 22.11 “Raccoon” | November 2022 |
NixOS 23.05 “Stoat” | May 2023 |
NixOS 23.11 “Tapir” | November 2023 |
NixOS 24.05 “Uakari” | May 2024
|
ویژگیها
نصب گرافیکی NixOS مدل پیکربندی توصیفی
در NixOS، کل سیستم عامل – شامل کرنل، برنامهها، بستههای سیستم و فایلهای پیکربندی – توسط مدیر بسته Nix از یک توصیف در زبان Nix ساخته میشود. ساخت نسخه جدید بر روی نسخههای قبلی بازنویسی نمیشود.
یک سیستم NixOS با نوشتن مشخصاتی از عملکردی که کاربر میخواهد روی دستگاه خود داشته باشد در یک فایل پیکربندی سراسری (معمولاً در /etc/nixos قرار دارد) پیکربندی میشود. در زیر یک مشخصه حداقل از یک ماشین در حال اجرای دامین SSH آمده است:
{
boot.loader.grub.device = “/dev/sda”;
fileSystems.”/”.device = “/dev/sda1”;
services.sshd.enable = true;}
پس از تغییر فایل مشخصات، سیستم میتواند با استفاده از دستور nixشظos-rebuild بهروزرسانی شود. این کار همه کارهای لازم برای ایجاد نسخه جدید سیستم، از جمله دانلود و نصب بستهها و تولید فایلهای پیکربندی را انجام میدهد.
بهروزرسانیهای قابل اعتماد و اتمی
از آنجایی که فایلهای Nix خالص و توصیفی هستند، ارزیابی آنها همیشه نتیجه یکسانی را تولید میکند، صرف نظر از اینکه چه بستهها یا فایلهای پیکربندی روی سیستم وجود دارند.
NixOS از یک رویکرد تراکنشگونه برای مدیریت پیکربندی استفاده میکند و تغییرات پیکربندی مانند ارتقاها را اتمی میکند. به عنوان مثال، اگر ارتقا به یک پیکربندی جدید توسط قطع برق متوقف شود، سیستم همچنان در یک حالت سازگار خواهد بود: یا در پیکربندی قدیمی یا جدید بوت میشود.
بازگرداندن به نسخه قبلی
اگر پس از بهروزرسانی سیستم، پیکربندی جدید مطلوب نباشد، میتوان آن را با استفاده از یک دستور خاص (nixos-rebuild switch –rollback) به حالت قبل بازگرداند. هر نسخه پیکربندی سیستم به طور خودکار در منوی بوت سیستم ظاهر میشود. اگر پیکربندی جدید خراب شود یا به درستی بوت نشود، میتوان یک نسخه قدیمیتر را انتخاب کرد. بازگرداندن عملیات سبک وزنی است که شامل بازگرداندن فایلها از نسخههای پشتیبان نمیشود.
پیکربندیهای سیستم قابل تکرار
مدل پیکربندی توصیفی NixOS باعث میشود تکرار پیکربندی سیستم روی دستگاه دیگری آسان شود. کپی کردن فایل پیکربندی به دستگاه هدف و اجرای دستور بهروزرسانی سیستم، پیکربندی سیستم یکسانی (کرنل، برنامهها، سرویسهای سیستم و غیره) را ایجاد میکند، به جز بخشهایی از سیستم که توسط مدیر بسته مدیریت نمیشوند، مانند دادههای کاربر.
مدل مبتنی بر سورس با کش باینری
زبان ساخت Nix که توسط NixOS استفاده میشود، نحوه ساخت بستهها از سورس را مشخص میکند. این کار تطبیق سیستم با نیازهای کاربر را آسان میکند. با این حال، ساخت از سورس یک فرآیند کند است، بنابراین مدیر بسته به طور خودکار باینریهای از پیش ساخته شده را از یک سرور کش دانلود میکند، در صورتی که در دسترس باشند. میتوان کش باینری را غیرفعال کرد و ساخت از سورس را با استفاده از آرگومان –option substitute false اجبار کرد. این انعطافپذیری یک مدل مدیریت بسته مبتنی بر سورس را با کارایی یک مدل باینری ارائه میدهد.
مدیریت بسته چند کاربره
نیازی به امتیازات ویژه برای نصب نرم افزار در NixOS وجود ندارد. علاوه بر پروفایل سیستمwide، هر کاربر یک پروفایل اختصاصی دارد که میتواند بستهها را در آن نصب کند. Nix همچنین اجازه میدهد نسخههای مختلف یک بسته همزمان وجود داشته باشند، بنابراین کاربران مختلف میتوانند نسخههای مختلفی از یک بسته را در پروفایلهای مربوطه خود نصب کنند. اگر دو کاربر نسخه یکسانی از یک بسته را نصب کنند، فقط یک نسخه ساخته یا دانلود میشود. مدل امنیتی Nix تضمین میکند که این کار ایمن است، زیرا فقط به کاربرانی که بهطور صریح توسط پیکربندی سیستم مورد اعتماد هستند، اجازه استفاده از پارامترهای ساخت داده میشود که به آنها اجازه میدهد محتوای خروجی یک مشتق را کنترل کنند (مانند افزودن ناخالصیها به شنک یا استفاده از یک جایگزین غیرقابل اعتماد). بدون این پارامترها، مسیرها فقط میتوانند از یک جایگزین مورد اعتماد توسط سیستم یا یک ساخت شنک شده محلی که به طور ضمنی مورد اعتماد است، جایگزین شوند.
پیادهسازی
NixOS بر اساس مدیر بسته Nix ساخته شده است که تمام بستهها را به صورت جداگانه از یکدیگر در فروشگاه بسته ذخیره میکند.
بستههای نصب شده با یک هش رمزنگاری از تمام ورودیهای استفاده شده برای ساخت آنها شناسایی میشوند. تغییر دستورالعملهای ساخت یک بسته هش آن را تغییر میدهد و این منجر به نصب یک بسته متفاوت در فروشگاه بسته میشود. این سیستم همچنین برای مدیریت فایلهای پیکربندی استفاده میشود و اطمینان حاصل میکند که پیکربندیهای جدید بر روی پیکربندیهای قدیمی بازنویسی نمیشوند.
نتیجه این امر این است که NixOS از استاندارد سلسله مراتب فایل سیستم پیروی نمیکند. تنها استثناها این است که یک لینک نمادین /bin/sh به نسخه در فروشگاه Nix ایجاد میشود (به عنوان مثال /nix/store/s/5rnfzla9kcx4mj5zdc7nlnv8na1najvg–4.3.43/)، و در حالی که NixOS دارای یک دایرکتوری /etc برای نگهداری فایلهای پیکربندی سیستمwide است، بیشتر فایلهای موجود در این دایرکتوری لینکهای نمادین به فایلهای تولید شده در /nix/store هستند، مانند /nix/store/s2sjbl85xnrc18rl4fhn56irkxqxyk4p-sshd_config. استفاده نکردن از دایرکتوریهای جهانی مانند /bin بخشی از چیزی است که به نسخههای مختلف یک بسته اجازه همزیستی میدهد.
پذیرش
Jesse Smith، در بررسی NixOS 15.09 برای DistroWatch Weekly در سال 2015، نوشت:
من خیلی دوست دارم که NixOS چگونه نگرانی در مورد ارتقای بستهها را با قرار دادن هر تغییر در “نسل” خود از بین میبرد و من از دیدگاه کاربر نهایی، NixOS را همانند هر توزیع لینوکس دیگری کار میکردم. راهاندازی NixOS برای مبتدیان نیست و فکر نمیکنم NixOS برای استفاده به عنوان یک سیستم عامل دسکتاپ عمومی در نظر گرفته شده باشد. اما کاری که NixOS انجام میدهد این است که به ما یک زمین بازی مفید برای بررسی مدیر بسته Nix میدهد و من فکر میکنم این فناوری بسیار جالب است که سزاوار بررسی بیشتر و پذیرش توسط توزیعهای اضافی است.
یک بررسی در سال 2022 از NixOS 21.11 “Porcupine” در مجله Full Circle نتیجهگیری کرد:
به طور کلی NixOS Gnome 21.11 به عنوان یک سیستم جدی، منظم و زیبا تاثیرگذار است. اگر شما طرفدار دسکتاپ Gnome بدون تغییر هستید، در اینجا چیزهای زیادی برای دوست داشتن پیدا خواهید کرد. نقطه ضعف این توزیع، منحنی یادگیری تند برای مدیریت بسته، از جمله بهروزرسانیها و موارد مشابه است. صرف نظر از اینکه از کدام توزیع آمدهاید، برای اینکه Nix را برای خود روی خط فرمان کار کنید، چیزهای زیادی برای یادگیری خواهید داشت.
NixOS 22.11 “Raccoon” توسط Liam Proven در The Register بررسی شد:
در مقایسه با گزارشهای NixOS از تنها دو یا سه سال پیش، نصب و راهاندازی آن بسیار ساده است. این نشان میدهد که ابزارها به خوبی در حال بلوغ هستند و به سطح خاصی از پولیش رسیدهاند، اما از دیدگاه یک کاربر تازه کار، ما هیچ پایه مقایسه قبلی نداریم. این یک توزیع سنتی و حتی یک یونیکس سنتی نیست، اما کار میکند و ما میتوانیم جذابیت آن را ببینیم.
NixOS 23.11 “Tapir” توسط Jesse Smith در DistroWatch بررسی شد:
NixOS یک گوهر نادر است زیرا فکر نمیکنم در حین استفاده از آن با هیچ خطایی مواجه شده باشم. توزیع پایدار بود، با سختافزار من خوب کار میکرد و در حین اجرای آن با هیچ مشکلی مواجه نشدم. احساس میکنم NixOS ارزش امتحان کردن را دارد، به خصوص اگر شما یک مدیر سیستم هستید و میخواهید توزیعهای یکسان را در چندین دستگاه مستقر (یا نگهداری) کنید.
بوت شدن از رسانه نصب
برای شروع نصب، باید کامپیوتر خود را از درایو نصب بوت کنید.
- درایو نصب را وصل کنید. سپس کامپیوتر خود را روشن یا مجددا راهاندازی کنید.
- منوی بوت را با فشار دادن کلید مناسب باز کنید که معمولاً در ابتدای بوت روی صفحه نمایش نشان داده میشود. فلش درایو USB را انتخاب کنید (گزینه معمولاً حاوی کلمه “USB” است). اگر درایو نادرست را انتخاب کنید، کامپیوتر شما احتمالاً به بوت شدن عادی ادامه خواهد داد. در این صورت کامپیوتر خود را مجددا راهاندازی کنید و درایو دیگری را انتخاب کنید.
نکته: کلید باز کردن منوی بوت در بین برندها و حتی مدلهای کامپیوتر متفاوت است. این میتواند F12، اما همچنین F1، F9، F10، Enter، Del، Esc یا کلید عملکرد دیگری باشد. اگر مطمئن نیستید و آن را روی صفحه نمایش بوت اولیه نمیبینید، میتوانید برای برند و مدل کامپیوتر خود به دنبال “بوت از usb” در اینترنت جستجو کنید. کامپیوتر ممکن است حتی این ویژگی را نداشته باشد، بنابراین باید وارد تنظیمات BIOS/UEFI شوید تا ترتیب بوت را تغییر دهید. دوباره برای جزئیات در مورد مدل کامپیوتر خاص خود در اینترنت جستجو کنید. برای کامپیوترهای اپل با پردازندههای اینتل، کلید ⌥ (Option یا Alt) را نگه دارید تا منوی بوت را ببینید. روی سیلیکون اپل دکمه پاور را فشار داده و نگه دارید.
نکته: اگر کامپیوتر شما از بوت BIOS و UEFI پشتیبانی میکند، گزینه UEFI را انتخاب کنید.نکته: اگر از سیدی برای نصب استفاده میکنید، کامپیوتر احتمالاً به طور خودکار از آن بوت میشود. در غیر این صورت، گزینه حاوی کلمه “CD” را از منوی بوت انتخاب کنید.
- کمی پس از انتخاب درایو بوت مناسب، باید یک منو با گزینههای نصب مختلف به شما نشان داده شود. پیشفرض را رها کنید و منتظر بمانید (یا برای سرعت بخشیدن Enter را فشار دهید).
- تصاویر گرافیکی محیط دسکتاپ مربوطه و نصبگر گرافیکی را شروع میکنند که ممکن است مدتی طول بکشد. تصاویر مینیمال به یک خط فرمان بوت میشوند. شما باید دستورالعملهای موجود در بخش “نصب دستی” را دنبال کنید.
نصب گرافیکی
نصبگر گرافیکی برای کاربران دسکتاپ توصیه میشود و شما را در طول نصب راهنمایی میکند.
- در صفحه “خوش آمدید”، میتوانید زبان نصبگر و سیستم نصب شده را انتخاب کنید.نکته: باقی گذاشتن زبان به عنوان “انگلیسی آمریکایی” جستجوی پیامهای خطا را در موتور جستجو یا گزارش یک مشکل آسانتر میکند.
- سپس باید مکان خود را انتخاب کنید تا منطقه زمانی به درستی تنظیم شود. شما در واقع میتوانید روی نقشه کلیک کنید!نکته: نصبگر از یک سرویس آنلاین برای حدس زدن موقعیت مکانی شما بر اساس آدرس IP عمومی شما استفاده خواهد کرد.
- سپس میتوانید طرحبندی صفحه کلید را انتخاب کنید. مدل صفحه کلید پیشفرض باید با اکثر صفحه کلیدهای دسکتاپ به خوبی کار کند. اگر صفحه کلید یا نوتبوک خاصی دارید، مدل شما ممکن است در لیست باشد. زبانی را که راحتتر تایپ میکنید انتخاب کنید.
- در صفحه “کاربران”، باید نام نمایشی، نام ورود و رمز عبور خود را تایپ کنید. همچنین میتوانید گزینه ورود خودکار به دسکتاپ را فعال کنید.
- سپس شما گزینه انتخاب یک محیط دسکتاپ را دارید. اگر میخواهید یک تنظیم سفارشی با یک مدیر پنجره ایجاد کنید، میتوانید “بدون دسکتاپ” را انتخاب کنید.نکته: اگر دسکتاپ مورد علاقهای ندارید و نمیدانید کدام یک را انتخاب کنید، میتوانید به GNOME یا Plasma پایبند باشید. آنها طراحی کاملا متفاوتی دارند، بنابراین باید هر کدام را که بیشتر دوست دارید انتخاب کنید. هر دو انتخابهای محبوب هستند و روی NixOS به خوبی آزمایش شدهاند.
- شما در صفحه بعدی گزینه اجازه دادن به نرم افزار غیر آزاد را دارید.
- سادهترین گزینه در صفحه “پارتیشنبندی” “پاک کردن دیسک” است که تمام دادهها را از دیسک انتخاب شده حذف میکند و سیستم را روی آن نصب میکند. همچنین “Swap (با خواب زمستانی)” را در زیر آن انتخاب کنید. شما میتوانید کل دیسک را با LUKS رمزگذاری کنید.نکته: در بالا سمت چپ میبینید که آیا نصبگر با BIOS یا UEFI بوت شده است. اگر میدانید سیستم شما از UEFI پشتیبانی میکند و “BIOS” نشان میدهد، با گزینه صحیح ریبوت کنید.هشدار: مطمئن شوید که دیسک صحیح را در بالا انتخاب کردهاید و هیچ داده ارزشمندی هنوز روی دیسک وجود ندارد! هنگام فرمت کردن دیسک حذف خواهد شد.
- انتخابهای خود را در “خلاصه” بررسی کنید و روی “نصب” کلیک کنید.نکته: نصب حدود 15 دقیقه طول میکشد. زمان بر اساس محیط دسکتاپ انتخاب شده، سرعت اتصال به اینترنت و سرعت نوشتن دیسک متفاوت است.
- پس از اتمام نصب، فلش درایو USB را خارج کنید و به سیستم جدید خود ریبوت کنید!
این فصل برای افراد بی حوصله ای است که علاقه ای به خواندن مستندات ندارند. برای اطلاعات عمیق تر، لطفا به فصل های بعدی مراجعه کنید.
نصب Nix با اجرای دستور زیر انجام می شود
$ curl -L https://nixos.org/nix/install | sh
اسکریپت نصب از sudo استفاده می کند، بنابراین مطمئن شوید که حقوق کافی دارید. در لینوکس، می توان برای نصب تک کاربره گزینه –daemon را حذف کرد. برای روش های دیگر نصب، [اینجا](لینک به راهنمای نصب کامل) را ببینید.
مشاهده بسته های قابل نصب موجود در کانال جاری:
$ nix-env –query –available –attr-path
خروجی این دستور به صورت زیر خواهد بود (این نمونه است و بسته های واقعی ممکن است متفاوت باشند):
- nixpkgs.docbook_xml_dtd_43 docbook-xml-4.3
- nixpkgs.docbook_xml_dtd_45 docbook-xml-4.5
- nixpkgs.firefox firefox-33.0.2
- nixpkgs.hello hello-2.9
- nixpkgs.libxslt libxslt-1.1.28
- …
نصب برخی بسته ها از کانال
$ nix-env –install –attr nixpkgs.hello
این دستور باید بسته های از پیش ساخته شده را دانلود کند؛ نباید آنها را به صورت محلی بسازد (اگر اینطور شد، مشکلی پیش آمده است).
بررسی عملکرد بسته ها:
$ which hello
- خروجی احتمالی: /home/eelco/.nix-profile/bin/hello
$ hello
17. خروجی احتمالی: Hello, world!
حذف نصب یک بسته:
$ nix-env –uninstall hello
همچنین می توانید یک بسته را بدون نصب آن تست کنید:
$ nix-shell –packages hello
این دستور بسته GNU Hello و وابستگی های آن را می سازد یا دانلود می کند، سپس شما را وارد یک پوسته می کند که در آن دستور hello وجود دارد، بدون اینکه بر محیط عادی شما تأثیری بگذارد.
خروجی:
[nix-shell:~]$
hello
Hello,
world!
[nix-shell:~]$
exit
$ hello
hello:
command not found
برای به روز ماندن با کانال، موارد زیر را انجام دهید:
23. “`
$ nix-channel –update nixpkgs
$ nix-env –upgrade ‘*’
دستور آخر هر بسته نصب شده ای را که نسخه “جدیدتری” برای آن وجود دارد (بر اساس مقایسه شماره نسخه ها) ارتقا می دهد.
اگر از نتیجه یک عمل nix-env (به عنوان مثال، یک بسته ارتقا یافته به درستی کار نمی کند) راضی نیستید، می توانید به عقب برگردید:
$ nix-env –rollback
شما باید به طور دوره ای از ابزار جمع آوری زباله Nix برای خلاص شدن از شر بسته های استفاده نشده استفاده کنید، زیرا حذف یا ارتقاها آنها را به طور واقعی حذف نمی کنند:
$ nix-collect-garbage –delete-old
مدیر بسته Nix
Nix یک مدیر بسته و سیستم ساخت است که دستورالعملهای ساخت قابل تکرار را مشخص شده در زبان Nix Expression، یک زبان تابع خالص با ارزیابی تنبل، تجزیه میکند. عبارات Nix توابع خالصی هستند که وابستگیها را به عنوان آرگومان میگیرند و یک مشتق مشخص کننده یک محیط ساخت قابل تکرار برای بسته تولید میکنند. Nix نتایج ساخت را در آدرسهای منحصر به فرد مشخص شده توسط یک هش از درخت وابستگی کامل ذخیره میکند و یک فروشگاه بسته تغییرناپذیر ایجاد میکند که امکان ارتقاهای اتمی، بازگرداندن و نصب همزمان نسخههای مختلف یک بسته را فراهم میکند و در اصل جهنم وابستگی را حذف میکند.
نصب
بخش نصب راهنمای Nix نحوه نصب Nix از باینری یا سورس روی سیستمهای لینوکس و مک برای کاربری با امتیازات روت را توضیح میدهد؛ نصب Nix برای یک کاربر واحد سادهتر است، اما مراحل راهاندازی یک نصب چند کاربره نیز گنجانده شده است. برای یک راهنمای گسترده در مورد روشهای مختلف برای نصب Nix – از جمله نحوه نصب Nix بدون امتیازات روت – به راهنمای نصب Nix مراجعه کنید.
دستورات Nix
از nix 2.0 به بعد سبک جدیدی از دستورات وجود دارد. اینها در راهنمای رسمی مستند شدهاند. برای اطلاعات بیشتر به Nix command مراجعه کنید.
پیکربندی توصیفی
تنها فایل پیکربندی مرتبط با Nix، nix.conf است (معمولاً در /etc/nix/ یافت میشود) که تعدادی تنظیمات مربوط به نحوه ساخت، جمعآوری زباله، شنکسازی و مجوزهای کاربر Nix را تعریف میکند. جزئیات در مورد گزینههای موجود در راهنما یافت میشود. از آنجایی که بیشتر سناریوها شامل استفاده از Nixpkgs هستند، پیکربندی ~/.config/nixpkgs/config.nix اغلب مفید است؛ در اینجا میتوان جایگزینیهای بسته را مشخص کرد. Home Manager روش ترجیحی برای مدیریت محیطهای توصیفی برای یک کاربر واحد است. برای پیکربندی سیستم روی macOS، nix-darwin راه حل ترجیحی است.
عملیات امری
تا حد زیادی، مدیریت بسته و محیط در Nix امری است؛ محیطهای کاربر – از جمله نصب و حذف بسته – با دستور nix-env مدیریت میشود، در حالی که nix-channels تعیین میکند کدام نسخه از Nixpkgs استفاده میشود و در نتیجه بستههای شما چه نسخههایی خواهند داشت.
محیطهای کاربر
Nix یک ابزار خط فرمان مدیریت بسته امری به نام nix-env ارائه میدهد که میتواند برای نصب بستهها در سطح کاربر استفاده شود. بستههای نصب شده با استفاده از nix-env فقط برای کاربر مشخص در دسترس هستند و حالت سیستم را تغییر نمیدهند.
Common nix-env Commands | |
Searching for packages | nix search nixpkgs packagename |
Installing a package | nix-env -iA packagename |
List installed packages | nix-env -q |
Uninstall packages | nix-env -e packagename |
Upgrade packages | nix-env -u |
کانالها
بستههای Nix از طریق تعدادی کانال Nix توزیع میشوند: مکانیزمهایی برای توزیع عبارات Nix و همچنین کشهای باینری مرتبط با آنها. این کانالها هستند که تعیین میکنند بستههای شما چه نسخههایی دارند و میتوانند به طور گسترده به کانالهای پایدار و ناپایدار تقسیم شوند. اکثر کاربران کانال پایدار را میخواهند که در حال حاضر nixos-24.05 است
Listing current channels | nix-channel –list |
Adding a primary channel | nix-channel –add https://nixos.org/channels/channel-name nixos |
Adding other channels | nix-channel –add https://some.channel/url my-alias |
Remove a channel | nix-channel –remove channel-alias |
Updating a channel | nix-channel –update channel-alias |
Updating all channels | nix-channel –update |
Nixpkgs
Nixpkgs مجموعهای از بیش از 100000 بسته نرمافزاری است که میتوان با مدیر بسته Nix نصب کرد. همچنین NixOS، یک توزیع لینوکس کاملاً تابعی را پیادهسازی میکند.
دستور nix-env: یک راهنمای جامع با مثالها
nix-env ابزاری قدرتمند در محیط NixOS است که برای مدیریت بستهها و محیطهای کاربری به کار میرود. با استفاده از این دستور میتوانید بستههای نرمافزاری را نصب، حذف، بروزرسانی کرده و محیطهای کاری مختلفی را ایجاد کنید.
ساختار کلی دستور:
nix-env <options>
گزینههای اصلی و توضیحات:
- –install (-i):
- برای نصب یک یا چند بسته استفاده میشود.
- مثال: nix-env -iA nixpkgs.firefox (نصب فایرفاکس)
- –uninstall (-u):
- برای حذف یک یا چند بسته استفاده میشود.
- مثال: nix-env –uninstall firefox (حذف فایرفاکس)
- –upgrade:
- برای بروزرسانی همه بستههای نصب شده استفاده میشود.
- مثال: nix-env –upgrade ‘*’ (بروزرسانی همه بستهها)
- –query (-q):
- برای نمایش اطلاعات در مورد بستهها استفاده میشود.
- مثال: nix-env -qI (نمایش لیست بستههای نصب شده)
- -A:
- برای نصب یک بسته با مشخص کردن مسیر کامل آن در درخت بستهها استفاده میشود.
- مثال: nix-env -A nixpkgs#firefox (نصب فایرفاکس با مشخص کردن مسیر دقیق)
- –system:
- برای نصب بستهها در سطح سیستم استفاده میشود.
- –user:
- برای نصب بستهها در سطح کاربر استفاده میشود. (پیشفرض)
- –profile:
- برای مشخص کردن پروفایل کاربری استفاده میشود.
مثالهای بیشتر
- نصب چندین بسته:
nix-env -iA nixpkgs.{vim,git}
- حذف چندین بسته:
nix-env –uninstall {vim,git}
- جستجوی بسته:
nix-env -qaP ‘.*vim.*’
(نمایش همه بستههای مرتبط با vim)
- ایجاد یک محیط جدید:
- با ایجاد یک فایل پیکربندی configuration.nix و اجرای دستور nix-env -iA nixos#config
- نمایش اطلاعات یک بسته:
nix-env -qP nixpkgs.firefox –meta
“` (نمایش متادیتاهای بسته فایرفاکس)