Make hibernation offset safer

This commit is contained in:
David Heinemeier Hansson
2026-04-15 11:49:03 +02:00
parent f7dc63ca72
commit 0017f2eab0
2 changed files with 37 additions and 5 deletions
+20 -5
View File
@@ -14,9 +14,22 @@ if ! command -v limine-mkinitcpio &>/dev/null; then
fi fi
MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf" MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf"
SWAP_FILE="/swap/swapfile"
RESUME_DROP_IN="/etc/limine-entry-tool.d/resume.conf"
# Check if hibernation is already configured # Check if hibernation is already configured
if [[ -f $MKINITCPIO_CONF ]] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then if [[ -f $MKINITCPIO_CONF ]] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then
# Fix empty resume_offset if btrfs map-swapfile failed during initial setup
if [[ -f $RESUME_DROP_IN ]] && grep -q 'resume_offset="$' "$RESUME_DROP_IN" && [[ -f $SWAP_FILE ]]; then
RESUME_OFFSET=$(sudo btrfs inspect-internal map-swapfile -r "$SWAP_FILE" 2>/dev/null)
if [[ -n $RESUME_OFFSET ]]; then
echo "Fixing empty resume_offset ($RESUME_OFFSET)"
sudo sed -i "s/resume_offset=\"$/resume_offset=$RESUME_OFFSET\"/" "$RESUME_DROP_IN"
sudo sed -i "s/resume_offset=\"$/resume_offset=$RESUME_OFFSET\"/" /etc/default/limine
sudo limine-mkinitcpio
sudo limine-update
fi
fi
echo "Hibernation is already set up" echo "Hibernation is already set up"
exit 0 exit 0
fi fi
@@ -29,7 +42,6 @@ if [[ $1 != "--force" ]]; then
fi fi
SWAP_SUBVOLUME="/swap" SWAP_SUBVOLUME="/swap"
SWAP_FILE="$SWAP_SUBVOLUME/swapfile"
# Create btrfs subvolume for swap # Create btrfs subvolume for swap
if ! sudo btrfs subvolume show "$SWAP_SUBVOLUME" &>/dev/null; then if ! sudo btrfs subvolume show "$SWAP_SUBVOLUME" &>/dev/null; then
@@ -68,15 +80,18 @@ sudo cp -p "$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight" /usr/
# Add resume= kernel parameters so the initramfs resume hook knows where to find the # Add resume= kernel parameters so the initramfs resume hook knows where to find the
# hibernation image. Without these, resume happens late (after GPU drivers load) and fails. # hibernation image. Without these, resume happens late (after GPU drivers load) and fails.
RESUME_DROP_IN="/etc/limine-entry-tool.d/resume.conf"
if [[ ! -f $RESUME_DROP_IN ]]; then if [[ ! -f $RESUME_DROP_IN ]]; then
echo "Adding resume kernel parameters" echo "Adding resume kernel parameters"
sudo swapon -p 0 "$SWAP_FILE" 2>/dev/null sudo swapon -p 0 "$SWAP_FILE" 2>/dev/null
RESUME_DEVICE=$(findmnt -no SOURCE -T "$SWAP_FILE" | sed 's/\[.*\]//') RESUME_DEVICE=$(findmnt -no SOURCE -T "$SWAP_FILE" | sed 's/\[.*\]//')
RESUME_OFFSET=$(sudo btrfs inspect-internal map-swapfile -r "$SWAP_FILE") RESUME_OFFSET=$(sudo btrfs inspect-internal map-swapfile -r "$SWAP_FILE")
sudo mkdir -p /etc/limine-entry-tool.d if [[ -n $RESUME_OFFSET ]]; then
echo "KERNEL_CMDLINE[default]+=\" resume=$RESUME_DEVICE resume_offset=$RESUME_OFFSET\"" | sudo tee "$RESUME_DROP_IN" >/dev/null sudo mkdir -p /etc/limine-entry-tool.d
sudo tee -a /etc/default/limine < "$RESUME_DROP_IN" >/dev/null echo "KERNEL_CMDLINE[default]+=\" resume=$RESUME_DEVICE resume_offset=$RESUME_OFFSET\"" | sudo tee "$RESUME_DROP_IN" >/dev/null
sudo tee -a /etc/default/limine < "$RESUME_DROP_IN" >/dev/null
else
echo "Warning: Could not determine resume offset for $SWAP_FILE" >&2
fi
fi fi
# Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate) # Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate)
+17
View File
@@ -0,0 +1,17 @@
echo "Fix empty resume_offset in hibernation config"
RESUME_DROP_IN="/etc/limine-entry-tool.d/resume.conf"
SWAP_FILE="/swap/swapfile"
if [[ -f $RESUME_DROP_IN ]] && grep -q 'resume_offset="$' "$RESUME_DROP_IN" && [[ -f $SWAP_FILE ]]; then
RESUME_OFFSET=$(sudo btrfs inspect-internal map-swapfile -r "$SWAP_FILE" 2>/dev/null)
if [[ -n $RESUME_OFFSET ]]; then
sudo sed -i "s/resume_offset=\"$/resume_offset=$RESUME_OFFSET\"/" "$RESUME_DROP_IN"
sudo sed -i "s/resume_offset=\"$/resume_offset=$RESUME_OFFSET\"/" /etc/default/limine
sudo limine-mkinitcpio
sudo limine-update
echo "Fixed: resume_offset=$RESUME_OFFSET"
else
echo "Warning: Could not determine resume offset for $SWAP_FILE"
fi
fi