Управління живленням/Призупинення та сплячий режим

В даний час доступні три методи призупинення: призупинити до оперативної пам'яті (зазвичай називається просто призупинити), призупинити на диск (зазвичай відомий як зимувати), і гібридна підвіска (іноді влучно називається призупинити до обох):

призупинення

  • Призупинити до оперативної пам'яті Метод відключає живлення більшості частин машини, окрім оперативної пам'яті, необхідної для відновлення стану машини. Через велику економію електроенергії доцільно для ноутбуків автоматично переходити в цей режим, коли комп’ютер працює від батарейок і кришка закрита (або користувач деякий час неактивний).
  • Призупинити на диск метод зберігає стан машини в місцях обміну і повністю вимикає машину. Коли машину ввімкнено, стан відновлюється. До цього часу споживання енергії нульове.
  • Призупинити обидва метод зберігає стан машини в місцях обміну, але не вимикає машину. Натомість він викликає звичайне призупинення до оперативної пам'яті. Отже, якщо акумулятор не розряджений, система може відновити роботу з оперативної пам'яті. Якщо акумулятор розрядиться, систему можна відновити з диска, що набагато повільніше, ніж відновлення з оперативної пам'яті, але стан машини не втрачено.

Існує безліч інтерфейсів низького рівня (бэкэнди), що забезпечують базову функціональність, а деякі інтерфейси високого рівня, що забезпечують налаштування для обробки проблемних драйверів обладнання/модулів ядра (наприклад, повторна ініціалізація відеокарти).

Зміст

  • 1 Інтерфейси низького рівня
    • 1.1 ядро ​​(swsusp)
    • 1,2 uswsusp
  • 2 Інтерфейси високого рівня
    • 2.1 системна
  • 3 Зимовий сон
    • 3.1 Про розмір підкачки/розміру файлу
    • 3.2 Необхідні параметри ядра
      • 3.2.1 Гібернація у файл підкачки
      • 3.2.2 Сплячий режим у файл підкачки на Btrfs
      • 3.2.3 Сплячий режим у тонко наданий обсяг LVM
    • 3.3 Налаштування initramfs
  • 4 Усунення несправностей
    • 4.1 ACPI_OS_NAME
    • 4.2 Призупинення/сплячий режим не працює або працює не постійно
    • 4.3 Пробудження через локальну мережу
    • 4.4 Миттєві пробудження від призупинення
    • 4.5 Система не вимикається під час сплячки

Інтерфейси низького рівня

Хоча ці інтерфейси можна використовувати безпосередньо, доцільно використовувати деякі інтерфейси високого рівня для призупинення/сплячого режиму. Безпосереднє використання інтерфейсів низького рівня значно швидше, ніж використання будь-якого інтерфейсу високого рівня, оскільки запуск усіх гачків перед і після зупинки вимагає часу, але хуки можуть правильно встановити апаратний годинник, відновити бездротові мережі тощо.

ядро (swsusp)

Найпростіший підхід - це безпосереднє інформування коду призупинення програмного забезпечення в ядрі (swsusp) для переходу в призупинений стан; точний спосіб і стан залежать від рівня апаратної підтримки. На сучасних ядрах запис відповідних рядків у/sys/power/state є основним механізмом, що викликає це призупинення.

uswsusp

Uswsusp ('Призупинення користувацького простору програмного забезпечення') - це обгортка навколо механізму призупинення до оперативної пам'яті ядра, який виконує деякі маніпуляції з графічним адаптером з простору користувача перед тим, як призупинити і після відновлення.

Дивіться основну статтю Uswsusp.

Інтерфейси високого рівня

Кінцева мета цих пакетів - забезпечити двійкові файли/сценарії, які можна викликати для виконання призупинення/сплячого режиму. Насправді підключення їх до кнопок живлення, клацань меню або подій кришки ноутбука зазвичай залишається за іншими інструментами. Щоб автоматично призупиняти/переходити в сплячий режим для певних подій живлення, таких як закриття кришки ноутбука або відсоток вичерпання заряду акумулятора, можливо, ви захочете вивчити роботу Acpid.

системний

systemd надає власні команди для призупинення, сплячого режиму та гібридного призупинення; докладніше див. у розділі Керування живленням # Управління живленням із systemd. Це інтерфейс за замовчуванням, який використовується в Arch Linux.

Додаткову інформацію про налаштування гачків призупинення/сплячого режиму див. У розділі Керування живленням. Також див. Systemctl (1), systemd-sleep (8) та systemd.special (7) .

Зимова сплячка

Для того, щоб використовувати сплячий режим, вам потрібно створити розділ підкачки або файл. Вам потрібно буде вказати ядро ​​на ваш підкачка за допомогою параметра resume = kernel, який налаштовано за допомогою завантажувача. Вам також потрібно буде налаштувати initramfs. Це повідомляє ядру, щоб спробувати відновити роботу із зазначеного обміну в ранній просторі користувача. Ці три кроки докладно описані нижче.

Про розмір розділу/файлу підкачки

Навіть якщо ваш розділ підкачки менше оперативної пам'яті, ви все одно маєте великі шанси на успішний сплячий режим. Відповідно до документації до ядра:

