آموزش پیکربندی و آمادهسازی ماشینهای راه دور از طریق SSH
امکان جایگزینی هر نوع نصب لینوکس با یک پیکربندی NixOS روی سیستمهای در حال اجرا با استفاده از nixos-anywhere و disko وجود دارد.
مقدمه
در این آموزش، یک پیکربندی NixOS را روی یک رایانه در حال اجرا مستقر میکنید.
چه چیزی خواهید آموخت؟
شما یاد خواهید گرفت که چگونه:
- یک پیکربندی حداقلی NixOS با طرحبندی دیسک اعلانی و دسترسی SSH را مشخص کنید
- معتبر بودن یک پیکربندی را بررسی کنید
- یک پیکربندی NixOS را روی یک ماشین راه دور مستقر و بهروزرسانی کنید
به چه چیزی نیاز دارید؟
- آشنایی با زبان Nix
- آشنایی با module-system-tutorial
برای یک نصب خودکار موفق، اطمینان حاصل کنید که ماشین هدف دارای شرایط زیر است:
یک ماشین مجازی QEMU باشد که لینوکس را اجرا میکند
- با پشتیبانی از
kexec - روی معماری مجموعه دستورالعمل (ISA)
x86-64یاaarch64 - با حداقل ۱ گیگابایت (GB) رم (RAM)
این سیستم همچنین میتواند یک سیستم زنده (Live) بوتشده از USB باشد، مانند نصبکننده NixOS.
- با پشتیبانی از
آدرس IP بهطور خودکار با DHCP پیکربندی شده باشد
- امکان ورود به سیستم از طریق SSH را داشته باشید
- با احراز هویت کلید عمومی (ترجیح داده میشود) یا رمز عبور
- به عنوان کاربر
rootیا کاربر دیگری با دسترسیهایsudo
ماشین محلی فقط به یک نصب Nix فعال نیاز دارد.
ما در این آموزش به ماشین هدف target-machine میگوییم.
آن را با نام هاست یا آدرس IP واقعی جایگزین کنید.
آمادهسازی محیط
یک پوشه پروژه جدید ایجاد کنید و با شل (Shell) خود وارد آن شوید:
mkdir remote
cd remote تعیین وابستگیها روی nixpkgs، disko و nixos-anywhere:
$ nix-shell -p npins
[nix-shell:remote]$ npins init
[nix-shell:remote]$ npins add github nix-community disko
[nix-shell:remote]$ npins add github nix-community nixos-anywhere یک فایل جدید shell.nix ایجاد کنید که تمام ابزارهای موردنیاز را با استفاده از وابستگیهای سنجاقشده فراهم میکند:
let
sources = import ./npins;
pkgs = import sources.nixpkgs {};
in
pkgs.mkShell {
nativeBuildInputs = with pkgs; [
npins
nixos-anywhere
nixos-rebuild
];
shellHook = ''
export NIX_PATH="nixpkgs=${sources.nixpkgs}:nixos-config=$PWD/configuration.nix"
'';
} اکنون از محیط موقت خارج شده و وارد محیط جدید مشخصشده شوید:
[nix-shell:remote]$ exit
$ nix-shell این محیط شل آماده است تا از نسخههای خوشتعریف Nixpkgs به همراه nixos-anywhere و nixos-rebuild استفاده کند.
مهم
تمام دستورات زیر را در این محیط اجرا کنید.
ایجاد یک پیکربندی NixOS
پیکربندی جدید NixOS شامل پیکربندی عمومی سیستم و مشخصات چیدمان دیسک خواهد بود.
چیدمان دیسک در این مثال یک دیسک تکی را توصیف میکند که دارای یک رکورد راهاندازی اصلی master boot record (MBR) و پارتیشن سیستم EFI system partition (ESP)، و یک سیستمفایل ریشه است که تمام فضای خالی باقیمانده را اشغال میکند. این تنظیم هم روی سیستمهای EFI و هم BIOS کار خواهد کرد.
یک فایل جدید به نام single-disk-layout.nix با مشخصات چیدمان دیسک ایجاد کنید:
{ ... }:
{
disko.devices.disk.main = {
type = "disk";
content = {
type = "gpt";
partitions = {
MBR = {
priority = 0;
size = "1M";
type = "EF02";
};
ESP = {
priority = 1;
size = "500M";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
};
};
root = {
priority = 2;
size = "100%";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
};
};
};
};
} فایل configuration.nix را ایجاد کنید که تعریف طرحبندی دیسک را درونریزی کرده و مشخص میکند کدام دیسک باید فرمت شود:
راهنمایی
اگر شناسه دستگاه دیسک هدف را نمیدانید، تمام دستگاههای روی ماشین هدف را با دستور
lsblkفهرست کنید:$ ssh target-machine lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 256G 0 disk ├─sda1 8:1 0 248.5G 0 part /nix/store │ / └─sda2 8:2 0 7.5G 0 part [SWAP] sr0 11:0 1 1024M 0 romدر این مثال، نام دیسک
sdaاست. مسیر بلاک دیسک (block device) به شکل/dev/sdaخواهد بود. آن مقدار را برای بعد به خاطر بسپارید.
{ modulesPath, ... }:
let
diskDevice = "/dev/sda";
sources = import ./npins;
in
{
imports = [
(modulesPath + "/profiles/qemu-guest.nix")
(sources.disko + "/module.nix")
./single-disk-layout.nix
];
disko.devices.disk.main.device = diskDevice;
boot.loader.grub = {
devices = [ diskDevice ];
efiSupport = true;
efiInstallAsRemovable = true;
};
services.openssh.enable = true;
users.users.root.openssh.authorizedKeys.keys = [
"<your SSH key here>"
];
system.stateVersion = "24.11";
} مهم
مسیر
/dev/sdaرا با مسیر دستگاه بلوکی دیسک خود جایگزین کنید.رشتهی
<your SSH key here>را با کلید عمومی SSH که میخواهید برای ورودهای آینده به عنوان کاربرrootاستفاده کنید، جایگزین کنید.
توضیح تفصیلی متغیر diskDevice در بلوک let مسیر دستگاه بلوکی دیسک را تعریف میکند:
let
diskDevice = "/dev/sda";
sources = import ./npins;
in این گزینه برای تعیین هدف پارتیشنبندی و فرمتبندی همانطور که در مشخصات طرحبندی دیسک توضیح داده شده است، استفاده میشود. همچنین در پیکربندی راهانداز بوت استفاده میشود تا امکان راهاندازی آن هم روی سیستمهای قدیمی BIOS و هم UEFI فراهم شود:
disko.devices.disk.main.device = diskDevice;
boot.loader.grub = {
devices = [ diskDevice ];
efiSupport = true;
efiInstallAsRemovable = true;
}; ماژول qemu-guest.nix این سیستم را برای اجرا در داخل یک ماشین مجازی QEMU سازگار میکند:
imports = [
(modulesPath + "/profiles/qemu-guest.nix")
(sources.disko + "/module.nix")
./single-disk-layout.nix
]; بر اساس مشخصات طرحبندی دیسک، کتابخانه disko یک اسکریپت پارتیشنبندی و بخشی از پیکربندی NixOS را تولید میکند که پارتیشنها را به همان نسبت در زمان بوت (ra'andazi) مونتاژ میکند.
خط اول کتابخانه را درونریزی میکند و خط دوم طرحبندی دیسک را اعمال میکند:
imports = [
(modulesPath + "/profiles/qemu-guest.nix")
(sources.disko + "/module.nix")
./single-disk-layout.nix
]; تست چیدمان دیسک
بررسی کنید که چیدمان دیسک معتبر باشد:
nix-build -E "((import <nixpkgs> {}).nixos [ ./configuration.nix ]).installTest" این دستور کل فرآیند نصب را با ساخت یک derivation در صفت installTest که توسط ماژول disko ارائه شده است، درون یک ماشین مجازی اجرا میکند.
استقرار سیستم
برای استقرار سیستم، پیکربندی و اسکریپت قالببندی دیسک مربوطه را ساخته و nixos-anywhere را با استفاده از نتایج اجرا کنید:
مهم
مقدار
target-hostرا با نام هاست یا آدرس IP ماشین هدف خود جایگزین کنید.
toplevel=$(nixos-rebuild build --no-flake)
diskoScript=$(nix-build -E "((import <nixpkgs> {}).nixos [ ./configuration.nix ]).diskoScript")
nixos-anywhere --store-paths "$diskoScript" "$toplevel" root@target-host نکته
اگر احراز هویت با کلید عمومی را ندارید: متغیر محیطی
SSH_PASSرا روی رمز عبور خود تنظیم کنید و سپس پرچم--env-passwordرا به دستورnixos-anywhereاضافه کنید.
اکنون ابزار nixos-anywhere به سیستم مقصد وارد میشود، دیسک را پارتیشنبندی، قالببندی و متصل (mount) میکند و پیکربندی NixOS را نصب میکند.
سپس، سیستم را راهاندازی مجدد (Reboot) میکند.
بهروزرسانی سیستم
برای بهروزرسانی سیستم، npins را اجرا کرده و پیکربندی را مجدداً مستقر کنید:
npins update nixpkgs
nixos-rebuild switch --no-flake --target-host root@target-host ابزار nixos-anywhere دیگر مورد نیاز نیست، مگر اینکه بخواهید چیدمان دیسک را تغییر دهید.