# [HOWTO] Come montare / nella RAM

## Dhaki

Ho tradotto questo HOWTO perché mi sembrava estremamente interessante  :Razz: . Per adesso non l'ho ancora provato, quindi mi raccomando riportate le vostre esperienze. L'originale lo trovate qua.

Attenzione: dato che in 2 giorni é stato modificato 22 volte, aspettatevi frequenti aggiornamenti, e se vi accorgete che é stato aggiornato senza che lo sia anche questo, segnalatemelo per favore. Per lo stesso motivo non assicuro niente sul lato della stabilità e della correttezza della procedura.

-------------------------------------

Questo HOWTO é immaginato a partire da questo (ndt: boh... chi mi illumina sul legame tra i due??)

Vuoi montare / nella RAM per un sistema super-veloce?

Qui c'é quello di cui hai bisogno per far volare la tua gentoo

Requisiti:

- Le seguenti directory in partizioni separate:

/usr

/home (se molto pesante o usata per depositare dati)

/root (come per /home)

/var (cosi da evitare di mettere nella RAM i log o la cache di portage)

- una directory chiamata /newroot

- una partizione disponibile per depositarci dentro i tarballs (non può essere root) Magari usa la partizione che é stat / durante l'installazione

- 176MB di RAM disponibili (dipende da quanto si vuole caricare nella RAM)

Il miglioramento di prestazioni é questo (in ordine di importanza):

```
/usr/lib

/lib

/usr/bin

/bin

/usr/sbin & /sbin
```

Step 1

Installa normalmente

Step 2

Genera i tarballs che vuoi caricare nella RAM.

Salvalo come /sbin/update-balls (controlla che STORE sia montato, e che sia una dir adatta allo scopo):

```
#!/bin/sh

CURRDIR=`/bin/pwd`

STORE="root"

cd /

#Exclude anything that's on it's own partition here

tar cfp ${STORE}/fs.tar * --exclude=usr/* --exclude=root/* --exclude=home/* \

        --exclude=proc/* --exclude=sys/* --exclude=tmp/* --exclude=var/*  \

        --exclude=opt/*

cd /usr/

# rm -fr /usr/bin /usr/sbin /usr/lib

# cp -a /usr/.bin /usr/bin

# cp -a /usr/.sbin /usr/sbin

# cp -a /usr/.lib /usr/lib

cd bin && tar cfp /${STORE}/usr_bin.tar *

cd ../sbin && tar cfp /${STORE}/usr_sbin.tar *

cd ../lib && tar cfp /${STORE}/usr_lib.tar *

# rm -fr /usr/bin /usr/sbin /usr/lib

# mkdir /usr/bin /usr/sbin /usr/lib

cd $CURRDIR 
```

Per farlo eseguire ad ogni riavvio:

```
echo /sbin/update-balls >> /etc/conf.d/local.stop
```

Step 3

Adesso dobbiamo creare un initrd per migliorare l'occupazione del nostro drive RAM prima di caricare init:

```
mount /boot #se necessario

touch /boot/initrd

dd if=/dev/zero of=/boot/initrd bs=1024k count=8

losetup /dev/loop0 /boot/initrd

mke2fs /dev/loop0 
```

Adesso abbiamo loop0 montato come initrd. Per occuparlo:

```
mkdir /mnt/initrd

mount /dev/loop0 /mnt/initrd

cd /mnt/initrd

mkdir etc dev lib bin proc new store

touch linuxrc etc/mtab etc/fstab

chmod +x linuxrc

for I in sh cat mount umount mkdir chroot tar; do cp /bin/$I bin/; done

cp /sbin/pivot_root bin/ 
```

Adesso dobbiamo copiare tutte le librerie per ogni binario che usiamo. Puoi determinare quali copiare cosi:

```
ldd /bin/sh

 linux-gate.so.1 =>  (0xffffe000)

        libdl.so.2 => /lib/libdl.so.2 (0xb7fe2000)

        libc.so.6 => /lib/tls/libc.so.6 (0xb7eca000)

        /lib/ld-linux.so.2 (0xb7feb000) 
```

Significa che per usare /bin/sh abbiamo bisogno di /lib/libdl.so.2 /lib/tls/libc.so.6, lib/ld-linux.so.2 

Questo é tutto quello di cui abbiamo bisogno:

```
ls -R lib

lib:

ld-linux.so.2  libblkid.so.1  libdl.so.2  libuuid.so.1  tls

lib/tls:

libc.so.6  libpthread.so.0  librt.so.1 
```

Controlla ogni binario, secondo le tue necessità. Usa a questo scopo lo script linuxrc (/mnt/initrd/linuxrc):