/ sys/power/image_size керує розміром зображення, створеного механізмом призупинення до диска. Це може бути записаний рядок, що представляє ціле невід’ємне число, яке буде використовуватися як верхня межа розміру зображення в байтах. Механізм призупинення до диску зробить все можливе, щоб розмір зображення не перевищував цієї кількості. Однак, якщо це виявиться неможливим, воно все одно спробує призупинити використання найменшого можливого зображення. Зокрема, якщо у цьому файлі записано "0", зображення призупинення буде якомога меншим. Читання з цього файлу відображатиме поточну межу розміру зображення, яка за замовчуванням встановлена ​​на 2/5 доступної оперативної пам'яті.

Ви можете або зменшити значення/sys/power/image_size, щоб зробити призупинене зображення якомога меншим (для невеликих розділів підкачки), або збільшити його, щоб можливо прискорити процес сплячого режиму. Для систем з великим обсягом оперативної пам'яті менші значення можуть різко збільшити швидкість відновлення сплячого режиму. Див. Systemd # systemd-tmpfiles - тимчасові файли, щоб зробити ці зміни постійними.

Призупинене зображення не може охоплювати декілька розділів обміну та/або файли обміну. Він повинен повністю вміститися в одному розділі підкачки або одному файлі підкачки. [1]

Необхідні параметри ядра

Параметр ядра resume =пристрій обміну повинні бути використані. Будь-який із методів іменування стійких блокових пристроїв може бути використаний як пристрій обміну . Наприклад:

  • резюме = UUID = 4209c845-f495-4c43-8a03-5363dd433153
  • резюме = "PARTLABEL = поміняти розділ"
  • resume =/dev/archVolumeGroup/archLogicVolume - якщо підкачка знаходиться на логічному томі LVM

Параметри ядра набудуть чинності лише після перезавантаження. Щоб мати змогу відразу перейти в сплячий режим, отримайте основний та другорядний номери пристрою в lsblk і повторіть їх у форматі майор:неповнолітній до/sys/power/resume. Якщо використовується файл підкачки, додатково повторіть зміщення резюме на/sys/power/resume_offset. [2]

Наприклад, якщо обмін пристроєм 8: 3:

Або під час сплячого режиму у файлі підкачки, якщо файл підкачки знаходиться на томі 8: 2 і має зміщення 38912:

Сплячий режим у файл підкачки

Використання файлу обміну вимагає також встановлення резюме =пристрій обміну і додатково зсув_зміщення =swap_file_offset параметри ядра. Див. Документацію до ядра.

пристрій обміну - обсяг, в якому знаходиться файл підкачки, і він має той самий формат, що і для кореневого параметра. Значення swap_file_offset можна отримати, запустивши filefrag -v файл_заміни, висновок знаходиться у форматі таблиці, а необхідне значення розміщується в першому рядку стовпця fiziчний_зсув. Наприклад:

У прикладі значення swap_file_offset є першим 38912 з двома періодами.

Сплячий режим у файл підкачки на Btrfs

Сплячий режим у файл підкачки підтримується останніми версіями systemd [3].

Номер зміщення_зміщення можна розрахувати за допомогою інструменту btrfs_map_physical.c. Не намагайтеся використовувати інструмент filefrag, на Btrfs "фізичний" зсув, який ви отримуєте від filefrag, не є реальним фізичним зсувом на диску; є віртуальний адресний простір диска для підтримки декількох пристроїв. [4]

Завантажте або скопіюйте інструмент btrfs_map_physical.c у файл з іменем btrfs_map_physical.c, а потім скомпілюйте його,

і запустіть його. Приклад виведення показаний нижче.

Зверніть увагу на перше фізичне зміщення, повернене цим інструментом. У цьому прикладі ми використовуємо 4009762816. Також зверніть увагу на розмір сторінки, який можна знайти за допомогою getconf PAGESIZE .

Для обчислення значення resume_offset розділіть фізичне зміщення на розмір сторінки. У цьому прикладі це 4009762816/4096 = 978946 .

Сплячий режим у тонко забезпечений том LVM

Можливий сплячий режим у тонко наданому томі LVM, але ви повинні переконатися, що обсяг повністю розподілений. Інакше відновлення з нього не вдасться.

Ви можете повністю розподілити обсяг LVM, просто заповнивши його нулями. Наприклад:

Щоб перевірити обсяг повністю розподіленого, ви можете використовувати:

Повністю виділений том відобразиться як такий, що використовує 100% даних.

Налаштуйте initramfs

  • Коли використовується initramfs з базовим хуком, який є типовим, гачок відновлення потрібно в /etc/mkinitcpio.conf. Незалежно від мітки чи UUID, розділ підкачки посилається на вузол пристрою udev, тому перехід на відновлення повинен пройти після гачок udev. Цей приклад був зроблений, починаючи із конфігурації гачка за замовчуванням:
Не забудьте відновити initramfs, щоб ці зміни набули чинності.
  • Коли використовується initramfs із системним гачком, механізм відновлення вже передбачений, і ніяких додаткових хуків не потрібно додавати.

Вирішення проблем

