Suspend & Hibernate với NVIDIA systemd trên LOQ 15ARP9
Lưu ý: Bài hướng dẫn/chia sẻ dựa trên tài liệu NVIDIA, ArchWiki và quá trình thử nghiệm trên Lenovo LOQ 15ARP9. Kết quả kiểm thử chỉ phản ánh cấu hình phần cứng và phần mềm được sử dụng, không bảo đảm hoạt động tương tự
Lưu ý: Bài hướng dẫn/chia sẻ dựa trên tài liệu NVIDIA, ArchWiki và quá trình thử nghiệm trên Lenovo LOQ 15ARP9. Kết quả kiểm thử chỉ phản ánh cấu hình phần cứng và phần mềm được sử dụng, không bảo đảm hoạt động tương tự trên mọi hệ thống.
1. Kiểm tra yêu cầu hệ thống
Hướng dẫn áp dụng cho hệ thống đáp ứng các điều kiện sau:
Linux sử dụng systemd.
NVIDIA proprietary driver hoặc NVIDIA Open Kernel Modules hỗ trợ giao diện
/proc/driver/nvidia/suspend.Có các NVIDIA systemd suspend services tương ứng với driver.
Bootloader cho phép cấu hình kernel parameters.
Có swapfile hoặc swap partition trên thiết bị lưu trữ bền vững nếu sử dụng Hibernate.
Hướng dẫn sử dụng cơ chế NVIDIA systemd suspend services truyền thống để lưu và khôi phục trạng thái GPU, thay vì Kernel Suspend Notifiers.
Với NVIDIA 595 trở lên, Kernel Suspend Notifiers thường là cơ chế được ưu tiên. Nếu sử dụng cơ chế này, tham khảo bài hướng dẫn NVIDIA Kernel Suspend Notifiers thay thế.
Kiểm tra NVIDIA driver
nvidia-smiVới các hệ thống có NVIDIA Open Kernel Modules phiên bản 595 trở lên có thể tham khảo phương pháp hiện đại ở đây
Kiểm tra các tham số hiện tại:
cat /proc/driver/nvidia/params | grep -E \
'UseKernelSuspendNotifiers|PreserveVideoMemoryAllocations|TemporaryFilePath'Kiểm tra giao diện NVIDIA suspend:
ls -l /proc/driver/nvidia/suspendKiểm tra NVIDIA services:
systemctl list-unit-files 'nvidia-*.service'Nếu các services không tồn tại, cần kiểm tra gói NVIDIA driver đang sử dụng trước khi tiếp tục.
2. Cấu hình NVIDIA Power Management
Thêm kernel parameter:
nvidia.NVreg_PreserveVideoMemoryAllocations=1Với driver hỗ trợ NVreg_UseKernelSuspendNotifiers, để lựa chọn cơ chế systemd truyền thống, thêm:
nvidia.NVreg_UseKernelSuspendNotifiers=0
NVreg_UseKernelSuspendNotifiers=0 chỉ áp dụng cho driver có hỗ trợ tham số này. Không thêm tham số không được driver nhận diện.
Có thể tùy chọn vị trí lưu VRAM:
nvidia.NVreg_TemporaryFilePath=/đường/dẫn/tuỳ/chọnNVIDIA có thể sử dụng /tmp hoặc vị trí khác tùy phiên bản driver và cách đóng gói của bản phân phối.
Nên sử dụng filesystem hỗ trợ unnamed temporary files, chẳng hạn ext4 hoặc XFS, và có đủ không gian lưu VRAM.
Kiểm tra:
df -h /var/tmp
findmnt -T /var/tmpTham khảo cấu hình kernel parameters tại đây
3. Vô hiệu hóa NVIDIA Early Module Loading
Khi sử dụng cơ chế bảo toàn VRAM, NVIDIA Early Loading có thể gây lỗi trong quá trình khôi phục Hibernate.
Theo ArchWiki – NVIDIA: Early loading, việc nạp NVIDIA trong initramfs có thể khiến Hibernate không hoạt động khi video memory preservation được bật.
Lưu ý: Bước này chỉ ngăn NVIDIA được nạp sớm trong initramfs, không vô hiệu hóa NVIDIA driver hoặc DRM Kernel Mode Setting (KMS) sau khi hệ thống khởi động.
3.1. Kiểm tra cấu hình mkinitcpio
Mở file:
sudo nano /etc/mkinitcpio.confTìm mảng MODULES.
Nếu chứa:
MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)Loại bỏ bốn NVIDIA modules khỏi mảng, đồng thời giữ nguyên các module khác nếu có.
Nếu không có module nào khác:
MODULES=()Không cần xóa kms khỏi HOOKS chỉ để vô hiệu hóa NVIDIA Early Loading.
3.2. Kiểm tra các cấu hình bổ sung
Một số bản phân phối có thể bổ sung NVIDIA modules qua file cấu hình mkinitcpio khác.
Kiểm tra:
grep -RnE 'nvidia(_modeset|_uvm|_drm)?' \
/etc/mkinitcpio.conf /etc/mkinitcpio.conf.d/ 2>/dev/nullTrên CachyOS, CHWD có thể tạo:
/etc/mkinitcpio.conf.d/10-chwd.confTrong đó có cấu hình:
MODULES+=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)Nếu tồn tại cấu hình ép NVIDIA Early Loading, cần điều chỉnh trước khi tiếp tục. Có thể phải kiểm tra lại sau các lần cập nhật CHWD hoặc driver.
3.3. Tạo lại initramfs
Với mkinitcpio:
sudo mkinitcpio -PVới Limine trên CachyOS:
sudo limine-mkinitcpio3.4. Kiểm tra initramfs
lsinitcpio -a /boot/initramfs-linux-cachyos.img | grep -E \
'(^|/)(nvidia|nvidia_modeset|nvidia_uvm|nvidia_drm)\.ko'Đường dẫn initramfs có thể khác tùy kernel và bản phân phối.
Không có kết quả là dấu hiệu các NVIDIA kernel modules không còn được đóng gói trong initramfs đang kiểm tra.
Nếu sử dụng dracut, cần kiểm tra và điều chỉnh cơ chế đóng gói/nạp NVIDIA modules tương ứng, thay vì áp dụng trực tiếp cấu hình mkinitcpio.
3.5. Kiểm tra sau khi reboot
lsmod | grep nvidiaNVIDIA modules vẫn có thể được nạp bình thường sau khi hệ thống khởi động.
Kiểm tra DRM KMS:
cat /sys/module/nvidia_drm/parameters/modesetKết quả mong đợi:
YKiểm tra tham số bảo toàn VRAM:
cat /proc/driver/nvidia/params | grep -E \
'UseKernelSuspendNotifiers|PreserveVideoMemoryAllocations'Với driver hỗ trợ cả hai tham số, kết quả mong đợi:
PreserveVideoMemoryAllocations: 1
UseKernelSuspendNotifiers: 0Việc vô hiệu hóa Early Loading không đồng nghĩa với tắt NVIDIA DRM KMS.
Lưu ý: Một số hệ thống phụ thuộc NVIDIA KMS ngay từ giai đoạn boot. Nếu xuất hiện màn hình đen hoặc lỗi khởi động giao diện, cần kiểm tra và khôi phục cấu hình phù hợp.
4. Bật NVIDIA systemd suspend services
Với cơ chế /proc/driver/nvidia/suspend, systemd sử dụng các NVIDIA services để thông báo cho driver trước và sau khi hệ thống Suspend hoặc Hibernate.
Các services cần thiết:

