Ramdisk Linux alatt

Bevezető

Ha már kerestél a számítógéped gyorsítására házi praktikákat, biztosan belefutottál már a ramdisk fogalmába.

Ügyesen kiaknázva jelentős teljesítménynövekedést lehet vele elérni. A memóriát (RAM-ot) arra használjuk, hogy ideiglenes adatokat írjunk oda. Gyors az elérése, azonban az operációs rendszereink sokszor szeretik memóriaként, ideiglenes adatok tárolására a háttértárainkat használni.


Te hova gyorsítótáraznál szívesen? (forrás: PROHARDVER!)

Mi is az a ramdisk?

A ramdisk lényege az, hogy a fizikai memóriánk (RAM) egy részét merevlemezként (disk) használjuk. A konvertált rész merevlemezként viselkedik: van fájlrendszere, mérete, partíciója, csatolási pontja és olvasható/írható. Egyedül a SMART adatokat olvasó programok nem tudnak velük mit kezdeni.

A cikkemben szeretnék egy-két praktikát bemutatni a ramdisk használatával, amellyel gyorsíthatjuk gépünket. Nálam a böngészés szinte villámgyors lett.

Cikkemben a ramdisk-et Linuxos szemszögből fogom nézni.

Hirdetés

Előnyei
Merevlemezzel (HDD) szemben
A merevlemezzel szembeni legnagyobb előnye, hogy gyorsabb. Sokkal gyorsabb. A gyorsítótárazás azt jelenti, hogy egy könnyen elérhető területre összegyűjtünk dolgokat, amiket onnan gyorsabban elérünk. (Pl. a böngésző által megjelenítendő képeket) Azonban ezt egy lassú merevlemezre tenni olyan, mintha magunk alatt vágnánk a fát.

SSD-vel szemben
Az SSD gyorsabb mint a merevlemez (olvasnivaló...), de közbejön egy súlyosabb probléma, a cellák korlátozott írhatósága. Hogy kíméljük a (most még korántsem olcsó) eszközünket, alkalmazhatunk ramdisket.

A ramdisk létrehozása

Első körben természetesen létre kell hoznunk a ramdisket.

A méret egy meggondolandó dolog. A legtöbb számítógépben 4 GB memória található, extrém esetben is maximum 12. Én 1 GB-os ramdisket használok.

A csatolási pont létrehozása
A ramdisket az ember oda csatolja fel, ahova szeretné, azonban a cikkben (és az általam készített fájlokban) a csatolás helye a /mnt/ram mappa.

A mappa létrehozásához a terminálba gépeljük be ezt: $ sudo mkdir /mnt/ram.

Nyissuk meg a mappát a fájlkezelőben. Az állapotsoron a / partíció szabad méretét kell látnunk. Ez azt jelenti, hogy most még ez egy sima mappa.


A csatolási pont mappája (csatolás előtt)

A ramdisk létrehozása
Nyissuk meg az fstab fájlt ($ sudo nano /etc/fstab). Ez a fájl tartalmazza az automatikusan csatolandó fájlrendszerek leírásait. A fájl végére szúrjuk be a következő két sort:

# create 1 gB RAMdisk and mount it to /mnt/ram
none /mnt/ram tmpfs nodev,nosuid,noatime,size=1024M,mode=1777 0 0

Mentsük el a fájlt (Ctrl + O, majd Enter). Lépjünk ki a szerkesztőből a Ctrl + X kombinációval. Indítsuk újra a gépet.

A ramdisk felcsatolva
Nyissuk meg újra a /mnt/ram mappát, most az állapotsorban a ramdisk méretét (1024 MB) kell látnunk.


A csatolási pont mappája (csatolás után)

Ha most már a korrekt méretet látjuk, akkor megbizonyosodhatunk róla, a ramdisk létrejött. Ha további bizonyíték kell, másoljunk be egy fájlt, majd indítsuk újra a gépet. Ha nem lesz ott, az valóban ramdisk.

A /tmp mappa áthelyezése

Az ideiglenes fájlokat a Linux a /tmp mappába teszi. Ezek következő indításra eltűnnek, de ez a mappa a háttértáron található.