```
#!/bin/sh

export PATH=/bin

STOREDEV=/dev/hda10

STORE=/store

ROOTSIZE=128m

# Get kernel CMDLINE

mount -t proc none /proc

CMDLINE=`cat /proc/cmdline`

umount /proc

mount $STOREDEV $STORE

# Mount root and create read-write directories

mount -t tmpfs -o size=$ROOTSIZE none /new/ > /dev/null 2>&1

cd /new/ && tar xpf $STORE/fs.tar > /dev/null 2>&1

umount $STOREDEV

# Pivot root and start real init

cd /new

pivot_root . newroot

exec chroot . /bin/sh <<- EOF >dev/console 2>&1

exec /sbin/init ${CMDLINE}

EOF 
```

Una volta fatto questo, abbiamo bisogno di creare i nodi dei device che vogliamo usare:

```
mknod /mnt/initrd/dev/console c 5 1

mknod /mnt/initrd/dev/null c 1 3

mknod /mnt/initrd/dev/hda b 3 0

mknot /mnt/initrd/dev/hda4 b 3 4

mknod /mnt/initrd/dev/hda10 b 3  10 
```

Hai solo bisogno dei nodi dei device che lo script linuxrc usa (vedi /usr/src/linux/Documentation/devices.txt)

E questo é per l'initrd:

```
umount /mnt/initrd
```

Step 4

Modifica /etc/init.d/localmount

```
start() {

        USRBINSIZE=32m

        USRSBINSIZE=2m

        USRLIBSIZE=256m

        # Mount local filesystems in /etc/fstab.

        ebegin "Mounting local filesystems"

        mount -at nocoda,nonfs,noproc,noncpfs,nosmbfs,noshm >/dev/null

        eend $? "Some local filesystem failed to mount"

        ebegin "Mounting RAM filesystems"

        mount -t tmpfs -o size=$USRBINSIZE none /usr/bin > /dev/null 2>&1

        mount -t tmpfs -o size=$USRSBINSIZE none /usr/sbin > /dev/null 2>&1

        mount -t tmpfs -o size=$USRLIBSIZE none /usr/lib > /dev/null 2>&1

        cd /usr/bin && tar xpf /root/usr_bin.tar > /dev/null 2>&1

        cd /usr/sbin && tar xpf /root/usr_sbin.tar > /dev/null 2>&1

        cd /usr/lib && tar xpf /root/usr_lib.tar > /dev/null 2>&1

        eend $? "Some RAM filesystems did not mount" 
```

Step 5

Modifica la conf del bootloader (in questo caso grub)

```
timeout 3

default 0

# For booting GNU/Linux from an existing install (rescue)

title  Gentoo

root (hd0,0)

kernel /bzImage root=/dev/ram0 rw init=linuxrc video=vesafb:ywrap,pmipal,1024x768-16@70

initrd /initrd 
```

Step 6

Se trovi che /usr/lib é troppo grande da mettere nella RAM, magari puoi muovere alcune cose in /usr/local/lib e linkarle, per esempio:

```
cd /usr/lib

for I in perl5 python2.3 portage modules gcc gcc-lib; do

mv $I ../local/lib/

ln -s ../local/lib/$I $I

done 
```

Mettere portage nella RAM é sicuramente un notevole incremento di velocità.

```
time /usr/bin/emerge -s mozilla

real    0m3.680s

user    0m2.978s

sys     0m0.131s
```

Step 7

Finializziamo

```
mv /usr/sbin /usr/.sbin

mv /usr/bin /usr/.bin

mv /usr/lib /usr/.lib

reboot
```

A parte:

Se vuoi caricare solo alcune applicazioni nella RAM, fai qualcosa del genere:

```
##fai questo prima

tar cpf /root/preload.tar /usr/bin/firefox /lib/and /lib/all /usr/lib/of /usr/lib/the /lib/raries/ it's/dependent /lib/on

##rimpiazza tutte i binari originali e le librerie con link a /preload/foo

##Quindi metti questo in /etc/conf.d/local.start

mount -t tmpfs -o size=128m none /preload > /dev/null 2>&1

cd /preload && tar xfp /root/preload.tar
```

Enjoy!!Last edited by Dhaki on Sun Feb 20, 2005 11:52 am; edited 1 time in total

----------

## fedeliallalinea

Aggiunto ai post utilissimi sezione howto. Se puoi mettilo pure su wiki.gentoo-italia.net

----------

## FonderiaDigitale

ricordatevi di comprarvi un UPS buono  :Rolling Eyes: 

EDIT: due critiche:

