From 18ad43787221cfb535c0282a2161d94eb76fe9b8 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Mon, 19 Aug 2024 23:42:25 +0200 Subject: [PATCH] Format nix files --- machines/installer/default.nix | 3 +- modules/desk-os/default.nix | 14 +- modules/installer/default.nix | 31 +- modules/installer/iso-image.nix | 717 +++++++++++----------- packages/calamares-extensions/default.nix | 3 +- 5 files changed, 402 insertions(+), 366 deletions(-) diff --git a/machines/installer/default.nix b/machines/installer/default.nix index 13dd2bd..b674a8d 100644 --- a/machines/installer/default.nix +++ b/machines/installer/default.nix @@ -3,8 +3,7 @@ lib, inputs, ... -}: -{ +}: { imports = [ ../../modules/installer ]; diff --git a/modules/desk-os/default.nix b/modules/desk-os/default.nix index 7eba120..2be5d97 100644 --- a/modules/desk-os/default.nix +++ b/modules/desk-os/default.nix @@ -133,13 +133,13 @@ "org/gnome/shell/extensions/arcmenu" = { menu-layout = "Windows"; pinned-apps = lib.gvariant.mkArray [ - [ (lib.gvariant.mkDictionaryEntry "id" "firefox.desktop") ] - [ (lib.gvariant.mkDictionaryEntry "id" "org.gnome.Geary.desktop") ] - [ (lib.gvariant.mkDictionaryEntry "id" "org.gnome.Calendar.desktop") ] - [ (lib.gvariant.mkDictionaryEntry "id" "org.gnome.Nautilus.desktop") ] - [ (lib.gvariant.mkDictionaryEntry "id" "writer.desktop") ] - [ (lib.gvariant.mkDictionaryEntry "id" "calc.desktop") ] - [ (lib.gvariant.mkDictionaryEntry "id" "impress.desktop") ] + [(lib.gvariant.mkDictionaryEntry "id" "firefox.desktop")] + [(lib.gvariant.mkDictionaryEntry "id" "org.gnome.Geary.desktop")] + [(lib.gvariant.mkDictionaryEntry "id" "org.gnome.Calendar.desktop")] + [(lib.gvariant.mkDictionaryEntry "id" "org.gnome.Nautilus.desktop")] + [(lib.gvariant.mkDictionaryEntry "id" "writer.desktop")] + [(lib.gvariant.mkDictionaryEntry "id" "calc.desktop")] + [(lib.gvariant.mkDictionaryEntry "id" "impress.desktop")] ]; }; }; diff --git a/modules/installer/default.nix b/modules/installer/default.nix index 04f256f..6b5c751 100644 --- a/modules/installer/default.nix +++ b/modules/installer/default.nix @@ -1,12 +1,19 @@ -{ config, lib, options, pkgs, inputs, modulesPath, ... }: - -with lib; - -let - calamares-nixos-autostart = pkgs.makeAutostartItem { name = "io.calamares.calamares"; package = pkgs.calamares-nixos; }; - calamares-extensions-desk-os = pkgs.callPackage ../../packages/calamares-extensions {}; -in { + config, + lib, + options, + pkgs, + inputs, + modulesPath, + ... +}: +with lib; let + calamares-nixos-autostart = pkgs.makeAutostartItem { + name = "io.calamares.calamares"; + package = pkgs.calamares-nixos; + }; + calamares-extensions-desk-os = pkgs.callPackage ../../packages/calamares-extensions {}; +in { imports = [ ./iso-image.nix (modulesPath + "/profiles/all-hardware.nix") @@ -17,7 +24,7 @@ in # boot.loader.timeout = lib.mkForce 0; # Adds terminus_font for people with HiDPI displays - console.packages = options.console.packages.default ++ [ pkgs.terminus_font ]; + console.packages = options.console.packages.default ++ [pkgs.terminus_font]; # FIXME(m): Disable squashfs compression during development isoImage.squashfsCompression = null; @@ -33,7 +40,7 @@ in # An installation media cannot tolerate a host config defined file # system layout on a fresh machine, before it has been formatted. - swapDevices = mkImageMediaOverride [ ]; + swapDevices = mkImageMediaOverride []; fileSystems = mkImageMediaOverride config.lib.isoFileSystems; boot.postBootCommands = '' @@ -114,7 +121,7 @@ in ]; # Support choosing from any locale - i18n.supportedLocales = [ "all" ]; + i18n.supportedLocales = ["all"]; isoImage.edition = "gnome"; @@ -136,7 +143,7 @@ in sleep-inactive-battery-type='nothing' ''; - extraGSettingsOverridePackages = [ pkgs.gnome.gnome-settings-daemon ]; + extraGSettingsOverridePackages = [pkgs.gnome.gnome-settings-daemon]; enable = true; }; diff --git a/modules/installer/iso-image.nix b/modules/installer/iso-image.nix index 8389170..7b663ae 100644 --- a/modules/installer/iso-image.nix +++ b/modules/installer/iso-image.nix @@ -1,89 +1,88 @@ # This module creates a bootable ISO image containing the given NixOS # configuration. The derivation for the ISO image will be placed in # config.system.build.isoImage. - -{ config, lib, pkgs, ... }: - -with lib; - -let - /** - * Given a list of `options`, concats the result of mapping each options - * to a menuentry for use in grub. +{ + config, + lib, + pkgs, + ... +}: +with lib; let + /* * - * * defaults: {name, image, params, initrd} - * * options: [ option... ] - * * option: {name, params, class} - */ - menuBuilderGrub2 = - defaults: options: lib.concatStrings + * Given a list of `options`, concats the result of mapping each options + * to a menuentry for use in grub. + * + * * defaults: {name, image, params, initrd} + * * options: [ option... ] + * * option: {name, params, class} + */ + menuBuilderGrub2 = defaults: options: + lib.concatStrings ( map (option: '' menuentry '${defaults.name} ${ - # Name appended to menuentry defaults to params if no specific name given. - option.name or (optionalString (option ? params) "(${option.params})") + # Name appended to menuentry defaults to params if no specific name given. + option.name or (optionalString (option ? params) "(${option.params})") }' ${optionalString (option ? class) " --class ${option.class}"} { # Fallback to UEFI console for boot, efifb sometimes has difficulties. terminal_output console linux ${defaults.image} \''${isoboot} ${defaults.params} ${ - option.params or "" - } + option.params or "" + } initrd ${defaults.initrd} } '') options - ) - ; + ); - /** - * Builds the default options. - */ + /* + * + * Builds the default options. + */ buildMenuGrub2 = buildMenuAdditionalParamsGrub2 ""; targetArch = - if config.boot.loader.grub.forcei686 then - "ia32" - else - pkgs.stdenv.hostPlatform.efiArch; + if config.boot.loader.grub.forcei686 + then "ia32" + else pkgs.stdenv.hostPlatform.efiArch; - /** - * Given params to add to `params`, build a set of default options. - * Use this one when creating a variant (e.g. hidpi) - */ - buildMenuAdditionalParamsGrub2 = additional: - let + /* + * + * Given params to add to `params`, build a set of default options. + * Use this one when creating a variant (e.g. hidpi) + */ + buildMenuAdditionalParamsGrub2 = additional: let finalCfg = { name = "${config.isoImage.prependToMenuLabel}${config.system.nixos.distroName} ${config.system.nixos.label}${config.isoImage.appendToMenuLabel}"; params = "init=${config.system.build.toplevel}/init ${additional} ${toString config.boot.kernelParams}"; image = "/boot/${config.system.boot.loader.kernelFile}"; initrd = "/boot/initrd"; }; - in menuBuilderGrub2 finalCfg [ - { class = "installer"; } - ] - ; + {class = "installer";} + ]; # Timeout in syslinux is in units of 1/10 of a second. # null means max timeout (35996, just under 1h in 1/10 seconds) # 0 means disable timeout - syslinuxTimeout = if config.boot.loader.timeout == null then - 35996 - else - config.boot.loader.timeout * 10; + syslinuxTimeout = + if config.boot.loader.timeout == null + then 35996 + else config.boot.loader.timeout * 10; # Timeout in grub is in seconds. # null means max timeout (infinity) # 0 means disable timeout - grubEfiTimeout = if config.boot.loader.timeout == null then - -1 - else - config.boot.loader.timeout; + grubEfiTimeout = + if config.boot.loader.timeout == null + then -1 + else config.boot.loader.timeout; # The configuration file for syslinux. @@ -122,23 +121,28 @@ let APPEND ${toString config.boot.loader.grub.memtest86.params} ''; - isolinuxCfg = concatStringsSep "\n" - ([ baseIsolinuxCfg ] ++ optional config.boot.loader.grub.memtest86.enable isolinuxMemtest86Entry); + isolinuxCfg = + concatStringsSep "\n" + ([baseIsolinuxCfg] ++ optional config.boot.loader.grub.memtest86.enable isolinuxMemtest86Entry); - refindBinary = if targetArch == "x64" || targetArch == "aa64" then "refind_${targetArch}.efi" else null; + refindBinary = + if targetArch == "x64" || targetArch == "aa64" + then "refind_${targetArch}.efi" + else null; # Setup instructions for rEFInd. refind = - if refindBinary != null then - '' + if refindBinary != null + then '' # Adds rEFInd to the ISO. cp -v ${pkgs.refind}/share/refind/${refindBinary} $out/EFI/boot/ - '' - else - "# No refind for ${targetArch}" - ; + '' + else "# No refind for ${targetArch}"; - grubPkgs = if config.boot.loader.grub.forcei686 then pkgs.pkgsi686Linux else pkgs; + grubPkgs = + if config.boot.loader.grub.forcei686 + then pkgs.pkgsi686Linux + else pkgs; grubMenuCfg = '' # @@ -181,234 +185,239 @@ let fi ${ # When there is a theme configured, use it, otherwise use the background image. - if config.isoImage.grubTheme != null then '' - # Sets theme. - set theme=(\$root)/EFI/boot/grub-theme/theme.txt - # Load theme fonts - $(find ${config.isoImage.grubTheme} -iname '*.pf2' -printf "loadfont (\$root)/EFI/boot/grub-theme/%P\n") - '' else '' - if background_image (\$root)/EFI/boot/efi-background.png; then - # Black background means transparent background when there - # is a background image set... This seems undocumented :( - set color_normal=black/black - set color_highlight=white/blue - else - # Falls back again to proper colors. - set menu_color_normal=cyan/blue - set menu_color_highlight=white/blue - fi - ''} + if config.isoImage.grubTheme != null + then '' + # Sets theme. + set theme=(\$root)/EFI/boot/grub-theme/theme.txt + # Load theme fonts + $(find ${config.isoImage.grubTheme} -iname '*.pf2' -printf "loadfont (\$root)/EFI/boot/grub-theme/%P\n") + '' + else '' + if background_image (\$root)/EFI/boot/efi-background.png; then + # Black background means transparent background when there + # is a background image set... This seems undocumented :( + set color_normal=black/black + set color_highlight=white/blue + else + # Falls back again to proper colors. + set menu_color_normal=cyan/blue + set menu_color_highlight=white/blue + fi + '' + } ''; # The EFI boot image. # Notes about grub: # * Yes, the grubMenuCfg has to be repeated in all submenus. Otherwise you # will get white-on-black console-like text on sub-menus. *sigh* - efiDir = pkgs.runCommand "efi-directory" { - nativeBuildInputs = [ pkgs.buildPackages.grub2_efi ]; - strictDeps = true; - } '' - mkdir -p $out/EFI/boot/ + efiDir = + pkgs.runCommand "efi-directory" { + nativeBuildInputs = [pkgs.buildPackages.grub2_efi]; + strictDeps = true; + } '' + mkdir -p $out/EFI/boot/ - # Add a marker so GRUB can find the filesystem. - touch $out/EFI/nixos-installer-image + # Add a marker so GRUB can find the filesystem. + touch $out/EFI/nixos-installer-image - # ALWAYS required modules. - MODULES=( - # Basic modules for filesystems and partition schemes - "fat" - "iso9660" - "part_gpt" - "part_msdos" + # ALWAYS required modules. + MODULES=( + # Basic modules for filesystems and partition schemes + "fat" + "iso9660" + "part_gpt" + "part_msdos" - # Basic stuff - "normal" - "boot" - "linux" - "configfile" - "loopback" - "chain" - "halt" + # Basic stuff + "normal" + "boot" + "linux" + "configfile" + "loopback" + "chain" + "halt" - # Allows rebooting into firmware setup interface - "efifwsetup" + # Allows rebooting into firmware setup interface + "efifwsetup" - # EFI Graphics Output Protocol - "efi_gop" + # EFI Graphics Output Protocol + "efi_gop" - # User commands - "ls" + # User commands + "ls" - # System commands - "search" - "search_label" - "search_fs_uuid" - "search_fs_file" - "echo" + # System commands + "search" + "search_label" + "search_fs_uuid" + "search_fs_file" + "echo" - # We're not using it anymore, but we'll leave it in so it can be used - # by user, with the console using "C" - "serial" + # We're not using it anymore, but we'll leave it in so it can be used + # by user, with the console using "C" + "serial" - # Graphical mode stuff - "gfxmenu" - "gfxterm" - "gfxterm_background" - "gfxterm_menu" - "test" - "loadenv" - "all_video" - "videoinfo" + # Graphical mode stuff + "gfxmenu" + "gfxterm" + "gfxterm_background" + "gfxterm_menu" + "test" + "loadenv" + "all_video" + "videoinfo" - # File types for graphical mode - "png" - ) + # File types for graphical mode + "png" + ) - echo "Building GRUB with modules:" - for mod in ''${MODULES[@]}; do - echo " - $mod" - done - - # Modules that may or may not be available per-platform. - echo "Adding additional modules:" - for mod in efi_uga; do - if [ -f ${grubPkgs.grub2_efi}/lib/grub/${grubPkgs.grub2_efi.grubTarget}/$mod.mod ]; then + echo "Building GRUB with modules:" + for mod in ''${MODULES[@]}; do echo " - $mod" - MODULES+=("$mod") - fi - done + done - # Make our own efi program, we can't rely on "grub-install" since it seems to - # probe for devices, even with --skip-fs-probe. - grub-mkimage \ - --directory=${grubPkgs.grub2_efi}/lib/grub/${grubPkgs.grub2_efi.grubTarget} \ - -o $out/EFI/boot/boot${targetArch}.efi \ - -p /EFI/boot \ - -O ${grubPkgs.grub2_efi.grubTarget} \ - ''${MODULES[@]} - cp ${grubPkgs.grub2_efi}/share/grub/unicode.pf2 $out/EFI/boot/ + # Modules that may or may not be available per-platform. + echo "Adding additional modules:" + for mod in efi_uga; do + if [ -f ${grubPkgs.grub2_efi}/lib/grub/${grubPkgs.grub2_efi.grubTarget}/$mod.mod ]; then + echo " - $mod" + MODULES+=("$mod") + fi + done - cat < $out/EFI/boot/grub.cfg + # Make our own efi program, we can't rely on "grub-install" since it seems to + # probe for devices, even with --skip-fs-probe. + grub-mkimage \ + --directory=${grubPkgs.grub2_efi}/lib/grub/${grubPkgs.grub2_efi.grubTarget} \ + -o $out/EFI/boot/boot${targetArch}.efi \ + -p /EFI/boot \ + -O ${grubPkgs.grub2_efi.grubTarget} \ + ''${MODULES[@]} + cp ${grubPkgs.grub2_efi}/share/grub/unicode.pf2 $out/EFI/boot/ - set textmode=${boolToString (config.isoImage.forceTextMode)} - set timeout=${toString grubEfiTimeout} + cat < $out/EFI/boot/grub.cfg - clear - # This message will only be viewable on the default (UEFI) console. - echo "" - echo "Loading graphical boot menu..." - echo "" - echo "Press 't' to use the text boot menu on this console..." - echo "" + set textmode=${boolToString (config.isoImage.forceTextMode)} + set timeout=${toString grubEfiTimeout} - ${grubMenuCfg} - - hiddenentry 'Text mode' --hotkey 't' { - loadfont (\$root)/EFI/boot/unicode.pf2 - set textmode=true - terminal_output console - } - hiddenentry 'GUI mode' --hotkey 'g' { - $(find ${config.isoImage.grubTheme} -iname '*.pf2' -printf "loadfont (\$root)/EFI/boot/grub-theme/%P\n") - set textmode=false - terminal_output gfxterm - } - - - # If the parameter iso_path is set, append the findiso parameter to the kernel - # line. We need this to allow the nixos iso to be booted from grub directly. - if [ \''${iso_path} ] ; then - set isoboot="findiso=\''${iso_path}" - fi - - # - # Menu entries - # - - ${buildMenuGrub2} - submenu "HiDPI, Quirks and Accessibility" --class hidpi --class submenu { - ${grubMenuCfg} - submenu "Suggests resolution @720p" --class hidpi-720p { - ${grubMenuCfg} - ${buildMenuAdditionalParamsGrub2 "video=1280x720@60"} - } - submenu "Suggests resolution @1080p" --class hidpi-1080p { - ${grubMenuCfg} - ${buildMenuAdditionalParamsGrub2 "video=1920x1080@60"} - } - - # If we boot into a graphical environment where X is autoran - # and always crashes, it makes the media unusable. Allow the user - # to disable this. - submenu "Disable display-manager" --class quirk-disable-displaymanager { - ${grubMenuCfg} - ${buildMenuAdditionalParamsGrub2 "systemd.mask=display-manager.service"} - } - - # Some laptop and convertibles have the panel installed in an - # inconvenient way, rotated away from the keyboard. - # Those entries makes it easier to use the installer. - submenu "" {return} - submenu "Rotate framebuffer Clockwise" --class rotate-90cw { - ${grubMenuCfg} - ${buildMenuAdditionalParamsGrub2 "fbcon=rotate:1"} - } - submenu "Rotate framebuffer Upside-Down" --class rotate-180 { - ${grubMenuCfg} - ${buildMenuAdditionalParamsGrub2 "fbcon=rotate:2"} - } - submenu "Rotate framebuffer Counter-Clockwise" --class rotate-90ccw { - ${grubMenuCfg} - ${buildMenuAdditionalParamsGrub2 "fbcon=rotate:3"} - } - - # As a proof of concept, mainly. (Not sure it has accessibility merits.) - submenu "" {return} - submenu "Use black on white" --class accessibility-blakconwhite { - ${grubMenuCfg} - ${buildMenuAdditionalParamsGrub2 "vt.default_red=0xFF,0xBC,0x4F,0xB4,0x56,0xBC,0x4F,0x00,0xA1,0xCF,0x84,0xCA,0x8D,0xB4,0x84,0x68 vt.default_grn=0xFF,0x55,0xBA,0xBA,0x4D,0x4D,0xB3,0x00,0xA0,0x8F,0xB3,0xCA,0x88,0x93,0xA4,0x68 vt.default_blu=0xFF,0x58,0x5F,0x58,0xC5,0xBD,0xC5,0x00,0xA8,0xBB,0xAB,0x97,0xBD,0xC7,0xC5,0x68"} - } - - # Serial access is a must! - submenu "" {return} - submenu "Serial console=ttyS0,115200n8" --class serial { - ${grubMenuCfg} - ${buildMenuAdditionalParamsGrub2 "console=ttyS0,115200n8"} - } - } - - ${lib.optionalString (refindBinary != null) '' - # GRUB apparently cannot do "chainloader" operations on "CD". - if [ "\$root" != "cd0" ]; then - menuentry 'rEFInd' --class refind { - # Force root to be the FAT partition - # Otherwise it breaks rEFInd's boot - search --set=root --no-floppy --fs-uuid 1234-5678 - chainloader (\$root)/EFI/boot/${refindBinary} - } - fi - ''} - menuentry 'Firmware Setup' --class settings { - fwsetup clear + # This message will only be viewable on the default (UEFI) console. echo "" - echo "If you see this message, your EFI system doesn't support this feature." + echo "Loading graphical boot menu..." echo "" + echo "Press 't' to use the text boot menu on this console..." + echo "" + + ${grubMenuCfg} + + hiddenentry 'Text mode' --hotkey 't' { + loadfont (\$root)/EFI/boot/unicode.pf2 + set textmode=true + terminal_output console + } + hiddenentry 'GUI mode' --hotkey 'g' { + $(find ${config.isoImage.grubTheme} -iname '*.pf2' -printf "loadfont (\$root)/EFI/boot/grub-theme/%P\n") + set textmode=false + terminal_output gfxterm + } + + + # If the parameter iso_path is set, append the findiso parameter to the kernel + # line. We need this to allow the nixos iso to be booted from grub directly. + if [ \''${iso_path} ] ; then + set isoboot="findiso=\''${iso_path}" + fi + + # + # Menu entries + # + + ${buildMenuGrub2} + submenu "HiDPI, Quirks and Accessibility" --class hidpi --class submenu { + ${grubMenuCfg} + submenu "Suggests resolution @720p" --class hidpi-720p { + ${grubMenuCfg} + ${buildMenuAdditionalParamsGrub2 "video=1280x720@60"} + } + submenu "Suggests resolution @1080p" --class hidpi-1080p { + ${grubMenuCfg} + ${buildMenuAdditionalParamsGrub2 "video=1920x1080@60"} + } + + # If we boot into a graphical environment where X is autoran + # and always crashes, it makes the media unusable. Allow the user + # to disable this. + submenu "Disable display-manager" --class quirk-disable-displaymanager { + ${grubMenuCfg} + ${buildMenuAdditionalParamsGrub2 "systemd.mask=display-manager.service"} + } + + # Some laptop and convertibles have the panel installed in an + # inconvenient way, rotated away from the keyboard. + # Those entries makes it easier to use the installer. + submenu "" {return} + submenu "Rotate framebuffer Clockwise" --class rotate-90cw { + ${grubMenuCfg} + ${buildMenuAdditionalParamsGrub2 "fbcon=rotate:1"} + } + submenu "Rotate framebuffer Upside-Down" --class rotate-180 { + ${grubMenuCfg} + ${buildMenuAdditionalParamsGrub2 "fbcon=rotate:2"} + } + submenu "Rotate framebuffer Counter-Clockwise" --class rotate-90ccw { + ${grubMenuCfg} + ${buildMenuAdditionalParamsGrub2 "fbcon=rotate:3"} + } + + # As a proof of concept, mainly. (Not sure it has accessibility merits.) + submenu "" {return} + submenu "Use black on white" --class accessibility-blakconwhite { + ${grubMenuCfg} + ${buildMenuAdditionalParamsGrub2 "vt.default_red=0xFF,0xBC,0x4F,0xB4,0x56,0xBC,0x4F,0x00,0xA1,0xCF,0x84,0xCA,0x8D,0xB4,0x84,0x68 vt.default_grn=0xFF,0x55,0xBA,0xBA,0x4D,0x4D,0xB3,0x00,0xA0,0x8F,0xB3,0xCA,0x88,0x93,0xA4,0x68 vt.default_blu=0xFF,0x58,0x5F,0x58,0xC5,0xBD,0xC5,0x00,0xA8,0xBB,0xAB,0x97,0xBD,0xC7,0xC5,0x68"} + } + + # Serial access is a must! + submenu "" {return} + submenu "Serial console=ttyS0,115200n8" --class serial { + ${grubMenuCfg} + ${buildMenuAdditionalParamsGrub2 "console=ttyS0,115200n8"} + } + } + + ${lib.optionalString (refindBinary != null) '' + # GRUB apparently cannot do "chainloader" operations on "CD". + if [ "\$root" != "cd0" ]; then + menuentry 'rEFInd' --class refind { + # Force root to be the FAT partition + # Otherwise it breaks rEFInd's boot + search --set=root --no-floppy --fs-uuid 1234-5678 + chainloader (\$root)/EFI/boot/${refindBinary} + } + fi + ''} + menuentry 'Firmware Setup' --class settings { + fwsetup + clear + echo "" + echo "If you see this message, your EFI system doesn't support this feature." + echo "" + } + menuentry 'Shutdown' --class shutdown { + halt + } + EOF + + grub-script-check $out/EFI/boot/grub.cfg + + ${refind} + ''; + + efiImg = + pkgs.runCommand "efi-image_eltorito" { + nativeBuildInputs = [pkgs.buildPackages.mtools pkgs.buildPackages.libfaketime pkgs.buildPackages.dosfstools]; + strictDeps = true; } - menuentry 'Shutdown' --class shutdown { - halt - } - EOF - - grub-script-check $out/EFI/boot/grub.cfg - - ${refind} - ''; - - efiImg = pkgs.runCommand "efi-image_eltorito" { - nativeBuildInputs = [ pkgs.buildPackages.mtools pkgs.buildPackages.libfaketime pkgs.buildPackages.dosfstools ]; - strictDeps = true; - } # Be careful about determinism: du --apparent-size, # dates (cp -p, touch, mcopy -m, faketime for label), IDs (mkfs.vfat -i) '' @@ -443,12 +452,8 @@ let # Verify the FAT partition. fsck.vfat -vn "$out" ''; # */ - -in - -{ +in { options = { - isoImage.isoName = mkOption { default = "${config.isoImage.isoBaseName}.iso"; type = lib.types.str; @@ -475,12 +480,13 @@ in }; isoImage.squashfsCompression = mkOption { - default = with pkgs.stdenv.hostPlatform; "xz -Xdict-size 100% " - + lib.optionalString isx86 "-Xbcj x86" - # Untested but should also reduce size for these platforms - + lib.optionalString isAarch "-Xbcj arm" - + lib.optionalString (isPower && is32bit && isBigEndian) "-Xbcj powerpc" - + lib.optionalString (isSparc) "-Xbcj sparc"; + default = with pkgs.stdenv.hostPlatform; + "xz -Xdict-size 100% " + + lib.optionalString isx86 "-Xbcj x86" + # Untested but should also reduce size for these platforms + + lib.optionalString isAarch "-Xbcj arm" + + lib.optionalString (isPower && is32bit && isBigEndian) "-Xbcj powerpc" + + lib.optionalString isSparc "-Xbcj sparc"; type = lib.types.nullOr lib.types.str; description = '' Compression settings to use for the squashfs nix store. @@ -578,9 +584,9 @@ in isoImage.efiSplashImage = mkOption { default = pkgs.fetchurl { - url = "https://raw.githubusercontent.com/NixOS/nixos-artwork/a9e05d7deb38a8e005a2b52575a3f59a63a4dba0/bootloader/efi-background.png"; - sha256 = "18lfwmp8yq923322nlb9gxrh5qikj1wsk6g5qvdh31c4h5b1538x"; - }; + url = "https://raw.githubusercontent.com/NixOS/nixos-artwork/a9e05d7deb38a8e005a2b52575a3f59a63a4dba0/bootloader/efi-background.png"; + sha256 = "18lfwmp8yq923322nlb9gxrh5qikj1wsk6g5qvdh31c4h5b1538x"; + }; description = '' The splash image to use in the EFI bootloader. ''; @@ -588,9 +594,9 @@ in isoImage.splashImage = mkOption { default = pkgs.fetchurl { - url = "https://raw.githubusercontent.com/NixOS/nixos-artwork/a9e05d7deb38a8e005a2b52575a3f59a63a4dba0/bootloader/isolinux/bios-boot.png"; - sha256 = "1wp822zrhbg4fgfbwkr7cbkr4labx477209agzc0hr6k62fr6rxd"; - }; + url = "https://raw.githubusercontent.com/NixOS/nixos-artwork/a9e05d7deb38a8e005a2b52575a3f59a63a4dba0/bootloader/isolinux/bios-boot.png"; + sha256 = "1wp822zrhbg4fgfbwkr7cbkr4labx477209agzc0hr6k62fr6rxd"; + }; description = '' The splash image to use in the legacy-boot bootloader. ''; @@ -674,44 +680,52 @@ in If text mode is required off-handedly (e.g. for serial use) you can use the `T` key, after being prompted, to use text mode for the current boot. ''; }; - }; # store them in lib so we can mkImageMediaOverride the # entire file system layout in installation media (only) config.lib.isoFileSystems = { - "/" = mkImageMediaOverride + "/" = + mkImageMediaOverride { fsType = "tmpfs"; - options = [ "mode=0755" ]; + options = ["mode=0755"]; }; # Note that /dev/root is a symlink to the actual root device # specified on the kernel command line, created in the stage 1 # init script. - "/iso" = mkImageMediaOverride - { device = "/dev/root"; + "/iso" = + mkImageMediaOverride + { + device = "/dev/root"; neededForBoot = true; noCheck = true; }; # In stage 1, mount a tmpfs on top of /nix/store (the squashfs # image) to make this a live CD. - "/nix/.ro-store" = mkImageMediaOverride - { fsType = "squashfs"; + "/nix/.ro-store" = + mkImageMediaOverride + { + fsType = "squashfs"; device = "/iso/nix-store.squashfs"; - options = [ "loop" ]; + options = ["loop"]; neededForBoot = true; }; - "/nix/.rw-store" = mkImageMediaOverride - { fsType = "tmpfs"; - options = [ "mode=0755" ]; + "/nix/.rw-store" = + mkImageMediaOverride + { + fsType = "tmpfs"; + options = ["mode=0755"]; neededForBoot = true; }; - "/nix/store" = mkImageMediaOverride - { fsType = "overlay"; + "/nix/store" = + mkImageMediaOverride + { + fsType = "overlay"; device = "overlay"; options = [ "lowerdir=/nix/.ro-store" @@ -741,8 +755,7 @@ in length = stringLength config.isoImage.volumeID; howmany = toString length; toomany = toString (length - 32); - in - "isoImage.volumeID ${config.isoImage.volumeID} is ${howmany} characters. That is ${toomany} characters longer than the limit of 32."; + in "isoImage.volumeID ${config.isoImage.volumeID} is ${howmany} characters. That is ${toomany} characters longer than the limit of 32."; } ]; @@ -750,9 +763,9 @@ in # here and it causes a cyclic dependency. boot.loader.grub.enable = false; - environment.systemPackages = [ grubPkgs.grub2 grubPkgs.grub2_efi ] - ++ optional (config.isoImage.makeBiosBootable) pkgs.syslinux - ; + environment.systemPackages = + [grubPkgs.grub2 grubPkgs.grub2_efi] + ++ optional (config.isoImage.makeBiosBootable) pkgs.syslinux; # In stage 1 of the boot, mount the CD as the root FS by label so # that we don't need to know its device. We pass the label of the @@ -762,70 +775,86 @@ in # UUID of the USB stick. It would be nicer to write # `root=/dev/disk/by-label/...' here, but UNetbootin doesn't # recognise that. - boot.kernelParams = - [ "root=LABEL=${config.isoImage.volumeID}" - "boot.shell_on_fail" - ]; + boot.kernelParams = [ + "root=LABEL=${config.isoImage.volumeID}" + "boot.shell_on_fail" + ]; fileSystems = config.lib.isoFileSystems; - boot.initrd.availableKernelModules = [ "squashfs" "iso9660" "uas" "overlay" ]; + boot.initrd.availableKernelModules = ["squashfs" "iso9660" "uas" "overlay"]; - boot.initrd.kernelModules = [ "loop" "overlay" ]; + boot.initrd.kernelModules = ["loop" "overlay"]; # Closures to be copied to the Nix store on the CD, namely the init # script and the top-level system configuration directory. isoImage.storeContents = - [ config.system.build.toplevel ] ++ - optional config.isoImage.includeSystemBuildDependencies - config.system.build.toplevel.drvPath; + [config.system.build.toplevel] + ++ optional config.isoImage.includeSystemBuildDependencies + config.system.build.toplevel.drvPath; # Individual files to be included on the CD, outside of the Nix # store on the CD. isoImage.contents = [ - { source = config.boot.kernelPackages.kernel + "/" + config.system.boot.loader.kernelFile; + { + source = config.boot.kernelPackages.kernel + "/" + config.system.boot.loader.kernelFile; target = "/boot/" + config.system.boot.loader.kernelFile; } - { source = config.system.build.initialRamdisk + "/" + config.system.boot.loader.initrdFile; + { + source = config.system.build.initialRamdisk + "/" + config.system.boot.loader.initrdFile; target = "/boot/" + config.system.boot.loader.initrdFile; } - { source = pkgs.writeText "version" config.system.nixos.label; + { + source = pkgs.writeText "version" config.system.nixos.label; target = "/version.txt"; } - ] ++ optionals (config.isoImage.makeBiosBootable) [ - { source = config.isoImage.splashImage; + ] + ++ optionals (config.isoImage.makeBiosBootable) [ + { + source = config.isoImage.splashImage; target = "/isolinux/background.png"; } - { source = pkgs.substituteAll { + { + source = pkgs.substituteAll { name = "isolinux.cfg"; src = pkgs.writeText "isolinux.cfg-in" isolinuxCfg; bootRoot = "/boot"; }; target = "/isolinux/isolinux.cfg"; } - { source = "${pkgs.syslinux}/share/syslinux"; + { + source = "${pkgs.syslinux}/share/syslinux"; target = "/isolinux"; } - ] ++ optionals config.isoImage.makeEfiBootable [ - { source = efiImg; + ] + ++ optionals config.isoImage.makeEfiBootable [ + { + source = efiImg; target = "/boot/efi.img"; } - { source = "${efiDir}/EFI"; + { + source = "${efiDir}/EFI"; target = "/EFI"; } - { source = (pkgs.writeTextDir "grub/loopback.cfg" "source /EFI/boot/grub.cfg") + "/grub"; + { + source = (pkgs.writeTextDir "grub/loopback.cfg" "source /EFI/boot/grub.cfg") + "/grub"; target = "/boot/grub"; } - { source = config.isoImage.efiSplashImage; + { + source = config.isoImage.efiSplashImage; target = "/EFI/boot/efi-background.png"; } - ] ++ optionals (config.boot.loader.grub.memtest86.enable && config.isoImage.makeBiosBootable) [ - { source = "${pkgs.memtest86plus}/memtest.bin"; + ] + ++ optionals (config.boot.loader.grub.memtest86.enable && config.isoImage.makeBiosBootable) [ + { + source = "${pkgs.memtest86plus}/memtest.bin"; target = "/boot/memtest.bin"; } - ] ++ optionals (config.isoImage.grubTheme != null) [ - { source = config.isoImage.grubTheme; + ] + ++ optionals (config.isoImage.grubTheme != null) [ + { + source = config.isoImage.grubTheme; target = "/EFI/boot/grub-theme"; } ]; @@ -834,36 +863,38 @@ in # Create the ISO image. system.build.isoImage = pkgs.callPackage "${toString pkgs.path}/nixos/lib/make-iso9660-image.nix" ({ - inherit (config.isoImage) isoName compressImage volumeID contents; - bootable = config.isoImage.makeBiosBootable; - bootImage = "/isolinux/isolinux.bin"; - syslinux = if config.isoImage.makeBiosBootable then pkgs.syslinux else null; - squashfsContents = config.isoImage.storeContents; - squashfsCompression = config.isoImage.squashfsCompression; - } // optionalAttrs (config.isoImage.makeUsbBootable && config.isoImage.makeBiosBootable) { - usbBootable = true; - isohybridMbrImage = "${pkgs.syslinux}/share/syslinux/isohdpfx.bin"; - } // optionalAttrs config.isoImage.makeEfiBootable { - efiBootable = true; - efiBootImage = "boot/efi.img"; - }); + inherit (config.isoImage) isoName compressImage volumeID contents; + bootable = config.isoImage.makeBiosBootable; + bootImage = "/isolinux/isolinux.bin"; + syslinux = + if config.isoImage.makeBiosBootable + then pkgs.syslinux + else null; + squashfsContents = config.isoImage.storeContents; + squashfsCompression = config.isoImage.squashfsCompression; + } + // optionalAttrs (config.isoImage.makeUsbBootable && config.isoImage.makeBiosBootable) { + usbBootable = true; + isohybridMbrImage = "${pkgs.syslinux}/share/syslinux/isohdpfx.bin"; + } + // optionalAttrs config.isoImage.makeEfiBootable { + efiBootable = true; + efiBootImage = "boot/efi.img"; + }); - boot.postBootCommands = - '' - # After booting, register the contents of the Nix store on the - # CD in the Nix database in the tmpfs. - ${config.nix.package.out}/bin/nix-store --load-db < /nix/store/nix-path-registration + boot.postBootCommands = '' + # After booting, register the contents of the Nix store on the + # CD in the Nix database in the tmpfs. + ${config.nix.package.out}/bin/nix-store --load-db < /nix/store/nix-path-registration - # nixos-rebuild also requires a "system" profile and an - # /etc/NIXOS tag. - touch /etc/NIXOS - ${config.nix.package.out}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system - ''; + # nixos-rebuild also requires a "system" profile and an + # /etc/NIXOS tag. + touch /etc/NIXOS + ${config.nix.package.out}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system + ''; # Add vfat support to the initrd to enable people to copy the # contents of the CD to a bootable USB stick. - boot.initrd.supportedFilesystems = [ "vfat" ]; - + boot.initrd.supportedFilesystems = ["vfat"]; }; - } diff --git a/packages/calamares-extensions/default.nix b/packages/calamares-extensions/default.nix index 1242846..38d05c3 100644 --- a/packages/calamares-extensions/default.nix +++ b/packages/calamares-extensions/default.nix @@ -1,5 +1,4 @@ -{ stdenv }: - +{stdenv}: stdenv.mkDerivation { pname = "calamares-extensions-desk-os"; version = "0.0.1";