Ha át szeretnénk helyezni ramdisk-be, meggyűlhet a bajunk. Ha rosszkor helyezzük át, búcsút mondhatunk minden grafikai cukiságnak (ideértve a tty-ket is). Megtörtént, hogy nem volt kép.

Írtam három pici szkriptet, amik megoldják a mappa áthelyezését.
Az első fájl a ramtemp_create.sh nevet kapta. Ez hozza létre az ideiglenes mappát, és állítja helyre az eredetit (hogy a fentebb leírt esemény ne következzen be).

#!/bin/bash
# This script creates the ramdisk tmp directory

ramdisk=/mnt/ram # ramdisk address
ramtmp=tmp # Ramdisk temp directory name
tempdir=/tmp # Temp directory address

# If the ramdisk temp directory is missing, make it and set mode, owner
if [ ! -r $ramdisk/$ramtmp ]; then
echo -e '\E[0;31m'"\033[1m[RAMDISK TEMP DIRECOTRY ($ramdisk/$ramtmp) NOT FOUND]\033[0m"
echo -e '\E[0;33m'"\033[1mCreating ramdisk temp directory\033[0m"
mkdir $ramdisk/$ramtmp
fi

chown root:root $ramdisk/$ramtmp
chmod 777 $ramdisk/$ramtmp
chmod +t $ramdisk/$ramtmp

echo "This is a mounted RAMdisk. The contents of this directory is stored entirely in the RAM." > $ramdisk/README
echo "Please be sure not to store important things here." >> $ramdisk/README
echo "When the computer shuts down or the power cuts off, things here will be purged." >> $ramdisk/README

# If the temp directory is in ramdisk at the execution of this script,
# remove the link and make an ordinary /tmp directory
if [ "$(readlink $tempdir)" == "$ramdisk/$ramtmp" ]; then
echo -e '\E[0;31m'"\033[1m[TEMP DIRECTORY IS RAMDISK BEFORE BOOT]\033[0m"
echo -e '\E[0;32m'"\033[1mThis can cause boot failure\033[0m"

# Remove old tmp file (symlink)
echo -e '\E[0;33m'"\033[1mRemoving symbolic link\033[0m"
rm $tempdir

echo -e '\E[0;33m'"\033[1mCreating ordinary /tmp directory\033[0m"
mkdir $tempdir
fi

# If the "ordinary" /tmp directory is missing create it and set mode, owner
if [ ! -r $tempdir ]; then
echo -e '\E[0;31m'"\033[1m[TEMP DIRECTORY IS MISSING]\033[0m"
echo -e '\E[0;32m'"\033[1mThis can cause boot failure\033[0m"

echo -e '\E[0;33m'"\033[1mCreating ordinary /tmp directory\033[0m"
mkdir $tempdir
fi

# Remove old tmp file (symlink)
echo -e '\E[0;33m'"\033[1mRemoving symbolic link\033[0m"
rm $tempdir

echo -e '\E[0;33m'"\033[1mCreating ordinary /tmp directory\033[0m"
mkdir $tempdir

chown root:root $tempdir
chmod 777 $tempdir
chmod +t $tempdir

A második fájl a ramtemp_move.sh nevet kapta. Ez kapásból az első után fut le, a tartalom áthelyezéséről és a szimbolikus link beállításáról gondoskodik. Szimbolikus linket írtam, mivel, az áthelyezés után az eredeti /tmp mappa egy link lesz a ramdiskben található mappára.

#!/bin/bash
# This script move the tmp directory to ramdisk

ramdisk=/mnt/ram # ramdisk address
ramtmp=tmp # Ramdisk temp directory name
tempdir=/tmp # Temp directory address

# If the ramdisk temp directory is missing, make it and set mode, owner
if [ ! -r $ramdisk/$ramtmp ]; then
echo -e '\E[0;31m'"\033[1m[RAMDISK TEMP DIRECOTRY ($ramdisk/$ramtmp) NOT FOUND]\033[0m"
echo -e '\E[0;33m'"\033[1mCreating ramdisk temp directory\033[0m"
mkdir $ramdisk/$ramtmp
fi

chown root:root $ramdisk/$ramtmp
chmod 777 $ramdisk/$ramtmp
chmod +t $ramdisk/$ramtmp

# If the temp directory is in ramdisk at the execution of this script,
# remove the link and make an ordinary /tmp directory

