Hibernar y reanudar desde un archivo de intercambio

23

He configurado una nueva instalación de Ubuntu en una computadora portátil para usar un archivo de intercambio, en lugar de usar una partición de intercambio.

Por defecto, no es posible hacer que Ubuntu hiberne usando un archivo de intercambio, así que probé este tutorial , pero es específico de grub1 , y Ubuntu ahora usa grub2 .

¿Alguien sabe cómo hacer esto?

tfmoraes
fuente

Respuestas:

21

Hibernar con archivo de intercambio usando uswusp

Aunque es posible hibernar para intercambiar archivos y supuestamente funciona con systemd hibernate configurando los parámetros del kernel. Sin embargo, no pude reanudarlo, así que en lugar de eso usé uswsusp (suspensión del software del espacio de usuario) . Estos son los pasos que utilicé en Ubuntu 17.04 / 17.10.

Crear el archivo de intercambio

Los comandos para crear un archivo de intercambio 4GiB formateado, montado y agregado 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

Verifique la partición del archivo de intercambio

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

Instalar suspensión de software de espacio de usuario (uswsusp)

sudo apt install uswsusp

Configurar uswsusp

Para crear /etc/uswsusp.confy recrear initramfs:

sudo dpkg-reconfigure -pmedium uswsusp
  • Yes¿ Continuar sin un espacio de intercambio válido? ' (El asistente aún no establece el archivo de intercambio).
  • Seleccione la partición en la que reside el archivo de intercambio, haga una referencia cruzada con los detalles de findmntarriba. ( Nota: no el archivo de intercambio en sí )

Nota: Cualquier cambio realizado manualmente /etc/uswsusp.confrequerirá volver a initramfscrearse luego con este comando:

sudo update-initramfs -u

Prueba uswusp hibernate

sudo s2disk

Debería haber snapshotmensajes en la pantalla sobre hibernar y reanudar.

Utilice s2disk con systemd hibernate

Por defecto, systemd usará sus propios comandos de hibernación, así que reemplácelos con los comandos uswusp anulando systemd-hibernate.service:

sudo systemctl edit systemd-hibernate.service

En el editor de texto que se abre, coloque el siguiente texto (se requiere ExecStart en blanco). Luego guarde y salga:

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

Esto creará un /etc/systemd/system/systemd-hibernate.service.d/override.confarchivo con detalles de anulación.

Prueba systemd hibernate:

systemctl hibernate 

Nota: Para verificar que el systemd override.confha sido creado, cargado y sin errores, ejecute:

systemctl status systemd-hibernate.service

Referencias

Cas
fuente
Parece que estas instrucciones funcionan, pero la hibernación systemd no me funciona. ¿Has probado esto por tu cuenta? Si esto ExceStart=run-parts -a post /lib/systemd/system-sleepfuera asíExceStartPost=run-parts -a post /lib/systemd/system-sleep
Joaquín Aramendía
Fue probado y funcionando, pero tal vez se necesita esa adición. He actualizado mi respuesta.
Cas
Esto no se ve del todo bien. La enableopción de systemctl enlaces simbólicos de /etc/systemd/system/a /lib/systemd/system/. Nunca debe copiar directamente en/etc/systemd/system/
Auspex
1
No pude hacer que esto funcione 😞. Configuré swapfile, instalé y configuré uswsusp, pero sudo s2disksolo registra Saving snapshot, que apaga la pantalla, se cuelga durante ~ 5 min y luego apaga la computadora. Sin embargo, después de encenderlo, arranca normalmente como si no hubiera habido hibernación.
m93a
1
Creo que esta línea sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swapdebería cambiarse asudo findmnt -no SOURCE,UUID -T /swapfile
user1915011
12

