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
Article12 phút đọc

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ự

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

Vớ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/suspend

Kiể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=1

Với driver hỗ trợ NVreg_UseKernelSuspendNotifiers, để lựa chọn cơ chế systemd truyền thống, thêm:

nvidia.NVreg_UseKernelSuspendNotifiers=0
image

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ọn

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

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

Tì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/null

Trên CachyOS, CHWD có thể tạo:

/etc/mkinitcpio.conf.d/10-chwd.conf

Trong đó 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 -P

Với Limine trên CachyOS:

sudo limine-mkinitcpio

3.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 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 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: 0

Việ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:

image

Bật các services:

sudo systemctl enable \
  nvidia-suspend.service \
  nvidia-hibernate.service \
  nvidia-resume.service

Nế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.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 đượ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.service

Kiểm tra Environment:

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

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

Hã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-reload

Kiểm tra lại:

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

Lư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_sleep

Ví dụ:

freeze mem disk
[s2idle]
image

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=1

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

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

Chú ý 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 --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

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

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

Sao 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 /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'

Với driver hỗ trợ cả hai tham số, kết quả mong đợi:

PreserveVideoMemoryAllocations: 1
UseKernelSuspendNotifiers: 0

Kiểm tra NVIDIA services:

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

Kết quả mong đợi:

enabled
enabled
enabled

Kiểm tra NVIDIA driver:

nvidia-smi

Kiể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 suspend

Sau khi Resume:

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

Kiểm tra NVIDIA suspend/resume services:

journalctl -b \
  -u nvidia-suspend.service \
  -u nvidia-resume.service \
  --no-pager

Nế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 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) 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 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

Kiểm tra NVIDIA hibernate/resume services:

journalctl -b \
  -u nvidia-hibernate.service \
  -u nvidia-resume.service \
  --no-pager

Kiể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 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:

  • Swap và dung lượng lưu hibernation image.

  • resume và 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ử:

image
image

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

1

Thảo luận

0 bình luận

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

?