Convert "filesystems"

svn path=/nixos/branches/fix-style/; revision=14401
This commit is contained in:
Marc Weber 2009-03-06 12:27:33 +00:00
parent ea60090213
commit d964466c1a
3 changed files with 106 additions and 105 deletions

View File

@ -420,6 +420,8 @@ in
(import ../upstart-jobs/swraid.nix) # Activate software RAID arrays. (import ../upstart-jobs/swraid.nix) # Activate software RAID arrays.
(import ../upstart-jobs/filesystems.nix) # Mount file systems.
# security # security
(import ../system/sudo.nix) (import ../system/sudo.nix)

View File

@ -71,13 +71,6 @@ let
jobs = map makeJob jobs = map makeJob
([ ([
# Mount file systems.
(import ../upstart-jobs/filesystems.nix {
inherit mount;
inherit (pkgs) utillinux e2fsprogs;
fileSystems = config.fileSystems;
})
# Swapping. # Swapping.
(import ../upstart-jobs/swap.nix { (import ../upstart-jobs/swap.nix {
inherit (pkgs) utillinux lib; inherit (pkgs) utillinux lib;

View File

@ -1,120 +1,126 @@
{utillinux, e2fsprogs, fileSystems, mount}: {pkgs, config, ...}:
###### implementation
let let
inherit (pkgs) e2fsprogs;
# !!! use XML
mountPoints = map (fs: fs.mountPoint) fileSystems; mountPoints = map (fs: fs.mountPoint) fileSystems;
fileSystems = config.fileSystems;
devices = map (fs: if fs ? device then fs.device else "LABEL=" + fs.label) fileSystems; devices = map (fs: if fs ? device then fs.device else "LABEL=" + fs.label) fileSystems;
fsTypes = map (fs: if fs ? fsType then fs.fsType else "auto") fileSystems; fsTypes = map (fs: if fs ? fsType then fs.fsType else "auto") fileSystems;
optionss = map (fs: if fs ? options then fs.options else "defaults") fileSystems; optionss = map (fs: if fs ? options then fs.options else "defaults") fileSystems;
autocreates = map (fs: if fs ? autocreate then fs.autocreate else "0") fileSystems; autocreates = map (fs: if fs ? autocreate then fs.autocreate else "0") fileSystems;
mount = config.system.sbin.mount;
in job = ''
start on startup
{ start on new-devices
name = "filesystems"; start on ip-up
job = " script
start on startup
start on new-devices
start on ip-up
script
PATH=${e2fsprogs}/sbin:$PATH PATH=${e2fsprogs}/sbin:$PATH
mountPoints=(${toString mountPoints}) mountPoints=(${toString mountPoints})
devices=(${toString devices}) devices=(${toString devices})
fsTypes=(${toString fsTypes}) fsTypes=(${toString fsTypes})
optionss=(${toString optionss}) optionss=(${toString optionss})
autocreates=(${toString autocreates}) autocreates=(${toString autocreates})
newDevices=1 newDevices=1
# If we mount any file system, we repeat this loop, because new # If we mount any file system, we repeat this loop, because new
# mount opportunities may have become available (such as images # mount opportunities may have become available (such as images
# for loopback mounts). # for loopback mounts).
while test -n \"$newDevices\"; do while test -n "$newDevices"; do
newDevices= newDevices=
for ((n = 0; n < \${#mountPoints[*]}; n++)); do for ((n = 0; n < ''${#mountPoints[*]}; n++)); do
mountPoint=\${mountPoints[$n]} mountPoint=''${mountPoints[$n]}
device=\${devices[$n]} device=''${devices[$n]}
fsType=\${fsTypes[$n]} fsType=''${fsTypes[$n]}
options=\${optionss[$n]} options=''${optionss[$n]}
autocreate=\${autocreates[$n]} autocreate=''${autocreates[$n]}
isLabel= isLabel=
if echo \"$device\" | grep -q '^LABEL='; then isLabel=1; fi if echo "$device" | grep -q '^LABEL='; then isLabel=1; fi
isPseudo= isPseudo=
if test \"$fsType\" = \"nfs\" || test \"$fsType\" = \"tmpfs\" || if test "$fsType" = "nfs" || test "$fsType" = "tmpfs" ||
test \"$fsType\" = \"ext3cow\"; then isPseudo=1; fi test "$fsType" = "ext3cow"; then isPseudo=1; fi
if ! test -n \"$isLabel\" -o -n \"$isPseudo\" -o -e \"$device\"; then if ! test -n "$isLabel" -o -n "$isPseudo" -o -e "$device"; then
echo \"skipping $device, doesn't exist (yet)\" echo "skipping $device, doesn't exist (yet)"
continue continue
fi fi
# !!! quick hack: if mount point already exists, try a # !!! quick hack: if mount point already exists, try a
# remount to change the options but nothing else. # remount to change the options but nothing else.
if cat /proc/mounts | grep -F -q \" $mountPoint \"; then if cat /proc/mounts | grep -F -q " $mountPoint "; then
echo \"remounting $device on $mountPoint\" echo "remounting $device on $mountPoint"
${mount}/bin/mount -t \"$fsType\" \\ ${mount}/bin/mount -t "$fsType" \
-o remount,\"$options\" \\ -o remount,"$options" \
\"$device\" \"$mountPoint\" || true "$device" "$mountPoint" || true
continue continue
fi fi
# If $device is already mounted somewhere else, unmount it first. # If $device is already mounted somewhere else, unmount it first.
# !!! Note: we use /etc/mtab, not /proc/mounts, because mtab # !!! Note: we use /etc/mtab, not /proc/mounts, because mtab
# contains more accurate info when using loop devices. # contains more accurate info when using loop devices.
# !!! not very smart about labels yet; should resolve the label somehow. # !!! not very smart about labels yet; should resolve the label somehow.
if test -z \"$isLabel\" -a -z \"$isPseudo\"; then if test -z "$isLabel" -a -z "$isPseudo"; then
device=$(readlink -f \"$device\") device=$(readlink -f "$device")
prevMountPoint=$( prevMountPoint=$(
cat /etc/mtab \\ cat /etc/mtab \
| grep \"^$device \" \\ | grep "^$device " \
| sed 's|^[^ ]\\+ \\+\\([^ ]\\+\\).*|\\1|' \\ | sed 's|^[^ ]\+ \+\([^ ]\+\).*|\1|' \
) )
if test \"$prevMountPoint\" = \"$mountPoint\"; then if test "$prevMountPoint" = "$mountPoint"; then
echo \"remounting $device on $mountPoint\" echo "remounting $device on $mountPoint"
${mount}/bin/mount -t \"$fsType\" \\ ${mount}/bin/mount -t "$fsType" \
-o remount,\"$options\" \\ -o remount,"$options" \
\"$device\" \"$mountPoint\" || true "$device" "$mountPoint" || true
continue continue
fi fi
if test -n \"$prevMountPoint\"; then if test -n "$prevMountPoint"; then
echo \"unmount $device from $prevMountPoint\" echo "unmount $device from $prevMountPoint"
${mount}/bin/umount \"$prevMountPoint\" || true ${mount}/bin/umount "$prevMountPoint" || true
fi fi
fi fi
echo \"mounting $device on $mountPoint\" echo "mounting $device on $mountPoint"
# !!! should do something with the result; also prevent repeated fscks. # !!! should do something with the result; also prevent repeated fscks.
if test -z \"$isPseudo\"; then if test -z "$isPseudo"; then
fsck -a \"$device\" || true fsck -a "$device" || true
fi fi
if test \"\$autocreate\" = 1; then mkdir -p \"\$mountPoint\"; fi if test "$autocreate" = 1; then mkdir -p "$mountPoint"; fi
if ${mount}/bin/mount -t \"$fsType\" -o \"$options\" \"$device\" \"$mountPoint\"; then if ${mount}/bin/mount -t "$fsType" -o "$options" "$device" "$mountPoint"; then
newDevices=1 newDevices=1
fi fi
done done
done done
end script
'';
in
end script {
"; services = {
extraJobs = [{
name = "filesystems";
inherit job;
}];
};
} }