Hlavní navigace

Ramdisk v jádrech 2.4.x

Martin Froněk

Někteří z vás se již možná s větším či menším úspěchem pokoušeli koketovat s ramdiskem v linuxových jádrech 2.4.x Tento článek vám pomůže ramdisk vytvořit, úspěšně používat, a upozorní vás na případná úskalí této technologie.

Většině z vás není jistě třeba ramdisk představovat, ale pokud by snad někdo nevěděl, o čem je řeč, krátce tuto techniku popíšu. Ramdisk je vyhrazená oblast paměti, která funguje jako velmi rychlý disk. V minulosti to nebylo nijak zajímavé, protože paměti RAM byly velmi drahé, a tak nebylo používání ramdisků příliš běžné. Dnes je vše jinak, 256 MB paměti můžete pořídit okolo 1300,– Kč bez DPH. Proto také vznikl tento článek, který má za cíl naučit vás efektivně ramdisk používat.

Ramdisk je podporován mimo jiné i přímo v jádře dodávaném s RH 7.1 (všechny informace se týkají jádra 2.4.x z distribuce Red Hat Linux 7.1, čímž nechci hodnotit ostatní distribuce) a ve výchozím nastavení má velikost 4MB. To může postačovat pro testování funkčnosti ramdisku, my si ale ukážeme, jak lze nastavit velikost podle našich potřeb. Výchozí nastavení změníte zápisem řádky:

ramdisk=X

do souboru /etc/lilo.conf, přičemž X je velikost ramdisku v Kb, tedy například 32000 znamená velikost ramdisku 32MB. Optimální velikost ramdisku je asi 1/3 fyzické paměti, máte-li 128MB a víc RAM. Nezapomeňte po úpravě souboru /etc/lilo.conf spustit příkaz lilo, aby byly provedené změny platné. Existuje i jiný způsob nastavení velikosti ramdisku, ale při jeho použití jsem měl problémy (rozsypala se mi znaková sada), a proto jej zde raději neuvádím.

Tímto postupem nastavíme velikost ramdisku, ale stále jej ještě není možné používat. Nejprve je vhodné paměť přidělenou pro ramdisk vyčistit. Nejlépe to provedete kopírováním ze zařízení /dev/null příkazem:

dd if=/dev/null bs=1024 of=/dev/ramdisk count=X

kde X je velikost ramdisku v Kb. Doporučuji stejnou hodnotu jako v parametru ramdisk v souboru /etc/lilo.conf. Nastavením menší hodnoty nebude vynulována celá oblast paměti, vyšší hodnota způsobí chybové hlášení. V některých distribucích nemusí být v adresáři /dev přítomen symlink ramdisk, v takovém případě použijte zařízení  /dev/ram0.

Dále je nutné vytvořit v ramdisku souborový systém. To zajistí příkaz

mkfs.ext2 /dev/ramdisk

Někdo může namítnout, že by byl vhodnější jiný souborový systém – nic tomu nebrání, ramdisk může být provozován s jakýmkoliv souborovým systémem. Dále je nutné připojit tento svazek do adresářového stromu, což lze provést zcela běžným příkazem

mount /dev/ramdisk /data/ramdisk

kde prvním parametrem je připojovaný svazek, druhým parametrem je místo ve stromu adresářů, odkud bude ramdisk přístupný. Výše uvedený příklad předpokládá, že je vytvořen adresář /data/ramdisk.

Takto vytvořený ramdisk můžeme používat, ale při ukončení běhu systému jsou zde uložená data ztracena. V některých případech to nevadí, ale většinou budeme chtít data někam uložit a při dalším startu systému opět zpřístupnit. Toho lze dosáhnou následujícím způsobem.

Data z ramdisku zkopírujeme do souboru /data/ramdisk.img příkazem:

dd if=/dev/ramdisk bs=1024 of=/data/ramdisk.img

Takto zkopírujeme celou paměťovou oblast ramdisku, bez ohledu na použitý souborový systém a strukturu adresářů. Jedná se o nejrychlejší možný způsob uchování informací z ramdisku. Pokud provedeme předchozí příkaz, bude v souboru /data/ramdisk.img uložen obsah ramdisku, který lze do paměťové oblasti ramdisku opět umístit pomocí příkazů:

umount /dev/ramdisk
dd if=/data/ramdisk.img bs=1024 of=/dev/ramdisk
mount /dev/ramdisk /data/ramdisk

