filesystems: use list of strings for fs options

Allow usage of list of strings instead of a comma-separated string
for filesystem options. Deprecate the comma-separated string style
with a warning message; convert this to a hard error after 16.09.
15.09 was just released, so this provides a deprecation period during
the 16.03 release.

closes #10518

Signed-off-by: Robin Gloster <mail@glob.in>

Changed files
+46 -25
nixos
doc
modules
installer
system
tasks
virtualisation
tests
+1 -1
nixos/doc/manual/configuration/config-file.xml
···
fileSystems."/boot" =
{ device = "/dev/sda1";
fsType = "ext4";
-
options = "rw,data=ordered,relatime";
+
options = [ "rw" "data=ordered" "relatime" ];
};
</programlisting>
</para>
+2 -2
nixos/doc/manual/man-nixos-generate-config.xml
···
fileSystems."/" =
{ device = "/dev/disk/by-label/nixos";
fsType = "ext3";
-
options = "rw,data=ordered,relatime";
+
options = [ "rw" "data=ordered" "relatime" ];
};
fileSystems."/boot" =
{ device = "/dev/sda1";
fsType = "ext3";
-
options = "rw,errors=continue,user_xattr,acl,barrier=1,data=writeback,relatime";
+
options = [ "rw" "errors=continue" "user_xattr" "acl" "barrier=1" "data=writeback" "relatime" ];
};
swapDevices =
+17
nixos/doc/manual/release-notes/rl-unstable.xml
···
rights, new <literal>aliasFiles</literal> and <literal>mapFiles</literal>
options and more.</para>
</listitem>
+
+
<listitem>
+
<para>Filesystem options should now be configured as a list of strings, not
+
a comma-separated string. The old style will continue to work, but print a
+
warning, until the 16.09 release. An example of the new style:
+
+
<programlisting>
+
fileSystems."/example" = {
+
device = "/dev/sdc";
+
fsType = "btrfs";
+
options = [ "noatime" "compress=lzo" "space_cache" "autodefrag" ];
+
};
+
</programlisting>
+
+
</para>
+
</listitem>
+
</itemizedlist>
+4 -4
nixos/modules/installer/cd-dvd/iso-image.nix
···
fileSystems."/" =
{ fsType = "tmpfs";
-
options = "mode=0755";
+
options = [ "mode=0755" ];
};
# Note that /dev/root is a symlink to the actual root device
···
fileSystems."/nix/.ro-store" =
{ fsType = "squashfs";
device = "/iso/nix-store.squashfs";
-
options = "loop";
+
options = [ "loop" ];
neededForBoot = true;
};
fileSystems."/nix/.rw-store" =
{ fsType = "tmpfs";
-
options = "mode=0755";
+
options = [ "mode=0755" ];
neededForBoot = true;
};
fileSystems."/nix/store" =
{ fsType = "unionfs-fuse";
device = "unionfs";
-
options = "allow_other,cow,nonempty,chroot=/mnt-root,max_files=32768,hide_meta_files,dirs=/nix/.rw-store=rw:/nix/.ro-store=ro";
+
options = [ "allow_other" "cow" "nonempty" "chroot=/mnt-root" "max_files=32768" "hide_meta_files" "dirs=/nix/.rw-store=rw:/nix/.ro-store=ro" ];
};
boot.initrd.availableKernelModules = [ "squashfs" "iso9660" "usb-storage" ];
+2 -2
nixos/modules/installer/tools/nixos-generate-config.pl
···
fileSystems.\"$mountPoint\" =
{ device = \"$base$path\";
fsType = \"none\";
-
options = \"bind\";
+
options = \[ \"bind\" \];
};
EOF
···
if (scalar @extraOptions > 0) {
$fileSystems .= <<EOF;
-
options = \"${\join ",", uniq(@extraOptions)}\";
+
options = \[ ${\join " ", map { "\"" . $_ . "\"" } uniq(@extraOptions)} \];
EOF
}
+1 -1
nixos/modules/system/boot/stage-1.nix
···
(filter (sd: (sd ? label || hasPrefix "/dev/" sd.device) && !sd.randomEncryption) config.swapDevices);
fsInfo =
-
let f = fs: [ fs.mountPoint (if fs.device != null then fs.device else "/dev/disk/by-label/${fs.label}") fs.fsType fs.options ];
+
let f = fs: [ fs.mountPoint (if fs.device != null then fs.device else "/dev/disk/by-label/${fs.label}") fs.fsType (builtins.concatStringsSep "," fs.options) ];
in pkgs.writeText "initrd-fsinfo" (concatStringsSep "\n" (concatMap f fileSystems));
setHostId = optionalString (config.networking.hostId != null) ''
+11 -7
nixos/modules/tasks/filesystems.nix
···
};
options = mkOption {
-
default = "defaults";
-
example = "data=journal";
-
type = types.commas; # FIXME: should be a list
+
default = [ "defaults" ];
+
example = [ "data=journal" ];
description = "Options used to mount the file system.";
-
};
+
} // (if versionAtLeast lib.nixpkgsVersion "16.09" then {
+
type = types.listOf types.str;
+
} else {
+
type = types.either types.commas (types.listOf types.str);
+
apply = x: if isList x then x else lib.strings.splitString "," (builtins.trace "warning: passing a comma-separated string for filesystem options is deprecated; use a list of strings instead. This will become a hard error in 16.09." x);
+
});
autoFormat = mkOption {
default = false;
···
"/data" = {
device = "/dev/hda2";
fsType = "ext3";
-
options = "data=journal";
+
options = [ "data=journal" ];
};
"/bigdisk".label = "bigdisk";
};
···
<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>).
+
<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
···
else throw "No device specified for mount point ‘${fs.mountPoint}’.")
+ " " + fs.mountPoint
+ " " + fs.fsType
-
+ " " + fs.options
+
+ " " + builtins.concatStringsSep "," fs.options
+ " 0"
+ " " + (if skipCheck fs then "0" else
if fs.mountPoint == "/" then "1" else "2")
+6 -6
nixos/modules/virtualisation/qemu-vm.nix
···
${if cfg.writableStore then "/nix/.ro-store" else "/nix/store"} =
{ device = "store";
fsType = "9p";
-
options = "trans=virtio,version=9p2000.L,cache=loose";
+
options = [ "trans=virtio" "version=9p2000.L" "cache=loose" ];
neededForBoot = true;
};
"/tmp/xchg" =
{ device = "xchg";
fsType = "9p";
-
options = "trans=virtio,version=9p2000.L,cache=loose";
+
options = [ "trans=virtio" "version=9p2000.L" "cache=loose" ];
neededForBoot = true;
};
"/tmp/shared" =
{ device = "shared";
fsType = "9p";
-
options = "trans=virtio,version=9p2000.L";
+
options = [ "trans=virtio" "version=9p2000.L" ];
neededForBoot = true;
};
} // optionalAttrs cfg.writableStore
{ "/nix/store" =
{ fsType = "unionfs-fuse";
device = "unionfs";
-
options = "allow_other,cow,nonempty,chroot=/mnt-root,max_files=32768,hide_meta_files,dirs=/nix/.rw-store=rw:/nix/.ro-store=ro";
+
options = [ "allow_other" "cow" "nonempty" "chroot=/mnt-root" "max_files=32768" "hide_meta_files" "dirs=/nix/.rw-store=rw:/nix/.ro-store=ro" ];
};
} // optionalAttrs (cfg.writableStore && cfg.writableStoreUseTmpfs)
{ "/nix/.rw-store" =
{ fsType = "tmpfs";
-
options = "mode=0755";
+
options = [ "mode=0755" ];
neededForBoot = true;
};
} // optionalAttrs cfg.useBootLoader
{ "/boot" =
{ device = "/dev/vdb2";
fsType = "vfat";
-
options = "ro";
+
options = [ "ro" ];
noCheck = true; # fsck fails on a r/o filesystem
};
});
+1 -1
nixos/tests/misc.nix
···
systemd.tmpfiles.rules = [ "d /tmp 1777 root root 10d" ];
fileSystems = mkVMOverride { "/tmp2" =
{ fsType = "tmpfs";
-
options = "mode=1777,noauto";
+
options = [ "mode=1777" "noauto" ];
};
};
systemd.automounts = singleton
+1 -1
nixos/tests/nfs.nix
···
[ { mountPoint = "/data";
device = "server:/data";
fsType = "nfs";
-
options = "vers=${toString version}";
+
options = [ "vers=${toString version}" ];
}
];
networking.firewall.enable = false; # FIXME: only open statd