Esto es lo que hice para que funcione con Ubuntu 18.04.

  • Haga que /swapfiletenga al menos el tamaño de su 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
    
  • Tenga en cuenta el UUID de la partición que contiene su /swapfile:

    $ sudo findmnt -no SOURCE,UUID -T /swapfile
    /dev/nvme0n1p5 20562a02-cfa6-42e0-bb9f-5e936ea763d0
    
  • Reconfigure el paquete uswsusppara usar correctamente el archivo de intercambio:

    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"
    
  • Edite el servicio de hibernación SystemD usando sudo systemctl edit systemd-hibernate.servicey complételo con el siguiente contenido:

    [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
    
  • Tenga en cuenta la compensación de reanudación de su /swapfile:

    $ sudo swap-offset /swapfile
    resume offset = 34818
    
  • Configure Grub para reanudar desde el archivo de intercambio editando /etc/default/gruby modifique la siguiente línea:

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

    sudo update-grub
    
  • Crea lo siguiente /etc/initramfs-tools/conf.d/resume:

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

    sudo update-initramfs -u -k all
    

Ahora puedes hibernar con sudo systemctl hibernate.

También se pueden crear esos scripts:

    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

Para que pueda dormir gotosleepo hibernar con gotohibernation.

Debe poder ejecutar sudo s2both, sudo s2ramy sudo systemctl hibernatesin tener que ingresar su contraseña para que los scripts anteriores funcionen.

Podría hacerlo, por ejemplo, creando un powerdevgrupo, agregue su usuario actual y configure la siguiente configuración de sudoers (edítela con sudo visudo -f /etc/sudoers.d/powerdev):

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

Documentación utilizada:

Anthony O.
fuente
¡Gracias por esto! He probado muchos métodos, pero solo el tuyo funciona para mí en Ubuntu 18.04 :)
jirislav
Esto casi me da ganas de volver a intentar la hibernación: tuve un problema con la corrupción ocasional en mis discos, que aparentemente estaba relacionado con el proceso de hibernación. ¿Has encontrado algo así?
Charles Green
¡Gracias, @Anthony! Intenté muchas cosas para que hibernara al trabajo. La suya fue la solución final que lo hizo. Me parece muy extraño que esto no esté configurado correctamente de inmediato. :(
Mike Williamson
Gracias por esta guia. Después de seguir los pasos y luego tratar de hibernar usando $ sudo systemctl hibernate, mi computadora portátil se despierta un par de segundos después de intentar hibernar. / var / log / syslog muestra muchos errores, pero estos parecen ser los más relevantes: - Error al establecer el modo de ahorro de energía para la salida eDP-1: Permiso denegado ... - El objeto .Gjs_AppIndicatorIconActor__1 (0x561c60a4d150) ya se ha finalizado. Imposible establecerle alguna propiedad. ... - s2disk: no se pudo usar el dispositivo de reanudación (pruebe swapon -a). Motivo: No existe tal dispositivo - systemd-hibernate.service: proceso principal salido, código = salido, ...
Jelani Nelson
1
Esta es la única solución que funcionó para mí. Accedí solo para votar esta respuesta. Gracias.
dpetrini
8

Leí rápidamente el tutorial y, si lo he entendido correctamente, solo necesita especificar las resumeopciones en la línea de comandos de Linux. Con Grub2 es realmente simple, y sus cambios siempre se conservarán. Necesita editar el /etc/default/grubarchivo, específicamente esta línea:

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

Después de eso, corre sudo update-grubpara que los cambios surtan efecto.

El cambio GRUB_CMDLINE_LINUXno afectará a otras instalaciones de Linux que tenga (porque /etc/grub.d/30_os-proberno usa esta variable).

Sobre el problema que tiene: ¿está encriptada la partición del archivo de intercambio? Si es así, la hibernación no funcionará. Si no, entonces la salida de filefrag -v /swapfilepuede ser útil.

Andrea Corbellini
fuente
¡Gracias! Intentaré. Pero creo que configuró todas las entradas de Linux en grub con esta línea.
tfmoraes
No lo olvides: después de cambiar /etc/default/grubdebes correr update-grub.
JanC
@tfmoraes: ¿por qué no quieres que esto se agregue a todas las entradas de Linux?
JanC
@ JanC: Porque puedo tener otras distribuciones de Linux instaladas.
tfmoraes
1
@ didi_X8 ese comentario fue escrito hace 8 años. Es posible que las cosas hayan cambiado desde entonces. Gracias por compartir.
Andrea Corbellini