ماشینهای مجازی NixOS
یکی از مهمترین ویژگیهای NixOS، قابلیت پیکربندی سرتاسر سیستم به شکل اعلانی (declarative)، از جمله بستههایی که باید نصب شوند، سرویسهایی که باید اجرا شوند و همچنین سایر تنظیمات و گزینهها است.
پیکربندیهای NixOS را میتوان برای تست و استفاده از NixOS با استفاده از یک ماشین مجازی به کار برد که در مقایسه با نصب کامل روی سختافزار واقعی (bare metal)، گزینهای سبکتر محسوب میشود.
چه چیزی خواهید آموخت؟
این آموزش به عنوان مقدمهای بر ایجاد ماشینهای مجازی NixOS عمل میکند. ماشینهای مجازی ابزاری کاربردی برای آزمایش یا دیباگ (اشکالزدایی) پیکربندیهای NixOS هستند.
به چه چیزی نیاز دارید؟
- یک سیستم لینوکس با پشتیبانی از مجازیسازی
- (اختیاری) یک محیط گرافیکی برای اجرای یک ماشین مجازی گرافیکی
- یک نصب Nix فعال
- دانش پایهای از زبان Nix
مهم
یک پیکربندی NixOS یک تابع در زبان Nix است که از قرارداد ماژول NixOS پیروی میکند. برای بررسی جامع سیستم ماژول، آموزش module-system-deep-dive را مطالعه کنید.
شروع از یک پیکربندی پیشفرض NixOS
نکته
این آموزش با ساختن
configuration.nixشما از اصول اولیه شروع میکند و هر مرحله را توضیح میدهد. در صورت تمایل، میتوانید مستقیماً به بخش پیکربندی نمونه بروید.
ما با یک configuration.nix حداقلی شروع میکنیم:
{ config, pkgs, ... }:
{
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
system.stateVersion = "24.05";
} برای امکان ورود به سیستم، خطوط زیر را به مجموعه ویژگی بازگرداندهشده اضافه کنید:
users.users.alice = {
isNormalUser = true;
extraGroups = [ "wheel" ];
}; علاوه بر این، باید یک رمز عبور برای این کاربر مشخص کنید.
فقط به منظور نمایش، با افزودن گزینهٔ initialPassword به پیکربندی کاربر، یک رمز عبور ناامن و به صورت متن ساده (Plain text) مشخص میکنید:
initialPassword = "test"; ما دو برنامه سبکوزن را به عنوان مثال اضافه میکنیم:
environment.systemPackages = with pkgs; [
cowsay
lolcat
]; هشدار
از گذرواژههای متنی ساده (plain text) در خارج از این مثال استفاده نکنید، مگر اینکه بدانید چه کار میکنید. برای جایگزینهای امنتر،
initialHashedPasswordیاssh.authorizedKeysرا ببینید.
پیکربندی نمونه
فایل کامل configuration.nix به شکل زیر است:
{ config, pkgs, ... }:
{
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
users.users.alice = {
isNormalUser = true;
extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
initialPassword = "test";
};
environment.systemPackages = with pkgs; [
cowsay
lolcat
];
system.stateVersion = "24.05";
} ایجاد یک ماشین مجازی مبتنی بر QEMU از روی یک پیکربندی NixOS
یک ماشین مجازی NixOS با استفاده از دستور nix-build ایجاد میشود:
$ nix-build '<nixpkgs/nixos>' -A vm -I nixpkgs=channel:nixos-24.05 -I nixos-config=./configuration.nix این دستور صفت vm را از نسخه nixos-24.05 از NixOS، با استفاده از پیکربندی NixOS مشخصشده در مسیر نسبی، میسازد.
توضیح دقیق
آرگومان موقعیتی برای
nix-buildمسیری است به درایویشنی که باید ساخته شود. آن مسیر را میتوان از یک عبارت Nix که به یک derivation ارزیابی میشود به دست آورد.کمکرسان ساخت ماشین مجازی در NixOS تعریف شده است که بخشی از مخزن
nixpkgsاست. بنابراین ما از مسیر جستجو<nixpkgs/nixos>استفاده میکنیم.گزینهی
-Aصفت مورد نظر را برای انتخاب از عبارت Nix ارائهشده یعنی<nixpkgs/nixos>مشخص میکند.برای ساخت ماشین مجازی، ما صفت
vmرا همانطور که درnixos/default.nixتعریف شده است، انتخاب میکنیم.گزینهی
-Iورودیها را به مسیر جستجو اضافه میکند.در اینجا ما
nixpkgsرا طوری تنظیم میکنیم که به نسخه خاصی از Nixpkgs اشاره کند وnix-configرا روی فایلconfiguration.nixدر پوشه جاری تنظیم میکنیم.
اجرای ماشین مجازی
دستور قبلی یک پیوند نمادین با نام result در پوشه کاری ایجاد کرد.
این پیوند به پوشهای اشاره دارد که حاوی ماشین مجازی است.
$ ls -R ./result
result:
bin system
result/bin:
run-nixos-vm ماشین مجازی را اجرا کنید:
$ QEMU_KERNEL_PARAMS=console=ttyS0 ./result/bin/run-nixos-vm -nographic; reset این دستور به دلیل وجود -nographic، QEMU را در همین ترمینال اجرا خواهد کرد.
گزینهٔ console=ttyS0 همچنین فرآیند راهاندازی (بوت) را نمایش میدهد که در صفحهٔ ورود به کنسول به پایان میرسد.
با نام کاربری alice و رمز عبور test وارد شوید.
بررسی کنید که برنامهها طبق مشخصات واقعاً در دسترس هستند:
$ cowsay hello | lolcat با خاموش کردن ماشین مجازی، از آن خارج شوید:
$ sudo poweroff نکته
اگر فراموش کردید کاربر را به گروه
wheelاضافه کنید یا پسوردی تعیین نکردید، ماشین مجازی را از یک ترمینال دیگر متوقف کنید:نکته
$ sudo pkill qemuاجرای ماشین مجازی یک فایل
nixos.qcow2در پوشه فعلی ایجاد میکند. این فایل تصویر دیسک حاوی وضعیت پویای ماشین مجازی است. از آنجا که این فایل وضعیت اجراهای قبلی (مانند رمز عبور کاربر) را حفظ میکند، ممکن است در اشکالزدایی تداخل ایجاد کند.هرگاه پیکربندی را تغییر دادید، این فایل را حذف کنید:
$ rm nixos.qcow2اجرای GNOME روی یک ماشین مجازی گرافیکی
برای ایجاد یک ماشین مجازی با رابط کاربری گرافیکی، خطوط زیر را به پیکربندی اضافه کنید:
# Enable the X11 windowing system. services.xserver.enable = true; # Enable the GNOME Desktop Environment. services.xserver.displayManager.gdm.enable = true; services.xserver.desktopManager.gnome.enable = true;این سه خط، X11، مدیر نمایشگر GDM (برای امکان ورود به سیستم) و GNOME را به عنوان مدیر دسکتاپ فعال میکنند.
راهنمایی
همچنین میتوانید از ماژول
installation-cd-graphical-gnome.nixبرای تولید فایل پیکربندی از صفر استفاده کنید:nix-shell -I nixpkgs=channel:nixos-24.05 -p "$(cat <<EOF let pkgs = import <nixpkgs> { config = {}; overlays = []; }; iso-config = pkgs.path + /nixos/modules/installer/cd-dvd/installation-cd-graphical-gnome.nix; nixos = pkgs.nixos iso-config; in nixos.config.system.build.nixos-generate-config EOF )"$ nixos-generate-config --dir ./فایل کامل
configuration.nixبه شکل زیر است:{ config, pkgs, ... }: { boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; services.xserver.enable = true; services.xserver.displayManager.gdm.enable = true; services.xserver.desktopManager.gnome.enable = true; users.users.alice = { isNormalUser = true; extraGroups = [ "wheel" ]; initialPassword = "test"; }; system.stateVersion = "24.05"; }برای دریافت خروجی گرافیکی، ماشین مجازی را بدون گزینههای خاص اجرا کنید:
$ nix-build '<nixpkgs/nixos>' -A vm -I nixpkgs=channel:nixos-24.05 -I nixos-config=./configuration.nix $ ./result/bin/run-nixos-vmاجرای Sway به عنوان کامپوزیتور Wayland روی یک ماشین مجازی
برای تغییر به یک کامپوزیتور Wayland، گزینه
services.xserver.desktopManager.gnomeرا غیرفعال کرده وprograms.swayرا فعال کنید:
configuration.nix- services.xserver.desktopManager.gnome.enable = true; + programs.sway.enable = true;نکته
اجرای ترکیبکنندههای Wayland در یک ماشین مجازی ممکن است منجر به مشکلاتی با درایورهای نمایشگر مورد استفاده توسط QEMU شود. شما باید از میان درایورهای موجود، یکی را که با Sway سازگار است انتخاب کنید. برای مشاهده گزینهها به مستندات کاربر QEMU مراجعه کنید. یکی از گزینهها درایور
virtio-vgaاست: :::{$ ./result/bin/run-nixos-vm -device virtio-vgaهمچنین میتوان آرگومانها را به QEMU در فایل پیکربندی اضافه کرد:
{ config, pkgs, ... }: { boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; services.xserver.enable = true; services.xserver.displayManager.gdm.enable = true; programs.sway.enable = true; imports = [ <nixpkgs/nixos/modules/virtualisation/qemu-vm.nix> ]; virtualisation.qemu.options = [ "-device virtio-vga" ]; users.users.alice = { isNormalUser = true; extraGroups = [ "wheel" ]; initialPassword = "test"; }; system.stateVersion = "24.05"; }راهنمای NixOS دارای فصلهایی درباره X11 و Wayland است که مدیران پنجره جایگزین را فهرست میکنند.
مراجع
- راهنمای NixOS: پیکربندی NixOS.
- راهنمای NixOS: ماژولها.
- مرجع گزینههای راهنمای NixOS.
- راهنمای NixOS: تغییر پیکربندی.
- کد منبع NixOS: قالب پیکربندی (
configuration template) درtools.nix.- کد منبع NixOS: صفت
vmدرdefault.nix.- راهنمای Nix:
nix-build.- راهنمای Nix: گزینههای رایج خط فرمان.
- مستندات کاربری QEMU برای گزینههای زمان اجرای بیشتر
- جستجوی گزینههای NixOS:
virtualisation.qemuبرای پیکربندی اعلانی ماشین مجازیگامهای بعدی