Bật các services:
sudo systemctl enable \
nvidia-suspend.service \
nvidia-hibernate.service \
nvidia-resume.serviceNếu service có trạng thái masked, not-found hoặc không thể enable, cần kiểm tra gói driver và cấu hình systemd trước khi tiếp tục.
Không vô hiệu hóa các systemd services sau:
systemd-suspend.service
systemd-hibernate.service
systemd-suspend-then-hibernate.serviceĐây là các services chịu trách nhiệm điều khiển trạng thái ngủ của toàn bộ hệ thống, không phải NVIDIA services.
Lưu ý: Không cần systemctl start thủ công các NVIDIA suspend/hibernate services. Chúng được kích hoạt khi hệ thống thực hiện thao tác nguồn tương ứng.
5. Cấu hình Freeze User Sessions (tùy chọn)
Một số NVIDIA driver package cung cấp systemd drop-in:
/usr/lib/systemd/system/systemd-suspend.service.d/10-nvidia-no-freeze-session.conf
/usr/lib/systemd/system/systemd-hibernate.service.d/10-nvidia-no-freeze-session.confCác drop-in này có thể thiết lập:
[Service]
Environment="SYSTEMD_SLEEP_FREEZE_USER_SESSIONS=false"Cấu hình được sử dụng nhằm tránh một số xung đột giữa quá trình đóng băng user sessions và NVIDIA suspend helpers, đặc biệt khi driver cần tương tác với Xorg hoặc virtual terminal.
Khi sử dụng NVIDIA systemd suspend services truyền thống, nên giữ cấu hình do gói driver cung cấp, trừ khi có lý do cụ thể để thay đổi.
5.1. Kiểm tra cấu hình hiện tại
systemctl cat systemd-suspend.service
systemctl cat systemd-hibernate.serviceKiểm tra Environment:
systemctl show systemd-suspend.service -p Environment
systemctl show systemd-hibernate.service -p EnvironmentNếu driver đã cấu hình SYSTEMD_SLEEP_FREEZE_USER_SESSIONS=false, không cần tạo override để thay đổi thành true.
5.2. Khôi phục cấu hình mặc định nếu đã tùy chỉnh
Nếu trước đây đã tạo các override thủ công để bật Freeze User Sessions:
/etc/systemd/system/systemd-suspend.service.d/override.conf
/etc/systemd/system/systemd-hibernate.service.d/override.confHãy kiểm tra và loại bỏ các thiết lập SYSTEMD_SLEEP_FREEZE_USER_SESSIONS=true do chính mình bổ sung, nếu chúng xung đột với cấu hình NVIDIA hiện tại.
Sau khi chỉnh sửa:
sudo systemctl daemon-reloadKiểm tra lại:
systemctl show systemd-suspend.service -p Environment
systemctl show systemd-hibernate.service -p EnvironmentLưu ý: Không cần ép false trên mọi hệ thống. Chỉ điều chỉnh khi có cấu hình xung đột hoặc theo yêu cầu của gói driver đang sử dụng.
6. Cấu hình Suspend
Kiểm tra các chế độ ngủ mà kernel hỗ trợ:
cat /sys/power/state
cat /sys/power/mem_sleepVí dụ:
freeze mem disk
[s2idle]
Nếu hệ thống hỗ trợ nhiều chế độ, có thể lựa chọn bằng kernel parameter mem_sleep_default.
Không ép sử dụng deep trên phần cứng không hỗ trợ hoặc chưa được kiểm thử.
NVIDIA S0ix Power Management
Nếu GPU và nền tảng hỗ trợ S0ix, có thể bật:
nvidia.NVreg_EnableS0ixPowerManagement=1Kiểm tra khả năng hỗ trợ và trạng thái:
cat /proc/driver/nvidia/gpus/*/powerChú ý các trường:
S0ix Power Management:
Platform Support:
Status:NVreg_EnableS0ixPowerManagement không thay thế cho các NVIDIA systemd suspend services.
Bật S0ix không đồng nghĩa GPU chắc chắn đã chuyển sang trạng thái tiết kiệm điện tương ứng trong mọi lần Suspend.
7. Cấu hình Hibernate
Hibernate yêu cầu một vùng lưu trữ bền vững để lưu hibernation image.
Có thể sử dụng swapfile hoặc swap partition.
Lưu ý:
Zram không thể sử dụng để lưu hibernation image vì dữ liệu sẽ mất khi máy tắt. Tuy nhiên, zram vẫn có thể hoạt động song song với swapfile hoặc swap partition trên SSD/HDD.
Chủ bài chưa sử dụng Btrfs tham khảo chi tiết chính xác tại đây
7.1. Kiểm tra Swap hiện tại
swapon --showKiểm tra filesystem chứa swapfile dự định sử dụng:
findmnt -no FSTYPE -T /Nếu đã có swapfile hoặc swap partition đủ dung lượng và được cấu hình phù hợp, có thể bỏ qua bước tạo mới.
7.2. Tạo Swapfile
Đối với ext4/XFS
Ví dụ tạo swapfile 16 GiB:
sudo mkswap -U clear --size 16G --file /swapfileKích hoạt:
sudo swapon /swapfileĐối với Btrfs
Btrfs có các yêu cầu riêng về Copy-on-Write, compression và bố trí swapfile.
Ví dụ:
sudo btrfs filesystem mkswapfile --size 16g --uuid clear /swapfile
sudo swapon /swapfileTham khảo: ArchWiki – Btrfs Swapfile.
7.3. Tự động kích hoạt Swap khi khởi động
Chỉnh sửa:
sudo nano /etc/fstabThêm:
/swapfile none swap defaults,pri=-2 0 0Sao chép
pri=-2 thiết lập độ ưu tiên của swapfile ở mức -2.
Nếu hệ thống sử dụng zram với priority cao hơn, Linux sẽ ưu tiên zram trong hoạt động swapping thông thường.
Swap priority không quyết định nơi lưu hibernation image. Hibernate vẫn phụ thuộc vào thiết bị được chỉ định thông qua cấu hình resume.
Có thể bỏ pri=-2 để kernel tự gán priority mặc định nếu không có yêu cầu riêng.
Kiểm tra:
swapon --showSao chép
7.4. Xác định Resume UUID và Offset
Nếu sử dụng swapfile, kernel cần biết thiết bị chứa swapfile và vị trí vật lý bắt đầu của swapfile.
Lấy UUID của filesystem chứa swapfile:
findmnt -no UUID -T /swapfileSao chép
Đối với ext4/XFS
sudo filefrag -v /swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'Sao chép
Giá trị trả về là physical offset của extent đầu tiên, được sử dụng để cấu hình resume_offset.
Đối với Btrfs
sudo btrfs inspect-internal map-swapfile -r /swapfileKhông sử dụng filefrag để xác định resume offset trên Btrfs.
7.5. Cấu hình Kernel Parameters
Nếu sử dụng swapfile:
resume=UUID=<FILESYSTEM_UUID>
resume_offset=<PHYSICAL_OFFSET>Nếu sử dụng swap partition:
resume=UUID=<SWAP_PARTITION_UUID>Trong đó:
resume: Xác định thiết bị lưu hibernation image.resume_offset: Xác định vị trí bắt đầu của swapfile, tính theo đơn vị page của kernel.
Không sao chép UUID hoặc offset từ thiết bị khác.
Nếu swapfile bị xóa, tạo lại hoặc di chuyển đến vị trí vật lý mới, phải xác định lại resume_offset.

Thêm các tham số vào cấu hình bootloader theo hướng dẫn kernel parameters ở trên.
Đảm bảo initramfs có khả năng khôi phục hibernation image. Với mkinitcpio hoặc dracut, cần kiểm tra hooks và cơ chế resume tương ứng.
Sau khi thay đổi cấu hình, cập nhật initramfs/UKI nếu cần rồi reboot.
7.6. Kiểm tra Hibernate
swapon --show
cat /sys/power/state
cat /sys/power/image_size
cat /sys/power/resume_offsetĐảm bảo /sys/power/state hỗ trợ disk.
image_size biểu thị kích thước mục tiêu của hibernation image, không phải dung lượng swap bắt buộc tuyệt đối.
8. Reboot và xác nhận cấu hình NVIDIA
Sau khi hoàn tất các thay đổi:
rebootKiểm tra:
cat /proc/driver/nvidia/params | grep -E \
'UseKernelSuspendNotifiers|PreserveVideoMemoryAllocations|TemporaryFilePath'Với driver hỗ trợ cả hai tham số, kết quả mong đợi:
PreserveVideoMemoryAllocations: 1
UseKernelSuspendNotifiers: 0Kiểm tra NVIDIA services:
systemctl is-enabled \
nvidia-suspend.service \
nvidia-hibernate.service \
nvidia-resume.serviceKết quả mong đợi:
enabled
enabled
enabledKiểm tra NVIDIA driver:
nvidia-smiKiểm tra cấu hình kernel:
cat /proc/cmdlineĐảm bảo tham số resume, resume_offset nếu cần, và các tham số NVIDIA đã được áp dụng.
9. Kiểm thử Suspend
Lưu công việc đang mở trước khi kiểm thử.
systemctl suspendSau khi Resume:
journalctl -b -u systemd-suspend.service --no-pagerKiểm tra NVIDIA suspend/resume services:
journalctl -b \
-u nvidia-suspend.service \
-u nvidia-resume.service \
--no-pagerNếu hoạt động bình thường, log phải cho thấy NVIDIA suspend helper được gọi thành công và hệ thống quay lại từ trạng thái Suspend.
Kiểm tra kernel:
journalctl -b -k --no-pager | grep -Ei \
'PM: suspend|PM: resume|NVRM|Xid'Với s2idle:
PM: suspend entry (s2idle)
PM: suspend exitTùy chọn: Workaround cho lỗi PCIe ASPM
Cảnh báo: Không khuyến nghị sử dụng pcie_aspm=off theo mặc định.
Nếu Suspend/Resume vẫn gặp lỗi sau khi đã hoàn tất các bước cấu hình, có thể thử kernel parameter:
pcie_aspm=offTham số này khiến Linux không thay đổi cấu hình PCIe Active State Power Management (ASPM) do firmware thiết lập.
ASPM giúp giảm điện năng tiêu thụ trên các liên kết PCIe khi ít hoạt động.
Cần lưu ý:
Chỉ thử khi Suspend/Resume gặp lỗi và đã kiểm tra các nguyên nhân khác.
Có thể làm tăng điện năng tiêu thụ và giảm thời lượng pin.
Không nên giữ nếu hệ thống vẫn hoạt động ổn định khi không sử dụng.
Đây là workaround, không phải giải pháp chung cho mọi thiết bị.
Trên Lenovo LOQ 15ARP9 sử dụng CachyOS, pcie_aspm=off là thay đổi giúp Suspend hoạt động thành công trong quá trình kiểm thử cơ chế systemd truyền thống.
Trước đó, pm_test=freezer và pm_test=devices thành công nhưng pm_test=platform bị treo.
Chưa xác định chính xác thiết bị PCIe hoặc tương tác firmware gây lỗi.
10. Kiểm thử Hibernate
Lưu công việc đang mở trước khi thực hiện.
systemctl hibernateSau khi bật máy và khôi phục phiên làm việc:
journalctl -b -u systemd-hibernate.service --no-pagerKiểm tra NVIDIA hibernate/resume services:
journalctl -b \
-u nvidia-hibernate.service \
-u nvidia-resume.service \
--no-pagerKiểm tra kernel:
journalctl -b -k --no-pager | grep -Ei \
'hibernation|PM: Image|NVRM|Xid'Các thông báo liên quan có thể bao gồm:
PM: hibernation: hibernation entry
PM: Image successfully loaded
PM: hibernation: hibernation exitNếu hệ thống khởi động phiên mới thay vì khôi phục phiên cũ, cần kiểm tra:
Swap và dung lượng lưu hibernation image.
resumevàresume_offset.Initramfs và cơ chế Resume.
NVIDIA Early Loading.
NVIDIA systemd suspend services.
Lỗi NVIDIA khi Resume từ Hibernate
Trên Lenovo LOQ 15ARP9, từng xuất hiện:
PM: Image successfully loaded
NVRM: PreserveVideoMemoryAllocations module parameter is set.
System Power Management attempted without driver procfs suspend interface.
nvidia: pci_pm_freeze returns -5
PM: hibernation: resume failed (-5)Lỗi cho thấy hibernation image đã được đọc nhưng quá trình khôi phục thất bại tại NVIDIA.
Trong cấu hình được kiểm thử, việc loại bỏ NVIDIA Early Loading khỏi initramfs đã khắc phục lỗi.
Nếu gặp thông báo tương tự, kiểm tra lại bước 3 và bước 4 trước khi thử Hibernate lần nữa.
11. Kết quả kiểm thử thực tế
Hệ thống được kiểm thử:


Hệ thống sử dụng NVIDIA systemd suspend services truyền thống để xử lý Suspend/Hibernate, không sử dụng NVreg_UseKernelSuspendNotifiers=1.
Cả Suspend và Hibernate riêng lẻ đã hoạt động thành công sau khi khắc phục các lỗi liên quan đến PCIe ASPM và NVIDIA Early Loading.
Kết quả không bảo đảm mọi hệ thống NVIDIA đều có hành vi tương tự.
Đang tải bình luận…