În prezent, există trei metode de suspendare disponibile: suspendați la RAM (de obicei numit doar suspenda), suspend pe disc (de obicei cunoscut sub numele de hibernează), și suspendare hibridă (uneori numit în mod adecvat suspendă la amândouă):

gestionarea

  • Suspendați la RAM metoda reduce puterea la majoritatea părților mașinii, în afară de memoria RAM, care este necesară pentru a restabili starea mașinii. Datorită economiilor mari de energie, este recomandabil ca laptopurile să intre automat în acest mod atunci când computerul funcționează pe baterii și capacul este închis (sau utilizatorul este inactiv de ceva timp).
  • Suspendați pe disc metoda salvează starea mașinii în spațiul de schimb și oprește complet mașina. Când aparatul este pornit, starea este restabilită. Până atunci, consumul de energie este zero.
  • Suspendați la amândoi metoda salvează starea mașinii în spațiul de schimb, dar nu oprește mașina. În schimb, invocă suspendarea obișnuită la RAM. Prin urmare, dacă bateria nu este epuizată, sistemul se poate relua din RAM. Dacă bateria este descărcată, sistemul poate fi reluat de pe disc, care este mult mai lent decât reluarea din RAM, dar starea aparatului nu a fost pierdută.

Există mai multe interfețe de nivel scăzut (backend-uri) care oferă funcționalități de bază, iar unele interfețe de nivel înalt oferă modificări pentru a gestiona driverele hardware/modulele kernel problematice (de exemplu, reinițializarea plăcii video).

Cuprins

  • 1 Interfețe de nivel scăzut
    • 1.1 nucleu (swsusp)
    • 1.2 uswsusp
  • 2 interfețe de nivel înalt
    • 2.1 sistemd
  • 3 Hibernare
    • 3.1 Despre partiția swap/dimensiunea fișierului
    • 3.2 Parametrii necesari ai nucleului
      • 3.2.1 Hibernare în fișier swap
      • 3.2.2 Hibernare în fișier swap pe Btrfs
      • 3.2.3 Hibernare într-un volum LVM subțire
    • 3.3 Configurați initramfs
  • 4 Depanare
    • 4.1 ACPI_OS_NAME
    • 4.2 Suspendarea/hibernarea nu funcționează sau nu funcționează consecvent
    • 4.3 Wake-on-LAN
    • 4.4 Treziri instantanee de la suspendare
    • 4.5 Sistemul nu se oprește la hibernare

Interfețe de nivel scăzut

Deși aceste interfețe pot fi utilizate direct, este recomandabil să utilizați unele dintre interfețele de nivel înalt pentru a suspenda/hibernare. Utilizarea directă a interfețelor de nivel scăzut este semnificativ mai rapidă decât utilizarea oricărei interfețe de nivel înalt, deoarece executarea tuturor cârligelor pre și post-suspendare necesită timp, dar cârligele pot seta corect ceasul hardware, pot restaura conexiunile wireless etc.

miez (swsusp)

Cea mai simplă abordare este de a informa direct codul de suspendare a software-ului din kernel (swsusp) pentru a intra într-o stare suspendată; metoda și starea exactă depind de nivelul de suport hardware. Pe nucleele moderne, scrierea șirurilor adecvate în/sys/power/state este mecanismul principal pentru a declanșa această suspendare.

uswsusp

Uswsusp („Userpace Software Suspend”) este o învelitoare în jurul mecanismului suspend-to-RAM al nucleului, care efectuează unele manipulări ale adaptorului grafic din spațiul utilizatorilor înainte de suspendare și după reluare.

Vezi articolul principal Uswsusp.

Interfețe de nivel înalt

Scopul final al acestor pachete este de a oferi binare/scripturi care pot fi invocate pentru a efectua suspendarea/hibernarea. De fapt, conectarea acestora la butoanele de pornire sau la clicurile din meniu sau la evenimentele de pe capacul laptopului este de obicei lăsată în sarcina altor instrumente. Pentru a suspenda/hibera automat în anumite evenimente de alimentare, cum ar fi închiderea capacului laptopului sau procentul de descărcare a bateriei, vă recomandăm să rulați Acpid.

