Ngủ đông sử dụng systemctl
và làm cho nó hoạt động trong trường hợp khó khăn
Đối với tôi, pm-hibernate
luôn luôn thất bại. Sau một số điều chỉnh, tôi đã có thể ngủ đông bằng giao diện của systemd (hệ thống init trong 16.04 trở lên). Tôi cũng đã quản lý để làm cho nó hoạt động vào ngày 17.04 với một tệp hoán đổi. Nghiên cứu trường hợp này có thể hữu ích cho những người khác có vấn đề.
Lần thử đầu tiên:
sudo systemctl hibernate
Nếu thất bại, hãy bắt đầu khắc phục sự cố: ở trạng thái ngủ đông (HTD hoặc ACPI S4), trạng thái máy được ghi vào đĩa để không cần nguồn điện để bảo quản. Trạng thái được ghi vào phân vùng trao đổi hoặc tệp hoán đổi. Lưu ý: nếu sử dụng BTRFS KHÔNG cố sử dụng tệp hoán đổi vì điều này có thể gây ra hỏng hệ thống tệp
Swap partition hoặc trao đổi tập tin của bạn có thể cần phải có cùng kích thước như RAM để cho phép ngủ đông, nhưng có một cơ hội tốt bạn sẽ có thể ngủ đông nếu nó là ít nhất 2/5 kích thước của bộ nhớ RAM, theo các trang wiki Arch , vì vậy hãy thử các bước khác trước khi tăng kích thước trao đổi.
Nếu vấn đề của bạn là bạn có được một khởi động sạch thay vì sơ yếu lý lịch dự kiến, tối thiểu bạn rất có thể cần phải đặt tham số khởi động để tìm ảnh đĩa
Tìm phân vùng trao đổi của bạn:
grep swap /etc/fstab
cho tôi lợi nhuận này (đầu ra một phần)
# swap was on /dev/mmcblk0p3 during installation
nơi /dev/mmcblk0p3
là phân vùng để xác định
Thêm một tham số khởi động:
sudoedit /etc/default/grub
Để dòng bắt đầu GRUB_CMDLINE_LINUX_DEFAULT
thêm resume=/dev/YourSwapPartition
vào phần trong dấu ngoặc kép (thay thế bằng phân vùng bạn đã xác định trước đó). Sử dụng ví dụ của tôi:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3"
Bất cứ khi nào bạn thay đổi tệp này, bạn phải chạy sudo update-grub
nếu không các thay đổi sẽ không có hiệu lực.
Bây giờ bạn cần khởi động lại. Sau đó, bạn có thể cố gắng ngủ đông, bằng cách ban hành lệnh:
sudo systemctl hibernate
Để tiếp tục, nhấn nút nguồn và hệ thống sẽ khởi động.
Nếu bạn vẫn có vấn đề, hãy bắt đầu gỡ lỗi.
Tôi bao gồm trường hợp của tôi dưới đây là một ví dụ, nhưng thông tin chi tiết về gỡ lỗi trạng thái S có thể được tìm thấy trong blog này và cả trường hợp này .
Đặt thêm một số thông số khởi động để nắm bắt thêm thông tin. Xóa quiet
và splash
thêm initcall_debug
và no_console_suspend
điều đó sẽ khiến các lệnh gọi hệ thống init được in ra bàn điều khiển để bạn có thể xem những gì đang xảy ra. Tôi đặt cái này:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
Điều này giúp tôi thấy những gì đã xảy ra trong sơ yếu lý lịch từ ngủ đông.
Trong trường hợp của tôi, sau khi tiếp tục, tôi bị mất WiFi và hạt nhân rõ ràng rất khó chịu vì hầu hết các lệnh (ví dụ như đọc bất cứ thứ gì /sys
, tải lại mô-đun hoặc bất kỳ systemctl
lệnh nào ) sẽ không hoạt động - quá trình sẽ xuất hiện và chỉ bị treo (tất cả điều này sẽ xảy ra trở lại bình thường sau khi khởi động lại tất nhiên). Theo dõi hệ thống tắt rất chậm và đọc tất cả các thông báo gỡ lỗi, tôi nhận thấy rằng có rất nhiều vấn đề với "brcm", vì vậy tôi đoán rằng mô-đun trình điều khiển không dây Broadcom của tôi là lỗi. Chắc chắn tôi đã điều chỉnh quy trình ngủ đông để dỡ mô-đun trước:
sudo modprobe -r brcmfmac
sudo systemctl hibernate
trong sơ yếu lý lịch tôi cài đặt lại mô-đun
sudo modprobe brcmfmac
Và mọi thứ hoạt động hoàn hảo. Tôi cũng phải đưa vào danh sách đen các btsdio
mô-đun dường như không tương thích vớibrcmfmac
Cập nhật: Ngủ đông bằng cách sử dụng tệp hoán đổi vào ngày 17.04.
Một lần nữa với sự giúp đỡ từ trang Arch wiki và một số sửa đổi bổ sung, tôi đã xoay sở để ngủ đông hoạt động vào ngày 17.04 với một tệp hoán đổi. Điều này yêu cầu một tham số khởi động bổ sung, resume_offset=n
trong đó n là số đầu tiên bên dưới physical_offset
trong đầu ra của sudo filefrag -v /swapfile
:
$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 1425873920 (348114 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
....
Do đó, tham số khởi động bổ sung trong trường hợp của tôi là resume_offset=34816
. Bạn vẫn cần đặt tham số khởi động cho phân vùng để tiếp tục. Đây sẽ là phân vùng gốc (hoặc bất kỳ phân vùng nào mà tệp hoán đổi của bạn được đặt trên) Các tham số của tôi hiện là:
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"
Trong trường hợp /dev/mmcblk1p2
là phân vùng gốc của tôi (của bạn có nhiều khả năng trở thành một cái gì đó giống như /dev/sda2
).
Trong quá trình tiếp tục, tôi đã thấy tải hình ảnh thành công, nhưng trong trường hợp của tôi (chỉ là một ví dụ - YMMVAPD) thì một số trình điều khiển khác ( i2c_designware
) đã ném một số lỗi và tôi đã đóng băng hệ thống hoàn chỉnh trong sơ yếu lý lịch. Chế độ ngủ đông hoạt động nếu tôi dỡ các mô-đun đó ra ngoài brcmfmac
, nhưng hệ thống nhanh chóng trở nên không sử dụng được nếu không có các mô-đun đó. Do đó, tôi đã tạo ra một loại kịch bản để dỡ bỏ các mô-đun lỗi và ngay lập tức cài đặt lại chúng trong sơ yếu lý lịch:
# remove buggy modules
modprobe -r brcmfmac i2c_designware_platform i2c_designware_core &&
# hibernate
echo disk > /sys/power/state
# reinsert
modprobe i2c_designware_core i2c_designware_platform brcmfmac
Khi tôi muốn ngủ đông, tôi chạy sudo bash script
. Điều này làm việc tuyệt vời.
TL; DR
Sử dụng systemd, đặt tham số khởi động để tiếp tục từ trao đổi, xác định trình điều khiển lỗi và hủy tải chúng trước khi bắt đầu ngủ đông. Nếu hệ thống không thể hoạt động lâu mà không có các mô-đun đó hoặc bạn cần dỡ một số mô-đun, có thể dễ dàng sử dụng một tập lệnh đơn giản để bắt đầu chế độ ngủ đông.