NixOS


معرفی NixOS

NixOS یک توزیع لینوکس است که بر پایه یک مدیر بسته به نام Nix ساخته شده است. این سیستم از طراحی تغییرناپذیر (Immutable) و مدل به‌روزرسانی اتمی استفاده می‌کند. استفاده از سیستم پیکربندی توصیفی و برنامه‌نویسی عملکردی، قابلیت تکرار و قابلیت حمل را فراهم می‌کند. NixOS نرم‌افزاری آزاد و متن‌باز با مجوز MIT است.

پیکربندی NixOS با استفاده از ماژول‌های ترکیبی انجام می‌شود و به بسته‌هایی که در پروژه Nixpkgs تعریف شده‌اند وابسته است. دستورالعمل‌های ساخت بسته و پیکربندی‌ها در زبان اختصاصی “Nix” نوشته می‌شوند که همراه با مدیر بسته Nix ارائه می‌شود.

Nix در سال 2003 به عنوان یک پروژه تحقیقاتی توسط Eelco Dolstra آغاز شد. هدف او توسعه سیستمی برای استقرار قابل اعتماد نرم‌افزار بود. این تحقیق منجر به پایان‌نامه دکترای او با عنوان “مدل استقرار نرم‌افزار کاملاً تابعی” شد که رویکردی نوآورانه برای پیکربندی نرم‌افزار به صورت توصیفی و تابعی ارائه می‌کرد. تحقیقات او زیر نظر Eelco Visser در دانشگاه اوترخت انجام شد و پایه‌های نظری Nix را ایجاد کرد.

در سال 2006، NixOS به عنوان بخشی از پایان‌نامه کارشناسی ارشد Armijn Hemel معرفی شد، که بررسی کرد چگونه اصول Nix را می‌توان در یک توزیع لینوکس به کار برد. این امر منجر به ایجاد یک مدل پیکربندی توصیفی منحصربه‌فرد شد که NixOS را از دیگر سیستم‌های عامل متمایز کرد.

بنیاد NixOS در سال 2015 در هلند تأسیس شد تا از پروژه‌هایی که مدل استقرار کاملاً تابعی را پیاده‌سازی می‌کنند پشتیبانی کند و توسعه و پایداری NixOS و اکوسیستم آن را تضمین کند.

این پروژه از زمان آغاز به رشد قابل توجهی رسیده است. از جمله دستاوردهای مهم می‌توان به معرفی ماژول‌های NixOS در سال 2009 اشاره کرد که پیکربندی سیستم را ساده‌تر کرد، و توسعه Nixpkgs که به یکی از بزرگترین مخازن بسته با بیش از 80,000 بسته تا سال 2024 تبدیل شده است.

ویژگی‌های کلیدی

  • پشتیبانی از معماری‌های x86-64 و AArch64 به صورت کامل؛ پشتیبانی محدود برای i686 (باید از سورس ساخته شود).
  • هسته لینوکس یکپارچه (Monolithic).
  • مدیریت بسته با Nix و پیکربندی توصیفی.
  • مجوز MIT و متن‌باز بودن.
  • استفاده از طراحی تغییرناپذیر و به‌روزرسانی اتمی.

لینک‌ها و منابع

وبسایت رسمی: nixos.org

مخزن گیت‌هاب: github.com/NixOS/nixpkgs

تاریخچه و تکامل ویکی NixOS

اولین ویکی جامعه NixOS حدود سال‌های 2010–2011 راه‌اندازی شد تا مستندات را متمرکز کرده و امکان به اشتراک‌گذاری دانش به صورت مشارکتی را فراهم کند. با این حال، با کاهش علاقه جامعه به نگهداری ویکی، اطلاعات قدیمی و نادرست جمع شد و مفید بودن آن کاهش یافت. در نوامبر 2015، Rok Garbas در سخنرانی خود با عنوان «دوستانه‌تر کردن Nix برای مبتدیان» به وضعیت رو به زوال ویکی اشاره کرد و بحث گسترده‌ای در جامعه ایجاد شد. بسیاری از توسعه‌دهندگان معتقد بودند که مستندات رسمی Nix* بهتر می‌تواند به عنوان مرجع مورد استفاده قرار گیرد، اما هیچ راه‌حل فوری اجرا نشد.

