J'ai configuré une nouvelle installation Ubuntu dans un bloc-notes pour utiliser un fichier d'échange au lieu d'utiliser une partition d'échange.
Par défaut, il n’est pas possible de mettre en veille prolongée Ubuntu à l’aide d’un fichier d’échange. J’ai donc essayé ce tutoriel , mais il est spécifique à grub1 , et Ubuntu utilise maintenant grub2 .
Est-ce que quelqu'un sait comment faire cela?
Bien qu'il soit possible d'hiberner pour échanger un fichier et que cela fonctionne soi-disant avec systemd hibernate en définissant les paramètres du noyau. Cependant, je ne pouvais pas le faire reprendre, alors je suis passé à l’utilisation de uswsusp (suspension du logiciel dans l’espace utilisateur) . Voici les étapes que j'ai suivies sur Ubuntu 17.04/17.10.
Les commandes permettant de créer un fichier d'échange 4GiB formaté, monté et ajouté à /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
Sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swap
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233
Sudo apt install uswsusp
Pour créer /etc/uswsusp.conf
et recréer initramfs
name__:
Sudo dpkg-reconfigure -pmedium uswsusp
Yes
to ' Continuer sans espace d'échange valide? ' (l'Assistant n'a pas encore défini le fichier d'échange.) findmnt
ci-dessus. ( Remarque: pas le fichier d'échange lui-même ) Remarque: Toute modification apportée manuellement à /etc/uswsusp.conf
nécessitera la recréation de initramfs
à l'aide de la commande suivante:
Sudo update-initramfs -u
Sudo s2disk
Il devrait y avoir des messages snapshot
à l'écran en veille prolongée et reprendre.
Par défaut, systemd utilisera ses propres commandes de veille prolongée, aussi, remplacez-les par les commandes uswusp en remplaçant le systemd-hibernate.service
:
Sudo systemctl edit systemd-hibernate.service
Dans l'éditeur de texte qui s'ouvre, placez le texte suivant (le champ ExecStart vierge est requis). Puis sauvegardez et quittez:
[Service]
ExecStart=
ExecStart=/usr/sbin/s2disk
ExecStartPost=/bin/run-parts -a post /lib/systemd/system-sleep
Cela créera un fichier /etc/systemd/system/systemd-hibernate.service.d/override.conf
avec les détails de la substitution.
systemctl hibernate
Remarque: pour vérifier que le code système override.conf
a été créé, chargé et qu'il n'y a pas d'erreur, exécutez:
systemctl status systemd-hibernate.service
Références:
Voici ce que j'ai fait pour que cela fonctionne avec Ubuntu 18.04.
Faites en sorte que votre /swapfile
ait au moins la taille de votre 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
Notez l'UUID de la partition contenant votre /swapfile
:
$ Sudo findmnt -no SOURCE,UUID -T /swapfile
/dev/nvme0n1p5 20562a02-cfa6-42e0-bb9f-5e936ea763d0
Reconfigurez le package uswsusp
afin d’utiliser correctement le fichier swap:
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"
Editez le service SystemD hibernate en utilisant Sudo systemctl edit systemd-hibernate.service
et remplissez-le avec le contenu suivant:
[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
Notez le décalage de CV de votre /swapfile
:
$ Sudo swap-offset /swapfile
resume offset = 34818
Configurez Grub pour reprendre à partir du fichier d'échange en modifiant /etc/default/grub
et en modifiant la ligne suivante:
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
Mettre à jour Grub:
Sudo update-grub
Créez le /etc/initramfs-tools/conf.d/resume
suivant:
RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
# Resume from /swapfile
Mettre à jour initramfs:
Sudo update-initramfs -u -k all
Vous pouvez maintenant passer en hibernation avec Sudo systemctl hibernate
.
On peut aussi créer ces 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
Vous pouvez donc dormir avec gotosleep
ou passer en veille prolongée avec gotohibernation
.
Vous devez être en mesure d'exécuter Sudo s2both
, Sudo s2ram
et Sudo systemctl hibernate
sans avoir à entrer votre mot de passe pour que les scripts précédents fonctionnent.
Vous pouvez le faire par exemple en créant un groupe powerdev
, en y ajoutant votre utilisateur actuel et en configurant la configuration suivante pour sudoers (modifiez-la avec Sudo visudo -f /etc/sudoers.d/powerdev
):
%powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate
Documentation utilisée:
J'ai donné une lecture rapide du didacticiel et, si j'ai bien compris, il vous suffit de spécifier les options resume
sur la ligne de commande Linux. Avec Grub2, c’est très simple et vos modifications seront toujours conservées. Vous devez éditer le fichier /etc/default/grub
, en particulier cette ligne:
GRUB_CMDLINE_LINUX="resume=... resume_offset=..."
Ensuite, exécutez Sudo update-grub
pour que les modifications prennent effet.
Changer GRUB_CMDLINE_LINUX
n'affectera pas vos autres installations Linux (car /etc/grub.d/30_os-prober
n'utilise pas cette variable).
À propos du problème rencontré: la partition du fichier d'échange est-elle cryptée? Si c'est le cas, l'hibernation ne fonctionnera pas. Sinon, la sortie de filefrag -v /swapfile
peut être utile.