Swapfile hibernacja

Witam wszystkich.
Borykam się z plikiem z tematem hibernacji.
Utworzyłem plik wymiany i chcę by działała hibernacja. Jakoś nie mogę się do szukać tutka.
Widziałem na youtube ale coś jest zakręcone.
sudo fallocate -l 8G /swapfile
sudo mkswap /swapfile
sudo chmod 600 /swapfile
sudo swapon /swapfile

sudo bash -c “echo /swapfile none swap defaults 0 0 >> /etc/fstab”

pozdrawiam

1 polubienie

Tymi poleceniami na razie tylko utworzyłeś i aktywowałeś swapfile. Pomijam tu fakt, że zamiast fallocate rekomendują dd – ale to jest alternatywa, która też powinna zadziałać. Teraz powinieneś dodać odpowiednie parametry do kernela (czyli do /etc/default/grub w linii GRUB_CMDLINE_LINUX_DEFAULT) według schematu:

resume=<swap_file_partition> resume_offset=<swap_file_offset>

gdzie:

  • <swap_file_partition> to partycja, na której znajduje się swapfile, dla pewności sprawdź poleceniem findmnt -no UUID -T /swapfile
  • parametr <swap_file_offset> za Arch Wiki otrzymasz z polecenia filefrag -v /swapfile | awk '{ if($1=="0:"){print substr($4, 1, length($4)-2)} }' (są inne sposoby, ale ten daje bezpośredni wynik i nie wymaga tłumaczenia :stuck_out_tongue:)

Na koniec jeszcze mała uwaga, jeśli korzystasz z brfts to sytuacja wygląda trochę inaczej zarówno jeśli chodzi o utworzenie swapfile jak i hibernację do niego – odsyłam do linków, a w razie problemów pytaj :wink:

Możesz też użyć usługi w systemd która sama będzie tworzyła i usuwała swapfile

Rekomendacja dotyczy niektórych systemów plików - ‘pozastandardowych’ - na których mogą być problemy (nie znam szczegółów). Używam fallocate na Ext4 i nie zarejestrowałem dotychczas jakichkolwiek nieprawidłowości.


Nie tyle tworzyła i usuwała, ile zarządzała swap’em dynamicznie, dodając/usuwając pliki (o stałym, zdefiniowanym rozmiarze), w zależności od potrzeb.
EDIT-20210506 … i (jeżeli zechcemy) zarządzała pulą wszystkich dostępnych swap’ów.

Witajcie postanawiam odgrzebać mój temat ponieważ nie ukończyłem tej hibernacji.

Zacząłem od nowa.

dd if=/dev/zero of=swapfile bs=1K count=8M status=progress
chmod 600 swapfile  
mkswap swapfile 

Tworzenie obszaru wymiany w wersji 1, rozmiar = 8 GiB (bajtów: 8589930496)
brak etykiety, UUID=b5060ac4-a3a5-4af6-96ef-0e6b1fdf89ab

swapon swapfile

swapon: /home/rafiki20/swapfile: niebezpieczny właściciel pliku 1000, sugerowany 0 (root).
swapon: /home/rafiki20/swapfile: swapon nie powiodło się: Operacja niedozwolona

Próbowałem przez sudo i też nici :frowning:

sudo bash -c "echo /swapfile none swap defaults 0 0 >> /etc/fstab"
filefrag -v swapfile | awk '{ if($1=="0:"){print substr($4, 1, length($4)-2)} }'
resume=swapfile resume_offset=133103616

Jakie są następne kroki :confused:

Z tego wynika, że wszystkie wcześniejsze polecenia wykonywałeś z poziomu zwykłego użytkownika – błąd, wszystkie polecenia wykonujesz z uprawnieniami root.

Również źle, skoro zdecydowałeś się utworzyć swap w swoim katalogu domowym. Czyli zamiast /swapfile powinno być /home/rafiki20/swapfile

Kolejny błąd, tu podajesz UUID partycji na której znajduje się plik swap, czyli w twoim przypadku będzie to wynik findmnt -no UUID -T /home/rafiki20/swapfile

Mam nadzieję, że nie wpisałeś tego do terminala – te parametry (resume oczywiście do poprawy) podajesz w /etc/default/grub w linii:

GRUB_CMDLINE_LINUX_DEFAULT=

Potem oczywiście aktualizacja gruba, sudo update-grub

Nic więcej nie jest potrzebne, co najwyżej może być konieczne odblokowanie w ustawieniach systemowych opcji hibernacji, żeby się pojawiły w menu. Możesz też przetestować hibernację poleceniem systemctl hibernate

Ja zrobiłem wszystko według tego i hibernacja działa mi bez zarzutów.

Ok w grub mam napisą linię kodu.

