Темата е интересна за тези ползващи преносими компютри, които често им се налага да "заспиват". Всичко би се оправило със създаване на отделен дял за тази цел, но ние ще се постараем да използваме по-нови методи. Първо дисковете които се ползват са SSD, а те са с по-кратък живот на четене/запис. Поради тази причина се ползва zram като технология за SWAP. ZRam се използва за swap, когато искате да увеличите капацитета на оперативната памет (RAM) чрез компресия, без да използвате бавния хард диск или SSD. Това създава виртуален swap сектор директно в самата RAM памет. Когато системата започне да се пълни, тя не изпраща данните към диска, а ги компресира в ZRam устройството, което спестява място и работи изключително бързо. Всичко изглежда прекрасно до момента когато системата трябва да заспи. В този случай е необходима хибернация, а класическия ZRam не върши работа. За хибернацията се изисква физическо дисково пространство. За по-нагледно нека предположим, че имаме 16GB RAM и някакъв процесор (примерно Intel i7). Това са чисто хипотетични числа. Изхождайки от горните условия стъпките които ще изпълним са: ● Създаваме основен Swap дял или файл върху диска (с размер около 17-20 GB, за да събере 16GB RAM + кеша при хибернация). ● Създаваме zRAM с по-висок приоритет (за да може системата да ползва бързата компресирана памет в ежедневието и да записва на диска само при хибернация или краен недостиг на RAM).
Тъй като вече имате инсталирана система, най-лесно е да се създаде SWAP файл на диска (вместо да се преоразмерява дяла). Създаване на празен файл с размер 20 GB (препоръчително за 16GB RAM):
sudo dd if=/dev/zero of=/swapfile bs=1G count=20 status=progress
След това трябва да се дефинират правилни права за сигурност.
sudo chmod 600 /swapfile
Формиране като SWAP.
sudo mkswap /swapfile
Активиране на SWAP-a.
sudo swapon /swapfile
SWAP-a е готов. Да го опишем в /etcfstab.
echo '/swapfile none swap defaults,pri=1 0 0' | sudo tee -a /etc/fstab sudo reboot
Забележка: Задаваме нисък приоритет pri=1, за да може zRAM да се ползва с предимство
За да знае ядрото (kernel) откъде да прочете данните при събуждане от хибернация, ни трябват UUID на диска и offset (отместването) на swap файла.
Намерете UUID на основния ви дял (където е /swapfile):
findmnt -no UUID -T /swapfile 92273cb0-32da-466d-8380-f257ba28481d
Запишете си този дълъг низ, например: 1234abcd-56ef-78gh-... Намерете offset на файла:
sudo filefrag -v /swapfile | awk '{if($1=="0:") print substr($4, 1, length($4)-2)}' 720896
Запишете си полученото число, например: 34528 Редактирайте GRUB конфигурацията:
sudo nano /etc/default/grub # GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet" GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=ВАШИЯТ_UUID_ТУК resume_offset=ВАШИЯТ_OFFSET_ТУК"
След това GRUB трябва да се обнови.
sudo grub-mkconfig -o /boot/grub/grub.cfg
Следва Initramfs.
sudo nano /etc/mkinitcpio.conf HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block resume filesystems fsck)
Генерираме наново Initramfs.
sudo mkinitcpio -P
За най-лесно управление на zRAM в Arch Linux се използва пакетът zram-generator.
sudo pacman -S zram-generator
Създаme конфигурационен файл /etc/systemd/zram-generator.conf.
sudo nano /etc/systemd/zram-generator.conf [zram0] zram-size = ram compression-algorithm = zstd swap-priority = 100
Тази настройка създава zRAM с размер 16GB (равен на вашата RAM) и с приоритет 100. Тъй като физическият swap файл има приоритет 1, системата винаги ще пълни първо zRAM, а диска ще ползва само за хибернация. Стартираме услугата.
sudo systemctl daemon-reload sudo systemctl start systemd-zram-setup@zram0.service
Проверяваме дали всичко работи.
zramctl swapon --show
Трябва да виждате и двете устройства, като zram0 е с по-висок приоритет.
След като бекендът е готов, трябва да кажете на KDE да показва бутона за Хибернация. 1. Отидете в System Settings (Системни настройки) -> Power Management (Управление на захранването) -> Energy Saving. 2. Вече трябва да виждате опция "Hibernate" при затваряне на капака или натискане на бутона за включване. 3. Ако бутонът липсва в старт менюто, проверете дали Polkit не го блокира. Обикновено в Arch и KDE, ако ядрото поддържа хибернация, бутонът се появява автоматично след рестарт. Тествайте хибернацията ръчно през терминала:
systemctl hibernate
Лаптопът трябва да изключи напълно. При повторно включване системата трябва да зареди директно в KDE Plasma със записваните отворени прозорци.
Ако използвате systemd-boot вместо GRUB, процедурата се променя единствено в начина, по който предавате параметрите на ядрото (kernel parameters). Всичко останало (UUID, offset на файла и промяната в mkinitcpio.conf) остава абсолютно същото. Много важен момент!. Трябва да знаете къде е активната конфигурация за зареждане. Ето как да настроите systemd-boot за хибернация: 1. Намерете активната конфигурация на зареждане. Конфигурационните файлове на systemd-boot се намират в EFI дяла ви, обикновено в директорията /boot/loader/entries/. Там ще намерите един или повече .conf файлове (например arch.conf). Отворете активния конфигурационен файл, ако няма го създадете:
sudo nano /boot/loader/entries/arch.conf title Arch Linux linux /vmlinuz-linux initrd /intel-ucode.img initrd /initramfs-linux.img options root=UUID=ВАШ_ROOT_UUID rw quiet splash resume=UUID=ВАШ_ROOT_UUID resume_offset=ВАШ_OFFSET sudo nano /boot/loader/loader.conf timeout 3 default arch.conf # console-mode keep
(По избор) Ако използвате sd-vconsole или systemd куки Тъй като използвате systemd-boot, е много вероятно в /etc/mkinitcpio.conf на реда HOOKS=(...) вместо udev да използвате systemd. * Ако ползвате udev подредба: добавете resume (както е описано в предния отговор). * Ако ползвате systemd подредба: вместо resume, трябва да добавите куката systemd (тя вече трябва да е там), а самата хибернация ще се управлява автоматично от нея. Няма нужда да добавяте нищо допълнително в реда HOOKS. За всеки случай, след промяната на .conf файла, генерирайте отново initramfs имиджите:
sudo mkinitcpio -P
При systemd-boot няма нужда от команда за обновяване (като grub-mkconfig). Промените влизат в сила веднага след записването на файла. Можете да рестартирате лаптопа и да тествате хибернацията.
Ако използвате по-новата практика с Unified Kernel Images (UKI), няма да намерите отделен .img файл. Вместо това ще имате файл с разширение .efi (например arch-linux.efi), който съдържа в себе си и ядрото, и initramfs. Той се намира в: /efi/EFI/Linux/ или /boot/EFI/Linux/.
Да изброим първо стъпките които трябва да са изпълнени до тук: 1. Създаване на физически Swap файл. 2. Активиране на физическия Swap файл. 3. Определяне приоритета на физическия Swap файл в /etc/fstab. 4. Конфигуриране на ZRam чрез zram-generator 5. Намиране на параметрите за хибернация (UUID и resume_offset) Това са стъпките които направихме до тук. Предстои да изпълним: 6. Добавяне на параметрите в ядрото чрез UKI (редактираме глобалния файл /etc/kernel/cmdline) 7. Конфигуриране на Initramfs (mkinitcpio) за поддръжка на Resume (/etc/mkinitcpio.conf) 8. Генериране наново на UKI изображения. 9. Проверка на systemd-boot. 10. Настройка в KDE Plasma От точка 1 до 4, даже до точка 5 нещата са изпълнени. Все пак да почнем от точка 5 за да стане по явно. Да определим UUID и resume_offset.
### Намиране UUID на партишъна, където е /swapfile findmnt -no UUID -T /swapfile 92273cb0-32da-466d-8380-f257ba28481d
Да определим resume_offset.
### resume_offset за ext4 sudo filefrag -v /swapfile | awk '{if($1=="0:") print substr($4, 1, length($4)-2)}' 720896
Добавяне на параметрите в ядрото чрез UKI. Тъй като се използва Unified Kernel Images (UKI), параметрите на ядрото (kernel cmdline) се вграждат директно в самия .efi файл в момента на генерирането му. Те не се вземат от обикновените .conf файлове на systemd-boot. За целта отваряме /etc/kernel/cmdline. Ако файла го няма, го създаваме:
sudo nano /etc/kernel/cmdline ### Цялото съдържание трябва да е на един ред root=PARTUUID=2837f732-bb89-4906-b241-2993554d7f74 zswap.enabled=0 rw rootfstype=ext4 resume=UUID=92273cb0-32da-466d-8380-f257ba28481d resume_offset=720896
Конфигурация на Initramfs (mkinitcpio) за подръжка на Resume. За да може системата да прочете данните от диска при стартиране, се изисква hook resume в initramfs имиджа.
sudo nano /etc/mkinitcpio.conf HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block resume filesystems fsck)
Генерираме наново UKI изображения.
sudo mkinitcpio -P
Това автоматично ще събере новото UKI и ще го запише във вашата EFI партиция (обикновено в /efi/EFI/Linux/ или /boot/EFI/Linux/), интегрирайки вътре новите опции от /etc/kernel/cmdline. Проверка на systemd-boot. След като използвате UKI, systemd-boot автоматично сканира директорията EFI/Linux/ на вашата EFI партиция и ще покаже ядрото в менюто при буутване без нужда от ръчно въвеждане на записи.Уверете се, че всичко е инсталирано правилно:
sudo bootctl update Skipping "/boot/EFI/systemd/systemd-bootx64.efi", same boot loader version in place already. Skipping "/boot/EFI/BOOT/BOOTX64.EFI", same boot loader version in place already. sudo reboot
Ако се върне горния отговор, значи всичко е наред. Настройка в KDE Plasma. След рестарт KDE Plasma автоматично ще засече, че системата поддържа хибернация. 1. Отидете в System Settings -> Power Management. 2. В секциите за поведение при затваряне на капака (Lid close) или натискане на бутона за захранване (When power button pressed:), вече ще имате опция Hibernate или Hybrid Sleep. 3. Можете да тествате дали работи през терминала:
systemctl hibernate
Когато изпълните горната команда компютъра или лаптопа трябва да изпадне в хибернация.
Както при Вариант 1 и тук до точка 5 всичко трябва да е изпълнено. За разлика от горния случай ще заредим ядрото с някои допълнения като създадем ново меню за зареждане.
sudo nano /boot/loader/entries/arch-hiber.conf title Arch Linux (Hibernation) linux /EFI/Linux/arch-linux.efi options root=PARTUUID=2837f732-bb89-4906-b241-2993554d7f74 zswap.enabled=0 rw rootfstype=ext4 resume=UUID=92273cb0-32da-466d-8380-f257ba28481d resume_offset=720896 sudo nano /boot/loader/loader.conf timeout 3 default arch-hiber.conf # console-mode keep
Конфигурация на Initramfs (mkinitcpio) за подръжка на Resume. За да може системата да прочете данните от диска при стартиране, се изисква hook resume в initramfs имиджа.
sudo nano /etc/mkinitcpio.conf HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block resume filesystems fsck)
Генерираме наново UKI изображения.
sudo mkinitcpio -P
Това автоматично ще събере новото UKI и ще го запише във вашата EFI партиция (обикновено в /efi/EFI/Linux/ или /boot/EFI/Linux/), интегрирайки вътре новите опции от /etc/kernel/cmdline. Проверка на systemd-boot. След като използвате UKI, systemd-boot автоматично сканира директорията EFI/Linux/ на вашата EFI партиция и ще покаже ядрото в менюто при буутване без нужда от ръчно въвеждане на записи.Уверете се, че всичко е инсталирано правилно:
sudo bootctl update Skipping "/boot/EFI/systemd/systemd-bootx64.efi", same boot loader version in place already. Skipping "/boot/EFI/BOOT/BOOTX64.EFI", same boot loader version in place already.
Ако се върне горния отговор, значи всичко е наред. Рестартираме системата.
sudo reboot
След рестарта при зареждане, под основното меню Arch Linux, трябва да се появи още едно меню Arch Linux (Hibernation). То е по подразбиране и ако се зареди от него ще има хибернация.
Настройка в KDE Plasma. След рестарт KDE Plasma автоматично ще засече, че системата поддържа хибернация. 1. Отидете в System Settings -> Power Management. 2. В секциите за поведение при затваряне на капака (Lid close) или натискане на бутона за захранване (When power button pressed:), вече ще имате опция Hibernate или Hybrid Sleep. 3. Можете да тествате дали работи през терминала:
systemctl hibernate
Когато изпълните горната команда компютъра или лаптопа трябва да изпадне в хибернация.
swapon --show NAME TYPE SIZE USED PRIO /swapfile file 4G 0B 1 /dev/zram0 partition 3.8G 0B 100