systemd

systemd oferă comenzi native pentru suspendare, hibernare și suspendare hibridă, consultați Gestionarea energiei # Gestionarea energiei cu systemd pentru detalii. Aceasta este interfața implicită utilizată în Arch Linux.

Consultați Gestionarea energiei # Sleep hooks pentru informații suplimentare despre configurarea suspendării/hibernării cârligelor. A se vedea, de asemenea, systemctl (1), systemd-sleep (8) și systemd.special (7) .

Hibernare

Pentru a utiliza hibernarea, trebuie să creați o partiție sau un fișier swap. Va trebui să îndreptați nucleul către swap folosind parametrul resume = kernel, care este configurat prin boot loader. De asemenea, va trebui să configurați initramfs. Acest lucru îi spune nucleului să încerce să reia din swap-ul specificat în spațiul utilizatorilor timpurii. Acești trei pași sunt descriși în detaliu mai jos.

Despre partiția swap/dimensiunea fișierului

Chiar dacă partiția de swap este mai mică decât memoria RAM, aveți totuși mari șanse de hibernare cu succes. Conform documentației kernelului:

/ sys/power/image_size controlează dimensiunea imaginii create de mecanismul suspend-to-disk. Se poate scrie un șir reprezentând un număr întreg non-negativ care va fi folosit ca limită superioară a dimensiunii imaginii, în octeți. Mecanismul de suspendare pe disc va face tot posibilul pentru a se asigura că dimensiunea imaginii nu va depăși acel număr. Cu toate acestea, dacă acest lucru se dovedește a fi imposibil, va încerca să suspende oricum folosind cea mai mică imagine posibilă. În special, dacă „0” este scris în acest fișier, imaginea suspendată va fi cât mai mică posibil. Citirea din acest fișier va afișa limita curentă a dimensiunii imaginii, care este setată la 2/5 din RAM disponibilă în mod implicit.

Puteți fie să micșorați valoarea/sys/power/image_size pentru a face imaginea suspendată cât mai mică posibil (pentru partițiile de swap mici), sau să o măriți pentru a accelera posibil procesul de hibernare. Pentru sistemele cu o cantitate mare de memorie RAM, valori mai mici pot crește drastic viteza de reluare a unui sistem de hibernare. A se vedea systemd # systemd-tmpfiles - fișiere temporare pentru a face această modificare persistentă.

Imaginea de suspendare nu poate cuprinde mai multe partiții de swap și/sau fișiere de swap. Trebuie să se încadreze pe deplin într-o partiție swap sau într-un fișier swap. [1]

Parametrii necesari ai nucleului

Parametrul nucleului se reia =swap_device trebuie sa fie folosit. Oricare dintre metodele de denumire a dispozitivelor bloc persistente poate fi utilizată ca swap_device . De exemplu:

  • CV = UUID = 4209c845-f495-4c43-8a03-5363dd433153
  • resume = "PARTLABEL = Swap partiție"
  • resume =/dev/archVolumeGroup/archLogicalVolume - dacă swap-ul este pe un volum logic LVM

Parametrii kernelului vor intra în vigoare numai după repornire. Pentru a putea face hibernare imediat, obțineți numerele majore și minore ale volumului de la lsblk și faceți ecou în format major:minor la/sys/power/resume. Dacă utilizați un fișier swap, în plus, faceți ecou la decalajul de reluare la/sys/power/resume_offset. [2]

De exemplu, dacă dispozitivul swap este 8: 3:

Sau când faceți hibernare către un fișier swap, dacă fișierul swap este pe volumul 8: 2 și are offset 38912:

Hibernare în fișier swap

Utilizarea unui fișier swap necesită setarea CV-ului =swap_device și în plus un resume_offset =swap_file_offset parametrii kernelului. Consultați documentația nucleului.

