summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--configuration/upstart.nix6
-rw-r--r--upstart-jobs/filesystems.nix45
2 files changed, 51 insertions, 0 deletions
diff --git a/configuration/upstart.nix b/configuration/upstart.nix
index 5de0164b062..f0870159ead 100644
--- a/configuration/upstart.nix
+++ b/configuration/upstart.nix
@@ -31,6 +31,12 @@ import ../upstart-jobs/gather.nix {
       inherit (pkgs) kernel module_init_tools;
     })
       
+    # Mount file systems.
+    (import ../upstart-jobs/filesystems.nix {
+      inherit (pkgs) utillinux;
+      fileSystems = config.get ["fileSystems"];
+    })
+
     # Swapping.
     (import ../upstart-jobs/swap.nix {
       inherit (pkgs) utillinux;
diff --git a/upstart-jobs/filesystems.nix b/upstart-jobs/filesystems.nix
new file mode 100644
index 00000000000..0c581db9634
--- /dev/null
+++ b/upstart-jobs/filesystems.nix
@@ -0,0 +1,45 @@
+{utillinux, fileSystems}:
+
+let
+
+  # !!! use XML
+  mountPoints = map (fs: fs.mountPoint) fileSystems;
+  devices = map (fs: fs.device) fileSystems;
+
+in 
+
+{
+  name = "filesystems";
+  
+  job = "
+start on startup
+start on new-devices
+
+script
+    mountPoints=(${toString mountPoints})  
+    devices=(${toString devices})
+
+    for ((n = 0; n < \${#mountPoints[*]}; n++)); do
+        mountPoint=\${mountPoints[$n]}
+        device=\${devices[$n]}
+
+        # If $device is already mounted somewhere else, unmount it first.
+        prevMountPoint=$(cat /proc/mounts | grep \"^$device \" | sed 's|^[^ ]\\+ \\+\\([^ ]\\+\\).*|\\1|')
+
+        if test \"$prevMountPoint\" = \"$mountPoint\"; then continue; fi
+
+        if test -n \"$prevMountPoint\"; then
+            echo \"unmount $device from $prevMountPoint\"
+            ${utillinux}/bin/umount \"$prevMountPoint\" || true
+        fi
+
+        echo \"mounting $device on $mountPoint\"
+
+        mkdir -p \"$mountPoint\" || true
+        ${utillinux}/bin/mount \"$device\" \"$mountPoint\" || true
+    done
+
+end script
+  ";
+
+}