GNU/Linux >> Linux Esercitazione >  >> Linux

Ibernazione senza swap abilitata

  1. Disabilitare lo scambio quando sai già che il tuo sistema può arrivare al punto in cui non avrà abbastanza memoria è una cattiva idea . Proprio nel momento in cui il kernel non ha memoria per allocare il tuo sistema sarà probabilmente molto-molto non risponde o semplicemente si blocca, quindi dovrai riavviarlo. I blocchi possono causare perdite di dati, a volte danneggiamento del file system. Dipende dal filesystem, può essere corretto automaticamente (ext* family, fat family, btrfs e altri), ma non tutti i FS supportano questa funzionalità. Scommetto che probabilmente non ti piacerà eseguire fsck in modalità utente singolo ogni volta che hai un danneggiamento...

  2. Il kernel non è così stupido da scrivere tutto ciò che vuole sul tuo SSD, si comporta in modo diverso rispetto agli HDD e cerca di fare meno scritture possibili usando cose come TRIM. Non c'è molto danno alla tua guida come potresti pensare.

  3. L'ibernazione è un integrato sottosistema del kernel che opera a basso livello. Deve ancora avere una partizione separata con dimensioni ≥ dimensioni della RAM che gli consentano di creare solo un'istantanea completa della tua memoria. Qui puoi leggere come Linux gestisce l'ibernazione. Se non c'è un posto dove archiviare in modo permanente l'immagine della memoria, non è possibile che l'ibernazione funzioni. Non puoi archiviare dati in aria. Nessuna memoria fisica permanente =nessuna ibernazione. Quindi questa è anche la risposta alla tua domanda:non puoi usare l'ibernazione senza swap su Linux .

Quindi, il mio punto è che ovviamente puoi vivere senza swap e abilitarlo solo per l'ibernazione, ma solo se sei sicuro che il 99,9% del tempo in cui il sistema è acceso ha memoria sufficiente per tutto. Se questo non è il tuo caso devi usare swap.

Passiamo ora alla possibile soluzione:

Quando esegui systemctl hibernate systemd avvia un servizio chiamato systemd-hibernate.service . File Unit di cui di solito si trova in /usr/lib/systemd/system/ cartella

Su Debian ha questo aspetto:

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target
After=sleep.target

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate

Come puoi vedere ci sono Richiede e Dopo opzioni. Possiamo scrivere un'altra unità che abiliterà lo scambio e aggiungere il suo nome a questi campi. Lo chiameremo swap-on.service e posizionalo in /etc/systemd/system/ cartella

Il nostro file sarà simile a questo:

# Unit filed is not required in our case so you can skip it
[Unit]
Description=Enable swap partition

[Service]
# This line means that service will be executed just once and immediately stop when
# swapon enables swap on /dev/sda3
Type=oneshot

# Change /dev/sda3 with device named after your swap partition 
# like /dev/sdb3 or /dev/nvme0n1p3
# Use lsblk to determine your swap partition (partition with [SWAP] as mountpoint)
# Of course you can think of a more complex solution like running external script
# that determines your swap partition automatically every time service is executed
# but for now I'll go with simple /dev/sda3
ExecStart=/sbin/swapon /dev/sda3

Ora dovremmo modificare il systemd-hibernate.service del nostro sistema :

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target swap-on.service <--
After=sleep.target swap-on.service <--

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate

Stiamo duplicando swap-on.service in Dopo per assicurarsi che systemd avvii l'ibernazione dopo lo scambio è attivo e non viceversa e in Necessario per assicurarsi che systemd non tenti di ibernarsi se swap-on.service fallito.

Ora quando eseguiamo systemctl hibernate systemd esegue il nostro systemd-hibernate.service modificato che esegue swap-on.service che consente lo scambio. Quando lo scambio è abilitato e entrambi i campi Required e After sono soddisfatti, systemd può finalmente ibernare il nostro sistema.

Per fare in modo che systemd disabiliti lo scambio dopo la ripresa dall'ibernazione, non avremo bisogno di creare un altro file di servizio chiamato swap-off.service che farà la stessa cosa del nostro servizio.swap-on , posizionalo nella stessa directory del servizio "on" (/etc/systemd/system/). L'unica differenza è che questo servizio eseguirà lo swapoff invece di scambia :

[Unit]
Description=Disable swap partition

[Service]
Type=oneshot

#  again, change /dev/sda3 to your swap partition /dev file
ExecStart=/sbin/swapoff /dev/sda3 <--

Il prossimo passo è modificare il file di servizio chiamato [email protected] situato nello stesso /usr/lib/systemd/system cartella:

[Unit]
Description=Resume from hibernation using device %f
Documentation=man:[email protected](8)
DefaultDependencies=no
BindsTo=%i.device
Wants=local-fs-pre.target
After=%i.device
Before=local-fs-pre.target
ConditionPathExists=/etc/initrd-release

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-hibernate-resume %f

Dobbiamo modificare Prima campo ora. Aggiungi swap-off.service accanto a local-fs-pre.target :

...
After=%i.device
Before=local-fs-pre.target swap-off.service <--
ConditionPathExists=/etc/initrd-release
...

Ora, quando riprendi dall'ibernazione, systemd eseguirà swap-off.service dopo che l'immagine di scambio è stata caricata in memoria (in effetti un po' più tardi, ma per noi non ha importanza)

Tieni presente che questa è una soluzione completamente teorica, non l'ho ancora provata, ma in base a ciò che so su systemd dovrebbe funzionare. Dal momento che UPower chiede a systemd di ibernare che, come ho spiegato, esegue systemd-hibernate.service, questo è probabilmente quello che stai cercando


Linux
  1. Lo scambio è un anacronismo?

  2. Servizio del sistema operativo Linux 'nfs'

  3. Servizio del sistema operativo Linux 'microcode_ctl'

  4. Servizio del sistema operativo Linux "NetFS"

  5. Servizio del sistema operativo Linux 'ldap'

Come elencare i servizi di avvio all'avvio in Linux

Sistema operativo Linux Servizio "rete"

Servizio del sistema operativo Linux "portmap"

Servizio del sistema operativo Linux "auditd"

Servizio del sistema operativo Linux "hplip"

Sistema operativo Linux Servizio "smartd"