$ cat /sys/power/mem_sleep
# Output like: [s2idle] deep
# The bracketed value is the current default
# If you only see [s2idle], S3 is not available
cat /sys/power/mem_sleep
# Output like: [s2idle] deep
# The bracketed value is the current default
# If you only see [s2idle], S3 is not available
cat /sys/power/mem_sleep
# Output like: [s2idle] deep
# The bracketed value is the current default
# If you only see [s2idle], S3 is not available
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install powertop # Debian/Ubuntu
-weight: 600;">sudo -weight: 500;">pacman -S powertop # Arch
-weight: 600;">sudo -weight: 500;">dnf -weight: 500;">install powertop # Fedora # Run it after a suspend/resume cycle to see power draw
-weight: 600;">sudo powertop
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install powertop # Debian/Ubuntu
-weight: 600;">sudo -weight: 500;">pacman -S powertop # Arch
-weight: 600;">sudo -weight: 500;">dnf -weight: 500;">install powertop # Fedora # Run it after a suspend/resume cycle to see power draw
-weight: 600;">sudo powertop
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install powertop # Debian/Ubuntu
-weight: 600;">sudo -weight: 500;">pacman -S powertop # Arch
-weight: 600;">sudo -weight: 500;">dnf -weight: 500;">install powertop # Fedora # Run it after a suspend/resume cycle to see power draw
-weight: 600;">sudo powertop
# Look at what happened during the last suspend
journalctl -b 0 | grep -i "suspend\|sleep\|freeze"
# Look at what happened during the last suspend
journalctl -b 0 | grep -i "suspend\|sleep\|freeze"
# Look at what happened during the last suspend
journalctl -b 0 | grep -i "suspend\|sleep\|freeze"
# Temporary switch (resets on reboot)
echo deep | -weight: 600;">sudo tee /sys/power/mem_sleep # Permanent fix via kernel parameter
# Edit your bootloader config (GRUB example)
-weight: 600;">sudo nano /etc/default/grub # Add mem_sleep_default=deep to GRUB_CMDLINE_LINUX_DEFAULT
# Example:
# GRUB_CMDLINE_LINUX_DEFAULT="quiet splash mem_sleep_default=deep" # Regenerate GRUB config
-weight: 600;">sudo -weight: 500;">update-grub # Debian/Ubuntu
-weight: 600;">sudo grub-mkconfig -o /boot/grub/grub.cfg # Arch/Fedora
# Temporary switch (resets on reboot)
echo deep | -weight: 600;">sudo tee /sys/power/mem_sleep # Permanent fix via kernel parameter
# Edit your bootloader config (GRUB example)
-weight: 600;">sudo nano /etc/default/grub # Add mem_sleep_default=deep to GRUB_CMDLINE_LINUX_DEFAULT
# Example:
# GRUB_CMDLINE_LINUX_DEFAULT="quiet splash mem_sleep_default=deep" # Regenerate GRUB config
-weight: 600;">sudo -weight: 500;">update-grub # Debian/Ubuntu
-weight: 600;">sudo grub-mkconfig -o /boot/grub/grub.cfg # Arch/Fedora
# Temporary switch (resets on reboot)
echo deep | -weight: 600;">sudo tee /sys/power/mem_sleep # Permanent fix via kernel parameter
# Edit your bootloader config (GRUB example)
-weight: 600;">sudo nano /etc/default/grub # Add mem_sleep_default=deep to GRUB_CMDLINE_LINUX_DEFAULT
# Example:
# GRUB_CMDLINE_LINUX_DEFAULT="quiet splash mem_sleep_default=deep" # Regenerate GRUB config
-weight: 600;">sudo -weight: 500;">update-grub # Debian/Ubuntu
-weight: 600;">sudo grub-mkconfig -o /boot/grub/grub.cfg # Arch/Fedora
# Edit your loader entry
-weight: 600;">sudo nano /boot/loader/entries/arch.conf # Append to the options line:
# options ... mem_sleep_default=deep
# Edit your loader entry
-weight: 600;">sudo nano /boot/loader/entries/arch.conf # Append to the options line:
# options ... mem_sleep_default=deep
# Edit your loader entry
-weight: 600;">sudo nano /boot/loader/entries/arch.conf # Append to the options line:
# options ... mem_sleep_default=deep
# Install turbostat
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install linux-tools-common linux-tools-$(uname -r) # Check C-state residency (run before and after suspend)
-weight: 600;">sudo turbostat --show Core,CPU,Pkg%pc2,Pkg%pc3,Pkg%pc6,Pkg%pc8,Pkg%pc9,Pk%pc10 sleep 1
# Install turbostat
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install linux-tools-common linux-tools-$(uname -r) # Check C-state residency (run before and after suspend)
-weight: 600;">sudo turbostat --show Core,CPU,Pkg%pc2,Pkg%pc3,Pkg%pc6,Pkg%pc8,Pkg%pc9,Pk%pc10 sleep 1
# Install turbostat
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install linux-tools-common linux-tools-$(uname -r) # Check C-state residency (run before and after suspend)
-weight: 600;">sudo turbostat --show Core,CPU,Pkg%pc2,Pkg%pc3,Pkg%pc6,Pkg%pc8,Pkg%pc9,Pk%pc10 sleep 1
# List devices that can trigger wakeup
cat /proc/acpi/wakeup # Disable a specific device (e.g., XHC1 for USB controller)
echo XHC1 | -weight: 600;">sudo tee /proc/acpi/wakeup # To make it persistent, create a systemd -weight: 500;">service
-weight: 600;">sudo tee /etc/systemd/system/-weight: 500;">disable-usb-wakeup.-weight: 500;">service << 'EOF'
[Unit]
Description=Disable USB wakeup triggers
After=multi-user.target [Service]
Type=oneshot
ExecStart=/bin/sh -c "echo XHC1 > /proc/acpi/wakeup" [Install]
WantedBy=multi-user.target
EOF -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">enable -weight: 500;">disable-usb-wakeup.-weight: 500;">service
# List devices that can trigger wakeup
cat /proc/acpi/wakeup # Disable a specific device (e.g., XHC1 for USB controller)
echo XHC1 | -weight: 600;">sudo tee /proc/acpi/wakeup # To make it persistent, create a systemd -weight: 500;">service
-weight: 600;">sudo tee /etc/systemd/system/-weight: 500;">disable-usb-wakeup.-weight: 500;">service << 'EOF'
[Unit]
Description=Disable USB wakeup triggers
After=multi-user.target [Service]
Type=oneshot
ExecStart=/bin/sh -c "echo XHC1 > /proc/acpi/wakeup" [Install]
WantedBy=multi-user.target
EOF -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">enable -weight: 500;">disable-usb-wakeup.-weight: 500;">service
# List devices that can trigger wakeup
cat /proc/acpi/wakeup # Disable a specific device (e.g., XHC1 for USB controller)
echo XHC1 | -weight: 600;">sudo tee /proc/acpi/wakeup # To make it persistent, create a systemd -weight: 500;">service
-weight: 600;">sudo tee /etc/systemd/system/-weight: 500;">disable-usb-wakeup.-weight: 500;">service << 'EOF'
[Unit]
Description=Disable USB wakeup triggers
After=multi-user.target [Service]
Type=oneshot
ExecStart=/bin/sh -c "echo XHC1 > /proc/acpi/wakeup" [Install]
WantedBy=multi-user.target
EOF -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">enable -weight: 500;">disable-usb-wakeup.-weight: 500;">service
# Check current swap
swapon --show # If using a swap file, find its offset for the resume parameter
-weight: 600;">sudo filefrag -v /swapfile | head -4
# Note the first physical offset value # Add resume parameters to kernel command line
# GRUB_CMDLINE_LINUX_DEFAULT="... resume=/dev/sdX2 resume_offset=XXXXX"
# (use your swap partition or swap file location)
# Check current swap
swapon --show # If using a swap file, find its offset for the resume parameter
-weight: 600;">sudo filefrag -v /swapfile | head -4
# Note the first physical offset value # Add resume parameters to kernel command line
# GRUB_CMDLINE_LINUX_DEFAULT="... resume=/dev/sdX2 resume_offset=XXXXX"
# (use your swap partition or swap file location)
# Check current swap
swapon --show # If using a swap file, find its offset for the resume parameter
-weight: 600;">sudo filefrag -v /swapfile | head -4
# Note the first physical offset value # Add resume parameters to kernel command line
# GRUB_CMDLINE_LINUX_DEFAULT="... resume=/dev/sdX2 resume_offset=XXXXX"
# (use your swap partition or swap file location)
# Edit systemd sleep config
-weight: 600;">sudo nano /etc/systemd/sleep.conf # Add these lines:
# [Sleep]
# SuspendMode=suspend
# HibernateMode=shutdown
# HibernateDelaySec=7200 # hibernate after 2 hours of suspend # Change the lid close action
-weight: 600;">sudo nano /etc/systemd/logind.conf
# HandleLidSwitch=suspend-then-hibernate -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">restart systemd-logind
# Edit systemd sleep config
-weight: 600;">sudo nano /etc/systemd/sleep.conf # Add these lines:
# [Sleep]
# SuspendMode=suspend
# HibernateMode=shutdown
# HibernateDelaySec=7200 # hibernate after 2 hours of suspend # Change the lid close action
-weight: 600;">sudo nano /etc/systemd/logind.conf
# HandleLidSwitch=suspend-then-hibernate -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">restart systemd-logind
# Edit systemd sleep config
-weight: 600;">sudo nano /etc/systemd/sleep.conf # Add these lines:
# [Sleep]
# SuspendMode=suspend
# HibernateMode=shutdown
# HibernateDelaySec=7200 # hibernate after 2 hours of suspend # Change the lid close action
-weight: 600;">sudo nano /etc/systemd/logind.conf
# HandleLidSwitch=suspend-then-hibernate -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">restart systemd-logind
-weight: 600;">sudo fwupdmgr refresh
-weight: 600;">sudo fwupdmgr get-updates
-weight: 600;">sudo fwupdmgr refresh
-weight: 600;">sudo fwupdmgr get-updates
-weight: 600;">sudo fwupdmgr refresh
-weight: 600;">sudo fwupdmgr get-updates - USB devices keeping the controller awake
- Thunderbolt/USB4 controller not entering low-power
- WiFi card not supporting proper power save
- NVMe drive not entering deepest sleep state - Check sleep support before buying hardware. Search the Arch Wiki for your laptop model — it has the best hardware compatibility documentation in the Linux ecosystem.
- Keep your firmware updated. Manufacturers occasionally push BIOS updates that improve Linux sleep behavior. Use fwupdmgr to check: - Watch your kernel version. New kernels frequently add better power management for recent hardware. If you're on an LTS kernel and having issues, try a newer mainline kernel.
- Check the kernel bug tracker. Search for your specific laptop model plus "s2idle" or "suspend." Chances are someone has already reported and potentially fixed your exact issue.