Sospendi e riprendi da un file di scambio


23

Ho configurato una nuova installazione di Ubuntu in un Notebook per utilizzare un file di scambio, anziché utilizzare una partizione di scambio.

Di default non è possibile far ibernare Ubuntu usando un file di scambio, quindi ho provato questo tutorial , ma è specifico di grub1 e Ubuntu ora usa grub2 .

Qualcuno sa come si fa questo?

Risposte:


21

Iberna con il file di scambio usando uswusp

Sebbene sia possibile ibernare per scambiare file e presumibilmente funziona con ibernazione systemd impostando i parametri del kernel. Tuttavia, non sono riuscito a riprenderlo, quindi sono passato all'utilizzo di uswsusp (sospensione del software userspace) . Ecco i passaggi che ho usato su Ubuntu 17.04 / 17.10.

Crea il file di scambio

I comandi per creare un file di scambio formattato 4GiB, montato e aggiunto a /etc/fstab:

sudo fallocate -l 4g /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

Verifica la partizione del file di scambio

sudo findmnt -no SOURCE,UUID -T /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233

Installa sospensione software Userspace (uswsusp)

sudo apt install uswsusp

Configura uswsusp

Per creare /etc/uswsusp.confe ricreare initramfs:

sudo dpkg-reconfigure -pmedium uswsusp
  • Yesa ' Continuare senza uno spazio di scambio valido? ' (La procedura guidata non ha ancora impostato il file di scambio.)
  • Selezionare la partizione in cui risiede il file di scambio, fare un riferimento incrociato con i dettagli findmntdall'alto. ( Nota: non il file di scambio stesso )

Nota: qualsiasi modifica effettuata manualmente /etc/uswsusp.confrichiederà di essere ricreata in initramfsseguito con questo comando:

sudo update-initramfs -u

Prova ibernazione uswusp

sudo s2disk

Dovrebbero essere presenti snapshotmessaggi sullo schermo in modalità sospensione e ripresa.

Utilizzare s2disk con ibernazione systemd

Di default systemd utilizzerà i propri comandi di ibernazione, quindi sostituiscili con i comandi uswusp sovrascrivendo systemd-hibernate.service:

sudo systemctl edit systemd-hibernate.service

Nell'editor di testo che si apre, inserisci il testo seguente (è necessario ExecStart vuoto). Quindi salva ed esci:

[Service]
ExecStart=
ExecStart=/usr/sbin/s2disk 
ExecStartPost=/bin/run-parts -a post /lib/systemd/system-sleep

Questo creerà il /etc/systemd/system/systemd-hibernate.service.d/override.conffile con i dettagli di override.

Test di ibernazione del sistema:

systemctl hibernate 

Nota: per verificare che il systemd override.confsia stato creato, caricato e privo di errori, eseguire:

systemctl status systemd-hibernate.service

Riferimenti:


Queste istruzioni sembrano funzionare ma il letargo systemd non funziona per me. Hai provato questo tuo? Dovrebbe ExceStart=run-parts -a post /lib/systemd/system-sleepessereExceStartPost=run-parts -a post /lib/systemd/system-sleep
Joaquín Aramendía,

È stato testato e funzionante ma forse è necessaria quell'aggiunta. Ho aggiornato la mia risposta.
Cas

Questo non sembra del tutto giusto. L' enableopzione di systemctl symlink da /etc/systemd/system/a /lib/systemd/system/. Non dovresti mai copiare direttamente in/etc/systemd/system/
Auspex,

1
Non sono riuscito a far funzionare questo 😞. Ho impostato swapfile, installato e configurato uswsusp, ma sudo s2disksolo i log Saving snapshot, quindi spegne il display, si blocca per ~ 5 minuti e quindi spegne il computer. Tuttavia, dopo averlo acceso, si avvia normalmente come se non ci fosse stato il letargo.
m93a,

1
Penso che questa riga sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swapdovrebbe essere cambiata insudo findmnt -no SOURCE,UUID -T /swapfile
user1915011

12

