diff options
-rw-r--r-- | configuration/upstart.nix | 6 | ||||
-rw-r--r-- | upstart-jobs/filesystems.nix | 45 |
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 + "; + +} |