GRUB_DEFAULT=saved
GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE=hidden
GRUB_DISTRIBUTOR="Manjaro"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash apparmor=1 security=apparmor udev.log_priority=3"
GRUB_CMDLINE_LINUX=""

Mam wpisać

`resume=UUID=ec27ee41-d886-40b5-8374-98242d50b661 resume_offset=104730624

Tak + parametr resume_offset.

A co z tym ?? rozumiem ,że zostawić

"quiet splash apparmor=1 security=apparmor udev.log_priority=3"

A na końcu dodać to co wpisałem.

Zostawiasz, nowe wpisy dodajesz wewnątrz cudzysłowów. Bez znaczenia czy będą na początku, czy na końcu.


Jeszcze mały dodatek ode mnie, zajrzałem na wiki Archa i okazuje się, że zapomnieliśmy o jeszcze jednej rzeczy ważnej dla hibernacji, mianowicie o konfiguracji initframs. A więc w /etc/mkinitcpio.conf w HOOKS dodaj opcję resume i zrekonfiguruj initframs poleceniem sudo mkinitcpio -P

Dzięki za pomoc :wink:
Szkoda ,że po wywołaniu

systemctl hibernate
Failed to hibernate system via logind: Not enough swap space for hibernation
Eh, wymiękam może kiedyś się uda :frowning:

Do hibernacji potrzeba sporo swapu – minimum tyle ile masz RAM-u. Najwyraźniej dałeś mniej.

Komputer pokazuje 6,7GB
A ja mam 8GB ustawiony plik swapfile. Więc ;/

Jeżeli nie masz dobrego uzasadnienia do umieszczenia swap’a w swoim katalogu domowym, to nie rób tego. swapfile, to rzecz systemu (nawet jeżeli leży w home’ie), więc umieść go na podwórku systemowym (zazwyczaj spotykałem się z lokalizacją /swapfile, czyli plik bezpośrednio w /, ale możesz utworzyć go, na przykład, w stosownym katalogu w /var).
Przykład tworzenia i uruchamiania pliku swap:

  • lokalizacja: /swapfile
  • rozmiar: 16GB
  • użycie: swap, bez hibernacji
$ sudo fallocate -v -l 16G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo swapon -a
$ sudo micro /etc/fstab
$ swapon -s
  • Zamiast micro, jeżeli ktoś nie używa, może być nano. Edycja /etc/fstab ma służyć dokonania odpowiedniego wpisu, tak aby swap ‘uruchamiał się’ automatycznie ze startem systemu. Można, to zautomatyzować i wrzucić do jednej komendy.

  • Do zastanowienia użycie fallocate (z tego co wiem, to problemy z tą komendą mogą być pod Btrfs.)

  • Do tego, rzecz jasna, mkinitcpio i grub - wspominane wyżej przez @Tomek.

  • No i trzeba wziąć pod uwagę dodatkowe operacje (o których wyżej, we wcześniejszych wpisach), jeżeli chcemy hibernować system do swap’a w pliku.

  • Widziałem gdzieś zestawienie sugerowanych rozmiarów swap’a, w zależności od rozmiaru RAM’u i przeznaczenia (swap / swap+hibernacja) - jeżeli znajdę, to dopiszę. Z tego co pamiętam, to w przypadku 8GB RAM’u był mnożnik 2, czyli 16GB swap’a.


EDIT-20210506-1155 …

RAM: ⩽ 2 GB
swap space: 2 times the amount of RAM
swap+hibernation: 3 times the amount of RAM

RAM: > 2 GB – 8 GB
swap space: Equal to the amount of RAM
swap+hibernation: 2 times the amount of RAM

RAM: > 8 GB – 64 GB
swap space: At least 4 GB
swap+hibernation: 1.5 times the amount of RAM

RAM: > 64 GB
swap space: At least 4 GB
swap+hibernation: Hibernation not recommended

Jak dla mnie to powinien być skrypt dla początkujących jak instalują na nowo system bez formatowania partycji home. Powinno wybierać się rozmiar pliku pliku i miejsce utworzenia.

Mówisz, masz
mkswap.sh
Wymagana instalacja yad

#! /bin/sh

###################################################################################
#																 				  #
# Tworzenie, zmiana rozmiaru i usuwanie pliku wumiany swap w dowolnej lokalizacj, #
# 							z wykorzystaniem YAD 								  #
#																 				  #
###################################################################################

windowicon="file-manager-red";
image="file-manager";
okbutton="Ok"'!dialog-ok!Wykonaj:0';
nobutton="Anuluj"'!dialog-cancel!Zamknij:1';
title="Tworzenie pliku swap";
text="Proszę podać wymagane parametry (*) - pola wymagane.";

# SEKCJA ZBIERANIA DANYCH #
swap=$(yad  --title="$title" --text="$text" --window-icon="$windowicon"  --image="$image" --separator=" " --center --button="$okbutton" \
	--button="$nobutton" --width=500 --fixed --tabnum=1 --form --field=$"Wybierz lub utwórz plik:(*):SFL" '/swapfile' \
	--field=$"Rozmiar w GB:(*):NUM" '8' --field=$"Automatycznie dodać wpis do \"/etc/fstab\" ?:chk" 'no' \
	--field=$"Zmienić rozmiar pliku swap ?:chk" 'no' --field=$"Usunąć plik swap ?:chk" 'no')
   
		## declare -a pola=($swap) | Utworzenie tablicy z wartości zwróconych przez wybrane opcje
		declare -a pola=($swap);
		## declare -i rozmiar=${#pola[@]} | Obliczenie rozmiaru tablicy
		declare -i rozmiar=${#pola[@]}; 
		## "$rozmiar -lt 4" | Wygenerowanie błędu w przypadku nie wypełnienia wymaganych pól (*)
		if [ $rozmiar -lt 5 ]; then
			yad  --width=450 --title="Informacja" --image="dialog-information" --center --window-icon="dialog-information" \
			--text='<span color=\"red\" font=\"Verdana bold 11\">Nie podano wymaganych parametrów.</span>' \
			--button="Ok"!dialog-ok!Wykonaj:0
		fi
		
		# Pobranie danych z tablicy
		swapfile=${pola[0]};
		rozmiar=${pola[1]};
		fstab=${pola[2]};
		resize=${pola[3]};
		del=${pola[4]};
	
		# SEKCJA WYKONYWANIA POLECEŃ #
		
		# USUWANIE PLIKU SWAP #
		if [ "$del" == "TRUE" ]; then
			sudo swapoff $swapfile;
			sudo rm $swapfile;
			yad  --width=450 --title="Informacja" --image="dialog-information" --center --window-icon="dialog-information" \
			--text='<span color=\"red\" font="Verdana bold 11">Plik swap w lokalizacji '$swapfile' został usunięty.</span>' \
			--button="Ok"!dialog-ok!Wykonaj:0
		fi
		
		# ZMIANA ROZMIARU PLIKU SWAP #
		if [ "$resize" == "TRUE" ]; then
			sudo swapoff $swapfile;
			sudo rm $swapfile;
		fi
		## " -n "$swapfile" ..." | Sprawdzenie czy wszystkie pola zostały wypełnione
		if [[ -n "$swapfile" && -n "$rozmiar" || "$resize" == "TRUE" ]]; then
			## "sudo fallocate -v -l "$rozmiar"G $swapfile" | Tworzenie pliku (G - gigabytes)
			sudo fallocate -v -l "$rozmiar"G $swapfile;
			## "sudo chmod 600 $swapfile" | Nadanie uprawnienia odczytu i zapisu wyłącznie dla roota
			sudo chmod 600 $swapfile;
			## "sudo mkswap $swapfile" | Przygotowanie pliku
			sudo mkswap $swapfile;
			## "sudo swapon $swapfile" | Aktywowanie swap-u
			sudo swapon $swapfile;
			## "sudo swapon -a" | Aktywowanie wszystkich obszarów wymiany
			sudo swapon -a
			## "sudo swapon -s" | Weryfikacja czy swap działa poprawnie
			sudo swapon -s
			
			## ""$resize" == "TRUE""  | Wygenerowanie komunikatu o zmianie rozmiaru pliku
			if [ "$resize" == "TRUE" ]; then
				yad  --width=450 --title="Informacja" --image="dialog-information" --center --window-icon="dialog-information" \
				--text='<span color=\"green\" font="Verdana bold 11">Rozmiar pliku swap w lokalizacji '$swapfile' został zmieniony na '$rozmiar'GB.</span>' \
				--button="Ok"!dialog-ok!Wykonaj:0
				exit 0;
			fi
			
			if [ "$fstab" == "TRUE" ]; then
				## "echo \"$swapfile\" none swap defaults 0 0" | Dodanie wpisu do fstab (aktywowanie pliku wymiany na stałę)
				sudo bash -c "echo \"$swapfile\" none swap defaults 0 0 >> /etc/fstab"
			fi
			# Wyświetlenie szczegółowych informacji o nowo utworzonym pliku
			ls -lh $swapfile
			sudo swapon --show
		fi
		## " -n "$swapfile" ..." | Wygenerowanie komunikatu o zakończeniu programu
		if [[ -n "$swapfile" && -n "$rozmiar" ]]; then
			yad  --width=450 --fixed --title="Informacja" --image="dialog-information" --center --window-icon="dialog-information" \
			--text='<span color=\"green\" font="Verdana bold 11">Plik swap w lokalizacji '$swapfile' o rozmiarze '$rozmiar'GB został utworzony i aktywowany.</span>' \
			--button="Ok"!dialog-ok!Wykonaj:0
		fi