# If the temp directory is not a symbolic link already to the
# ramdisk directory (intended :) ), make it a symlink
if [ "$(readlink $tempdir)" != "$ramdisk/$ramtmp" ]; then
echo -e '\E[0;31m'"\033[1m[TEMP DIRECTORY IS NOT SYMBOLIC LINK]\033[0m"
echo -e '\E[0;32m'"\033[1mThis is intended at this point\033[0m"

echo -e '\E[0;33m'"\033[1mMoving $tempdir ---> $ramdisk/$ramtmp\033[0m"

# Copy the files
sleep 1
rsync -av $tempdir/ $ramdisk/$ramtmp/

# Remove the original tmp directory
rm -rf $tempdir

# Create symbolic link
ln -s $ramdisk/$ramtmp $tempdir
fi

echo -e '\E[0;32m'"\033[1m[DONE]\033[0m"

A harmadik fájl leállításkor/újraindításkor fut le, ez végzi el a takarítást, és a helyreállítást. Neve ramtemp_restore.sh.

#!/bin/bash
# This script restores the /tmp directory's normal status

ramdisk=/mnt/ram # ramdisk address
ramtmp=tmp # Ramdisk temp directory name
tempdir=/tmp # Temp directory address

# Remove old tmp file (symlink)
echo -e '\E[0;33m'"\033[1mRemoving symbolic link\033[0m"
rm $tempdir

echo -e '\E[0;33m'"\033[1mCreating ordinary /tmp directory\033[0m"
mkdir $tempdir

chown root:root $tempdir
chmod 777 $tempdir
chmod +t $tempdir

Mindegyik szkript tartalmaz hibaellenőrzést, és konzolos kimenetet, ha esetleg kézzel futtatva szeretnénk egy aprócska állapotjelentést.

Ha nem szeretnétek copy-pastelni, a szkriptek letölthető formátumban is elérhetőek. ramtemp.tar.gz

Telepítés
Mentsük le ezt a három szkriptet a /etc mappába. ($ sudo cp ramtemp_create.sh /etc/ramtemp_create.sh, $ sudo cp ramtemp_move.sh /etc/ramtemp_move.sh, $ sudo cp ramtemp_restore.sh /etc/ramtemp_restore.sh)

A szkriptek első pár sorában található három változó. Ezeket igény szerint módosítsuk, ha a konfigurációnk eltér a cikkben szereplőtől. A három változó rendre:
ramdisk: a ramdisk elérési útvonala (alapesetben /mnt/ram)
ramtmp: a ramdiskben található tmp almappa neve (alapesetben tmp)
tempdir: a "hagyományos" tmp mappa elérési útvonala (alapesetben /tmp)

Jól látszik, hogy miről is beszélünk. Az eredeti /tmp mappánk ezentúl /mnt/ram/tmp-ként lesz ismert.

Nyissuk meg szerkesztésre az /etc/rc.local fájlt. Ez a fájl rendszerjoggal (root) futtatja le a bele írt dolgokat, még rendszerindításkor. Erre lesz most szükségünk. ($ sudo nano /etc/rc.local)

Egyszerűen írjuk bele a két fájl nevét, majd mentsük el.
A fájl végének valahogy így kell kinéznie:
/etc/ramtemp_create.sh
/etc/ramtemp_move.sh
exit 0

Az exit 0 fontos, ne távolítsuk el!

Mivel az rc.local alapból nem fut le, muszáj futtathatóvá tennünk. Írjuk be a következő parancsot: $ sudo chmod +x /etc/rc.local. Ez futtathatóvá teszi, következő indításkor már működni is fog a létrehozás.

A helyreállító szkript telepítéséhez két parancsot kell lefuttatnunk. Létre kell hoznunk két szimbolikus linket két mappában:
$ sudo ln -s ../ramtemp_restore.sh /etc/rc0.d/K10ramtemp_restore.sh
$ sudo ln -s ../ramtemp_restore.sh /etc/rc6.d/K10ramtemp_restore.sh

Előbbi (rc0.d) akkor végzi el a helyreállítást, ha a gépet leállításra utasítjuk, utóbbi (rc6.d) pedig akkor, ha újraindításra.

A mappa áthelyezése ezennel megtörtént.

