dbadf6e9c2
during boot. Mountall ensures that these are done in the right order. It's informed by udev about devices becoming available. It emits some Upstart events upon reaching certain states, in particular ‘local-filesystems’ after all local filesystems have been mounted successfully, ‘remote-filesystems’ after all network filesystems have been mounted, and ‘filesystem’ (sic) when all filesystems have been mounted. Currently, if a filesystem fails to mount or doesn't exist, then the mingettys won't start and the boot will appear to hang. This is because mountall doesn't emit an event for failing filesystems and waits indefinitely for the filesystems to become available. * The ‘filesystems’ and ‘swap’ Upstart jobs are gone. (Support for encrypted swap devices is temporarily gone.) * Generate a proper /etc/fstab from the ‘fileSystems’ and ‘swapDevices’ options. svn path=/nixos/branches/boot-order/; revision=22148
167 lines
4.4 KiB
Nix
167 lines
4.4 KiB
Nix
{ config, pkgs, ... }:
|
|
|
|
with pkgs.lib;
|
|
|
|
{
|
|
|
|
###### interface
|
|
|
|
options = {
|
|
|
|
fileSystems = mkOption {
|
|
example = [
|
|
{ mountPoint = "/";
|
|
device = "/dev/hda1";
|
|
}
|
|
{ mountPoint = "/data";
|
|
device = "/dev/hda2";
|
|
fsType = "ext3";
|
|
options = "data=journal";
|
|
}
|
|
{ mountPoint = "/bigdisk";
|
|
label = "bigdisk";
|
|
}
|
|
];
|
|
|
|
description = "
|
|
The file systems to be mounted. It must include an entry for
|
|
the root directory (<literal>mountPoint = \"/\"</literal>). Each
|
|
entry in the list is an attribute set with the following fields:
|
|
<literal>mountPoint</literal>, <literal>device</literal>,
|
|
<literal>fsType</literal> (a file system type recognised by
|
|
<command>mount</command>; defaults to
|
|
<literal>\"auto\"</literal>), and <literal>options</literal>
|
|
(the mount options passed to <command>mount</command> using the
|
|
<option>-o</option> flag; defaults to <literal>\"defaults\"</literal>).
|
|
|
|
Instead of specifying <literal>device</literal>, you can also
|
|
specify a volume label (<literal>label</literal>) for file
|
|
systems that support it, such as ext2/ext3 (see <command>mke2fs
|
|
-L</command>).
|
|
|
|
<literal>autocreate</literal> forces <literal>mountPoint</literal> to be created with
|
|
<command>mkdir -p</command> .
|
|
";
|
|
|
|
type = types.nullOr (types.list types.optionSet);
|
|
|
|
options = {
|
|
|
|
mountPoint = mkOption {
|
|
example = "/mnt/usb";
|
|
type = types.uniq types.string;
|
|
description = "
|
|
Location of the mounted the file system.
|
|
";
|
|
};
|
|
|
|
device = mkOption {
|
|
default = null;
|
|
example = "/dev/sda";
|
|
type = types.uniq (types.nullOr types.string);
|
|
description = "
|
|
Location of the device.
|
|
";
|
|
};
|
|
|
|
label = mkOption {
|
|
default = null;
|
|
example = "root-partition";
|
|
type = types.uniq (types.nullOr types.string);
|
|
description = "
|
|
Label of the device (if any).
|
|
";
|
|
};
|
|
|
|
fsType = mkOption {
|
|
default = "auto";
|
|
example = "ext3";
|
|
type = types.uniq types.string;
|
|
description = "
|
|
Type of the file system.
|
|
";
|
|
};
|
|
|
|
options = mkOption {
|
|
default = "defaults,relatime";
|
|
example = "data=journal";
|
|
type = types.string;
|
|
merge = pkgs.lib.concatStringsSep ",";
|
|
description = "
|
|
Option used to mount the file system.
|
|
";
|
|
};
|
|
|
|
autocreate = mkOption {
|
|
default = false;
|
|
type = types.bool;
|
|
description = "
|
|
Automatically create the mount point defined in
|
|
<option>fileSystems.*.mountPoint</option>.
|
|
";
|
|
};
|
|
};
|
|
};
|
|
|
|
system.sbin.mount = mkOption {
|
|
internal = true;
|
|
default = pkgs.utillinuxng;
|
|
description = "
|
|
Package containing mount and umount.
|
|
";
|
|
};
|
|
|
|
};
|
|
|
|
|
|
###### implementation
|
|
|
|
config = {
|
|
|
|
# Add the mount helpers to the system path so that `mount' can find them.
|
|
environment.systemPackages = [ pkgs.ntfs3g pkgs.cifs_utils pkgs.nfsUtils pkgs.mountall ];
|
|
|
|
environment.etc = singleton
|
|
{ source = pkgs.writeText "fstab"
|
|
''
|
|
# This is a generated file. Do not edit!
|
|
|
|
# Filesystems.
|
|
${flip concatMapStrings config.fileSystems (fs:
|
|
(if fs.device != null then fs.device else "/dev/disk/by-label/${fs.label}")
|
|
+ " " + fs.mountPoint
|
|
+ " " + fs.fsType
|
|
+ " " + fs.options
|
|
+ " 0"
|
|
+ " " + (if fs.mountPoint == "/" then "1" else "2")
|
|
+ "\n"
|
|
)}
|
|
|
|
# Swap devices.
|
|
${flip concatMapStrings config.swapDevices (sw:
|
|
"${sw.device} none swap\n"
|
|
)}
|
|
'';
|
|
target = "fstab";
|
|
};
|
|
|
|
jobs.mountall =
|
|
{ startOn = "started udev";
|
|
|
|
script =
|
|
''
|
|
exec > /dev/console 2>&1
|
|
export PATH=${config.system.sbin.mount}/bin:${pkgs.utillinux}/sbin:$PATH
|
|
${pkgs.mountall}/sbin/mountall --verbose --debug
|
|
echo DONE
|
|
'';
|
|
|
|
extraConfig = "console owner";
|
|
|
|
task = true;
|
|
};
|
|
|
|
};
|
|
|
|
}
|