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

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

когда это может понадобиться? Приведу пару сценариев:
— вы в секте отрицателей свапа и у вас его просто нет;
— у вас есть свап но он в рам или в чанках;
— у вас есть свап но его мало для гибернации;
далее, вы пооткрывали кучу редакторов, закладок в браузере и что то там делаете важное, и тут такая мама: сына, срочно сгоняй за хлебом…
или
вы трудились весь день на багамах без подключения к сети 220в. всё, акк сел и надо срочно сохранить все труды, что бы при появлении розетки всё открыть в том же месте и продолжить писать роман.
в общем вариантов тьма. далее я приведу скрипт, который позволяет сделать задуманное простым его запуском и БЕЗ ПЕРЕЗАГРУЗКИ вы получите гибернацию на диск с полным отключением питания (скрипт запросит повышение привилегий — root доступ)

#!/bin/su root
#
# История версий
# -------------------------------------------------------------------------------------------------------
# Версия 2.1 почищены комментарии, удалены отладочные заметки 
# Версия 2.2 Переписывает конфигурацию для гибернации даже если она уже существует
# Версия 2.3 Скрипт завершиться при ошибке в любой команде
# Версия 2.4 Произведена структуризация скрипта комментариями
# Версия 2.5 Исключена ненужная переконфигурация initramfs при удалении настроек гибернации
# Версия 2.6 Скрипт проверяет запускался ли он ранее и остались ли настройки
# -------------------------------------------------------------------------------------------------------
# Конец истории версий
#
# введение и пояснения для юзера
# -------------------------------------------------------------------------------------------------------
set -e
echo "Если  на  комьпютере  файловая  система  ext4, то этот скрипт позволяет без"
echo "перезагрузки ввести систему в гибернацию на диск даже если она не настроена."
echo "Предварительно     необходимо   установить   пакет   uswsusp-git   из   AUR."
echo "Не  выходя  из  скрипта,  установи  этот  пакет  в новом окне терминала так:"
echo "------------>  pamac build uswsusp-git или yay -S uswsusp-git  <------------"
echo "После  этого  скрипт  произведет  настройку  системы и предложит гибернацию."
echo "Существующие   настройки  swap не повредятся, только добавится  необходимое."
echo "Если  гибернация  более  не  нужна, скрипт  удалит  настройки  и  swap-файл."
echo "Если настройки гибернации удалены вручную, удалите файл /etc/mkif."
# -------------------------------------------------------------------------------------------------------
# Разъяснения юзерам сделаны
#
# Удаление некоторых ненужных настроек гибернации в случае, если она больше не нужна
# -------------------------------------------------------------------------------------------------------
echo -e "\n"; read -n 1 -p "Удалить настройки гибернации, сделанные этим скриптом? [y/N]: " delhib;
if [[ "$delhib" = [yYlLдД] ]]; then echo -e "\n"; 
  if [ -e /etc/mkif ]; 
    then
      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
      mki=0
      if grep -q 'uresume' /etc/mkinitcpio.conf; 
        then sed -i 's!\(^HOOKS.*udev\) \(uresume\) \(.*filesystems.*\)!\1 \3!' /etc/mkinitcpio.conf; mki=1 ;
        else echo -e "\n"; echo "/etc/mkinitcpio.conf уже не содержит хук uresume"; echo -e "\n";
      fi
      if [ -e /etc/suspend.conf ]; then
        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; mki=1 ; fi
        if grep -q 'resume offset' /etc/suspend.conf; then sed -i '/resume offset/d' /etc/suspend.conf; mki=1 ; fi
      fi
      if [[ $mki = 1 ]]; then mkinitcpio -P ; fi
      rm -f /etc/mkif ;
    else echo -e "\n"; echo "Настройки скриптом не производились! Ваши настройки удалите руками"; echo -e "\n";
  fi
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 /etc/mkif ]; 
        then echo -e "\n"; echo "Настройки скриптом уже производились!"; echo -e "\n";
        # создание файла подкачки 
        # -------------------------------------------------------------------------------------------------------
        else if [ -e /swapfile ]; then swapoff /swapfile ; rm -f /swapfile ; fi
          echo -e "\n" ; echo -e "Создание и настройка файла подкачки /swapfile"; echo -e "\n"
          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
          # -------------------------------------------------------------------------------------------------------
          echo -e "\n" ; echo -e "Настройка initramfs"; echo -e "\n"
          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
          if [ -e /etc/suspend.conf ]; 
            then 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
            else df /swapfile | grep dev | awk '{ print "resume device = " $1 }' | tee /etc/suspend.conf
              swap-offset /swapfile | tee -a /etc/suspend.conf
          fi
          mkinitcpio -P ; 
          echo "Файл /etc/mkif создан скриптом hiber2sd и указывает на признак существования настроек скрипта" | tee /etc/mkif;
          echo "suspend on" | tee -a /etc/mkif;
      fi
      # -------------------------------------------------------------------------------------------------------
      # Настройка initramfs выполнена
      #
      # Настройка параметров гибернации пакета uswsusp-git
      # -------------------------------------------------------------------------------------------------------
      echo -e "\n" ; echo -e "Настройка параметров гибернации пакета uswsusp-git"; echo -e "\n" 
      if [ -f /etc/systemd/system/systemd-hibernate.service.d/override.conf ]; 
        then rm -f /etc/systemd/system/systemd-hibernate.service.d/override.conf ; 
      fi
      mkdir -p /etc/systemd/system/systemd-hibernate.service.d 
      # if [ ! -d "$DIR" ]; then mkdir $DIR ; fi
      echo "[Service]" | tee /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
      mkdir -p /etc/systemd/sleep.conf.d
      echo "[Sleep]" | tee /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; 
        # -------------------------------------------------------------------------------------------------------
        # гибернация на диск произведена
        else echo -e "\n" ; echo -e "Теперь можно использовать штатную гибернацию или повторно запустить этот скрипт"; echo -e "\n" 
      fi
      #
      # Пост комментарии для юзера
      # -------------------------------------------------------------------------------------------------------
      # Пакет uswsusp-git из AUR не установлен, обработка для гибернации не сделана
      else echo -e "\n" ; echo "Для работы скрипта надо установить пакет uswsusp-git из AUR!"; echo -e "\n" ;
    fi
  else echo -e "\n" ; echo "Ну на нет и суда нет! Если ошибся, то запусти скрипт снова!" ; echo -e "\n" ;
  # -------------------------------------------------------------------------------------------------------
  # Окончание работы скрипта, восстановление стандартных параметров оболочки
  #
fi
set +e 

немного комментария. для гибернации не обязательно использовать скрипт. после первого запуска в системе будут работать обычные команды системы для сна и гибернации. они появятся в меню выключения. т.е. если не отменить настройки гибернации в скрипте, то в дальнейшем скрипт для непосредственной гибернации использовать не надо. прелесть скрипта только в том, что все системные настройки можно сделать без перезапуска системы, как и отменить эти настройки тоже без перезапуска. эта фича появляется по причине того, что параметры гибернации не надо прописывать в параметры ядра загрузчика.

зы. скрипт полностью самописный, потому в интернете вы не найдете ни чего подобного. весь скрипт написан под впечатлением статьи из вики арча wiki.archlinux.org/title/Power_management/Suspend_and_hibernate, а именно раздела 3.3.1 Гибернация в файл подкачки. ( на русском языке )
 
скрипт можно поставить на ярлык/кнопку с вызовом, например, такой командой

bash -c "/home/kostya/my_scripts/hiber2sd.sh && exec $SHELL"

 

 

Комментарии: 0