A Firefox felgyorsítása

A másik nagyon égető probléma a Firefox lassúsága. Érezhetően begyorsult a böngészés ezen aprócska praktikától.

Készítettem még egy szkriptet, ez a Firefox szinkronizálását végzi el.

Lényege
Indításkor a biztonsági mentésből (vagy első futtatáskor az aktuális profilból) kimásolja a tartalmat a ramdiskbe. Leállításkor pedig a régi biztonsági mentést beletömöríti egy .tar.gz fájlba, és az aktuális ramdisk tartalmat átmásolja a merevlemezre. Tehát mindig lesz egy régebbi mentésed, egy aktuális mentésed, és egy aktuális tartalom a RAM-ban.

A szkript
#!/bin/bash

# #################################################
# This script copies the contents of the Firefox
# profile directory to ramdisk, then makes a copy
# into a backup directory (in case of power outage)
#
# After, it makes the original profile directory as
# a symbolic link to the ramdisk.
#
# (Speeds up Firefox like hell)
# #################################################

# * TITLE *
echo
echo -n " "
echo -en '\E[0;31m'"\033[1mFirefox\033[0m"
echo -n " "
echo -en '\E[0;32m'"\033[1mbackup\033[0m"
echo -n " "
echo -e '\E[37;44m'"\033[1mscript\033[0m"
echo # Line feed

# Name of your user
username=logoutuser
# Your user's home directory
userhome=/home/logoutuser
# Name of the profile directory (~/.mozilla/firefox/XYZ.default)
profile=12345abcd.default
# Name of the backup directory and file (file will be stored in userhome)
backup=backup
# Name of the ramdisk directory
ramdisk=/mnt/ram/firefox-$username

# * WELCOME *
echo
echo -en '\E[0;36m'"\033[1mUsername:\033[0m $username"
echo
echo -en '\E[0;36m'"\033[1mHome directory:\033[0m $userhome"
echo
echo -en '\E[0;36m'"\033[1mFirefox profile name:\033[0m $profile"
echo
echo -en '\E[0;36m'"\033[1mFirefox profile path:\033[0m $userhome/.mozilla/firefox/$profile"
echo
echo -en '\E[0;36m'"\033[1mBackup directory:\033[0m $backup"
echo
echo -en '\E[0;36m'"\033[1mBackup diretory path:\033[0m $userhome/.mozilla/firefox/$backup"
echo
echo -en '\E[0;36m'"\033[1mRamdisk directory:\033[0m $ramdisk"


set -efu
cd $userhome/.mozilla/firefox

# If the ramdisk directory is missing, make it
if [ ! -r $ramdisk ]; then
echo -e '\E[0;31m'"\033[1m[RAMDISK DIRECOTRY ($ramdisk) NOT FOUND]\033[0m"
echo -e '\E[0;33m'"\033[1mCreating ramdisk directory\033[0m"
mkdir -m0700 $ramdisk
fi
echo # Line feed

# If the profile directory is not a link to the
# ramdisk, move the profile directory contents to
# the backup directory, then make the profile directory
# a link to the ramdisk.
if [ "$(readlink $profile)" != "$ramdisk" ]; then
echo -e '\E[0;31m'"\033[1m[PROFILE IS STORED ON HDD/SSD]\033[0m"
echo -e '\E[0;33m'"\033[1mMaking initial backup\033[0m"
mv $profile $backup # Move the contents to the backup directory
echo -e '\E[0;33m'"\033[1mMoving contents to ramdisk\033[0m"
ln -s $ramdisk $profile # Make the profile dir. a sym. link to the ramdisk
fi

echo # Line feed

echo -e '\E[0;32m'"\033[1m[SYNCHRONIZING]\033[0m"

if [ -e $profile/.unpacked ]; then
# Make backups
echo -e '\E[0;33m'"\033[1m[RAMDISK IS NEWEST (modified)]\033[0m"

# Make a tarball bakcup of the current backup
echo -e '\E[0;32m'"\033[1m$backup ---> $userhome/$backup.tar.gz\033[0m"
tar --create --gzip --verbose --file $userhome/firefox-$username.tar.gz $backup

