GNU/Linux >> Znalost Linux >  >> Linux

Hibernace bez aktivace swapu

  1. Zakázat swap, když už víte, že se váš systém může dostat do bodu, kdy nebude mít dostatek paměti, je špatný nápad . Právě ve chvíli, kdy jádro nemá žádnou paměť pro alokaci vašeho systému, bude pravděpodobně velmi-velmi nereaguje nebo jen přestane reagovat, takže jej budete muset restartovat. Zablokování může způsobit ztráty dat, někdy poškození souborového systému. V závislosti na souborovém systému to lze opravit automaticky (rodina ext*, rodina fat, btrfs a některé další), ale ne každý FS tuto funkci podporuje. Vsadím se, že pravděpodobně nebudete chtít spouštět fsck v režimu jednoho uživatele pokaždé, když máte poškození...

  2. Jádro není tak hloupé, aby si na SSD zapisovalo vše, co chce, chová se jinak než HDD a snaží se o co nejmenší zápisy pomocí věcí jako je TRIM. Vašemu disku to nezpůsobí tolik škody, jak si možná myslíte.

  3. Hibernace je vestavěná subsystém jádra, který pracuje na nízké úrovni. Stále musí mít samostatný oddíl o velikosti ≥ velikost RAM, což mu umožňuje vytvořit úplný snímek vaší paměti. Zde si můžete přečíst, jak linux zvládá hibernaci. Pokud není místo pro trvalé uložení obrazu paměti, režim hibernace nebude fungovat. Nemůžete ukládat data do vzduchu. Žádné trvalé fyzické úložiště =žádná hibernace. To je také odpověď na vaši otázku:nelze použít hibernaci bez swapu na linuxu .

Jde mi o to, že samozřejmě můžete žít bez swapu a povolit jej pouze pro hibernaci, ale pouze pokud jste si jisti, že 99,9 % času je zapnuto, má dostatek paměti na všechno. Pokud to není váš případ, musíte použít swap.

Nyní k možnému řešení:

Když spustíte systemctl hibernate systemd spustí službu s názvem systemd-hibernate.service . Soubor jednotky, který se obvykle nachází /usr/lib/systemd/system/ adresář

V Debianu to vypadá takto:

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target
After=sleep.target

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate

Jak vidíte, existují Požadavky a Po možnosti. Můžeme napsat další jednotku, která umožní swap a přidat její název do těchto polí. Budeme to nazývat swap-on.service a umístěte jej do /etc/systemd/system/ adresář

Náš soubor bude vypadat nějak takto:

# Unit filed is not required in our case so you can skip it
[Unit]
Description=Enable swap partition

[Service]
# This line means that service will be executed just once and immediately stop when
# swapon enables swap on /dev/sda3
Type=oneshot

# Change /dev/sda3 with device named after your swap partition 
# like /dev/sdb3 or /dev/nvme0n1p3
# Use lsblk to determine your swap partition (partition with [SWAP] as mountpoint)
# Of course you can think of a more complex solution like running external script
# that determines your swap partition automatically every time service is executed
# but for now I'll go with simple /dev/sda3
ExecStart=/sbin/swapon /dev/sda3

Nyní bychom měli upravit službu systemd-hibernate.service našeho systému :

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target swap-on.service <--
After=sleep.target swap-on.service <--

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate

Duplikujeme swap-on.service v Po, abyste se ujistili, že systemd spustí hibernaci po swap je zapnutý a ne naopak a je v Povinné, aby se zajistilo, že se systemd nepokusí o hibernaci, pokud swap-on.service selhalo.

Nyní, když spustíme systemctl hibernate systemd spouští naši upravenou službu systemd-hibernate.service který provozuje swap-on.service který umožňuje výměnu. Když je swap povolen a obě pole Required a After jsou splněna, systemd může konečně přepnout náš systém do režimu spánku.

Aby systemd zakázal swap po obnovení z hibernace, nebudeme muset vytvářet další soubor služby s názvem swap-off.service která bude dělat totéž, co naše swap-on.service , umístěte ji do stejného adresáře jako služba "on" (/etc/systemd/system/). Jediný rozdíl je v tom, že tato služba poběží swapoff místo swapon :

[Unit]
Description=Disable swap partition

[Service]
Type=oneshot

#  again, change /dev/sda3 to your swap partition /dev file
ExecStart=/sbin/swapoff /dev/sda3 <--

Dalším krokem je úprava souboru služby s názvem [email protected] umístěného ve stejném /usr/lib/systemd/system adresář:

[Unit]
Description=Resume from hibernation using device %f
Documentation=man:[email protected](8)
DefaultDependencies=no
BindsTo=%i.device
Wants=local-fs-pre.target
After=%i.device
Before=local-fs-pre.target
ConditionPathExists=/etc/initrd-release

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-hibernate-resume %f

Musíme upravit Před pole nyní. Přidejte swap-off.service vedle local-fs-pre.target :

...
After=%i.device
Before=local-fs-pre.target swap-off.service <--
ConditionPathExists=/etc/initrd-release
...

Nyní, když se probudíte z hibernace, systemd spustí swap-off.service po načtení odkládacího obrázku do paměti (ve skutečnosti o něco později, ale to je pro nás jedno)

Mějte na paměti, že toto je plně teoretické řešení, ještě jsem to nezkoušel, ale podle toho, co vím o systemd, by to mělo fungovat. Protože UPower žádá systemd o hibernaci, která, jak jsem vysvětlil, spouští systemd-hibernate.service, je to pravděpodobně to, co hledáte


Linux
  1. Je swap anachronismus?

  2. Služba operačního systému Linux „nfs“

  3. Služba operačního systému Linux „microcode_ctl“

  1. Služba Linux OS „NetFS“

  2. Služba Linux OS „ldap“

  3. Služba OS Linux „yppasswdd“

  1. Linux OS Service ‚xendomény‘

  2. Služba Linux OS „nscd“

  3. Služba Linux OS „chobotnice“