- vedo che usi tmpfs. a differenza di ramfs, tmpfs usa prima la ram, se la piena passa a scrivere sui dischi. non credo sia quello che tu vuoi (o sbaglio, magari come misura cautelativa?)

- vedo che usi, dopo aver montato i dischi ram, un comando eend generico: per una cosa delicata come un disco, "some filesystems" non puo' essere considerato un'opzione valida. che ne dici di creare un loop per ogni disco e mettere l'eend dentro il loop?

----------

## Guglie

 *Dhaki wrote:*   

> Questo HOWTO é immaginato a partire da questo (ndt: boh... chi mi illumina sul legame tra i due??)

 

l'howto originale sarebbe questo vero?

https://forums.gentoo.org/viewtopic-t-296892.html

 *bet1m wrote:*   

> or only /lib and /usr/lib to put in ram, Firefox will load on 0.01 sec. 

 

da me sono poi "solo" circa 585 Mb, si potrebbe anche fare..

 *Dhaki wrote:*   

> Per farlo eseguire ad ogni riavvio:
> 
> ```
> echo /sbin/update-balls >> /etc/conf.d/local.stop
> ```
> ...

 

non sarebbe local.start?  :Wink: 

----------

## Dhaki

 *FonderiaDigitale wrote:*   

> ricordatevi di comprarvi un UPS buono 
> 
> EDIT: due critiche:
> 
> - vedo che usi tmpfs. a differenza di ramfs, tmpfs usa prima la ram, se la piena passa a scrivere sui dischi. non credo sia quello che tu vuoi (o sbaglio, magari come misura cautelativa?)
> ...

 

Allora, dato che ho solamente tradotto non saprei risponderti sulla prima domanda, dato che la differenza tra ramfs e tmpfs non mi é chiara del tutto. In che senso "a differenza di ramfs"? ramfs non scrive prima sulla ram?

Per la questione dell'eend ho piu o meno capito quello che intendi, solo che temo di fare una cosa poco pulita. Bé, io ci provo e mi correggete.

@Guglie: si che idiota mi sono dimenticato di citare la fonte...

In quanto alla dimensione delle lib... bé, ognuno carica in ram quello che può. È ovvio che non tutti abbiamo 2 GB....

In quanto al local.[stop/start], penso tu abbia ragione, anche se non ne sono troppo sicuro. Ecco, magari dovrei provarlo questo HOWTO...

----------

## flocchini

secondo me invece e' il local.stop visto che se per caso emergi qsa di nuovo lui ad ogni spegnimento aggiorna e la volta dopo hai un sistema in ram aggiornato... ma potrei nn aver capito un tubo. Aspetto che il tutto mi sia un po' piu' chiaro e poi provero' sicuramente, mi sn gia' procurato un disco x gli esperimenti visto che c'e' da smanettare cn le partizioni...  :Wink: 

----------

## kattivo

Volevo ricordare l'esistenza dello slot i-ram pci, con batteria.....se per caso si stakka la spina...non si bestemmia  :Razz: 

----------

## Dr.Dran

 *kattivo wrote:*   

> Volevo ricordare l'esistenza dello slot i-ram pci, con batteria.....se per caso si stakka la spina...non si bestemmia 

 

mmm... interessante praticamente un hdd a tutti gli effetti basato su memorie RAM volatili... voglio darci proprio una buona occhiata  :Very Happy: 

----------

## Truzzone

 *kattivo wrote:*   

> Volevo ricordare l'esistenza dello slot i-ram pci, con batteria.....se per caso si stakka la spina...non si bestemmia 

 

Vedo sprecato una cosa del genere poichè il tutto è limitato alla connessione SATA, se si pensa a 4gb "diretti" negli slot ram   :Wink: 

Ciao by Truzzone   :Smile: 

----------

## kattivo

 *DranXXX wrote:*   

>  *kattivo wrote:*   Volevo ricordare l'esistenza dello slot i-ram pci, con batteria.....se per caso si stakka la spina...non si bestemmia  
> 
> mmm... interessante praticamente un hdd a tutti gli effetti basato su memorie RAM volatili... voglio darci proprio una buona occhiata 

 

io ne ho fatto delle prove con  uno economico della gigabyte..che puo' tenere fino a 4 gb di ram....è un hd a tutti gl'effetti...

li ho provati su un controller SATA della 3ware... in stripping.....volava..!

----------

## netarrow