Ecco cosa ho fatto per farlo funzionare con Ubuntu 18.04.

  • Fai in modo che tu /swapfileabbia almeno le dimensioni della tua RAM

    sudo swapoff /swapfile
    sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | grep MemTotal | grep -oh '[0-9]*') count=1024 conv=notrun
    sudo mkswap /swapfile
    sudo swapon /swapfile
    
  • Nota l'UUID della partizione contenente /swapfile:

    $ sudo findmnt -no SOURCE,UUID -T /swapfile
    /dev/nvme0n1p5 20562a02-cfa6-42e0-bb9f-5e936ea763d0
    
  • Riconfigurare il pacchetto uswsuspper utilizzare correttamente il file di scambio:

    sudo dpkg-reconfigure -pmedium uswsusp
    # Answer "Yes" to continue without swap space
    # Select "/dev/disk/by-uuid/20562a02-cfa6-42e0-bb9f-5e936ea763d0" replace the UUID with the result from the previous findmnt command
    # Encrypt: "No"
    
  • Modificare il servizio di ibernazione SystemD utilizzando sudo systemctl edit systemd-hibernate.servicee riempirlo con il seguente contenuto:

    [Service]
    ExecStart=
    ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
    ExecStart=/usr/sbin/s2disk
    ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep
    
  • Nota l'offset di ripresa del tuo /swapfile:

    $ sudo swap-offset /swapfile
    resume offset = 34818
    
  • Configura Grub per riprendere dal file di scambio modificando /etc/default/grube modificando la seguente riga:

    GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
    
  • Aggiorna Grub:

    sudo update-grub
    
  • Creare quanto segue /etc/initramfs-tools/conf.d/resume:

    RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
    # Resume from /swapfile
    
  • Aggiorna initramfs:

    sudo update-initramfs -u -k all
    

Ora puoi andare in letargo con sudo systemctl hibernate.

Si possono anche creare quegli script:

    sudo tee /usr/local/bin/gotosleep <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo /usr/sbin/s2both
    EOF
    sudo chmod +x /usr/local/bin/gotosleep
    sudo tee /usr/local/bin/gotohibernation <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo systemctl hibernate
    EOF
    sudo chmod +x /usr/local/bin/gotohibernation

Quindi puoi dormire con gotosleepo andare in letargo con gotohibernation.

È necessario essere in grado di eseguire sudo s2both, sudo s2rame sudo systemctl hibernatesenza dover inserire la password per gli script precedenti al lavoro.

Puoi farlo, ad esempio, creando un powerdevgruppo, aggiungendo il tuo attuale utente e configurando la seguente configurazione di sudoers (modificalo con sudo visudo -f /etc/sudoers.d/powerdev):

     %powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate

Documentazione utilizzata:


Grazie per questo! Ho provato molti metodi, ma solo il tuo funziona per me su Ubuntu 18.04 :)
jirislav il

Questo mi fa quasi venire voglia di provare di nuovo l'ibernazione - ho avuto un problema con la corruzione occasionale sui miei dischi, che apparentemente era correlata al processo di ibernazione. Hai incontrato qualcosa del genere?
Charles Green,

Grazie, @Anthony! Ho provato tante cose per far funzionare il letargo. La tua è stata la soluzione finale che ha fatto. Mi sembra molto strano che questo non sia impostato correttamente subito. :(
Mike Williamson,

Grazie per questa guida Dopo aver seguito i passaggi e poi aver tentato di ibernare usando $ sudo systemctl ibernazione, il mio laptop si sveglia un paio di secondi dopo aver tentato di ibernare. / var / log / syslog spettacoli molti errori, ma questi sembrano i più rilevanti: - Impossibile potenza impostata la modalità di risparmio per l'uscita eDP-1: Permesso negato ... - Oggetto .Gjs_AppIndicatorIconActor__1 (0x561c60a4d150), è stato già finalizzato. Impossibile impostare qualsiasi proprietà su di esso. ... - s2disk: impossibile utilizzare il dispositivo di ripresa (provare swapon -a). Motivo: nessun dispositivo del genere - systemd-hibernate.service: processo principale chiuso, codice = uscito, ...
Jelani Nelson,

1
Questa è l'unica soluzione che ha funzionato per me. Accesso eseguito solo per votare questa risposta. Grazie.
dpetrini,

8

Ho dato una rapida lettura al tutorial e, se ho capito bene, devi solo specificare le resumeopzioni alla riga di comando di Linux. Con Grub2 è davvero semplice e le tue modifiche saranno sempre preservate. Devi modificare il /etc/default/grubfile, in particolare questa riga:

GRUB_CMDLINE_LINUX="resume=... resume_offset=..."

Successivamente, esegui sudo update-grubper rendere effettive le modifiche.

La modifica GRUB_CMDLINE_LINUXnon influirà sulle altre installazioni Linux che hai (perché /etc/grub.d/30_os-probernon utilizza questa variabile).

Informazioni sul problema riscontrato: la partizione del file di scambio è crittografata? In tal caso, l'ibernazione non funzionerà. In caso contrario, l'output di filefrag -v /swapfilepotrebbe essere utile.


Grazie! Cercherò. Ma penso che configura tutte le voci di Linux in grub con questa linea.
tfmoraes,

Non dimenticare: dopo aver cambiato /etc/default/grubdevi eseguire update-grub.
JanC

@tfmoraes: perché non dovresti volerlo aggiungere a tutte le voci di Linux?
JanC

@JanC: Perché potrei avere altre distribuzioni Linux installate.
tfmoraes,

1
@ didi_X8 quel commento è stato scritto 8 anni fa. È possibile che le cose siano cambiate da allora. Grazie per la condivisione.
Andrea Corbellini,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.