Учебники (How-To & F.A.Q)
   2739

Настройка гибернации на диск с полным отключением питания и немедленная гибернация без перезагрузки

дальнейшее развите кода тут github.com/berligostr/hiber2sd

когда это может понадобиться? Приведу пару сценариев:
— вы в секте отрицателей свапа и у вас его просто нет;
— у вас есть свап но он в рам или в чанках;
— у вас есть свап но его мало для гибернации;
далее, вы пооткрывали кучу редакторов, закладок в браузере и что то там делаете важное, и тут такая мама: сына, срочно сгоняй за хлебом…
или
вы трудились весь день на багамах без подключения к сети 220в. всё, акк сел и надо срочно сохранить все труды, что бы при появлении розетки всё открыть в том же месте и продолжить писать роман.
в общем вариантов тьма. далее я приведу скрипт, который позволяет сделать задуманное простым его запуском и БЕЗ ПЕРЕЗАГРУЗКИ вы получите гибернацию на диск с полным отключением питания (само собой скрипт надо запускать через sudo или от root:
#!/bin/bash
#
# История версий
# -------------------------------------------------------------------------------------------------------
# Версия 2.1 почищены комментарии, удалены отладочные заметки 
# Версия 2.2 Переписывает конфигурацию для гибернации даже если она уже существует
# Версия 2.3 Скрипт завершиться при ошибке в любой команде
# Версия 2.4 Произведена структуризация скрипта комментариями
# -------------------------------------------------------------------------------------------------------
# Конец истории версий
#
# введение и пояснения для юзера
# -------------------------------------------------------------------------------------------------------
set -e
echo "Если  на  комьпютере  файловая  система  ext4, то этот скрипт позволяет без"
echo "перезагрузки ввести систему в гибернацию на диск даже если она не настроена."
echo "Предварительно     необходимо   установить   пакет   uswsusp-git   из   AUR."
echo "Не  выходя  из  скрипта,  установи  этот  пакет  в новом окне терминала так:"
echo "------------------------>  pamac build uswsusp-git  <-----------------------"
echo "После  этого  скрипт  произведет  настройку  системы и предложит гибернацию."
echo "Существующие   настройки  swap не повредятся, только добавится  необходимое."
echo "Если  гибернация  более  не  нужна, скрипт  удалит  настройки  и  swap-файл."
# -------------------------------------------------------------------------------------------------------
# Разъяснения юзерам сделаны
#
# Удаление некоторых ненужных настроек гибернации в случае, если она больше не нужна
# -------------------------------------------------------------------------------------------------------
echo -e "\n"; read -n 1 -p "Удалить настройки гибернации? [y/N]: " delhib;
if [[ "$delhib" = [yYlLдД] ]]; then echo -e "\n"; 
  if [ -e /swapfile ]; then swapoff /swapfile ; rm -f /swapfile ; fi
  cp -v /etc/fstab /etc/fstab.backup
  if grep -q "swapfile none swap defaults' /etc/fstab; 
    then sed -i '/swapfile none swap defaults/d' /etc/fstab; 
  fi
  cp -v /etc/mkinitcpio.conf /etc/mkinitcpio.conf.backup
  if grep -q 'uresume' /etc/mkinitcpio.conf; 
    then sed -i 's!\(^HOOKS.*udev\) \(uresume\) \(.*filesystems.*\)!\1 \3!' /etc/mkinitcpio.conf; 
    else echo "/etc/mkinitcpio.conf уже не содержит хук uresume"; 
  fi
  cp -v /etc/suspend.conf /etc/suspend.conf.backup
  if grep -q 'resume device' /etc/suspend.conf; then sed -i '/resume device/d' /etc/suspend.conf; fi
  if grep -q 'resume offset' /etc/suspend.conf; then sed -i '/resume offset/d' /etc/suspend.conf; fi
  mkinitcpio -P
fi
# -------------------------------------------------------------------------------------------------------
# Конец процедуры удаления настроек гибернации
#
# Настройка гибернации в файл
# -------------------------------------------------------------------------------------------------------
echo -e "\n"; read -n 1 -p "Попытаться гибернизировать? [y/N]: " hib;
if [[ "$hib" = [yYlLдД] ]]; 
  then echo -e "\n"; 
# Скрипт работает только на ext4
  tipfs="$(df -Th | grep "$(df | grep '/$' | awk '{ print $1 }')" | awk '{ print $2 }')"
  if [[ ! $tipfs = ext4 ]]; 
    then echo "Ты странный какой-то, у тебя файловая система не ext4"; set +e ; sleep 10; exit; 
  fi
# для нормальной работы скрипта необходим пакет uswsusp-git
  package="uswsusp-git"; check="$(pacman -Qs --color always "${package}" | grep "local" | grep "${package}")";
  if [ -n "${check}" ] ; 
    then
# создание файла подкачки 
# -------------------------------------------------------------------------------------------------------
    if [ -e /swapfile ]; then swapoff /swapfile ; rm -f /swapfile ; fi
    ozu="$(cat /proc/meminfo | grep MemTotal | awk '{ print $2 "K" }')"
    fallocate -l $ozu /swapfile ; chmod 600 /swapfile ; mkswap /swapfile ; 
# Определяем поддержку TRIM
    ssd="$(lsblk -D | grep $(lsblk -r | grep '/$' | awk '{ print $1 }') | awk '{ print $4 }')"; 
    if [[ "$ssd" = 0B ]]; then swapon /swapfile; else swapon --discard /swapfile; fi
    cp -v /etc/fstab /etc/fstab.backup
    if grep -q 'swapfile none swap' /etc/fstab; then sed -i '/swapfile none swap/d' /etc/fstab; fi
    if [[ "$ssd" = 0B ]]; 
      then echo "/swapfile none swap defaults 0 0" | tee -a /etc/fstab; 
      else echo "/swapfile none swap defaults,discard 0 0" | tee -a /etc/fstab; 
    fi
# -------------------------------------------------------------------------------------------------------
# файл подкачки создан
#
# Настройка initramfs
# -------------------------------------------------------------------------------------------------------
    cp -v /etc/mkinitcpio.conf /etc/mkinitcpio.conf.backup
    if grep -q 'uresume' /etc/mkinitcpio.conf; 
      then echo "/etc/mkinitcpio.conf уже содержит хук uresume"; 
      else sed -i 's!\(^HOOKS.*udev\) \(.*filesystems.*\)!\1 uresume \2!' /etc/mkinitcpio.conf; 
    fi
    cp -v /etc/suspend.conf /etc/suspend.conf.backup
    if grep -q 'resume device' /etc/suspend.conf; then sed -i '/resume device/d' /etc/suspend.conf; fi
    if grep -q 'resume offset' /etc/suspend.conf; then sed -i '/resume offset/d' /etc/suspend.conf; fi
    df /swapfile | grep dev | awk '{ print "resume device = " $1 }' | tee -a /etc/suspend.conf
    swap-offset /swapfile | tee -a /etc/suspend.conf
    mkinitcpio -P
# -------------------------------------------------------------------------------------------------------
# Настройка initramfs выполнена
#
# Настройка параметров гибернации пакета uswsusp-git
# -------------------------------------------------------------------------------------------------------
    if [ -f /etc/systemd/system/systemd-hibernate.service.d/override.conf ]; 
      then rm -f /etc/systemd/system/systemd-hibernate.service.d/override.conf ; 
    fi
    echo "[Service]" | tee -a /etc/systemd/system/systemd-hibernate.service.d/override.conf
    echo "ExecStart=" | tee -a /etc/systemd/system/systemd-hibernate.service.d/override.conf
    echo "ExecStartPre=-/usr/bin/run-parts -v -a pre /usr/lib/systemd/systemd-sleep" | tee -a /etc/systemd/system/systemd-hibernate.service.d/override.conf
    echo "ExecStart=/usr/bin/s2disk" | tee -a /etc/systemd/system/systemd-hibernate.service.d/override.conf
    echo "ExecStartPost=-/usr/bin/run-parts -v --reverse -a post /usr/lib/systemd/systemd-sleep" | tee -a /etc/systemd/system/systemd-hibernate.service.d/override.conf
    echo " " | tee -a /etc/systemd/system/systemd-hibernate.service.d/override.conf
# Настройка параметра гибернации системы на диск с полным отключением питания
    if [ -f /etc/systemd/sleep.conf.d/hibernatemode.conf ]; 
      then rm -f /etc/systemd/sleep.conf.d/hibernatemode.conf ; 
    fi
    echo "[Sleep]" | tee -a /etc/systemd/sleep.conf.d/hibernatemode.conf
    echo "HibernateMode=shutdown" | tee -a /etc/systemd/sleep.conf.d/hibernatemode.conf
    echo " " | tee -a /etc/systemd/sleep.conf.d/hibernatemode.conf
# -------------------------------------------------------------------------------------------------------
# Настройка конфигов для гибернации на диск выполнена
#
# гибернация на диск
# -------------------------------------------------------------------------------------------------------
    echo -e "\n"; read -n 1 -p "Гибернизируемся? [y/N]: " hiber;
    if [[ "$hiber" = [yYlLдД] ]]; then echo -e "\n"; systemctl hibernate; fi
# -------------------------------------------------------------------------------------------------------
# гибернация на диск произведена
#
# Пост комментарии для юзера
# -------------------------------------------------------------------------------------------------------
# Пакет uswsusp-git из AUR не установлен, обработка для гибернации не сделана
  else then echo -e "\n"; echo "Для нормальной работы скрипта необходим пакет uswsusp-git из AUR! Установи его немедленно!"; then echo -e "\n";
  fi
  else then echo -e "\n"; echo "Ну на нет и суда нет! Если ошибся, то запусти скрипт снова!" ; then echo -e "\n"; 
# -------------------------------------------------------------------------------------------------------
# Окончание работы скрипта, восстановление стандартных параметров оболочки
#
fi
set +e 

2 комментария

avatar
немного комментария. для гибернации не обязательно использовать скрипт. после первого запуска в системе будут работать обычные команды системы для сна и гибернации. они появятся в меню выключения. т.е. если не отменить настройки гибернации в скрипте, то в дальнейшем скрипт для непосредственной гибернации использовать не надо. прелесть скрипта только в том, что все системные настройки можно сделать без перезапуска системы, как и отменить эти настройки тоже без перезапуска. эта фича появляется по причине того, что параметры гибернации не надо прописывать в параметры ядра загрузчика.
зы. скрипт полностью самописный, потому в интернете вы не найдете ни чего подобного. весь скрипт написан под впечатлением статьи из вики арча wiki.archlinux.org/title/Power_management/Suspend_and_hibernate, а именно раздела 3.3.1 Гибернация в файл подкачки. ( на русском языке )
Последний раз редактировалось
?
Всегда есть быстрое простое неправильное решение.
быстрые простые правильные (иногда) ответы здесь t.me/ManjaroRu
0
avatar
скрипт можно поставить на ярлык/кнопку с вызовом такой командой
bash -c "sudo /home/kostya/my_scripts/hiber2sd.sh && exec $SHELL"
Последний раз редактировалось
?
Всегда есть быстрое простое неправильное решение.
быстрые простые правильные (иногда) ответы здесь t.me/ManjaroRu
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.