nix-config/hosts/heather/image.nix
mikl 411a8ba689 heather/common: passwordless sudo for mikl + fix deprecated options
- 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).
2026-07-11 22:55:00 +03:00

100 lines
4.6 KiB
Nix
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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;
};
}