nixos/swap: use btrfs mkswapfile if possible (#447030)

Changed files
+14 -6
nixos
modules
config
+14 -6
nixos/modules/config/swap.nix
···
sw:
let
realDevice' = utils.escapeSystemdPath sw.realDevice;
+
btrfsInSystem = config.boot.supportedFilesystems.btrfs or false;
in
lib.nameValuePair "mkswap-${sw.deviceName}" {
description = "Initialisation of swap device ${sw.device}";
···
pkgs.util-linux
pkgs.e2fsprogs
]
+
++ lib.optional btrfsInSystem pkgs.btrfs-progs
++ lib.optional sw.randomEncryption.enable pkgs.cryptsetup;
environment.DEVICE = sw.device;
···
${lib.optionalString (sw.size != null) ''
currentSize=$(( $(stat -c "%s" "$DEVICE" 2>/dev/null || echo 0) / 1024 / 1024 ))
if [[ ! -b "$DEVICE" && "${toString sw.size}" != "$currentSize" ]]; then
-
# Disable CoW for CoW based filesystems like BTRFS.
-
truncate --size 0 "$DEVICE"
-
chattr +C "$DEVICE" 2>/dev/null || true
+
if [[ $(stat -f -c %T $(dirname "$DEVICE")) == "btrfs" ]]; then
+
# Use btrfs mkswapfile to speed up the creation of swapfile.
+
rm -f "$DEVICE"
+
btrfs filesystem mkswapfile --size "${toString sw.size}M" --uuid clear "$DEVICE"
+
else
+
# Disable CoW for CoW based filesystems.
+
truncate --size 0 "$DEVICE"
+
chattr +C "$DEVICE" 2>/dev/null || true
-
echo "Creating swap file using dd and mkswap."
-
dd if=/dev/zero of="$DEVICE" bs=1M count=${toString sw.size} status=progress
-
${lib.optionalString (!sw.randomEncryption.enable) "mkswap ${sw.realDevice}"}
+
echo "Creating swap file using dd and mkswap."
+
dd if=/dev/zero of="$DEVICE" bs=1M count=${toString sw.size} status=progress
+
${lib.optionalString (!sw.randomEncryption.enable) "mkswap ${sw.realDevice}"}
+
fi
fi
''}
${lib.optionalString sw.randomEncryption.enable ''