Swap
A Linux/Unix világban a swap kifejezést általában a memórialapozás szinonimájaként használják. A swap arra a műveletre utal, amikor a memóriaoldalakat az operatív memória és egy másodlagos adattároló között mozgatják.
A Linux több swapterület kombinációját is képes használni – vagyis több swap adathordozó eszközt és/vagy swapfájlt képes egyszerre használni. Emellett lehetőség van különböző előnyben részesítések hozzárendelésére a swapterületekhez.
Azonban előfordulhat, hogy a cserehely (a swap) egyáltalán nem szükséges, a kérdéses rendszer követelményeitől függően. Például egy olyan laptop esetében, amely hibernáláskor a memóriában lévő összes oldalt az adathordozóra menti, ott szükséges a swap. Ugyanakkor a nagy méretű memóriával felszerelt, állandó terhelés alatt működő szerverrendszerek esetében előfordulhat, hogy egyáltalán nincs szükség swapterületre. További részletekért tekintse meg az erre vonatkozó tudásbázis cikket.
A Gentoo kézikönyv az telepítési folyamat részeként egy hasznos ökölszabály táblázatot javasol arra az esetre, ha a felhasználó nem biztos benne, hogy mennyi swapterületre van szüksége. A swap azonban bármikor létrehozható és aktiválható, ha esetleg hibát követtek el.
Manapság, amikor a számítógépek bőséges memóriával rendelkeznek, elegendő lehet a rendelkezésre álló memóriánál kisebb méretű swap partíció létrehozása. Hibernálás használata esetén, amikor egy tömörített RAM képet kell a swap partícióba menteni, célszerű a telepített memóriával megegyező méretű swap partíciót kialakítani.
Létrehozás
Swap partíció
Tegyük fel, hogy a /dev/sda2 az a partíció, amely a swap céljára használható. Először formázza a partíciót swap típusúra.
root #
mkswap /dev/sda2
Swapfájl
Az adathordozókon lévő partíciók merevebb korlátozásainak áthidalása érdekében egy alternatíva az adathordozón található fájl használata swapterületként. A fájlok elhelyezhetőek a lemezpartíciókon belül ahol már nincsenek a partíciót érintő bizonyos korlátozások. Ez lehetővé teszi a swapterület átméretezését vagy áthelyezését a rendszer igényeinek megfelelően, anélkül hogy újra kellene particionálni az adathordozót.
Kezdje azzal, hogy létrehoz egy új fájlt, amelyet a swapfájl háttértáraként fog használni. Ennek a fájlnak a mérete lesz a swapterület mérete. Erre a célra használhatóak a szabványos segédprogramok, például a fallocate, amely a sys-apps/util-linux szoftvercsomag része.
root #
fallocate -l 12GiB swapfile
Ezután korlátozza a fájl jogosultságait úgy, hogy csak a root felhasználó férhessen hozzá.
root #
chmod 600 swapfile
Ha a swapfájl azon a partíción található, amely a btrfs fájlrendszert használja, akkor a swapon parancs sikertelen lesz, hacsak a swapfájl nincs saját al-kötetben, és a másolás íráskor (copy-on-write), valamint a tömörítés nincs letiltva a swapfájl esetében[1]. Egy 4 GiB méretű swapfájl esetén a lépések a következők lennének:
root #
btrfs subvolume create swap_vol
root #
chattr +C swap_vol
root #
fallocate -l 4G swap_vol/swapfile
root #
chmod 600 swap_vol/swapfile
Ezután inicializálja a swapfájlt:
root #
mkswap swapfile
Aktiválás
Mielőtt a swapterület használható lenne, engedélyezni kell azt a swapon paranccsal. Swap partíciók esetén:
root #
swapon /dev/sdb
Illetve, swapfájl esetében:
root #
swapon swapfile
Az is lehetséges, hogy a rendszer swapterületeit a swapon paranccsal megtekintse:
user $
swapon --show
Bár a swap aktiválása kézzel a swapon paranccsal rendben van, több módszer is létezik ennek a folyamatnak az automatizálására.
Általában a swapterületet az fstab fájlhoz szokták hozzáadni azért, hogy az inicializálási folyamat során a többi fájlrendszerrel együtt aktiválódjon. Ennek elérése érdekében, adjon hozzá egy sort (szükség szerint módosítva azt) az fstab fájlhoz:
/etc/fstab
/dev/sda2 none swap sw 0 0
/swapfile none swap sw 0 0
Alternatív megoldásként systemd alatt lehetőség van egy swap unit beállítására[2]:
/etc/systemd/system/swapfile.swap
[Unit]
Description=Activate /swapfile
# This is the key dependency; start after local disks have been mounted
After=local-fs.target
[Swap]
# Path to the swap file or device
What=/swapfile
# Optional: Set priority for the swap space
Priority=10
[Install]
# This tells systemd to start this unit as part of the main swap target
WantedBy=swap.target
A swap unitokat annak megfelelően kell elnevezni, hogy mely adathordozókat vagy fájlokat vezérlik. Például a /dev/sda2 swap adathordozót a dev-sda2.swap nevű unitfájlban kell beállítani.
Ezután aktiválja az unitot:
root #
systemctl enable swapfile.swap --now
A swap automatikus engedélyezésének utolsó módszere a Discoverable Partitions Specification segítségével történik.[3]: A GUID partíciós tábla (GPT) UUID értékét a megfelelőre kell beállítani (0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
, más néven SD_GPT_SWAP
). Ha a Discoverable Partitions módszert használja, akkor a root partíciót tartalmazó adathorodzón lévő összes swap partíció automatikusan engedélyezésre kerül. Ez a funkcionalitás az init rendszertől függ, de ismert, hogy a systemd támogatja.
Haladó swapkezelés
Titkosított swap hibernálási lehetőséggel
Feltételezve azt, hogy a kívánt cél egy LUKS által titkosított swap partíció, amely lehetővé teszi a hibernálás (az adathordozóra történő felfüggesztés) végrehajtását is, a titkosított swap partíciónak ismert LUKS-kulcsra (kulcsfájl, jelszó stb.) van szüksége. Az számítógép booltolásának korai szakaszában a felhasználó meg van kérve a jelszó megadására. A kernel ekkor eldönti, hogy normál módon indítja el az operációs rendszert, vagy betölti a swap partícióról a hibernált RAM-képet, amennyiben az előző áramellátási állapotban az operációs rendszer hibernálva volt.
A LUKS által titkosított swap partíció létrehozása nem különbözik más LUKS által titkosított partíció létrehozásától, amely a titkosított adathordozóplatform létrehozása cikkben van leírva. Használja a mkswap parancsot a mkfs.* helyett a LUKS által titkosított partíción a SWAP létrehozásához. A swap terület formázása során létrejött UUID azonosító (például: 01b37ea8-74a5-4526-85c7-9fdf6dad34cb
) szükséges a következő lépéshez:
Adja meg a bootloadernek (GRUB) azt, hogy honnan állítsa vissza az operációs rendszert a hibernálás után:
/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=01b37ea8-74a5-4526-85c7-9fdf6dad34cb"
Ezenkívül, a dracutnak meg kell adni a kapcsolódó LUKS adathordozó főszálát és mellékszámát annak érdekében, hogy megfelelő initrd képfájlt tudjon létrehozni.
root #
lsblk
.. └─sdb1 8:22 0 32G 0 part └─luks-cc166689-4246-41ae-86e8-84705b81ecc2 253:1 0 32G 0 crypt [SWAP]
root #
echo 253:1 > /sys/power/resume
Az alapértelmezett érték a
0:0
. Adja meg ismét ezt az értéket a echo paranccsal a hibernálás kikapcsolásához.Legyen óvatos. Ne keverje össze a LUKS UUID azonosítót (
cc166689-4246-41ae-86e8-84705b81ecc2
) a swap UUID azonosítóval (01b37ea8-74a5-4526-85c7-9fdf6dad34cb
).Végül frissíteni kell az initrd képfájlt ezekkel a módosításokkal:
root #
dracut --force
Ne felejtse el a swap szokásos beállítását a /etc/fstab fájlban, majd indítsa újra az operációs rendszert.
/etc/fstab
# /dev/sdb1 (SWAP)
UUID=01b37ea8-74a5-4526-85c7-9fdf6dad34cb none swap sw 0 0
Amennyiben egy LUKS által titkosított swap már be van állítva a /etc/conf.d/dmcrypt beállításfájl használatával a dm-crypt segítségével, akkor az elavulttá válik, mivel ez a LUKS adathordozó ezentúl korábban kerül megnyitásra a dracut által generált initrd segítségével.
Teljes adathordozó titkosítás használata
Amennyiben Ön már használja a teljes adathordozó titkosítást LUKS által, akkor a bootolás során kettőször fog megjelenni a jelszóbekérés: Egyszer az operációs rendszer root partíciójának LUKS-kulcsának megadása érdekében (mint korábban). Másodszor pedig a swap partíció feloldása érdekében. Lehetőség van azonban arra, hogy csak a root partíciót oldja fel, majd egy, az imént feloldott root partíción tárolt LUKS kulcsfájlt legyen felhasználva a swap partíció automatikus feloldásához. A részletek és egy egyszerű példa arra, hogy miként lehet ezt megtenni a /etc/default/grub fájlban, megtalálható a kernel.org oldalon.
Titkosított swap fájl
Legjobb gyakorlatnak számít a swap fájlok titkosítása.
Ez a titkosított swap fájlokra vonatkozó szakasz különösen hasznos a hibernálás támogatása szempontjából, mivel újraindítás után is ugyanazt a kulcsot használja a titkosított swap partícióhoz. A maximális biztonság érdekében használja a rekey-at-reboot beállítást: Az LVM használata kötelező a titkosított swappartícióhoz, és a /dev/mapper/<vg_group>_swap-titkosítatlan elérési utat kell használni (nem pedig a közvetlenebb /dev/dm-9 útvonalat) a /etc/fstab fájlban. Tekintse meg a Hogyan hozzon létre véletlenszerű kulccsal ellátott, titkosított swappartíciót, amelyre aztán "uuid módon" hivatkozhat.
Létrehozás
Annak érdekében, hogy a /opt könyvtárban létrehozzon egy 2 GiB méretű titkosított swapfájlt, futtassa a következő parancsot:
root #
cd /opt
root #
fallocate -l 2GiB swapfile
root #
chmod 600 swapfile
root #
cryptsetup --type plain -d /dev/urandom open swapfile cryptswap
root #
mkswap /dev/mapper/cryptswap
root #
swapon /dev/mapper/cryptswap
root #
swapon --show
/etc/fstab
/dev/mapper/cryptswap none swap sw 0 0
Aktiválás (systemd)
Győződjön meg arról, hogy a systemd a cryptsetup támogatással lett lefordítva a forráskódból, különben a /etc/crypttab fájl nem lesz beolvasva.
/etc/crypttab
cryptswap /opt/swapfile /dev/urandom swap
Aktiválás (OpenRC)
Az OpenRC dm-crypt szolgáltatás alapértelmezetten az
aes-cbc-plain
titkosítási módot használja, amely sebezhető[4]. Ezért meg kell adni az options
paramétert annak érdekében, hogy az aes-cbc-essiv
titkosítási mód kerüljön használatra.
Használja a következő parancsot annak ellenőrzésére, hogy melyik titkosítási mód van használatban:
root #
dmsetup table cryptswap
/etc/conf.d/dmcrypt
swap=cryptswap
source=/opt/swapfile
options='--type plain --key-file /dev/urandom'
A dmcrypt szolgáltatás engedélyezése:
root #
rc-update add dmcrypt boot
Ha például a következő hibaüzenettel a dm-crypt szolgáltatás a bootoláskor nem tudja létrehozni a swapterületet:
mkswap: unable to erase bootbits sectors
Akkor a swapterület sajátkezűleg is létrehozható. Tiltsa le a dm-crypt szolgáltatást, és állítsa vissza a /etc/fstab és a /etc/conf.d/dmcrypt fájlokban végrehajtott módosításokat:
/etc/local.d/swap.start
cryptsetup --type plain -d /dev/urandom open /opt/swapfile cryptswap
mkswap /dev/mapper/cryptswap
swapon /dev/mapper/cryptswap
/etc/local.d/swap.stop
swapoff /dev/mapper/cryptswap
cryptsetup close cryptswap
Majd, tegye végrehajthatóvá a szkripteket:
root #
chmod +x /etc/local.d/swap.start
root #
chmod +x /etc/local.d/swap.stop
A swapterület az számítógép újraindítása után lesz létrehozva.
OpenRC beállítása
Amikor a swapfájlok nem a gyökérfájlrendszeren találhatóak, akkor az OpenRC init rendszerben a szolgáltatások sorrendjét módosítani kell a /etc/conf.d/swap fájlon keresztül:
/etc/conf.d/swap
# If you are only using local swap partitions, you should not change
# this file. Otherwise, you need to uncomment the below rc_before line
# followed by the appropriate rc_need line.
rc_before="!localmount"
#
# If you are using swap files stored on local file systems, uncomment
# this line.
rc_need="localmount"
#
# If you are using swap files stored on network file systems or swap
# partitions stored on network block devices such as iSCSI, uncomment
# this line.
#rc_need="netmount"
Teljesítményhangolás
Prioritáskezelés
Lehetőség van a különböző swapterületek előnyben részesítésének a beállítására, egy 0 és 32767 közötti egész szám hozzárendelésével. A magasabb prioritású swapterületek kerülnek először felhasználásra. Az alacsonyabb prioritású területek csak a magasabbak kimerülése után kerülnek használatba. Az azonos prioritású területek körkörös módon, felváltva kerülnek felhasználásra[5].
Az előnyben részesítés használható olyan rendszerek esetében, amelyek gyors (ZRAM vagy NVMe-alapú eszközök) és lassú (HDD-alapú adathordozók) swapterületeket kombinálnak annak érdekében, hogy előbbiek elsőbbséget élvezzenek az utóbbiakkal szemben.
Például a gyors /dev/nvme0n1 swapadathordozó prioritásának beállítása a szokásos /swapfile fájl elé a /etc/fstab fájl segítségével:
/etc/fstab
Példa a swap előnyben részesítésre/dev/nvme0n1 none swap sw,pri=16383 0 0
/swapfile none swap sw,pri=1 0 0
Swappiness
A kernel lehetővé teszi a swap használatának hangolását a sysctl paramétereken keresztül, amelyek segítségével a lapozási viselkedés különböző munkaterhelésekhez igazítható.
A vm.swappiness paraméter azt a viszonyt szabályozza, hogy a kernel milyen arányban hajlandó visszaállítani a fájlalapú (például "gyorsítótárazott fájlrészeket" tartalmazó) és az anonim memórialapokat (mint az alkalmazások halmaza és veremmemóriája) azok háttértárolójába. Az újabb kernelfajtákon az értéktartomány 0-tól 200-ig terjed, az alapértelmezett érték pedig 60[6]. Az alapértéknél alacsonyabb értékek azt jelzik, hogy az alkalmazásokhoz kapcsolódó anonim memórialapokat inkább a memóriában kívánják megtartani a fájlalapú lapok rovására – és fordítva.
A jelenlegi érték a következő módon jeleníthető meg:
user $
sysctl vm.swappiness
vm.swappiness = 60
A kívánt swappiness érték tartósan beállítható a következő módon:
/etc/sysctl.d/90-swappiness.conf
Reduced system swappinessvm.swappiness=20
További olvasnivaló a témában
- Filesystem — egy eszköz az adatok rendszerezésére, amely lehetővé teszi azok megőrzését a program leállítása után.
- Zram — a Linux kernel feature and userspace tools for creating compressible RAM-based block devices.
- Zswap — a lightweight compressed cache for swap pages.
Külső források
Hivatkozások
- ↑ Swapfile — BTRFS documentation
- ↑ Systemd Documentation - systemd.swap.
- ↑ Discoverable Partitions Specification
- ↑ https://gitlab.com/cryptsetup/cryptsetup/-/blob/main/FAQ.md
- ↑ swapon(2) - Linux man page, die.net. Retrieved on: October 23, 2022
- ↑ Documentation for /proc/sys/vm/ — The Linux Kernel documentation, kernel.org. Retrieved on October 23, 2022