Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nixos/install-grub: include child configs in grub menu #45345

Merged
merged 4 commits into from Jul 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 23 additions & 0 deletions nixos/modules/system/boot/loader/grub/install-grub.pl
Expand Up @@ -407,6 +407,29 @@ sub addEntry {

$conf .= "$extraEntries\n" unless $extraEntriesBeforeNixOS;

# Find all the children of the current default configuration
# Do not search for grand children
my @links = sort (glob "$defaultConfig/fine-tune/*");
foreach my $link (@links) {

my $entryName = "";

my $cfgName = readFile("$link/configuration-name");

my $date = strftime("%F", localtime(lstat($link)->mtime));
my $version =
-e "$link/nixos-version"
? readFile("$link/nixos-version")
: basename((glob(dirname(Cwd::abs_path("$link/kernel")) . "/lib/modules/*"))[0]);

if ($cfgName) {
$entryName = $cfgName;
} else {
$entryName = "($date - $version)";
}
addEntry("NixOS - $entryName", $link);
}

my $grubBootPath = $grubBoot->path;
# extraEntries could refer to @bootRoot@, which we have to substitute
$conf =~ s/\@bootRoot\@/$grubBootPath/g;
Expand Down
130 changes: 101 additions & 29 deletions nixos/tests/installer.nix
Expand Up @@ -67,6 +67,7 @@ let
# partitions and filesystems.
testScriptFun = { bootLoader, createPartitions, grubVersion, grubDevice, grubUseEfi
, grubIdentifier, preBootCommands, extraConfig
, testCloneConfig
}:
let
iface = if grubVersion == 1 then "ide" else "virtio";
Expand All @@ -85,6 +86,7 @@ let
in if !isEfi && !(pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64) then
throw "Non-EFI boot methods are only supported on i686 / x86_64"
else ''

$machine->start;

# Make sure that we get a login prompt etc.
Expand Down Expand Up @@ -185,6 +187,43 @@ let
${preBootCommands}
$machine->waitForUnit("network.target");
$machine->shutdown;

# Tests for validating clone configuration entries in grub menu
${optionalString testCloneConfig ''
# Reboot Machine
$machine = createMachine({ ${hdFlags} qemuFlags => "${qemuFlags}", name => "clone-default-config" });
${preBootCommands}
$machine->waitForUnit("multi-user.target");

# Booted configuration name should be Home
# This is not the name that shows in the grub menu.
# The default configuration is always shown as "Default"
$machine->succeed("cat /run/booted-system/configuration-name >&2");
$machine->succeed("cat /run/booted-system/configuration-name | grep Home");

# We should find **not** a file named /etc/gitconfig
$machine->fail("test -e /etc/gitconfig");

# Set grub to boot the second configuration
$machine->succeed("grub-reboot 1");

$machine->shutdown;

# Reboot Machine
$machine = createMachine({ ${hdFlags} qemuFlags => "${qemuFlags}", name => "clone-alternate-config" });
${preBootCommands}

$machine->waitForUnit("multi-user.target");
# Booted configuration name should be Work
$machine->succeed("cat /run/booted-system/configuration-name >&2");
$machine->succeed("cat /run/booted-system/configuration-name | grep Work");

# We should find a file named /etc/gitconfig
$machine->succeed("test -e /etc/gitconfig");

$machine->shutdown;
''}

'';


Expand All @@ -194,6 +233,7 @@ let
, bootLoader ? "grub" # either "grub" or "systemd-boot"
, grubVersion ? 2, grubDevice ? "/dev/vda", grubIdentifier ? "uuid", grubUseEfi ? false
, enableOCR ? false, meta ? {}
, testCloneConfig ? false
}:
makeTest {
inherit enableOCR;
Expand Down Expand Up @@ -269,7 +309,8 @@ let

testScript = testScriptFun {
inherit bootLoader createPartitions preBootCommands
grubVersion grubDevice grubIdentifier grubUseEfi extraConfig;
grubVersion grubDevice grubIdentifier grubUseEfi extraConfig
testCloneConfig;
};
};

Expand Down Expand Up @@ -304,32 +345,24 @@ let
'';
};


in {

# !!! `parted mkpart' seems to silently create overlapping partitions.


# The (almost) simplest partitioning scheme: a swap partition and
# one big filesystem partition.
simple = makeInstallerTest "simple"
{ createPartitions =
''
$machine->succeed(
"flock /dev/vda parted --script /dev/vda -- mklabel msdos"
. " mkpart primary linux-swap 1M 1024M"
. " mkpart primary ext2 1024M -1s",
"udevadm settle",
"mkswap /dev/vda1 -L swap",
"swapon -L swap",
"mkfs.ext3 -L nixos /dev/vda2",
"mount LABEL=nixos /mnt",
);
'';
};

# Simple GPT/UEFI configuration using systemd-boot with 3 partitions: ESP, swap & root filesystem
simpleUefiSystemdBoot = makeInstallerTest "simpleUefiSystemdBoot"
simple-test-config = { createPartitions =
''
$machine->succeed(
"flock /dev/vda parted --script /dev/vda -- mklabel msdos"
. " mkpart primary linux-swap 1M 1024M"
. " mkpart primary ext2 1024M -1s",
"udevadm settle",
"mkswap /dev/vda1 -L swap",
"swapon -L swap",
"mkfs.ext3 -L nixos /dev/vda2",
"mount LABEL=nixos /mnt",
);
'';
};

simple-uefi-grub-config =
{ createPartitions =
''
$machine->succeed(
Expand All @@ -348,10 +381,45 @@ in {
"mount LABEL=BOOT /mnt/boot",
);
'';
bootLoader = "systemd-boot";
bootLoader = "grub";
grubUseEfi = true;
};

simpleUefiGrub = makeInstallerTest "simpleUefiGrub"
clone-test-extraconfig = { extraConfig =
''
environment.systemPackages = [ pkgs.grub2 ];
boot.loader.grub.configurationName = "Home";
nesting.clone = [
{
boot.loader.grub.configurationName = lib.mkForce "Work";

environment.etc = {
"gitconfig".text = "
[core]
gitproxy = none for work.com
";
};
}
];
'';
testCloneConfig = true;
};


in {

# !!! `parted mkpart' seems to silently create overlapping partitions.


# The (almost) simplest partitioning scheme: a swap partition and
# one big filesystem partition.
simple = makeInstallerTest "simple" simple-test-config;

# Test cloned configurations with the simple grub configuration
simpleClone = makeInstallerTest "simpleClone" (simple-test-config // clone-test-extraconfig);

# Simple GPT/UEFI configuration using systemd-boot with 3 partitions: ESP, swap & root filesystem
simpleUefiSystemdBoot = makeInstallerTest "simpleUefiSystemdBoot"
vmandela marked this conversation as resolved.
Show resolved Hide resolved
{ createPartitions =
''
$machine->succeed(
Expand All @@ -370,10 +438,14 @@ in {
"mount LABEL=BOOT /mnt/boot",
);
'';
bootLoader = "grub";
grubUseEfi = true;
bootLoader = "systemd-boot";
};

simpleUefiGrub = makeInstallerTest "simpleUefiGrub" simple-uefi-grub-config;

# Test cloned configurations with the uefi grub configuration
simpleUefiGrubClone = makeInstallerTest "simpleUefiGrubClone" (simple-uefi-grub-config // clone-test-extraconfig);

# Same as the previous, but now with a separate /boot partition.
separateBoot = makeInstallerTest "separateBoot"
{ createPartitions =
Expand Down