Hibernate и резюме из файла подкачки


23

Я настроил новую установку Ubuntu в ноутбуке для использования файла подкачки вместо раздела подкачки.

По умолчанию невозможно перевести Ubuntu в спящий режим с помощью файла подкачки, поэтому я попробовал это руководство , но оно относится только к grub1 , и теперь Ubuntu использует grub2 .

Кто-нибудь знает, как это сделать?

Ответы:


21

Спящий режим с файлом подкачки с использованием uswusp

Хотя есть возможность перейти в спящий режим, чтобы заменить файл, и он предположительно работает с системным спящим режимом, устанавливая параметры ядра. Тем не менее, я не мог заставить его возобновить работу, поэтому вместо этого переключился на использование uswsusp (приостановка программного обеспечения в пользовательском пространстве) . Вот шаги, которые я использовал в Ubuntu 17.04 / 17.10.

Создать файл подкачки

Команды для создания отформатированного файла подкачки 4GiB, смонтированного и добавленного в /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 /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233

Установить приостановку программного обеспечения для пользователей (uswsusp)

sudo apt install uswsusp

Настроить uswsusp

Для создания /etc/uswsusp.confи воссоздания initramfs:

sudo dpkg-reconfigure -pmedium uswsusp
  • Yes« Продолжить без действительного пространства подкачки? ' (Мастер еще не установил файл подкачки.)
  • Выберите раздел , на котором находится файл подкачки, перекрестные ссылки с подробной информацией findmntсверху. ( Примечание: не сам файл подкачки )

Примечание. Любые изменения, сделанные вручную /etc/uswsusp.conf, потребуют повторного initramfsсоздания этой команды:

sudo update-initramfs -u

Тест uswusp спящий

sudo s2disk

Должны быть snapshotсообщения на экране в спящем режиме и резюме.

Используйте s2disk с системным hibernate

По умолчанию systemd будет использовать свои собственные команды гибернации, поэтому замените их командами uswusp, переопределив systemd-hibernate.service:

sudo systemctl edit systemd-hibernate.service

В открывшемся текстовом редакторе введите следующий текст (необходим пустой ExecStart). Затем сохраните и выйдите:

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

Это создаст /etc/systemd/system/systemd-hibernate.service.d/override.confфайл с деталями переопределения.

Тестирование systemd hibernate:

systemctl hibernate 

Примечание. Чтобы проверить, что systemd override.confбыл создан, загружен и нет ошибок, выполните:

systemctl status systemd-hibernate.service

Ссылки:


Эта инструкция, кажется, работает, но спящий режим systemd у меня не работает. Вы проверяли это самостоятельно? Должно ли это ExceStart=run-parts -a post /lib/systemd/system-sleepбытьExceStartPost=run-parts -a post /lib/systemd/system-sleep
Хоакин Арамендия

Это было проверено и работает, но, возможно, это дополнение необходимо. Я обновил свой ответ.
Cas

Это выглядит не совсем правильно. enableВариант systemctl симлинок от /etc/systemd/system/до /lib/systemd/system/. Вы никогда не должны копировать прямо в/etc/systemd/system/
Auspex

1
Мне не удалось сделать эту работу 😞. Я установил файл подкачки, установил и настроил uswsusp, но sudo s2diskтолько логи Saving snapshot, чем отключение дисплея, зависает на ~ 5 мин и затем он выключает компьютер. Однако после включения он загружается нормально, как будто не было спящего режима.
m93a

1
Я думаю, что эта строка sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swapдолжна быть изменена наsudo findmnt -no SOURCE,UUID -T /swapfile
user1915011

12

