Bài viết

VNLFVNLF Social
?
Đăng nhậpĐể dùng đầy đủ tính năng
Bảng tinKhám pháTin nhắnVoice
VNLF trên các mạng xã hội khác
Cài đặtTrợ giúpĐăng nhập
Bảng tinKhám pháTin nhắnVoice
Article11 phút đọc

Suspend & Hibernate với NVIDIA Kernel Suspend Notifiers 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ự

Vanphat111@Vanphat111

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 Open Kernel Modules phiên bản 595 trở lên, hỗ trợ NVreg_UseKernelSuspendNotifiers.

  • 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.

Lưu ý: Hướng dẫn này không áp dụng nguyên trạng cho NVIDIA proprietary kernel modules hoặc các phiên bản driver chưa hỗ trợ Kernel Suspend Notifiers. Với những trường hợp đó, tham khảo phương pháp NVIDIA systemd suspend services truyền thống tại đây.

Kiểm tra NVIDIA driver

nvidia-smi

Kiểm tra các tham số hiện tại:

cat /proc/driver/nvidia/params | grep -E \
'UseKernelSuspendNotifiers|PreserveVideoMemoryAllocations|TemporaryFilePath'

2. Cấu hình NVIDIA Kernel Suspend Notifiers

Thêm các kernel parameters:

nvidia.NVreg_UseKernelSuspendNotifiers=1
nvidia.NVreg_PreserveVideoMemoryAllocations=2
image

Có thể tùy chọn vị trí lưu VRAM:

nvidia.NVreg_TemporaryFilePath=/đường/dẫn/tuỳ/chọn

Theo mặc định, NVIDIA sử dụng /tmp làm vị trí lưu tạm.

Tham khảo vị trí cấu hình kernel parameters tại đây.

Nếu NVIDIA được nạp sớm trong initramfs, cần bảo đảm cấu hình được áp dụng trước khi module được nạp. Tạo lại initramfs nếu có thay đổi liên quan đến module configuration hoặc early loading.

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.conf

Tìm dòng:

MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)

Loại bỏ bốn NVIDIA modules khỏi mảng MODULES, đồng thời giữ nguyên các modules 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 thông 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/null

Nếu có cấu hình ép NVIDIA modules được nạp sớm, cần kiểm tra và điều chỉnh trước khi tiếp tục.

3.3. Tạo lại initramfs

sudo mkinitcpio -P

3.4. Kiểm tra initramfs

lsinitcpio /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.

3.5. Kiểm tra sau khi reboot

lsmod | grep nvidia

NVIDIA 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/modeset

Kết quả mong đợi:

Y

Kiểm tra Kernel Suspend Notifiers:

cat /proc/driver/nvidia/params | grep -E \
'UseKernelSuspendNotifiers|PreserveVideoMemoryAllocations'

Kết quả mong đợi:

PreserveVideoMemoryAllocations: 2
UseKernelSuspendNotifiers: 1

Việc vô hiệu hóa Early Loading không đồng nghĩa với tắt NVIDIA DRM KMS. Driver vẫn có thể được nạp sau initramfs và hoạt động bình thường trên Wayland hoặc Xorg.

Lưu ý: Việc loại bỏ Early Loading có thể ảnh hưởng đến một số hệ thống phụ thuộc NVIDIA KMS ngay trong quá trình 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 lại cấu hình và cân nhắc khôi phục Early Loading.

4. Vô hiệu hóa NVIDIA systemd suspend services cũ

Với NVIDIA Kernel Suspend Notifiers, driver có thể tự xử lý quá trình lưu và khôi phục trạng thái GPU thông qua kernel callbacks, không cần sử dụng các NVIDIA systemd suspend services truyền thống.

Vô hiệu hóa các services đang tồn tại:

sudo systemctl disable \
  nvidia-suspend.service \
  nvidia-hibernate.service \
  nvidia-resume.service \
  nvidia-suspend-then-hibernate.service

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.

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.conf