swap_device este volumul în care se află fișierul swap și urmează același format ca și pentru parametrul rădăcină. Valoarea a swap_file_offset poate fi obținut executând filefrag -v swap_file, ieșirea este într-un format de tabel și valoarea necesară este situată în primul rând al coloanei physical_offset. De exemplu:

În exemplu, valoarea lui swap_file_offset este primul 38912 cu cele două perioade.

Hibernare în fișier swap pe Btrfs

Hibernarea către un fișier swap este acceptată de versiunile recente ale systemd [3].

Numărul resume_offset poate fi calculat folosind instrumentul btrfs_map_physical.c. Nu încercați să utilizați instrumentul filefrag, pe Btrfs offset-ul „fizic” pe care îl obțineți de la filefrag nu este offset-ul fizic real pe disc; există un spațiu de adresă de disc virtual pentru a suporta mai multe dispozitive. [4]

Descărcați sau copiați instrumentul btrfs_map_physical.c într-un fișier numit btrfs_map_physical.c, apoi compilați-l,

și rulați-l. Un exemplu de ieșire este prezentat mai jos.

Rețineți primul offset fizic returnat de acest instrument. În acest exemplu, folosim 4009762816. Rețineți, de asemenea, dimensiunea paginii care poate fi găsită cu getconf PAGESIZE .

Pentru a calcula valoarea resume_offset, împărțiți offset-ul fizic la dimensiunea paginii. În acest exemplu, este 4009762816/4096 = 978946 .

Hibernare într-un volum LVM subțire aprovizionat

Este posibilă hibernarea într-un volum LVM subțire, dar trebuie să vă asigurați că volumul este complet alocat. În caz contrar, reluarea din acesta va eșua.

Puteți aloca complet volumul LVM prin simpla umplere a acestuia cu zerouri. De exemplu .:

Pentru a verifica dacă volumul este alocat complet, puteți utiliza:

Un volum complet alocat va apărea ca având 100% utilizare a datelor.

Configurați initramfs

  • Când este utilizat un initramfs cu cârligul de bază, care este implicit, cârligul de reluare este necesar în /etc/mkinitcpio.conf. Fie prin etichetă, fie prin UUID, partiția de swap este menționată cu un nod de dispozitiv udev, deci cârligul de reluare trebuie să meargă după cârligul udev. Acest exemplu a fost făcut pornind de la configurația implicită a cârligului:
Nu uitați să regenerați initramfs pentru ca aceste modificări să aibă efect.
  • Când se utilizează un initramfs cu cârligul systemd, este deja furnizat un mecanism de reluare și nu trebuie adăugate alte cârlige.

Depanare

ACPI_OS_NAME

S-ar putea să doriți să vă modificați Tabel DSDT să-l facă să funcționeze. A se vedea articolul DSDT

Suspendarea/hibernarea nu funcționează sau nu funcționează consecvent

Au existat multe rapoarte despre ecranul care se înnegrește, fără erori ușor de vizualizat sau posibilitatea de a face orice atunci când intrați și reveniți de la suspendare și/sau hibernare. Aceste probleme au fost văzute atât pe laptopuri, cât și pe desktop-uri. Aceasta nu este o soluție oficială, dar trecerea la un nucleu mai vechi, în special nucleul LTS, va remedia probabil problema.

De asemenea, poate apărea o problemă atunci când se utilizează cronometrul hardware watchdog (dezactivat implicit, consultați RuntimeWatchdogSec = în systemd-system.conf (5) § OPȚIUNI). Cronometrul de supraveghere erorat poate reseta computerul înainte ca sistemul să finalizeze crearea imaginii de hibernare.

Uneori, ecranul devine negru datorită inițializării dispozitivului din initramfs. Eliminarea oricăror module pe care le-ați putea avea în Mkinitcpio # MODULES și reconstruirea initramfs poate rezolva această problemă, în special driverele grafice pentru KMS timpurii. Inițializarea unor astfel de dispozitive înainte de reluare poate provoca neconcordanțe care împiedică reluarea sistemului de hibernare. Acest lucru nu afectează reluarea din RAM. De asemenea, verificați cele mai bune practici ale articolului blogului pentru a depana problemele de suspendare.

