Перезимуйте та відновіть із файлу swap


23

Я налаштував нову установку Ubuntu в Блокноті для використання файлу swap, замість того, щоб використовувати розділ swap.

За замовчуванням неможливо змусити Ubuntu перейти у сплячку за допомогою файлу swap, тому я спробував цей підручник , але він характерний для grub1 , і Ubuntu тепер використовує grub2 .

Хтось знає, як це зробити?

Відповіді:


21

Перезимує з файлом Swap за допомогою uswusp

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

Створіть файл swap

Команди для створення форматованого файлу swap 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

Перевірте розділ файлів Swap

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до ' Продовжити без дійсного місця заміни? ' (Майстер ще не встановив файл swap.)
  • Виберіть розділ , на якому знаходиться файл swap, перехресне посилання з деталями findmntзверху. ( Примітка: не сам файл swap )

Примітка. Будь-які зміни, внесені вручну /etc/uswsusp.conf, потребують відтворення initramfsпісля цього за допомогою цієї команди:

sudo update-initramfs -u

Тест uswusp взимку

sudo s2disk

На snapshotекрані повинні бути повідомлення про сплячий режим та відновити його.

Використовуйте s2disk із системним сплячим режимом

За замовчуванням 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файл із деталями переосмислення.

Тест системного сплячого:

systemctl hibernate 

Примітка. Щоб перевірити, чи створено systemd override.conf, завантажено та немає помилок, запустіть:

systemctl status systemd-hibernate.service

Список літератури:


Ця інструкція, здається, працює, але системна сплячка не працює для мене. Ви перевірили це власноруч? Якщо це має 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
Мені не вдалося зробити цю роботу 😞. Я встановив swapfile, встановив і налаштував 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, щоб правильно використовувати swapfile:

    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 за допомогою 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 для відновлення з swapfile, відредагувавши /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

Це майже не змушує мене знову спробувати сплячку - у мене виникли проблеми з випадковими пошкодженнями моїх дисків, що, очевидно, було пов'язано з процесом сплячки. Ви стикалися з чимось подібним?
Чарльз Грін

Дякую, @Anthony! Я спробував так багато речей, щоб перенести сплячку на роботу. Ваше було остаточним рішенням. Мені здається дуже дивним, що це не правильно встановлено відразу. :(
Майк Вільямсон,

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

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ця змінна не використовує).

Про проблему, яка виникає: чи зашифрований розділ swapfile? Якщо так, сплячка не спрацює. Якщо ні, то результат filefrag -v /swapfileможе бути корисним.


Спасибі! Я спробую. Але я думаю, що він налаштовує всі записи Linux у grub за допомогою цього рядка.
tfmoraes

Не забувайте: після зміни /etc/default/grubвам потрібно бігти update-grub.
JanC

@tfmoraes: чому б ви не хотіли, щоб це було додано до всіх записів Linux?
січень

@JanC: Тому що у мене можуть бути встановлені інші дистрибутиви Linux.
tfmoraes

1
@ didi_X8 цей коментар був написаний 8 років тому. Можливо, з того часу все змінилося. Дякую, що поділились.
Андреа Корбелліні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.