Các drop-in này có thể thiết lập:

[Service]
Environment="SYSTEMD_SLEEP_FREEZE_USER_SESSIONS=false"

Cấu hình này được sử dụng nhằm tránh một số xung đột với cơ chế NVIDIA suspend truyền thống, đặc biệt trong quá trình tương tác với Xorg và virtual terminal.

Khi sử dụng Kernel Suspend Notifiers, có thể kiểm thử bật lại Freeze User Sessions.

Freeze User Sessions giúp tạm dừng thực thi các tiến trình thuộc user.slice trong quá trình hệ thống chuẩn bị Suspend hoặc Hibernate, sau đó tiếp tục chúng khi Resume.

Kiểm tra cấu hình hiện tại

systemctl show systemd-suspend.service -p Environment
systemctl show systemd-hibernate.service -p Environment

Bật Freeze cho Suspend

sudo mkdir -p /etc/systemd/system/systemd-suspend.service.d
printf '[Service]\nEnvironment="SYSTEMD_SLEEP_FREEZE_USER_SESSIONS=true"\n' \
  | sudo tee /etc/systemd/system/systemd-suspend.service.d/override.conf

Bật Freeze cho Hibernate

sudo mkdir -p /etc/systemd/system/systemd-hibernate.service.d
printf '[Service]\nEnvironment="SYSTEMD_SLEEP_FREEZE_USER_SESSIONS=true"\n' \
  | sudo tee /etc/systemd/system/systemd-hibernate.service.d/override.conf

Áp dụng:

sudo systemctl daemon-reload

Kiểm tra:

systemctl show systemd-suspend.service -p Environment
systemctl show systemd-hibernate.service -p Environment

Kết quả mong đợi:

Environment=SYSTEMD_SLEEP_FREEZE_USER_SESSIONS=true

Lưu ý: Đây là bước tùy chọn, không bắt buộc đối với mọi hệ thống sử dụng Kernel Suspend Notifiers. Nếu phát sinh lỗi, hãy hoàn tác các override vừa tạo và kiểm thử lại.

6. Cấu hình Suspend

Kiểm tra các chế độ ngủ được kernel hỗ trợ:

cat /sys/power/state
cat /sys/power/mem_sleep

Ví dụ:

freeze mem disk
[s2idle]

Ý nghĩa:

image

Nếu hệ thống hỗ trợ nhiều chế độ, có thể lựa chọn thông qua 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=1

Kiểm tra khả năng hỗ trợ và trạng thái S0ix:

