- common/default.nix: add mikl to wheel + security.sudo.wheelNeedsPassword=false. Without this, root is unreachable on a fresh NixOS-yc image (no root password, no rescue channel) — nixos-rebuild switch is impossible. Mirrors the NOPASSWD:ALL that old YC boxes got via cloud-config user-data. - home/server.nix: programs.git.extraConfig -> .settings, programs.git.delta -> programs.delta with enableGitIntegration=true (deprecated warnings). - image.nix: boot.loader.grub.timeout -> boot.loader.timeout (renamed option).
100 lines
4.6 KiB
Nix
100 lines
4.6 KiB
Nix
# heather — Yandex Cloud guest profile + qcow2 image build target.
|
||
#
|
||
# Образец: nixpkgs/nixos/modules/virtualisation/google-compute-image.nix
|
||
# (YC compute клонировал GCP API/ABI — virtio, metadata по 169.254.169.254).
|
||
#
|
||
# Строитель: nixos/lib/make-disk-image.nix — то, чем nixpkgs собирает ВСЕ
|
||
# официальные облачные образы (AWS/GCP/Azure/DO/...). Без disko, без nixos-anywhere,
|
||
# без kexec. partitionTableType = "legacy" → MBR + одна ext4-партиция (label
|
||
# "nixos"), ровно как реальные YC-образы (insomnia/iscg-dev: /dev/vda1).
|
||
#
|
||
# Сборка:
|
||
# nix build .#nixosConfigurations.heather.config.system.build.image
|
||
# → result/nixos-image-<label>-x86_64-linux.qcow2
|
||
# Потом: загрузить в YC Object Storage → yc compute image create → создать ВМ.
|
||
#
|
||
# Этот модуль импортируется в default.nix ВСЕГДА — облачный профиль (virtio,
|
||
# cloud-init, grub, fileSystems) нужен и при nixos-rebuild на живой ВМ, не только
|
||
# при сборке образа. Цель сборки (system.build.image) при обычном rebuild
|
||
# ничего не меняет.
|
||
|
||
{ config, lib, pkgs, modulesPath, ... }:
|
||
|
||
with lib;
|
||
|
||
{
|
||
imports = [
|
||
(modulesPath + "/profiles/qemu-guest.nix")
|
||
(modulesPath + "/virtualisation/disk-size-option.nix")
|
||
(modulesPath + "/image/file-options.nix")
|
||
];
|
||
|
||
# --- Диск: одна ext4-партиция на label "nixos", растёт при первом буте ---
|
||
fileSystems."/" = {
|
||
fsType = "ext4";
|
||
device = "/dev/disk/by-label/nixos";
|
||
autoResize = true;
|
||
};
|
||
boot.growPartition = true;
|
||
|
||
# --- Загрузка: GRUB в MBR на весь диск (YC = legacy BIOS) ---
|
||
# make-disk-image внутри build-VM видит диск как /dev/vda и symlink-ает
|
||
# grub.devices на него. На реальной YC-ВМ virtio-scsi тоже даёт /dev/vda.
|
||
boot.loader.grub.enable = mkDefault true;
|
||
boot.loader.grub.device = "/dev/vda";
|
||
boot.loader.grub.configurationLimit = 1; # только текущее, но механизм выбора есть
|
||
boot.loader.timeout = 0;
|
||
boot.loader.systemd-boot.enable = mkForce false;
|
||
boot.loader.efi.canTouchEfiVariables = mkForce false;
|
||
|
||
# --- Ядро: virtio-драйверы для YC.
|
||
# Большую часть даёт профиль qemu-guest.nix (virtio_net/pci/scsi/blk + balloon/
|
||
# console/rng/gpu в initrd). Здесь добавляем только то, чего профиль не даёт:
|
||
# virtio_scsi в initrd.kernelModules (грузить модуль, а не просто available) и
|
||
# virtio_pci/net в runtime kernelModules для горячих устройств. ---
|
||
boot.initrd.kernelModules = [ "virtio_scsi" ];
|
||
boot.kernelModules = [ "virtio_pci" "virtio_net" ];
|
||
boot.kernelParams = [
|
||
"console=ttyS0" # serial — для отладки через `yc compute connect-to-serial-port`
|
||
"panic=1"
|
||
"boot.panic_on_fail"
|
||
];
|
||
|
||
# --- Сеть: DHCP на eth0, firewall off (полагаемся на YC Security Groups) ---
|
||
networking.useDHCP = mkDefault true;
|
||
networking.firewall.enable = mkDefault false;
|
||
|
||
# --- SSH: только по ключам ---
|
||
services.openssh.enable = mkDefault true;
|
||
services.openssh.settings.PermitRootLogin = mkDefault "prohibit-password";
|
||
services.openssh.settings.PasswordAuthentication = mkDefault false;
|
||
|
||
# --- cloud-init: Ec2 datasource. YC отдаёт metadata по 169.254.169.254
|
||
# в AWS-совместимом формате. Тогда ssh-keys из metadata сами прилетают в
|
||
# authorized_keys (как сегодня у insomnia/iscg-dev). ---
|
||
services.cloud-init.enable = true;
|
||
services.cloud-init.ext4.enable = true;
|
||
services.cloud-init.settings = {
|
||
datasource_list = [ "Ec2" "NoCloud" "None" ];
|
||
datasource = {
|
||
Ec2 = {
|
||
strict_id = false;
|
||
metadata_urls = [ "http://169.254.169.254" ];
|
||
};
|
||
};
|
||
ssh_pwauth = false;
|
||
};
|
||
|
||
# --- Цель сборки образа: system.build.image ---
|
||
image.baseName = "heather";
|
||
image.extension = "qcow2";
|
||
system.nixos.tags = [ "yandex-cloud" ];
|
||
system.build.image = import (modulesPath + "/../lib/make-disk-image.nix") {
|
||
name = "heather-image";
|
||
inherit (config.image) baseName;
|
||
partitionTableType = "legacy"; # MBR + single ext4 root
|
||
format = "qcow2"; # make-disk-image сам конвертит raw→qcow2
|
||
inherit (config.virtualisation) diskSize;
|
||
inherit config lib pkgs;
|
||
};
|
||
}
|