Trecerea de la driverul video radeon la noul driver AMDGPU ar putea ajuta, de asemenea, la succesul procesului de hibernare și de trezire.

Pentru driverele grafice Intel, activarea KMS timpurie poate ajuta la rezolvarea problemei ecranului gol. Consultați setarea modului Kernel # Start KMS timpuriu pentru detalii.

După actualizarea la kernel 4.15.3, reluarea poate eșua cu un cursor static (care nu clipește) pe un ecran negru. Lista neagră a modulului nvidiafb ar putea ajuta. [5]

Laptopurile cu procesor Intel care încarcă modulul intel_lpss_pci pentru touchpad, se pot confrunta cu panica kernelului la reluare (blocare a capacelor intermitente) [6]. Modulul trebuie adăugat la initramfs ca:

Wake-on-LAN

Dacă Wake-on-LAN este activ, placa de interfață de rețea va consuma energie chiar dacă computerul este hibernat.

Treziri instantanee de la suspendare

Pentru unele sisteme Intel Haswell cu chipset LynxPoint și LynxPoint-LP, sunt raportate trezirile instantanee după suspendare. Acestea sunt legate de implementări eronate BIOS ACPI și de modul în care modulul xhci_hcd îl interpretează în timpul bootului. Pe măsură ce un proces de rezolvare a raportat, sistemele afectate sunt adăugate la un denylist (numit XHCI_SPURIOUS_WAKEUP) de către kernel de la caz la caz. [7]

Reluarea instantanee se poate întâmpla, de exemplu, dacă un dispozitiv USB este conectat în timpul suspendării și declanșatoarele de trezire ACPI sunt activate. O soluție viabilă pentru un astfel de sistem, dacă nu este încă în listă, este dezactivarea declanșatorilor de trezire. Un exemplu pentru dezactivarea trezirii prin USB este descris după cum urmează. [8]

Pentru a vizualiza configurația curentă:

Dispozitivele relevante sunt EHC1, EHC2 și XHC (pentru USB 3.0). Pentru a comuta starea lor, trebuie să redați numele dispozitivului în fișier ca root.

Aceasta ar trebui să ducă la suspendarea funcționării din nou. Cu toate acestea, aceste setări sunt doar temporare și ar trebui setate la fiecare repornire. Pentru a automatiza acest lucru, aruncați o privire la systemd # systemd-tmpfiles - fișiere temporare sau consultați firul BBS pentru o posibilă soluție și mai multe informații.

Exemplu de soluție cu dezactivarea PTXH și XHC0 în același timp. Din anumite motive, două linii cu PTXH și XHC0 una pe fiecare linie sau în fișiere diferite nu funcționează.

Dacă utilizați un driver nou, motivul trezirii instantanee poate fi o eroare în acel driver, care uneori împiedică suspendarea plăcii grafice. O posibilă soluție este descărcarea noului modul de nucleu chiar înainte de culcare și încărcarea acestuia după trezire. Pentru aceasta, creați următorul script:

Prima linie de ecou leagă nouveaufb de driverul consolei framebuffer (fbcon). De obicei, este vtcon1 ca în acest exemplu, dar poate fi și un alt vtcon *. Vedeți/sys/class/vtconsole/vtcon */nume care dintre ele este un „dispozitiv tampon cadru” [9].

Sistemul nu se oprește când hibernează

Când hibernați sistemul, sistemul ar trebui să se oprească (după salvarea stării pe disc). Uneori, ați putea vedea că LED-ul de alimentare este încă strălucitor. Dacă se întâmplă acest lucru, ar putea fi instructiv să setați HibernateMode să se oprească în sleep.conf.d (5):

Cu configurația de mai sus, dacă orice altceva este configurat corect, la invocarea unui hibernat systemctl, mașina va opri starea de salvare pe disc în timp ce o face.