{
  liminix
, lib
, svc
}:
{ partlabel, mountpoint, options, fstype }:
let
  inherit (liminix.services) oneshot;
  device = "/dev/disk/by-partlabel/${partlabel}";
  name = "mount.${lib.strings.sanitizeDerivationName (lib.escapeURL mountpoint)}";
  options_string =
    if options == [] then "" else "-o ${lib.concatStringsSep "," options}";
  controller = svc.uevent-rule.build {
    serviceName = name;
    symlink = device;
    terms = {
      partname = partlabel;
      devtype = "partition";
    };
  };
in oneshot {
  inherit name;
  timeout-up = 3600;
  up = "mount -t ${fstype} ${options_string} ${device} ${mountpoint}";
  down = "umount ${mountpoint}";
  inherit controller;
}