diff options
Diffstat (limited to 'nixos')
-rw-r--r-- | nixos/modules/installer/tools/nixos-generate-config.pl | 21 | ||||
-rw-r--r-- | nixos/modules/installer/tools/tools.nix | 1 | ||||
-rw-r--r-- | nixos/modules/installer/virtualbox-demo.nix | 3 | ||||
-rw-r--r-- | nixos/modules/system/boot/loader/grub/grub.nix | 37 | ||||
-rw-r--r-- | nixos/modules/system/boot/loader/grub/install-grub.pl | 136 | ||||
-rw-r--r-- | nixos/modules/tasks/filesystems/zfs.nix | 6 | ||||
-rw-r--r-- | nixos/release-combined.nix | 4 | ||||
-rw-r--r-- | nixos/release.nix | 2 | ||||
-rw-r--r-- | nixos/tests/installer.nix | 13 |
9 files changed, 38 insertions, 185 deletions
diff --git a/nixos/modules/installer/tools/nixos-generate-config.pl b/nixos/modules/installer/tools/nixos-generate-config.pl index 73dd87cef5c..66a8152a3a6 100644 --- a/nixos/modules/installer/tools/nixos-generate-config.pl +++ b/nixos/modules/installer/tools/nixos-generate-config.pl @@ -20,13 +20,6 @@ sub uniq { return @res; } -sub runCommand { - my ($cmd) = @_; - open FILE, "$cmd 2>/dev/null |" or die "Failed to execute: $cmd\n"; - my @ret = <FILE>; - close FILE; - return ($?, @ret); -} # Process the command line. my $outDir = "/etc/nixos"; @@ -344,20 +337,6 @@ EOF } } - # Is this a btrfs filesystem? - if ($fsType eq "btrfs") { - my ($status, @info) = runCommand("btrfs subvol show $rootDir$mountPoint"); - if ($status != 0) { - die "Failed to retreive subvolume info for $mountPoint"; - } - my @subvols = join("", @info) =~ m/Name:[ \t\n]*([^ \t\n]*)/; - if ($#subvols > 0) { - die "Btrfs subvol name for $mountPoint listed multiple times in mount\n" - } elsif ($#subvols == 0) { - push @extraOptions, "subvol=$subvols[0]"; - } - } - # Emit the filesystem. $fileSystems .= <<EOF; fileSystems.\"$mountPoint\" = diff --git a/nixos/modules/installer/tools/tools.nix b/nixos/modules/installer/tools/tools.nix index 91a30695a7a..39da2f1f0be 100644 --- a/nixos/modules/installer/tools/tools.nix +++ b/nixos/modules/installer/tools/tools.nix @@ -38,7 +38,6 @@ let nixos-generate-config = makeProg { name = "nixos-generate-config"; src = ./nixos-generate-config.pl; - path = [ pkgs.btrfsProgs ]; perl = "${pkgs.perl}/bin/perl -I${pkgs.perlPackages.FileSlurp}/lib/perl5/site_perl"; }; diff --git a/nixos/modules/installer/virtualbox-demo.nix b/nixos/modules/installer/virtualbox-demo.nix index 49ec0899610..f68f8dc40aa 100644 --- a/nixos/modules/installer/virtualbox-demo.nix +++ b/nixos/modules/installer/virtualbox-demo.nix @@ -10,9 +10,6 @@ with lib; ../profiles/clone-config.nix ]; - # FIXME: UUID detection is currently broken - boot.loader.grub.fsIdentifier = "provided"; - # Allow mounting of shared folders. users.extraUsers.demo.extraGroups = [ "vboxsf" ]; diff --git a/nixos/modules/system/boot/loader/grub/grub.nix b/nixos/modules/system/boot/loader/grub/grub.nix index bc9a155ac95..0cc060db8f9 100644 --- a/nixos/modules/system/boot/loader/grub/grub.nix +++ b/nixos/modules/system/boot/loader/grub/grub.nix @@ -6,8 +6,7 @@ let cfg = config.boot.loader.grub; - realGrub = if cfg.version == 1 then pkgs.grub - else pkgs.grub2.override { zfsSupport = cfg.zfsSupport; }; + realGrub = if cfg.version == 1 then pkgs.grub else pkgs.grub2; grub = # Don't include GRUB if we're only generating a GRUB menu (e.g., @@ -26,12 +25,11 @@ let inherit (cfg) version extraConfig extraPerEntryConfig extraEntries extraEntriesBeforeNixOS extraPrepareConfig configurationLimit copyKernels timeout - default devices fsIdentifier; + default devices explicitBootRoot; path = (makeSearchPath "bin" [ - pkgs.coreutils pkgs.gnused pkgs.gnugrep pkgs.findutils pkgs.diffutils pkgs.btrfsProgs - pkgs.utillinux + pkgs.coreutils pkgs.gnused pkgs.gnugrep pkgs.findutils pkgs.diffutils ]) + ":" + (makeSearchPath "sbin" [ - pkgs.mdadm pkgs.utillinux + pkgs.mdadm ]); }); @@ -211,26 +209,12 @@ in ''; }; - fsIdentifier = mkOption { - default = "uuid"; - type = types.addCheck types.str - (type: type == "uuid" || type == "label" || type == "provided"); - description = '' - Determines how grub will identify devices when generating the - configuration file. A value of uuid / label signifies that grub - will always resolve the uuid or label of the device before using - it in the configuration. A value of provided means that grub will - use the device name as show in <command>df</command> or - <command>mount</command>. Note, zfs zpools / datasets are ignored - and will always be mounted using their labels. - ''; - }; - - zfsSupport = mkOption { - default = false; - type = types.bool; + explicitBootRoot = mkOption { + default = ""; + type = types.str; description = '' - Whether grub should be build against libzfs. + The relative path of /boot within the parent volume. Leave empty + if /boot is not a btrfs subvolume. ''; }; @@ -276,9 +260,6 @@ in ${pkgs.coreutils}/bin/cp -pf "${v}" "/boot/${n}" '') config.boot.loader.grub.extraFiles); - assertions = [{ assertion = !cfg.zfsSupport || cfg.version == 2; - message = "Only grub version 2 provides zfs support";}]; - }) ]; diff --git a/nixos/modules/system/boot/loader/grub/install-grub.pl b/nixos/modules/system/boot/loader/grub/install-grub.pl index 7ced51f57e1..2fb771b5edf 100644 --- a/nixos/modules/system/boot/loader/grub/install-grub.pl +++ b/nixos/modules/system/boot/loader/grub/install-grub.pl @@ -1,6 +1,5 @@ use strict; use warnings; -use Class::Struct; use XML::LibXML; use File::Basename; use File::Path; @@ -28,14 +27,6 @@ sub writeFile { close FILE or die; } -sub runCommand { - my ($cmd) = @_; - open FILE, "$cmd 2>/dev/null |" or die "Failed to execute: $cmd\n"; - my @ret = <FILE>; - close FILE; - return ($?, @ret); -} - my $grub = get("grub"); my $grubVersion = int(get("version")); my $extraConfig = get("extraConfig"); @@ -48,7 +39,7 @@ my $configurationLimit = int(get("configurationLimit")); my $copyKernels = get("copyKernels") eq "true"; my $timeout = int(get("timeout")); my $defaultEntry = int(get("default")); -my $fsIdentifier = get("fsIdentifier"); +my $explicitBootRoot = get("explicitBootRoot"); $ENV{'PATH'} = get("path"); die "unsupported GRUB version\n" if $grubVersion != 1 && $grubVersion != 2; @@ -57,108 +48,22 @@ print STDERR "updating GRUB $grubVersion menu...\n"; mkpath("/boot/grub", 0, 0700); + # Discover whether /boot is on the same filesystem as / and # /nix/store. If not, then all kernels and initrds must be copied to -# /boot. -if (stat("/boot")->dev != stat("/nix/store")->dev) { +# /boot, and all paths in the GRUB config file must be relative to the +# root of the /boot filesystem. `$bootRoot' is the path to be +# prepended to paths under /boot. +my $bootRoot = "/boot"; +if (stat("/")->dev != stat("/boot")->dev) { + $bootRoot = ""; + $copyKernels = 1; +} elsif (stat("/boot")->dev != stat("/nix/store")->dev) { $copyKernels = 1; } -# Discover information about the location of /boot -struct(Fs => { - device => '$', - type => '$', - mount => '$', -}); -sub GetFs { - my ($dir) = @_; - my ($status, @dfOut) = runCommand("df -T $dir"); - if ($status != 0 || $#dfOut != 1) { - die "Failed to retrieve output about $dir from `df`"; - } - my @boot = split(/[ \n\t]+/, $dfOut[1]); - return Fs->new(device => $boot[0], type => $boot[1], mount => $boot[6]); -} -struct (Grub => { - path => '$', - search => '$', -}); -my $driveid = 1; -sub GrubFs { - my ($dir) = @_; - my $fs = GetFs($dir); - my $path = "/" . substr($dir, length($fs->mount)); - my $search = ""; - - if ($grubVersion > 1) { - # ZFS is completely separate logic as zpools are always identified by a label - # or custom UUID - if ($fs->type eq 'zfs') { - my $sid = index($fs->device, '/'); - - if ($sid < 0) { - $search = '--label ' . $fs->device; - $path = '/@' . $path; - } else { - $search = '--label ' . substr($fs->device, 0, $sid); - $path = '/' . substr($fs->device, $sid) . '/@' . $path; - } - } else { - my %types = ('uuid' => '--fs-uuid', 'label' => '--label'); - - if ($fsIdentifier eq 'provided') { - # If the provided dev is identifying the partition using a label or uuid, - # we should get the label / uuid and do a proper search - my @matches = $fs->device =~ m/\/dev\/disk\/by-(label|uuid)\/(.*)/; - if ($#matches > 1) { - die "Too many matched devices" - } elsif ($#matches == 1) { - $search = "$types{$matches[0]} $matches[1]" - } - } else { - # Determine the identifying type - $search = $types{$fsIdentifier} . ' '; - - # Based on the type pull in the identifier from the system - my ($status, @devInfo) = runCommand("blkid -o export @{[$fs->device]}"); - if ($status != 0) { - die "Failed to get blkid info for @{[$fs->device]}"; - } - my @matches = join("", @devInfo) =~ m/@{[uc $fsIdentifier]}=([^\n]*)/; - if ($#matches != 0) { - die "Couldn't find a $types{$fsIdentifier} for @{[$fs->device]}\n" - } - $search .= $matches[0]; - } - - # BTRFS is a special case in that we need to fix the referrenced path based on subvolumes - if ($fs->type eq 'btrfs') { - my ($status, @info) = runCommand("btrfs subvol show @{[$fs->mount]}"); - if ($status != 0) { - die "Failed to retreive subvolume info for @{[$fs->mount]}"; - } - my @subvols = join("", @info) =~ m/Name:[ \t\n]*([^ \t\n]*)/; - if ($#subvols > 0) { - die "Btrfs subvol name for @{[$fs->device]} listed multiple times in mount\n" - } elsif ($#subvols == 0) { - $path = "/$subvols[0]$path"; - } - } - } - if (not $search eq "") { - $search = "search --set=drive$driveid " . $search; - $path = "(\$drive$driveid)$path"; - $driveid += 1; - } - } - return Grub->new(path => $path, search => $search); -} -my $grubBoot = GrubFs("/boot"); -my $grubStore = GrubFs("/nix"); - -# We don't need to copy if we can read the kernels directly -if ($grubStore->search ne "") { - $copyKernels = 0; +if ($explicitBootRoot ne "") { + $bootRoot = $explicitBootRoot; } # Generate the header. @@ -171,14 +76,12 @@ if ($grubVersion == 1) { "; if ($splashImage) { copy $splashImage, "/boot/background.xpm.gz" or die "cannot copy $splashImage to /boot\n"; - $conf .= "splashimage " . $grubBoot->path . "/background.xpm.gz\n"; + $conf .= "splashimage $bootRoot/background.xpm.gz\n"; } } else { $conf .= " - " . $grubBoot->search . " - " . $grubStore->search . " if [ -s \$prefix/grubenv ]; then load_env fi @@ -199,7 +102,7 @@ else { set timeout=$timeout fi - if loadfont " . $grubBoot->path . "/grub/fonts/unicode.pf2; then + if loadfont $bootRoot/grub/fonts/unicode.pf2; then set gfxmode=640x480 insmod gfxterm insmod vbe @@ -213,7 +116,7 @@ else { copy $splashImage, "/boot/background.png" or die "cannot copy $splashImage to /boot\n"; $conf .= " insmod png - if background_image " . $grubBoot->path . "/background.png; then + if background_image $bootRoot/background.png; then set color_normal=white/black set color_highlight=black/white else @@ -235,7 +138,7 @@ mkpath("/boot/kernels", 0, 0755) if $copyKernels; sub copyToKernelsDir { my ($path) = @_; - return $grubStore->path . substr($path, length("/nix")) unless $copyKernels; + return $path unless $copyKernels; $path =~ /\/nix\/store\/(.*)/ or die; my $name = $1; $name =~ s/\//-/g; my $dst = "/boot/kernels/$name"; @@ -248,7 +151,7 @@ sub copyToKernelsDir { rename $tmp, $dst or die "cannot rename $tmp to $dst\n"; } $copied{$dst} = 1; - return $grubBoot->path . "/kernels/$name"; + return "$bootRoot/kernels/$name"; } sub addEntry { @@ -275,8 +178,11 @@ sub addEntry { $conf .= " " . ($xen ? "module" : "initrd") . " $initrd\n\n"; } else { $conf .= "menuentry \"$name\" {\n"; +<<<<<<< HEAD $conf .= $grubBoot->search . "\n"; $conf .= $grubStore->search . "\n"; +======= +>>>>>>> parent of 469f22d... Merge pull request #2449 from wkennington/master.grub $conf .= " $extraPerEntryConfig\n" if $extraPerEntryConfig; $conf .= " multiboot $xen $xenParams\n" if $xen; $conf .= " " . ($xen ? "module" : "linux") . " $kernel $kernelParams\n"; @@ -294,7 +200,7 @@ addEntry("NixOS - Default", $defaultConfig); $conf .= "$extraEntries\n" unless $extraEntriesBeforeNixOS; # extraEntries could refer to @bootRoot@, which we have to substitute -$conf =~ s/\@bootRoot\@/$grubBoot->path/g; +$conf =~ s/\@bootRoot\@/$bootRoot/g; # Emit submenus for all system profiles. sub addProfile { diff --git a/nixos/modules/tasks/filesystems/zfs.nix b/nixos/modules/tasks/filesystems/zfs.nix index 1c4bbc16b49..d7deb44c407 100644 --- a/nixos/modules/tasks/filesystems/zfs.nix +++ b/nixos/modules/tasks/filesystems/zfs.nix @@ -133,7 +133,7 @@ in }; boot.initrd = mkIf inInitrd { - kernelModules = [ "spl" "zfs" ]; + kernelModules = [ "spl" "zfs" ] ; extraUtilsCommands = '' cp -v ${zfsPkg}/sbin/zfs $out/bin @@ -148,10 +148,6 @@ in ''; }; - boot.loader.grub = mkIf inInitrd { - zfsSupport = true; - }; - systemd.services."zpool-import" = { description = "Import zpools"; after = [ "systemd-udev-settle.service" ]; diff --git a/nixos/release-combined.nix b/nixos/release-combined.nix index 23348e1d089..dae3b9210a8 100644 --- a/nixos/release-combined.nix +++ b/nixos/release-combined.nix @@ -52,10 +52,6 @@ in rec { (all nixos.tests.installer.lvm) (all nixos.tests.installer.separateBoot) (all nixos.tests.installer.simple) - (all nixos.tests.installer.simpleLabels) - (all nixos.tests.installer.simpleProvided) - (all nixos.tests.installer.btrfsSimple) - (all nixos.tests.installer.btrfsSubvols) (all nixos.tests.ipv6) (all nixos.tests.kde4) (all nixos.tests.login) diff --git a/nixos/release.nix b/nixos/release.nix index f78ecb4383d..e2b93640f91 100644 --- a/nixos/release.nix +++ b/nixos/release.nix @@ -231,7 +231,7 @@ in rec { tests.installer.simpleLabels = forAllSystems (system: (import tests/installer.nix { inherit system; }).simpleLabels.test); tests.installer.simpleProvided = forAllSystems (system: (import tests/installer.nix { inherit system; }).simpleProvided.test); tests.installer.btrfsSimple = forAllSystems (system: (import tests/installer.nix { inherit system; }).btrfsSimple.test); - tests.installer.btrfsSubvols = forAllSystems (system: (import tests/installer.nix { inherit system; }).btrfsSubvols.test); + #tests.installer.btrfsSubvols = forAllSystems (system: (import tests/installer.nix { inherit system; }).btrfsSubvols.test); tests.influxdb = callTest tests/influxdb.nix {}; tests.ipv6 = callTest tests/ipv6.nix {}; tests.jenkins = callTest tests/jenkins.nix {}; diff --git a/nixos/tests/installer.nix b/nixos/tests/installer.nix index 154f3323d29..6ee52fd63d8 100644 --- a/nixos/tests/installer.nix +++ b/nixos/tests/installer.nix @@ -35,8 +35,8 @@ let # The configuration to install. - makeConfig = { testChannel, useEFI, grubVersion, grubDevice, grubIdentifier }: - pkgs.writeText "configuration.nix" '' + makeConfig = { testChannel, useEFI, grubVersion, grubDevice }: pkgs.writeText "configuration.nix" + '' { config, pkgs, modulesPath, ... }: { imports = @@ -54,7 +54,6 @@ let ''} boot.loader.grub.device = "${grubDevice}"; boot.loader.grub.extraConfig = "serial; terminal_output.serial"; - boot.loader.grub.fsIdentifier = "${grubIdentifier}"; ''} environment.systemPackages = [ ${optionalString testChannel "pkgs.rlwrap"} ]; @@ -94,7 +93,7 @@ let # disk, and then reboot from the hard disk. It's parameterized with # a test script fragment `createPartitions', which must create # partitions and filesystems. - testScriptFun = { createPartitions, testChannel, useEFI, grubVersion, grubDevice, grubIdentifier }: + testScriptFun = { createPartitions, testChannel, useEFI, grubVersion, grubDevice }: let # FIXME: OVMF doesn't boot from virtio http://www.mail-archive.com/edk2-devel@lists.sourceforge.net/msg01501.html iface = if useEFI || grubVersion == 1 then "scsi" else "virtio"; @@ -162,7 +161,7 @@ let $machine->succeed("cat /mnt/etc/nixos/hardware-configuration.nix >&2"); $machine->copyFileFromHost( - "${ makeConfig { inherit testChannel useEFI grubVersion grubDevice grubIdentifier; } }", + "${ makeConfig { inherit testChannel useEFI grubVersion grubDevice; } }", "/mnt/etc/nixos/configuration.nix"); # Perform the installation. @@ -217,13 +216,13 @@ let makeInstallerTest = name: - { createPartitions, testChannel ? false, useEFI ? false, grubVersion ? 2, grubDevice ? "/dev/vda", grubIdentifier ? "uuid" }: + { createPartitions, testChannel ? false, useEFI ? false, grubVersion ? 2, grubDevice ? "/dev/vda" }: makeTest { inherit iso; name = "installer-" + name; nodes = if testChannel then { inherit webserver; } else { }; testScript = testScriptFun { - inherit createPartitions testChannel useEFI grubVersion grubDevice grubIdentifier; + inherit createPartitions testChannel useEFI grubVersion grubDevice; }; }; |