Ciao a tutti, sono giorni che cerco su gentoo.org, wiki gentoo, sul forum ma non riesco a ripescare quella guida che diceva come montare gentoo sulla ram o qualcosa di simile e che apriva mozilla in 0.2 secondi... so che magari è un po dispersiva come domanda ma non ho neanche trovato le giuste keywords per cercare nel forum o da altre parti; se qualcuno ha capito e si ricorda il tutorial a cui mi riferisco e me lo linka mi fa un favore.

grazie ciao!

----------

## ProT-0-TypE

https://forums.gentoo.org/viewtopic-t-297692-highlight-ram.html

cercavi questo?

----------

## netarrow

SI! grazie mille

----------

## gutter

Ho fatto il merge con il topic indicato da ProT-0-TypE.

----------

## misterwine

Bisogna proprio avere partizioni separate come indicato all' inizio del tip?

Scusate l'ignoranza, ma avendo io queste partizioni:

/

/boot

/home

swap

non posso farci nulla?

[OT] Ho provato prelink seguendo questa guida, ma non ho notato nessun miglioramento in velocità purtroppo.

----------

## fbcyborg

Salve a tutti, 

ho la necessità di montare una directory e tutto il suo contenuto in RAM... 

sto facendo così ma poi non vedo nulla montato:

```
mount -t tmpfs /dir/da/montare/ -o size=4000M,mode=777 /mnt/tmpfs
```

Perché se faccio ls /mnt/tmpfs non vedo il contenuto della directory da montare?

Mi serve per velocizzare l'accesso ad una directory momentaneamente.

Grazie.

----------

## Kernel78

 *fbcyborg wrote:*   

> Salve a tutti, 
> 
> ho la necessità di montare una directory e tutto il suo contenuto in RAM... 
> 
> sto facendo così ma poi non vedo nulla montato:
> ...

 

Con quel comando monti una partizione tmpfs vuota sopra /dir/da/montare ...

----------

## fbcyborg

OK, poi ho copiato quello che mi serviva "in ram" con un cp verso il punto di mount.. ma non ho risolto molto... le prestazioni mi sembra siano le stesse...

----------

## Kernel78

 *fbcyborg wrote:*   

> OK, poi ho copiato quello che mi serviva "in ram" con un cp verso il punto di mount.. ma non ho risolto molto... le prestazioni mi sembra siano le stesse...

 

Le prestazioni non cambiano di una virgola, quello che cambia è il tempo di caricamento dell'applicazione.

/EDIT:scusa, non avevo letto bene quello che avevi scritto ... descrivi meglio il tuo problema, cosa hai copiato in ram e come fai a dire che le prestazioni sono le stesse ?

----------

## napass

boolean RIESUMAZIONE_THREAD = true;   :Very Happy: 

a parte gli scherzi, mi sembra un buon howto... qualcuno ci ha provato davvero??   :Very Happy: 

non ci sono rischi nel caso vada via la corrente e si ha un pc senza UPS ??

accetto vari consigli...   :Very Happy: 

grazie!!

ciao ciao

----------

## Kernel78

 *napass wrote:*   

> boolean RIESUMAZIONE_THREAD = true;  
> 
> a parte gli scherzi, mi sembra un buon howto... qualcuno ci ha provato davvero??  
> 
> non ci sono rischi nel caso vada via la corrente e si ha un pc senza UPS ??
> ...

 

Innanzi tutto sappi che hai rischi se va via la corrente e non hai un UPS a prescindere da questo howto.

Io mi ci sono trovato benissimo, ho provato qualche variazione sul tema ma in linea di massima non ho mai avuto problemi (io ho un UPS).

----------

## napass

 *Kernel78 wrote:*   

> 
> 
> Innanzi tutto sappi che hai rischi se va via la corrente e non hai un UPS a prescindere da questo howto.
> 
> Io mi ci sono trovato benissimo, ho provato qualche variazione sul tema ma in linea di massima non ho mai avuto problemi (io ho un UPS).

 

bhè allora mi sa che devo abbandonare l'idea... non è frequente che capiti un'interruzione di corrente ma può sempre accadere...

grazie!   :Wink: 

----------

## Kernel78

 *napass wrote:*   

>  *Kernel78 wrote:*   
> 
> Innanzi tutto sappi che hai rischi se va via la corrente e non hai un UPS a prescindere da questo howto.
> 
> Io mi ci sono trovato benissimo, ho provato qualche variazione sul tema ma in linea di massima non ho mai avuto problemi (io ho un UPS). 
> ...

 

Ribadisco che se va via la corrente (o se ci sono sbalzi) e non hai un UPS corri sempre dei rischi che si sputtani qualcosa a livello di software o di hardware.

Usare questo metodo ti espone solo a qualche rischio in più.

Io consiglio l'UPS a tutti ...

----------