cat /proc/driver/nvidia/gpus/*/power

Chú ý các trường:

S0ix Power Management:
    Platform Support:
    Status:

NVreg_EnableS0ixPowerManagement và NVreg_UseKernelSuspendNotifiers là hai chức năng khác nhau.

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 --show

Kiể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 /swapfile

Kí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 /swapfile

Tham 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/fstab

Thêm:

/swapfile none swap defaults,pri=-2 0 0

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 --show

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 /swapfile

Đối với ext4/XFS

sudo filefrag -v /swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'

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 /swapfile

Khô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.

image

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:

reboot

Kiểm tra:

cat /proc/driver/nvidia/params | grep -E \
'UseKernelSuspendNotifiers|PreserveVideoMemoryAllocations|TemporaryFilePath'

Kết quả mong đợi:

PreserveVideoMemoryAllocations: 2
UseKernelSuspendNotifiers: 1

Kiểm tra các NVIDIA services:

systemctl is-enabled \
  nvidia-suspend.service \
  nvidia-hibernate.service \
  nvidia-resume.service

Kết quả mong đợi:

disabled
disabled
disabled

9. Kiểm thử Suspend

Lưu công việc đang mở trước khi kiểm thử.

systemctl suspend

Sau khi Resume:

journalctl -b -u systemd-suspend.service --no-pager

Nếu Freeze User Sessions đã bật, log thành công có thể chứa:

Successfully froze unit 'user.slice'.
Performing sleep operation 'suspend'...
System returned from sleep operation 'suspend'.
Successfully thawed unit 'user.slice'.
systemd-suspend.service: Deactivated successfully.
Finished System 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 exit

Tù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=off

Tham số này khiến Linux không thay đổi cấu hình PCIe Active State Power Management (ASPM) đã được firmware thiết lập.

ASPM giúp giảm mức tiêu thụ điện trên các kết nối 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 mức tiêu thụ điện 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ị.

Theo ArchWiki – Lenovo LOQ 15ARP9, pcie_aspm=off có thể giúp Suspend/Resume hoạt động nhưng không được khuyến nghị do ảnh hưởng đến khả năng tiết kiệm điện.

Trong thử nghiệm trên Lenovo LOQ 15ARP9 với CachyOS và NVIDIA Open Kernel Modules 615.78.08, Suspend và Hibernate đều hoạt động khi sử dụng tham số này.

Chưa có thử nghiệm đối chứng đầy đủ để xác nhận tham số này là điều kiện bắt buộc trên hệ thống được kiểm thử.

10. Kiểm thử Hibernate

Lưu công việc đang mở trước khi thực hiện.

systemctl hibernate

Sau khi bật máy và khôi phục phiên làm việc:

journalctl -b -u systemd-hibernate.service --no-pager

Nếu Hibernate và Freeze User Sessions hoạt động thành công, log có thể chứa:

Successfully froze unit 'user.slice'.
Performing sleep operation 'hibernate'...
System returned from sleep operation 'hibernate'.
Successfully thawed unit 'user.slice'.
systemd-hibernate.service: Deactivated successfully.
Finished System Hibernate.

Kiểm tra kernel:

journalctl -b -k --no-pager | grep -Ei \
'hibernation|PM: Image|NVRM|Xid'

Ví dụ:

PM: hibernation: hibernation entry
PM: hibernation: Preallocating image memory
PM: hibernation: Allocated ... pages for snapshot
PM: hibernation: hibernation exit

Nế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 lại swap, resume, resume_offset, initramfs và các thông báo lỗi liên quan đến hibernation image.

11. Kiểm tra lỗi NVIDIA sau Resume

journalctl -b -k --no-pager | grep -Ei \
'NVRM|Xid|nvidia.*error|GPU has fallen off'

Các thông báo NVIDIA xuất hiện trong quá trình khởi động không nhất thiết liên quan đến Suspend/Hibernate.

Cần đối chiếu timestamp để xác định lỗi có phát sinh trong chu trình Suspend/Resume hoặc Hibernate/Resume hay không.

Ngoài kiểm tra log, nên thử các tác vụ GPU thực tế sau Resume, chẳng hạn:

  • Trình duyệt có tăng tốc phần cứng.

  • Ứng dụng đồ họa.

  • CUDA hoặc các tác vụ tính toán GPU.

  • Game hoặc ứng dụng sử dụng nhiều VRAM.

11. Kết quả kiểm thử thực tế

image

Kết quả

image

Cả Suspend và Hibernate đã hoạt động trong các lần kiểm thử với NVreg_UseKernelSuspendNotifiers=1, không cần sử dụng NVIDIA systemd suspend services truyền thống.

Kết quả chỉ phản ánh phần cứng, driver và cấu hình đã được kiểm thử, không bảo đảm mọi hệ thống NVIDIA đều có hành vi tương tự.

Tài liệu tham khảo

  • NVIDIA Driver README – Configuring Power Management Support

  • ArchWiki – Suspend and Hibernate

  • ArchWiki – Swap

  • ArchWiki – Btrfs

  • ArchWiki – Lenovo LOQ 15ARP9

  • Linux Kernel – Kernel Parameters

3

Thảo luận

0 bình luận

Đang tải bình luận…

?