Swap

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Swap and the translation is 100% complete.
Other languages:
Resources
This article has some todo items:
  • remove swap files, btrfs swapfile note
Not to be confused with Zswap.


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.

Tip
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
Note
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
Tip
Az is lehetséges, hogy a rendszer swapterületeit a swapon paranccsal megtekintse:
user $swapon --show
NAME TYPE SIZE USED PRIO /swapfile file 12G 2.6G 10

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:

FILE /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]:

FILE /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
Tip
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:

FILE /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
Note
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.
Warning
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.

FILE /etc/fstab
# /dev/sdb1 (SWAP) 
UUID=01b37ea8-74a5-4526-85c7-9fdf6dad34cb               none            swap    sw      0 0
Note
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.

Note
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
FILE /etc/fstab
/dev/mapper/cryptswap none swap sw 0 0

Aktiválás (systemd)

Note
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.
FILE /etc/crypttab
cryptswap /opt/swapfile /dev/urandom swap

Aktiválás (OpenRC)

Warning
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
FILE /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:

FILE /etc/local.d/swap.start
cryptsetup --type plain -d /dev/urandom open /opt/swapfile cryptswap
mkswap /dev/mapper/cryptswap
swapon /dev/mapper/cryptswap
FILE /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:

FILE /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:

FILE /etc/fstabPé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:

FILE /etc/sysctl.d/90-swappiness.confReduced system swappiness
vm.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