Вот что я сделал, чтобы он работал с Ubuntu 18.04.

  • Сделайте так, чтобы у вас /swapfileбыл хотя бы размер вашей оперативной памяти

    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
    
  • Обратите внимание на UUID раздела, содержащего ваш /swapfile:

    $ sudo findmnt -no SOURCE,UUID -T /swapfile
    /dev/nvme0n1p5 20562a02-cfa6-42e0-bb9f-5e936ea763d0
    
  • Переконфигурируйте пакет uswsusp, чтобы правильно использовать файл подкачки:

    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"
    
  • Отредактируйте сервис SystemD hibernate с помощью sudo systemctl edit systemd-hibernate.serviceи заполните его следующим содержанием:

    [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
    
  • Обратите внимание на смещение резюме вашего /swapfile:

    $ sudo swap-offset /swapfile
    resume offset = 34818
    
  • Настройте Grub для возобновления работы из файла подкачки, отредактировав /etc/default/grubи изменив следующую строку:

    GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
    
  • Обновление Grub:

    sudo update-grub
    
  • Создайте следующее /etc/initramfs-tools/conf.d/resume:

    RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
    # Resume from /swapfile
    
  • Обновить initramfs:

    sudo update-initramfs -u -k all
    

Теперь вы можете переходить в спящий режим sudo systemctl hibernate.

Можно также создать эти сценарии:

    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

Таким образом, вы можете спать с gotosleepили в спящем режиме gotohibernation.

Вы должны быть в состоянии выполнить sudo s2both, sudo s2ramи sudo systemctl hibernateбез необходимости вводить пароль для работы предыдущих сценариев.

Вы можете сделать это, например, создав powerdevгруппу, добавив в нее своего текущего пользователя и сконфигурировав следующую конфигурацию sudoers (отредактируйте ее с помощью sudo visudo -f /etc/sudoers.d/powerdev):

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

Используемая документация:


Спасибо тебе за это! Я перепробовал много способов, но у меня на Ubuntu 18.04 работает только ваш :)
jirislav

Это почти заставляет меня испытывать желание снова попробовать гибернацию - у меня была проблема со случайным повреждением на моих дисках, которое, очевидно, было связано с процессом гибернации. Сталкивались ли вы с чем-нибудь подобным?
Чарльз Грин

Спасибо, @ Энтони! Я пробовал так много вещей, чтобы получить работу в спящем режиме. Ваше было окончательное решение, которое сделал. Мне кажется очень странным, что это не правильно настроено сразу. :(
Майк Уильямсон

Спасибо за это руководство. После выполнения шагов и попытки перехода в режим гибернации с помощью $ sudo systemctl hibernate мой ноутбук просыпается через пару секунд после попытки перехода в режим гибернации. / var / log / syslog показывает много ошибок, но они кажутся наиболее значимыми: - Не удалось установить режим энергосбережения для выхода eDP-1: Разрешение отказано ... - Объект .Gjs_AppIndicatorIconActor__1 (0x561c60a4d150), уже было завершено. Невозможно установить какое-либо свойство для него. ... - s2disk: не удалось использовать устройство возобновления (попробуйте swapon -a). Причина: нет такого устройства - systemd-hibernate.service: основной процесс завершен, код = завершен, ...
Джелани Нельсон

1
Это единственное решение, которое сработало для меня. Войдите, чтобы проголосовать за этот ответ. Спасибо.
dpetrini

8

Я быстро прочитал учебник, и, если я правильно понял, вам просто нужно указать resumeпараметры командной строки Linux. С Grub2 это действительно просто, и ваши изменения всегда будут сохранены. Вам нужно отредактировать /etc/default/grubфайл, а именно эту строку:

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

После этого запустите sudo update-grubизменения, чтобы изменения вступили в силу.

Изменение GRUB_CMDLINE_LINUXне повлияет на другие ваши установки Linux (потому /etc/grub.d/30_os-proberчто не использует эту переменную).

О вашей проблеме: зашифрован ли раздел файла подкачки? Если это так, гибернация не будет работать. Если нет, то вывод filefrag -v /swapfileможет быть полезным.


Благодарность! Я попробую. Но я думаю, что он настраивает все записи Linux в Grub с этой строкой.
tfmoraes

Не забывайте: после смены /etc/default/grubнужно бежать update-grub.
JanC 13.10.10

@tfmoraes: почему вы не хотите, чтобы это было добавлено ко всем записям Linux?
JanC 13.10.10

@JanC: Потому что у меня могут быть установлены другие дистрибутивы Linux.
tfmoraes

1
@ didi_X8 этот комментарий был написан 8 лет назад. Вполне возможно, что с тех пор все изменилось. Спасибо, что поделился.
Андреа Корбеллини
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.