Format nix files
This commit is contained in:
parent
d0194a555b
commit
18ad437872
@ -3,8 +3,7 @@
|
||||
lib,
|
||||
inputs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
}: {
|
||||
imports = [
|
||||
../../modules/installer
|
||||
];
|
||||
|
||||
@ -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")]
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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 <<EOF > $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 <<EOF > $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"];
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
{ stdenv }:
|
||||
|
||||
{stdenv}:
|
||||
stdenv.mkDerivation {
|
||||
pname = "calamares-extensions-desk-os";
|
||||
version = "0.0.1";
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user