diff --git a/layers/ioschedulers.nix b/layers/ioschedulers.nix
new file mode 100644
index 0000000000000000000000000000000000000000..aff840c410865648527f6bf8036d9125984974e9
--- /dev/null
+++ b/layers/ioschedulers.nix
@@ -0,0 +1,15 @@
+{ pkgs, ... }:
+let
+  ioschedulers-udev = pkgs.writeTextDir "/etc/udev/rules.d/60-ioschedulers.rules" ''
+    # set scheduler for NVMe
+    ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="bfq"
+    # set scheduler for SSD and eMMC
+    ACTION=="add|change", KERNEL=="[sv]d[a-z]|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="bfq"
+    # set scheduler for rotating disks
+    ACTION=="add|change", KERNEL=="[sv]d[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
+  '';
+
+in
+{
+  services.udev.packages = [ ioschedulers-udev ];
+}