تا اواسط سال 2016، ربات‌های هرزنامه ویکی را تحت تاثیر قرار دادند و به دلیل نبود محافظت کافی، ویکی در آگوست همان سال قفل شد. در فوریه 2017، یک مسئله در گیت‌هاب باز شد تا بحث درباره بازگشایی ویکی انجام شود، اما نتیجه‌ای حاصل نشد. نهایتاً، در ماه مه 2017، ویکی به طور دائم غیرفعال شد و صفحات وب آن در آرشیو اینترنت حفظ شدند.

برای پر کردن این خلأ، Jörg Thalheim (Mic92) در آوریل 2017 ویکی GitHub تحت نام nixos-users را راه‌اندازی کرد. اگرچه این پلتفرم امکان ویرایش سریع و مشارکت جامعه را فراهم می‌کرد، اما فاقد امکاناتی مانند جستجو و فهرست محتوا بود. کمی بعد، Tristan Helmich (fadenb) به صورت مستقل ویکی جدیدی بر اساس MediaWiki ایجاد کرد و به تجربه کاربری ضعیف ویکی GitHub اشاره کرد. Felix Richter (makefu) بعداً محتوای ویکی GitHub را به ویکی Helmich منتقل کرد.

در ژانویه 2024، ابتکار جدیدی برای ایجاد ویکی رسمی آغاز شد که منجر به راه‌اندازی ویکی رسمی فعلی در 1 آوریل 2024 شد.

تاریخچه نسخه‌های NixOS

نسخه و نام تاریخ
13.10, Aardvark اکتبر 2013
14.04, Baboon آوریل 2014
14.12, Caterpillar دسامبر 2014
15.09, Dingo سپتامبر 2015
16.03, Emu مارس 2016
16.09, Flounder سپتامبر 2016
17.03, Gorilla مارس 2017
17.09, Hummingbird سپتامبر 2017
18.03, Impala مارس 2018
18.09, Jellyfish سپتامبر 2018
19.03, Koi مارس 2019
19.09, Loris سپتامبر 2019
20.03, Markhor مارس 2020
20.09, Nightingale سپتامبر 2020
21.05, Okapi مه 2021
21.11, Porcupine نوامبر 2021
22.05, Quokka مه 2022
22.11, Raccoon نوامبر 2022
23.05, Stoat مه 2023
23.11, Tapir نوامبر 2023
24.05, Uakari مه 2024
24.11, Vicuña نوامبر 2024
25.05, Warbler مه 2025
25.11, Xantusia نوامبر 2025

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

پیاده‌سازی NixOS

NixOS بر اساس مدیر بسته Nix ساخته شده است، که تمام بسته‌ها را به‌طور جداگانه و ایزوله در فروشگاه بسته نگهداری می‌کند.

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

یکی از پیامدهای این طراحی این است که NixOS از استاندارد سلسله مراتب فایل سیستم پیروی نمی‌کند. تنها استثناها عبارتند از:

  • یک لینک نمادین /bin/sh به نسخه bash موجود در فروشگاه Nix ایجاد می‌شود (مثلاً /nix/store/s/5rnfzla9kcx4mj5zdc7nlnv8na1najvg-bash-4.3.43/)
  • در حالی که NixOS دارای دایرکتوری /etc برای نگهداری فایل‌های پیکربندی سراسری است، بیشتر فایل‌های موجود در این دایرکتوری لینک‌های نمادین به فایل‌های تولید شده در /nix/store هستند، مانند /nix/store/s2sjbl85xnrc18rl4fhn56irkxqxyk4p-sshd_config

عدم استفاده از دایرکتوری‌های سراسری مانند /bin یکی از دلایلی است که امکان coexistence نسخه‌های مختلف یک بسته فراهم می‌شود.

نقد و بررسی‌ها

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 ارزش امتحان کردن دارد، به ویژه اگر مدیر سیستم هستید و می‌خواهید توزیع‌های یکسان را روی چندین دستگاه مستقر یا نگهداری کنید.”

NixOS یک توزیع لینوکس آزاد و متن‌باز است که بر پایه مدیر بسته Nix ساخته شده است. این توزیع از طراحی ایمن‌ناپذیر (immutable) و مدل به‌روزرسانی اتمی استفاده می‌کند. پیکربندی توصیفی (Declarative) در NixOS امکان تکرارپذیری و انتقال‌پذیری را فراهم می‌کند.

NixOS از ماژول‌های ترکیبی برای پیکربندی بهره می‌برد و به بسته‌هایی متکی است که در پروژه Nixpkgs تعریف شده‌اند. زبان Nix که همراه با مدیر بسته عرضه می‌شود، برای تعریف دستورالعمل‌ها و پیکربندی‌ها مورد استفاده قرار می‌گیرد.