# Update backup directory
echo -e '\E[0;32m'"\033[1m$ramdisk ---> $backup\033[0m"
rsync -av --delete --exclude .unpacked ./$profile/ ./$backup/
else
# Copy backup to RAM
echo -e '\E[0;33m'"\033[1m[BACKUP IS NEWEST (maybe fresh boot)]\033[0m"
echo -e '\E[0;32m'"\033[1m$ramdisk <--- $backup\033[0m"

rsync -av ./$backup/ ./$profile/
touch $profile/.unpacked
fi

echo -e '\E[0;32m'"\033[1m[DONE]\033[0m"

Ez a szkript is elérhető letölthető formátumban. firefox.tar.gz

Telepítés
A szkriptben található 5 változó az elején, amit ebben az esetben kötelező módosítani, különben nem fog működni. A változók:
username: az aktuális felhasználód neve (az $USER helyettesítés nem használható, mivel akkor a RAM-ból visszamentés nem működik)
userhome: az aktuális felhasználód saját mappájának neve (alapesetben /home/felhasználónév, de az $HOME helyettesítés nem használható)
profile: a Firefox profilod neve (a ~/.mozilla/firefox mappán belüli valami.default mappa neve)
backup: a biztonsági mentés mappa/.tar.gz fájl neve (ízlés szerint, alapesetben backup)
ramdisk: a ramdisken belüli almappa neve (ízlés szerint, alapesetben /mnt/ram/firefox-$username, ahol a $username a korábban már megadott érték)

Másoljuk be ezt a szkriptet a /etc/init.d mappába: $ sudo cp firefox.sh /etc/init.d/firefox.sh.

Szükséges, hogy indításkor automatikusan lefusson. Ehhez szerkesztenünk kell a ~/.profile fájlunkat ($ nano ~/.profile).

Írjuk bele a következő sort, majd mentsük el:
/etc/init.d/firefox.sh

Hasonlóan járjunk el a ~/.bash_logout fájllal is.

Majd, a /tmp mappa áthelyezésekor leírt módon hozzunk létre két szimbolikus hivatkozást, hogy a szkript leállításkor/újraindításkor is lefusson. Erre a két parancsra lesz szükségünk:
$ sudo ln -s ../init.d/firefox.sh /etc/rc0.d/K10firefox.sh
$ sudo ln -s ../init.d/firefox.sh /etc/rc6.d/K10firefox.sh

A Firefox memóriába gyorsítótárazásának letiltása
Ez egy kicsit akasztjuk a hóhért szituáció. Most, hogy a "merevlemezes" gyorsítótár a memóriában található, nem szükséges, hogy a Firefox a memóriát (mint RAM-ot) gyorsítótárazásra használja. Egyrészt, mivel velem még nem fordult elő, hogy oda gyorsítótárazna akármit is, másrészt pedig, mivel ez a dupla kezelés felesleges.

Nyissuk meg a böngészőt (ha eddig nem lenne), majd írjuk be a címsorba about:config, majd nyomjunk Entert. Meg fogja kérdezni a böngésző, hogy tisztában vagyunk-e azzal, amit csinálunk, biztosítsuk ebben. A betöltött lapon a keresőrészbe írjuk be: cache, majd nyomjunk újra Entert.


A Firefox konfigurációs lapja a keresési találatokkal

A talátok között lesz egy browser.cache.memory.enable nevű. Erre kattintsunk duplán, így átteszi false értékbe. Be is zárhatjuk a böngészőt.

A telepítés befejeződött. Indítsuk újra a gépet.

Végszó

Remélem, eredményesed tudtad használni az itt leírt praktikákat. Ha van egyéb ötleted, kérdésed, javaslatod, bármid, írj hozzászólást. Bármely más mappát is átmozgathatsz a ramdiskbe, ha megfelelően szerkeszted a /tmp áthelyezését végző fájlokat/azok másolatait.

Még egy praktika a ramdiskkel
Ha kényes információval van dolgunk, azt kezelhetjük a ramdiskből is. Ha bármi baj bekövetkezne, annak, hogy a RAM-ból visszanyerjék illetéktelenek, kisebb az esélye, mintha a háttértáron lett volna.

FONTOS! A RAM jellegéből adódóan mindent kitöröl, amikor az áramellátás megszűnik. Ezért kényes, de megőrzendő adatokat ne tároljunk csak itt.