Celý postup lze shrnout do jednoduchého skriptu, na něj poté udělat symbolické linky v adresářích /etc/rcx.d  – a nemusíme se již o nic starat, systém to udělá při ukončení respektive startu za nás.

Příklad skriptu je zde:

#!/bin/sh
#
# description: Starts and stops RAMDISK

# Source function library.
. /etc/rc.d/init.d/functions

# Check that ramdrive.conf exists.
[ -f /etc/sysconfig/ramdisk ] || exit 0
if [ -f /etc/sysconfig/ramdisk ] ; then
   . /etc/sysconfig/ramdisk
fi

# See how we were called.
case "$1" in
  start)
        action $"Starting RAMDISK: ${IMAGE}" \
        dd if=${IMAGE} bs=1024 of=/dev/ramdisk
        fsck /dev/ramdisk
        mount /dev/ramdisk ${MOUNTPOINT}
        touch /var/lock/subsys/ramdisk
        ;;
  stop)
        action $"Shutting down RAMDISK: ${IMAGE}" \
        dd if=/dev/ramdisk bs=1024 of=${IMAGE} 2>/dev/null
        umount /dev/ramdisk
        echo
        rm -f /var/lock/subsys/ramdisk
        ;;
  restart)
        echo -n "Restarting RAMDISK: "
$0 stop
        $0 start
        echo "done."
;;
  *)
        echo "Usage: ramdisk {start|stop|restart}"
exit 1
esac

V tomto skriptu je ještě použit konfigurační soubor /etc/sysconfig/ramdisk, ve kterém je v proměnných prostředí ${IMAGE}, ${MOUNTPOINT} uvedeno, kde se nachází soubor ramdisk.img a kam se má ramdisk připojit ve stromu adresářů. Není nutné tento soubor použít, ale sníží se tím riziko chyby a tím i ztráty dat.

Ještě zbývá umístit patřičné symlinky do adresářů /etc/rc.d/rc3.d, /etc/rc.d/rc0.d a /etc/rc.d/rc6.d (na RH, jiné distribuce mohou používat poněkud odlišnou strukturu startovacích skriptů).

Do adresáře /etc/rc.d/rc3.d umístíme symlink nazvaný například  S82ramdisk.

Do adresáře /etc/rc.d/rc0.d umístíme symlink nazvaný například  K02ramdisk.

Do adresáře /etc/rc.d/rc6.d umístíme symlink nazvaný například  K02ramdisk.

Tyto názvy jsou v distribuci RH7.1 nepoužité.

Dobře si prohlédněte ukázkový skript. Především si všimněte, že při ukončení činnosti ramdisku je nejprve jeho obsah uložen do souboru, a teprve potom je ramdisk uvolněn příkazem umount. (pro tento časový úsek je pochopitelně záhodno zajistit, aby s obsahem ramdisku nikdo nepracoval – pozn. redakce)

Ramdisk je vhodné používat pro ukládání velmi rychle se měnících dat, která musí být také rychle k dispozici – lze do něj např. ukládat databázové soubory či podobná data. Osobně používám ramdisk ke sdílení souborů databázového charakteru prostřednictvím Samby mezi uživateli platformy Windows. Oproti klasickému disku došlo k více než stonásobnému zrychlení vyhledávání. Doufám, že vám tento článek bude nápomocný při tvorbě vašeho vlastního ramdisku.

Našli jste v článku chybu?
15. 6. 2004 23:38
dejvyd (neregistrovaný)

Co tahle? Microstar 865PE NEO2-PFS Popis: Chipset Intel 865PE, CPU P4 do 3,6GHz/800MHz socket 478 připraveno pro Prescott, FSB 800/533/400(pouze Northwood) MHz , IDE ATA 66/100, 2x SATA /150 raid 0 nebo 1, Dual channel DDR266/333/400/433/466/500/533 MHz max 4GB, 5xPCI, 1xAGP 8x/4x. Bratru za 2700 bez DPH...

6. 9. 2002 14:32
Petr (neregistrovaný)

MAN TMPFS tmpfs puts everything into the kernel internal caches and grows and shrinks to accommodate the files it contains and is able to swap unneeded pages out to swap space. It has maximum size limits which can be adjusted on the fly via 'mount -o remount ...' If you compare it to ramfs (which was the template to create tmpfs) you gain swapping and limit checking. Another similar thing is the RAM disk (/dev/ram*), which simulates a fixed size hard disk in physical RAM, where you h…