RAMdisk na Linuxe

19.11.2008 11:02 | catcher

Linux nam ponuka velmi zaujimavy strojcek – RAMdisk. V dnesnej dobe, ked cena pamate RAM je na historickom minime a 1GB je smiesne lacny, sa nam naskyta velmi prijemna moznost prace so subormi, ktore potrebujeme casto citat a zapisovat do nich. RAMdisk je totiz neuveritelne rychly. Dalsou moznostou je zapisovat na RAMdisk citlive data, ktore nechceme zapisovat (a nechavat po nich stopy) na HDD – data ulozene na RAMdisku su po vypnuti PC nenavratne stratene bez akejkolvek sance na ich obnovu.

Ako?

Linux ma pripravenych niekolko RAMdiskov defaultne:

[catcher@localhost ~]$ ls -lah /dev/ram*
lrwxrwxrwx 1 root root    4 2008-11-18 16:23 /dev/ram -> ram1
brw-rw---- 1 root disk 1,  0 2008-11-18 16:23 /dev/ram0
brw-rw---- 1 root disk 1,  1 2008-11-18 16:23 /dev/ram1
brw-rw---- 1 root disk 1, 10 2008-11-18 16:23 /dev/ram10
brw-rw---- 1 root disk 1, 11 2008-11-18 16:23 /dev/ram11
brw-rw---- 1 root disk 1, 12 2008-11-18 16:23 /dev/ram12
brw-rw---- 1 root disk 1, 13 2008-11-18 16:23 /dev/ram13
brw-rw---- 1 root disk 1, 14 2008-11-18 16:23 /dev/ram14
brw-rw---- 1 root disk 1, 15 2008-11-18 16:23 /dev/ram15
brw-rw---- 1 root disk 1,  2 2008-11-18 16:23 /dev/ram2
brw-rw---- 1 root disk 1,  3 2008-11-18 16:23 /dev/ram3
brw-rw---- 1 root disk 1,  4 2008-11-18 16:23 /dev/ram4
brw-rw---- 1 root disk 1,  5 2008-11-18 16:23 /dev/ram5
brw-rw---- 1 root disk 1,  6 2008-11-18 16:23 /dev/ram6
brw-rw---- 1 root disk 1,  7 2008-11-18 16:23 /dev/ram7
brw-rw---- 1 root disk 1,  8 2008-11-18 16:23 /dev/ram8
brw-rw---- 1 root disk 1,  9 2008-11-18 16:23 /dev/ram9
lrwxrwxrwx 1 root root    4 2008-11-18 16:23 /dev/ramdisk -> ram0

Defaultne je ich velkost nastavena na 4096 kB. Velkost RAMdiskov vsak mozeme upravit pocas bootu systemu, a to tak, ze kernelu podsupneme parameter ramdisk_size=pocet_kB, takto:

title Fedora (2.6.25-14.fc9.i686)
root (hd0,1)
kernel /boot/vmlinuz-2.6.25-14.fc9.i686 ro root=UUID=133070c1-d881-4279-8543-c55a04e126c9 rhgb ramdisk_size=1331200 quiet
initrd /boot/initrd-2.6.25-14.fc9.i686.img

urcite ste si vsimli parameter ramdisk_size=1331200. Ten zabezpeci, ze velkost kazdeho RAMdisku bude priblizne 1.3 GB. RAMdisk vsak zacne fungovat (a zaberat priestor v operacnej pamati) az potom, ako nanom vytvorime filesystem. On sa sprava ako device, ktore moze byt naformatovane prikazom mkfs (vtedy si alokuje realne stranky v pamati) a nasledne mountnute:

[root@localhost mnt]# mkfs.ext3 -m 0 /dev/ram0
mke2fs 1.41.0 (10-Jul-2008)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
83248 inodes, 332800 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=343932928
11 block groups
32768 blocks per group, 32768 fragments per group
7568 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done                           
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Parameter m urcuje pocet percent blokov, ktore maju byt vyhradene pre roota – za inych okolnosti velmi prospesny strojcek, ktory vsak teraz nepotrebujeme a vyuzijeme celu velkost ramdisku na vlastne potreby.

Potom uz len:

