Commit 69d79431 authored by Lily Foster's avatar Lily Foster
Browse files

nixos/systemd-stage-1: unify initrd fstab generation logic with system fstab

parent 0608bffd
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -100,12 +100,6 @@ let

  fileSystems = filter utils.fsNeededForBoot config.system.build.fileSystems;

  fstab = pkgs.writeText "initrd-fstab" (lib.concatMapStringsSep "\n"
    ({ fsType, mountPoint, device, options, autoFormat, autoResize, ... }@fs: let
        opts = options ++ optional autoFormat "x-systemd.makefs" ++ optional autoResize "x-systemd.growfs";
        finalDevice = if (lib.elem "bind" options) then "/sysroot${device}" else device;
      in "${finalDevice} /sysroot${mountPoint} ${fsType} ${lib.concatStringsSep "," opts}") fileSystems);

  needMakefs = lib.any (fs: fs.autoFormat) fileSystems;
  needGrowfs = lib.any (fs: fs.autoResize) fileSystems;

@@ -354,8 +348,6 @@ in {
          DefaultEnvironment=PATH=/bin:/sbin ${optionalString (isBool cfg.emergencyAccess && cfg.emergencyAccess) "SYSTEMD_SULOGIN_FORCE=1"}
        '';

        "/etc/fstab".source = fstab;

        "/lib/modules".source = "${modulesClosure}/lib/modules";
        "/lib/firmware".source = "${modulesClosure}/lib/firmware";

+31 −17
Original line number Diff line number Diff line
@@ -153,6 +153,34 @@ let
      specialMount "${mount.device}" "${mount.mountPoint}" "${concatStringsSep "," mount.options}" "${mount.fsType}"
    '') mounts);

  makeFstabEntries =
    let
      fsToSkipCheck = [ "none" "bindfs" "btrfs" "zfs" "tmpfs" "nfs" "vboxsf" "glusterfs" "apfs" "9p" "cifs" "prl_fs" "vmhgfs" ];
      isBindMount = fs: builtins.elem "bind" fs.options;
      skipCheck = fs: fs.noCheck || fs.device == "none" || builtins.elem fs.fsType fsToSkipCheck || isBindMount fs;
      # https://wiki.archlinux.org/index.php/fstab#Filepath_spaces
      escape = string: builtins.replaceStrings [ " " "\t" ] [ "\\040" "\\011" ] string;
    in fstabFileSystems: { rootPrefix ? "", excludeChecks ? false, extraOpts ? (fs: []) }: concatMapStrings (fs:
      (optionalString (isBindMount fs) (escape rootPrefix))
      + (if fs.device != null then escape fs.device
         else if fs.label != null then "/dev/disk/by-label/${escape fs.label}"
         else throw "No device specified for mount point ‘${fs.mountPoint}’.")
      + " " + escape (rootPrefix + fs.mountPoint)
      + " " + fs.fsType
      + " " + builtins.concatStringsSep "," (fs.options ++ (extraOpts fs))
      + " " + (optionalString (!excludeChecks)
        ("0 " + (if skipCheck fs then "0" else if fs.mountPoint == "/" then "1" else "2")))
      + "\n"
    ) fstabFileSystems;

    initrdFstab = pkgs.writeText "initrd-fstab" (makeFstabEntries (filter utils.fsNeededForBoot fileSystems) {
      rootPrefix = "/sysroot";
      excludeChecks = true;
      extraOpts = fs:
        (optional fs.autoResize "x-systemd.growfs")
        ++ (optional fs.autoFormat "x-systemd.makefs");
    });

in

{
@@ -279,11 +307,6 @@ in

    environment.etc.fstab.text =
      let
        fsToSkipCheck = [ "none" "bindfs" "btrfs" "zfs" "tmpfs" "nfs" "vboxsf" "glusterfs" "apfs" "9p" "cifs" "prl_fs" "vmhgfs" ];
        isBindMount = fs: builtins.elem "bind" fs.options;
        skipCheck = fs: fs.noCheck || fs.device == "none" || builtins.elem fs.fsType fsToSkipCheck || isBindMount fs;
        # https://wiki.archlinux.org/index.php/fstab#Filepath_spaces
        escape = string: builtins.replaceStrings [ " " "\t" ] [ "\\040" "\\011" ] string;
        swapOptions = sw: concatStringsSep "," (
          sw.options
          ++ optional (sw.priority != null) "pri=${toString sw.priority}"
@@ -298,18 +321,7 @@ in
        # <file system> <mount point>   <type>  <options>       <dump>  <pass>

        # Filesystems.
        ${concatMapStrings (fs:
            (if fs.device != null then escape fs.device
             else if fs.label != null then "/dev/disk/by-label/${escape fs.label}"
             else throw "No device specified for mount point ‘${fs.mountPoint}’.")
            + " " + escape fs.mountPoint
            + " " + fs.fsType
            + " " + builtins.concatStringsSep "," fs.options
            + " 0"
            + " " + (if skipCheck fs then "0" else
                     if fs.mountPoint == "/" then "1" else "2")
            + "\n"
        ) fileSystems}
        ${makeFstabEntries fileSystems {}}

        # Swap devices.
        ${flip concatMapStrings config.swapDevices (sw:
@@ -317,6 +329,8 @@ in
        )}
      '';

    boot.initrd.systemd.contents."/etc/fstab".source = initrdFstab;

    # Provide a target that pulls in all filesystems.
    systemd.targets.fs =
      { description = "All File Systems";