تاریخچه

در سال ۲۰۰۳، Eelco Dolstra پروژه Nix را به‌عنوان یک پروژه تحقیقاتی آغاز کرد. هدف او ساخت سیستمی برای استقرار صحیح نرم‌افزار بود.

در سال ۲۰۰۶، Armijn Hemel توزیع NixOS را به‌عنوان بخشی از پایان‌نامه کارشناسی ارشد خود در دانشگاه اوترخت ارائه کرد.

در سال ۲۰۱۵، بنیاد NixOS Foundation در هلند برای پشتیبانی از این پروژه و اجرای مدل استقرار تابعی تأسیس شد.

مقدمه‌ای بر Nix و NixOS

Nix یک مدیر بسته توصیفی است که به کاربران اجازه می‌دهد وضعیت مطلوب سیستم را در فایل‌های پیکربندی مشخص کنند. این ابزار سپس جزئیات مربوط به نصب، حذف و پیکربندی را به‌طور خودکار مدیریت می‌کند.

برای نمونه، اگر بخواهید i3 را با sway جایگزین کنید، تنها کافی است آن را در پیکربندی اعلام کنید؛ باقی کارها توسط Nix انجام می‌شود.

NixOS توزیعی بر پایه Nix است و می‌توان آن را «سیستم‌عامل به‌عنوان کد» نامید. این سیستم از فایل‌های پیکربندی برای تعریف کل وضعیت سیستم استفاده می‌کند.

چرا NixOS؟

NixOS توانایی بازگشت به هر حالت قبلی سیستم را فراهم می‌کند. این ویژگی به من اجازه داد پس از مشکلات متعدد با EndeavourOS، به NixOS مهاجرت کنم.

به لطف NixOS، اکنون می‌توانم تنها با یک دستور تمام محیط کاری خود را بازیابی کنم:

sudo nixos-rebuild switch –flake ..

این قابلیت اعتماد به نفس زیادی به من داده و دیگر نگران شکستن سیستم نیستم. همچنین، مدیریت چندین میزبان مختلف (سرورها و دسکتاپ‌ها) از طریق Git و Home Manager بسیار ساده‌تر شده است.

مزایا و معایب NixOS

مزایای NixOS

  • پیکربندی اعلامی (OS as Code): مدیریت کل سیستم از طریق فایل‌های پیکربندی و قابلیت بازگشت به وضعیت‌های قبلی.
  • سفارشی‌سازی آسان: امکان تغییر راحت اجزای سیستم، مانند محیط‌های دسکتاپ.
  • قابلیت بازگشت: همه نسخه‌های قبلی در منوی بوت ذخیره می‌شوند.
  • بدون مشکل وابستگی: هر بسته مسیر نصب منحصر به فرد دارد.
  • جامعه فعال: پروژه‌های متعدد شخص ثالث و مخزن قدرتمند nixpkgs.

معایب NixOS

  • منحنی یادگیری بالا: نیاز به یادگیری زبان Nix و مدل پیکربندی.
  • اسناد ناکامل: به‌ویژه در مورد Nix Flakes.
  • مصرف بالای فضای دیسک: نگهداری از محیط‌های قبلی به‌صورت پیش‌فرض.
  • پیام‌های خطای مبهم: عیب‌یابی بعضی خطاها دشوار است.
  • پیچیدگی پیاده‌سازی: کد زیربنایی پیچیده‌تر نسبت به ابزارهای سنتی.

NixOS انتخاب مناسبی برای توسعه‌دهندگانی است که تجربه کافی در لینوکس و برنامه‌نویسی دارند. این توزیع برای تازه‌کاران چندان توصیه نمی‌شود، زیرا یادگیری آن زمان‌بر و گاهی دشوار است.

مبانی زبان Nix

زبان Nix برای تعریف پیکربندی‌ها استفاده می‌شود. اگر تجربه برنامه‌نویسی داشته باشید، یادگیری اصول آن کمتر از دو ساعت زمان می‌برد. منابع مفید:

  1. مبانی زبان Nix – nix.dev
  2. تور نیکس
  3. مستندات رسمی زبان Nix
  4. موتور جستجوی توابع Nix

تاریخچه نسخه‌ها (Release History)

نام تاریخ
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;
}

پس از تغییر فایل مشخصات، سیستم می‌تواند با استفاده از دستور زیر به‌روزرسانی شود:

nixos-rebuild

به‌روزرسانی‌های قابل اعتماد و اتمی

