дальнейшее развите кода тут
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