summary refs log tree commit diff
path: root/nixos/modules/installer
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-05-08 21:00:06 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-05-09 00:51:48 +0200
commit91afe9eb8d8f86db6b97b4aee5b77ab486657726 (patch)
treeddfee2ac1898ef77fb36a466080a8ca20f10b310 /nixos/modules/installer
parent1bd8ced9c0eb4002ffa2afb3e4a60c5bccfc28ef (diff)
downloadnixlib-91afe9eb8d8f86db6b97b4aee5b77ab486657726.tar
nixlib-91afe9eb8d8f86db6b97b4aee5b77ab486657726.tar.gz
nixlib-91afe9eb8d8f86db6b97b4aee5b77ab486657726.tar.bz2
nixlib-91afe9eb8d8f86db6b97b4aee5b77ab486657726.tar.lz
nixlib-91afe9eb8d8f86db6b97b4aee5b77ab486657726.tar.xz
nixlib-91afe9eb8d8f86db6b97b4aee5b77ab486657726.tar.zst
nixlib-91afe9eb8d8f86db6b97b4aee5b77ab486657726.zip
nixos-generate-config: Use stable device paths (e.g. /dev/disk/by-uuid/X)
Diffstat (limited to 'nixos/modules/installer')
-rw-r--r--nixos/modules/installer/tools/nixos-generate-config.pl28
1 files changed, 25 insertions, 3 deletions
diff --git a/nixos/modules/installer/tools/nixos-generate-config.pl b/nixos/modules/installer/tools/nixos-generate-config.pl
index 23f9c3a4ca06..e8b725d6ea4c 100644
--- a/nixos/modules/installer/tools/nixos-generate-config.pl
+++ b/nixos/modules/installer/tools/nixos-generate-config.pl
@@ -1,9 +1,11 @@
 #! @perl@
 
+use Cwd 'abs_path';
 use File::Spec;
 use File::Path;
 use File::Basename;
 use File::Slurp;
+use File::stat;
 
 
 sub uniq {
@@ -236,6 +238,24 @@ if ($virt eq "qemu" || $virt eq "kvm" || $virt eq "bochs") {
 }
 
 
+# For a device name like /dev/sda1, find a more stable path like
+# /dev/disk/by-uuid/X or /dev/disk/by-label/Y.
+sub findStableDevPath {
+    my ($dev) = @_;
+    return $dev if substr($dev, 0, 1) ne "/";
+    return $dev unless -e $dev;
+
+    my $st = stat($dev) or return $dev;
+
+    foreach my $dev2 (glob("/dev/disk/by-uuid/*"), glob("/dev/mapper/*"), glob("/dev/disk/by-label/*")) {
+        my $st2 = stat($dev2) or next;
+        return $dev2 if $st->rdev == $st2->rdev;
+    }
+
+    return $dev;
+}
+
+
 # Generate the swapDevices option from the currently activated swap
 # devices.
 my @swaps = read_file("/proc/swaps");
@@ -243,7 +263,9 @@ shift @swaps;
 my @swapDevices;
 foreach my $swap (@swaps) {
     $swap =~ /^(\S+)\s/;
-    push @swapDevices, "{ device = \"$1\"; }";
+    next unless -e $1;
+    my $dev = findStableDevPath $1;
+    push @swapDevices, "{ device = \"$dev\"; }";
 }
 
 
@@ -315,7 +337,7 @@ EOF
     # Emit the filesystem.
     $fileSystems .= <<EOF;
   fileSystems.\"$mountPoint\" =
-    { device = \"$device\";
+    { device = \"${\(findStableDevPath $device)}\";
       fsType = \"$fsType\";
 EOF
 
@@ -344,7 +366,7 @@ sub toNixExpr {
 
 sub multiLineList {
     my $indent = shift;
-    return "[ ]" if !@_;
+    return " [ ]" if !@_;
     $res = "\n${indent}[ ";
     my $first = 1;
     foreach my $s (@_) {