[root@localhost mnt]# mount /dev/ram0 /mnt/ramdisk0
[root@localhost mnt]# df -h /mnt/ramdisk0
Filesystem            Size  Used Avail Use% Mounted on
/dev/ram0            1.3G  34M  1.3G  3% /mnt/ramdisk0
[root@localhost mnt]# cd /mnt/ramdisk0
[root@localhost ramdisk0]# ls
lost+found

Mame kusok RAMky namountovany na stroji a mozeme si s nim robit co chceme. A teraz male porovnanie:

[root@localhost ramdisk0]# cd
[root@localhost ~]# pwd
/root
[root@localhost ~]# dd if=/dev/zero of=./test bs=4M count=25
25+0 records in
25+0 records out
104857600 bytes (105 MB) copied, 1.76338 s, 59.5 MB/s
[root@localhost ~]# rm test
rm: remove regular file `test'? y
[root@localhost ~]# cd /mnt/ramdisk0
[root@localhost ramdisk0]# pwd
/mnt/ramdisk0
[root@localhost ramdisk0]# dd if=/dev/zero of=./test bs=4M count=25
25+0 records in
25+0 records out
104857600 bytes (105 MB) copied, 0.241366 s, 434 MB/s

Podla tohoto testu je zapis 4MB blokov na ramdisk priblizne 9 nasobne rychlejsi ako zapis takych istych blokov na HDD.

Vyuzitie RAMdisku by sa dala nechat na vasej fantazii, ja spomeniem napriklad tie casti DocumentRootu apacha, ktore sa casto pouzivaju. Dalsim vhodnym vyuzitim je napriklad vytvorenie 4GB Ramdisku, na ktorom sa vytvori virtualny stroj pod vmware. Umiesti sa nan jeho 4GB HDD file (*.vmdk a *-flat.vmdk), a OS virtualneho stroja sa nastavi tak, aby na tento svoj disk swapoval. Zrychlenie samotneho stroja bude nevidane. Dalsim vhodnym vyuzitim je vytvorit na RAMdisku filesystem /tmp – jeho automaticke mazanie po kazdom reboote by bolo zabezpecene povahou RAMdisku a najnebezpecnejsie subory na systeme (sockety pre ssh) by nikdy neboli zapisane na HDD, co je velmi vyhodna bezpecnostna politika.

Ako by ste vyuzili RAMdisk vy?

Tomas catcher Tudja, 19 Novembra 2008

    • Re: RAMdisk na Linuxe 19.11.2008 | 11:27
      schrapnel   Návštevník

      Hmmm co sa tyka virtualnej masiny v tmp je to vyborny napad ... to skusim
      Maly ryp: solaris ma /tmp ako sucast ramky

      edit: predpokladam, ze velkost ramdisku je limitovana fyzickou velkostou RAM, ze? ;) Gosh, virtualka v nej nebude :(

      • Re: RAMdisk na Linuxe 19.11.2008 | 12:29
        Avatar catcher   Používateľ

        Ten virtualny stroj v RAMdisku je zatial len surovy napad, realizovat ho budem az ked si v robote prelobujem nejakych par GB pamate (co pojde pri momentalnej krize dost ztuha... aj USB kluc mi nechcu dat 8GB, len 2GB udajne kvoli financnej krize :>)

        Velkost ramdisku je samozrejme limitovana velkostou extended memory (virtualka sa nevztahuje, resp som neskusal, co spravi system ak mu urcim ramdisk_size viac ako realne mnozstvo fyzickej pamate). Ak by aj nebola, z funkcneho hladiska by nam RAMdisk, ktoreho cast je na HDD nemusel byt vzdy az takou vyhrou.

        Pokial sa nemylim, tak v ranych 2.6 kerneloch bola velkost ramdisku limitovana na 1GB. Dnes, v dobe maticnych dosiek za 5 000 korun s moznostou instalovat 16GB pamate by akykolvek limit pod realnou velkostou pamate bol dost spiatocnicky (samozrejme, netreba zabudat na low memory a nevytvarat RAMdisky cez celu pamat :>)

      • Re: RAMdisk na Linuxe 24.11.2008 | 21:41
        sh0ck   Návštevník

        jop, /tmp na solarise mas z ramky.
        Default tusim nelimitovany. Cize napriklad ked ti nejaky special kopiruje do rw tempu a zaplni ti ram+swap -> konci to freezom masiny.

      • Re: RAMdisk na Linuxe 11.12.2008 | 12:23
        Avatar blackhole_ventYl   Používateľ

        dtto v linuxe, je to vynutene udevom.

        ---
        Cuchat s nadchou, to je ako sniffovat bez promiscu.

        --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
    • Re: RAMdisk na Linuxe 19.11.2008 | 11:56
      Avatar vektor   Používateľ

      Pridam informaciu, ktora moze zaujimat Ubuntistov: ti maju defaultne vytvoreny ramdisk v /dev/shm - je to r/w adresar, ktoreho obsah je v RAM (a nie je perzistentny, pochopitelne).

      Inak si myslim, ze ak OS dobre cachuje (co Linux robi), nepotrebujes pre jeho zrychlovanie ramdisk.

      To vyuzitie s virtualnym diskom ma tu nevyhodu, ze musis pri kazdom vypnuti host OS zalohovat na normalny HDD, co bude vzdy trvat krute dlho (nehovoriac o vypadkoch napajania).

      /tmp podla mna prave netreba davat na ramdisk, cachovanie to riesi samo a lepsie.

      _________________________ There is some SERIOUS sh*t going on right now!
      • Re: RAMdisk na Linuxe 19.11.2008 | 12:16
        Avatar betmen   Používateľ

        myslim, ze catcher mal na mysli skor rozne aplikacie (diskova cache proxy servera) nez system ako taky.
        ______________
        nález plný strát

        ______________ kam by som chodil...na dvor
    • Re: RAMdisk na Linuxe 19.11.2008 | 12:08
      Avatar betmen   Používateľ

      som akurat skepticky voci prezentacii, ktoru si urobil. na akom hw si to testoval? lebo prave pri vytvoreni nuloveho suboru z /dev/zero nevidiet pri beznom hw takmer ziadny rozdiel.
      ______________
      nález plný strát

      ______________ kam by som chodil...na dvor
      • Re: RAMdisk na Linuxe 19.11.2008 | 12:22
        Avatar catcher   Používateľ

        Ano, samozrejme to zavisi na HW, cielom bolo ukazat, ze na akomsi generic HW (normalny disk v normalnom kompe za 20 000) je ten rozdiel v rychlosti zapisu asi takyto. Samozrejme sa to da testovat aj inym sposobom a s vyssou relevanciou, ale to uz fakt nechavam na fantazii citatelov. Uznavam, ze pri tom teste sa slusilo uviest parametre HW... asi to tam dopisem, az budem mat cas.

    • Re: RAMdisk na Linuxe 20.11.2008 | 01:41
      Harvie   Návštevník

      Pekne... jen pokud mohu podotknout, tak ramdisk se da vytvorit take pres
      # mount tmpfs /nejaky/adresar (typicky /tmp)
      nevim, v cem je rozdil, ale soubory v tmpfs se presouvaji do swapu (kdyz dojde pamet a pokud je swap k dispozici)
      Taky je potreba si dat pozor na to, ze byly ruzne (uspesne) pokusy obnovit obsah RAM po vypnuti pocitace
      Vetsinou slo o vytahnuti ze zasuvky a rychle nabootovani nejakeho live linuxu, ktery pak pamet dumpnul a nebo z ni vygrepoval citlive informace... Este lepsi vysledky byly dosazeny pri podchlazeni pameti tekutym dusikem pred vypnutim. Jinak receno ani co je v ramce neni bezpecne. Stejne jako se tam dostane root, se tam dostane i nekdo, kdo dostatecne rychle pocitac zrestartuje...

    • Re: RAMdisk na Linuxe 20.11.2008 | 13:45
      Marki   Návštevník

      No neviem, preco v dnesnej dobe pouzivat ramdisky ked mame shm? Ramdisky sa uz pouzivaju viac-menej len pri bootovani cez initrd. Shm priamo filesystem, ktory je ulozeny v RAM. Na rozdiel od ramdisku neobsadzuje hned celu RAM, ale len tolko, kolko dat nanho nahras.
      Defaultne byva namountovany do /dev/shm s maximalnou velkostou rovnajucou sa polovici RAM. Ale mozes si takych filesystemov namountovat kolko chces. Ja tak mam napr. /var/lib/php5/sessions.
      Ako filesystem sa pri mount pouziva tmpfs, cize napr. moj zaznam /etc/fstab:
      tmpfs /var/lib/php5/sessions tmpfs nosuid,nodev,noexec,size=150M,uid=1002,gid=1002,mode=1733 0 0