از آنجایی که فایل‌های Nix خالص و توصیفی هستند، ارزیابی آن‌ها همیشه نتیجه یکسانی را تولید می‌کند…

بازگرداندن به نسخه قبلی

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

nixos-rebuild switch –rollback

پیکربندی‌های سیستم قابل تکرار

مدل پیکربندی توصیفی NixOS باعث می‌شود تکرار پیکربندی سیستم روی دستگاه دیگری آسان شود…

مدل مبتنی بر سورس با کش باینری

زبان ساخت Nix نحوه ساخت بسته‌ها از سورس را مشخص می‌کند…

–option substitute false

مدیریت بسته چند کاربره

نیازی به امتیازات ویژه برای نصب نرم افزار در NixOS وجود ندارد…

پیاده‌سازی

NixOS بر اساس مدیر بسته Nix ساخته شده است که تمام بسته‌ها را جداگانه ذخیره می‌کند…

پذیرش

نظرات و بررسی‌های مختلفی درباره NixOS منتشر شده است…

بوت شدن از رسانه نصب

  1. درایو نصب را وصل کنید و کامپیوتر را ریبوت کنید.
  2. کلید منوی بوت (مانند F12 یا Esc) را فشار دهید و USB را انتخاب کنید.

نصب گرافیکی

  1. انتخاب زبان نصب‌گر
  2. انتخاب مکان جغرافیایی
  3. انتخاب طرح‌بندی صفحه کلید
  4. ایجاد کاربر و رمز عبور
  5. انتخاب محیط دسکتاپ (GNOME یا Plasma)
  6. پارتیشن‌بندی و رمزگذاری دیسک
  7. تأیید و نصب

نصب Nix با دستور زیر انجام می‌شود:

$ curl -L https://nixos.org/nix/install | sh

برای مشاهده بسته‌ها:

$ nix-env –query –available –attr-path

نصب برخی بسته ها از کانال

$ nix-env –install –attr nixpkgs.hello

بررسی عملکرد بسته‌ها:

$ which hello
/home/user/.nix-profile/bin/hello
$ hello
Hello, world!

حذف بسته:

$ nix-env –uninstall hello

اجرای موقت بسته‌ها:

$ nix-shell –packages hello

به‌روزرسانی کانال و بسته‌ها:

$ nix-channel –update nixpkgs
$ nix-env –upgrade ‘*’

بازگردانی تغییرات:

$ nix-env –rollback

پاکسازی بسته‌های قدیمی:

$ nix-collect-garbage –delete-old

مدیر بسته Nix

Nix یک مدیر بسته و سیستم ساخت است…

نصب

راهنمای نصب Nix شامل جزئیات نصب باینری و سورس است…

دستورات Nix

از nix 2.0 سبک جدیدی از دستورات معرفی شد…

پیکربندی توصیفی

تنها فایل پیکربندی مرتبط با Nix، nix.conf است…

عملیات امری

مدیریت بسته‌ها با nix-env و nix-channels انجام می‌شود…

محیط‌های کاربر

Nix ابزار nix-env را برای مدیریت بسته‌ها فراهم کرده است:

دستورات پرکاربرد nix-env
جستجو nix search nixpkgs packagename
نصب nix-env -iA packagename
لیست بسته‌های نصب شده nix-env -q
حذف nix-env -e packagename
بروزرسانی nix-env -u

کانال‌ها

بسته‌های Nix از طریق کانال‌ها توزیع می‌شوند…

لیست کانال‌ها nix-channel –list
افزودن کانال اصلی nix-channel –add https://nixos.org/channels/channel-name nixos
حذف کانال nix-channel –remove channel-alias
بروزرسانی کانال‌ها nix-channel –update

Nixpkgs

Nixpkgs مجموعه‌ای بزرگ از بسته‌هاست…

دستور nix-env: یک راهنمای جامع

گزینه‌ها:

  • –install (-i): نصب بسته‌ها
  • –uninstall (-u): حذف بسته‌ها
  • –upgrade: بروزرسانی همه
  • –query (-q): نمایش اطلاعات
  • -A: نصب با مسیر کامل

مثال‌های بیشتر

nix-env -iA nixpkgs.{vim,git}
nix-env –uninstall {vim,git}
nix-env -qaP ‘.*vim.*’
nix-env -qP nixpkgs.firefox –meta


✍️ نویسنده: حسین سیلانی

🔗 درباره من: seilany.ir

📢 نویسندگی و مشارکت در وبلاگ: t.me/seilany