ACPI_OS_NAME

Можливо, ви захочете налаштувати свій Таблиця DSDT щоб це працювало. Див. Статтю DSDT

Призупинення/сплячий режим не працює або працює не постійно

Було багато повідомлень про те, що екран стає чорним без помилок, що легко переглядаються, або можливості робити що-небудь при переході та поверненні з режиму призупинення та/або сплячого режиму. Ці проблеми спостерігалися як на ноутбуках, так і на настільних комп’ютерах. Це не офіційне рішення, але перехід на старіше ядро, особливо LTS-ядро, це, мабуть, виправить.

Також проблема може виникнути при використанні апаратного таймера сторожового контролю (вимкнено за замовчуванням, див. RuntimeWatchdogSec = в systemd-system.conf (5) § ВАРІАНТИ). Помилковий сторожовий таймер може скинути налаштування комп’ютера до того, як система закінчить створення зображення сплячого режиму.

Іноді екран стає чорним через ініціалізацію пристрою всередині initramfs. Видалення будь-яких модулів, які можуть бути у вас у Mkinitcpio # MODULES, та відновлення initramfs, можливо, може вирішити цю проблему, особливо графічні драйвери для ранніх KMS. Ініціалізація таких пристроїв перед відновленням може спричинити невідповідність, що перешкоджає відновленню сплячого режиму системи. Це не впливає на відновлення роботи в оперативній пам'яті. Також перегляньте найкращі практики статті блогу щодо налагодження призупинення проблем.

Перехід від відеодрайвера radeon до нового драйвера AMDGPU також може допомогти зробити процес глибокого сну та пробудження успішним.

Для графічних драйверів Intel увімкнення ранньої KMS може допомогти вирішити проблему з порожнім екраном. Детальніше див. У налаштуванні режиму ядра # Ранній запуск KMS.

Після оновлення до ядра 4.15.3 відновлення може не вдатися зі статичним (немигаючим) курсором на чорному екрані. Чорний список модуля nvidiafb може допомогти. [5]

Ноутбуки з центральним процесором Intel, які завантажують модуль intel_lpss_pci для сенсорної панелі, можуть зіткнутися з панікою ядра при відновленні (миготливий замок) [6]. Модуль потрібно додати до initramfs як:

Wake-on-LAN

Якщо функція Wake-on-LAN активна, мережева карта інтерфейсу споживатиме енергію, навіть якщо комп'ютер перебуває в сплячому режимі.

Миттєві пробудження від призупинення

Для деяких систем Intel Haswell із набором мікросхем LynxPoint та LynxPoint-LP повідомляється про миттєві активації після призупинення. Вони пов’язані з помилковими реалізаціями BIOS ACPI і з тим, як модуль xhci_hcd інтерпретує його під час завантаження. У міру опрацювання, про які повідомляється, уражені системи додаються до денілісту (з назвою XHCI_SPURIOUS_WAKEUP) ядром у кожному окремому випадку. [7]

Миттєве відновлення може відбутися, наприклад, якщо під час призупинення підключено USB-пристрій і активовано активатори активації ACPI. Життєздатним рішенням для такої системи, якщо вона ще не в списку відтворення, є вимкнення тригерів активації. Приклад вимкнення пробудження через USB описаний нижче. [8]

Щоб переглянути поточну конфігурацію:

Відповідними пристроями є EHC1, EHC2 та XHC (для USB 3.0). Щоб переключити їхній стан, вам потрібно повторити назву пристрою у файл як root.

Це має призвести до того, що призупинення знову запрацює. Однак ці налаштування є лише тимчасовими і їх слід встановлювати при кожному перезавантаженні. Щоб автоматизувати це, подивіться на systemd # systemd-tmpfiles - тимчасові файли або перегляньте потік BBS для можливого рішення та додаткової інформації.

Приклад рішення із вимкненням PTXH та XHC0 одночасно. З якоїсь причини два рядки з PTXH та XHC0 по одному на рядок або у різних файлах не працюють.

Якщо ви використовуєте драйвер Nouveau, причиною миттєвого пробудження може бути помилка в цьому драйвері, яка іноді перешкоджає призупиненню роботи відеокарти. Одним із можливих обхідних шляхів є вивантаження модуля ядра nouveau безпосередньо перед сном і завантаження назад після пробудження. Для цього створіть такий сценарій:

Перший ехо-рядок відв’язує nouveaufb від драйвера консолі framebuffer (fbcon). Зазвичай це vtcon1, як у цьому прикладі, але це може бути і інший vtcon *. Дивіться/sys/class/vtconsole/vtcon */назвіть, який із них є "пристроєм буферного кадру" [9].

Система не вимикається під час сплячки

Коли ви переходите в сплячий режим, система повинна вимкнутись (після збереження стану на диску). Іноді ви можете побачити, що світлодіод живлення все ще світиться. Якщо це трапиться, може бути корисно встановити режим HibernateMode для вимкнення в режимі сну.conf.d (5):

З наведеною вище конфігурацією, якщо все інше налаштовано правильно, при виклику системного режиму сплячого режиму машина вимкне стан збереження на диск, як це робить.