# [Tip]Portage ristretto in 30Mb con squashfs, tmpfs e unionfs

## Sparker

 Attenzione:

 06/04/2006 aggiornato con il nuovo script potenziato fornito da matrix.

I problemi tra unionfs ed rsync sono stati risolti, funziona di nuovo perfettamente  :Smile:  (testato con versione 1.1.3)

Nel kernel 2.6.16 è stato cambiato VFS e unionfs-1.1.3 non funziona correttamente. Ora la versione 1.1.3-r1 di unionfs in portage comprende una patch per farlo funzionare con il nuovo VFS.

L'idea originale per il tip è partita da questo topic

Attenzione: non mi assumo nessuna responsabilità per l'eventuale distruzione delle vostre macchine.

Portage ristretto in 30Mb con squashfs, unionfs e tmpfs

Introduzione

Forse non ci avete mai fatto caso, ma ormai portage su ext3 occupa ben 600mb. E su reiserfs non andiamo molto meglio (credo sui 350mb).

Se sugli hd moderni questo non non è un grosso problema, può esserlo su pc più datati, e comunque anche con il mio 200gb trovo fastidioso buttare 600mb inutilmente. (Per tacere del mio portatile...)

L'idea è comprimere portage usando un file system compresso, squashfs2.x.

Attualmente i 600Mb di portage, compressi con squasfs, generano un file da meno di 30mb!

Il problema è che squasfs è un file system in sola lettura e quindi l'aggiornamento comporta la copia dei dati su hard disc e la creazione di una nuova immagine, diminuendo drasticamente l'utilità del trick.

La soluzione

Usare unionfs, ma è ovvio!!

Unionfs è uno stackable file system, in pratica permette di sovrapporre più directory, sia in sola lettura che in lettura/scrittura, e di unirne il contenuto in una sola directory virtuale.

Nel tip andremo a montare portage compresso con squashfs in una directory. Tale directory sarà posizionata alla base della pila in read-only, sopra la quale andremo ad impilare una directory montata in ram tramite tmpfs in lettura/scrittura, dove verranno effettivamente edeguite le modifiche a portage. Unionfs scriverà i file nuovi o modificati nella directory tmpfs ed al contempo memorizzerà la cancellazione dei files. Infine creeremo un nuovo snapshot di portage in squashfs comprimendo la directory creata dalla pila unionfs.

Strumenti necessari

Un kernel patchato per il supporto a squashfs 2.x, ad esempio gentoo-sources

Gli squashfs-tools:

```
emerge squashfs-tools
```

Il pacchetto unionfs:

Se non siete utenti ~x86 o ~amd64 è necessario smascherarlo:

```
echo "sys-fs/unionfs" >> /etc/portage/package.keywords
```

Attenzione:

unionfs installa un modulo del kernel, quindi ad ogni cambio di versione del kernel unionfs dovrà essere ri-emerso.

Preparazione ambiente

squashfs è read-only, quindi è necessario spostare le directory per i distfiles ed i pacchetti precompilati fuori da /usr/portage

```

mv /usr/portage/distfiles /usr/

mv /usr/portage/packages /usr/

```

Editare /etc/make.conf aggiungendo le seguenti righe:

```

DISTDIR=/usr/distfiles

PKGDIR=/usr/packages

```

E' utile montare il portage in automatico all'avvio, modificare /etc/fstab aggiungendo la seguente riga:

```

/usr/portage.sqfs       /usr/portage     squashfs         loop,ro  0 0

```

Il file portage.sqfs verrà salvato in /usr

Creazione dello snapshot quashfs di portage iniziale

Caricare il modulo del kernel per squashfs, se necessario:

```
modprobe squashfs
```

Creare lo snapshot:

```
mksquashfs /usr/portage /usr/portage.sqfs
```

Liberare un pò di spazio  :Smile: 

```
rm -r /usr/portage/*
```

tip: se volete fare test in tutta sicurezza, fate una copia di backup dello snapshot, vi eviterete di riscaricare tutto portage in caso di corruzione del file squashfs.

Script di aggiornamento portage

Innanzitutto è necessario caricare i moduli del kernel (se necessario):

```

modprobe squashfs

modprobe unionfs

```

Lo script di aggiornamento. I commenti a dopo:

```

#!/bin/bash

RAMDISK_SIZE="50M"

RAMDISK_DIR="/usr/portage_ramdisk"

PORTAGE_FILE="/usr/portage.sqfs"

PORTAGE_DIR="/usr/portage"

NICENESS="19"

cleanup_sync() {

        umount ${PORTAGE_DIR} && umount ${PORTAGE_DIR} && umount ${RAMDISK_DIR} && mount ${PORTAGE_DIR}

}

renice ${NICENESS} -p $$

echo ">> Checking squashed portage ..."

if [ "$(losetup -a |grep ${PORTAGE_FILE} | wc -l)" -eq 0 ]; then

        mount -t squashfs -o loop,ro ${PORTAGE_FILE} ${PORTAGE_DIR} &>/dev/null

        if [ "$?" -ne 0 ];then

                echo "!> Error: can't mount $PORTAGE_FILE ..."

                exit -1

        fi

fi

echo ">> Creating ramdisk at: ${RAMDISK_DIR} [ ${RAMDISK_SIZE} ] ..."

while [ "$(grep ${RAMDISK_DIR} /proc/self/mounts |wc -l)" -ne 0 ]; do

        umount ${RAMDISK_DIR} &>/dev/null

done

rm -rf ${RAMDISK_DIR} && mkdir -p ${RAMDISK_DIR}

mount -t tmpfs tmpfs -o size=${RAMDISK_SIZE},mode=770 ${RAMDISK_DIR}

if [ "$?" -ne 0 ];then

        echo "!> Error: can't mount ramdisk..."

        exit -1

fi

echo ">> Creating unionfs workspace ..."

mount -t unionfs -o dirs=${RAMDISK_DIR}=rw:${PORTAGE_DIR}=ro none ${PORTAGE_DIR}

if [ "$?" -ne 0 ];then

        umount ${RAMDISK_DIR} && rm -rf ${RAMDISK_DIR}

        echo "!> Error: can't create unionfs ..."

        exit -1

fi

echo ">> Proceding to sync for portage ..."

emerge --sync

if [ "$?" -ne 0 ]; then

        echo "!> Warning: sync is incomplete! Restoring last portage ..."

        cleanup_sync

        echo ">> Recover complete"

        exit -1

fi

cp ${PORTAGE_FILE} ${PORTAGE_FILE}-last

mksquashfs ${PORTAGE_DIR} ${PORTAGE_FILE}-new -noappend -check_data

if [ "$?" -ne 0 ]; then

        echo "!> Warning can't create new squashed portage! Restoring last portage ..."

        mv ${PORTAGE_FILE}-last ${PORTAGE_FILE}

        cleanup_sync

        echo ">> Recover complete"

        exit -1

fi

echo ">> Mounting new portage & update eix cache ..."

cp ${PORTAGE_FILE}-new ${PORTAGE_FILE}

cleanup_sync

if [ "$?" -ne 0 ]; then

        echo "!> Warning: portage corrupted! Restoring last portage ..."

        mv ${PORTAGE_FILE}-last ${PORTAGE_FILE}

        cleanup_sync

        echo ">> Recover complete"

        exit -1

fi

rm -rf ${PORTAGE_FILE}-last

sleep 1

echo ">> Update Complete!"

```

Salvare lo script in un file del vostro path e rendeterlo eseguibile.

Ad esempio io uso /root/bin/emsync

Eseguire emsync per aggiornare portage e verificare che tutto funzioni.

Commenti allo script:

- Portage viene rimontato in /root/portage poichè l'aggiornamento deve essere effettuato da emerge proprio in /usr/portage. Se si utilizzasse un'altra directory temporanea la cache in /var/cache/edb/dep/ si riferirebbe alla directory temporanea e non a /usr/portage

- L'opzione di unionfs "-o dirs=${RAMDISK_DIR}=rw:${PORTAGE_DIR}=ro" viene letta da sinistra a desta: la directory più a sinistra è in cima alla pila, quella a destra più in basso.

- L'opzione size=50M di tmpfs non alloca immediatamente 50Mb di memoria, ma consente di allocare fino a 50Mb, ma solo se necessari.

Suggerimenti per eventuali varianti

Aggiornamento senza tmpfs (se avete poca ram):

basta passare come opzione una directory qualsiasi quando si monta l'unionfs al posto della directory tmpfs, ed avere l'accortezza di svuotarla ad aggiornamento concluso.

Esportazione di portage via nfs:

purtroppo una directory sulla quale è montato un file squashfs non è esportabile via nfs. La soluzione è salvare portage.sqsh in una directory dedicata ed esportare la directory. Il client dovrà montare direttamente il file squashfs. Questo ha lo svantaggio che anche il client deve essere patchato squashfs.

Compressione di /var/cache/edb/dep/:

du -sh /var/cache/edb/dep/

83M     /var/cache/edb/dep/

mksquashfs /var/cache/edb/dep/ cache.sqfs

du -sh cache.sqfs

2,2M    cache.sqfs

Risparmio notevole!

Tale directory viene aggiornata automaticamente alla fine di emerge sync o manualmente tramite emerge metadata.

Inoltre viene toccata anche dai normali emerge, quindi è necessario che sia scrivibile.

Un modo per ovviare al problema è comprimere la directory con squashfs, montarla e quindi montarle sopra una normale directory scrivibile tramite unionfs. All'aggiornamento del portage si aggiorna lo snapshot

Conclusioni

Suggerimenti, critiche e correzioni sono ben accette.

Ringraziamenti

Ringrazio:

 darkimage per l'idea originale

 matrix per lo script di aggiornamento potenziato

 makoomba per i consigli sulla gestione di /var/cache/edb

Last edited by Sparker on Fri Apr 07, 2006 2:21 pm; edited 12 times in total

----------

## randomaze

 *Sparker wrote:*   

> Usare unionfs, ma è ovvio!!
> 
> Unionfs è uno stackable file system, in pratica permette di sovrapporre più directory, sia in sola lettura che in lettura/scrittura, e di unirne il contenuto in una sola directory virtuale.

 

Molto interessante  :Smile: 

Questo potrebbe mandare in pensione l'howto di darkimage.

Dal punto di vista delle prestazioni qual'é la situazione? Dopo quanti quanto tempo (o quante sovrascritture di portage) conviene ricostruire lo snapshot dello squash?

----------

## federico

MOLTO interessante.

Impressioni all'utilizzo?

Prima di testarlo volevo qualche parere personale da parte di chi lo ha utilizzato.

----------

## Sparker

Il mio scriptino ricrea lo snapshot ogni volta, poichè si appoggia alla RAM per le modifiche:

Sul mio AthlonXP 2600 (con in /usr/portage montato lo snapshot compresso)

time mksquashfs  /usr/portage  /root/portage.sqfs

real    0m22.503s

user    0m11.549s

sys     0m10.070s

22 secondi per creare lo snapshot mi sembrano un'inezia, rispetto alla parte di aggiornamento della cache.

Se non ricordo male, per creare uno snapshot da portage non compresso impiega almeno il doppio.

emerge -S non è più veloce: sospetto che lavori direttamente sulla cache in /var/cache/edb, che sono circa 90Mb. Come ho suggerito, potrebbe essere interessate provare a comprimere anche la cache, ma non ho ancora provato.

Le mie impressioni sulle prestazioni sono che si ha solo un risparmio di spazio e non un incremento prestazionale, (o almeno non notevole)

----------

## xchris

molto interessante..

e' carino da usare su una usbstick da 1GB oppure una CF per un minisistema con portage funzionante!

(quindi non un sistema RO)

Complimenti!

ciao

----------

## redview

che storia sta roba! la proverò!

intanto vorrei sapere: io di solito uso esync piuttosto che emerge sync. cosa dovrei cambiare per continuare così??

grazie mille!   :Smile: 

----------

## Sparker

 *redview wrote:*   

> 
> 
> intanto vorrei sapere: io di solito uso esync piuttosto che emerge sync. cosa dovrei cambiare per continuare così??
> 
> 

 

basta che nello script di aggiornamento metti esync al posto di emerge sync

----------

## redview

da quanto uso squashfs al boot mi viene dato un msg di errore sul mount di un filesystem, tuttavia sembra funzionare tutto ok.

```
# mount

/dev/hda9 on / type ext3 (rw,noatime)

none on /dev type devfs (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw)

/dev/hda8 on /home type ext3 (rw,noatime)

/dev/hda5 on /mnt/dati type vfat (rw,uid=1000,gid=100,umask=027)

none on /dev/shm type tmpfs (rw)

usbfs on /proc/bus/usb type usbfs (rw,devmode=0664,devgid=85)

/usr/portage.sqfs on /usr/portage type squashfs (ro,loop=/dev/loop0)

```

qualcuno ha suggerimenti?

grazie mille!

----------

## Lestaat

E' normale che durente il sync mi dia questi messaggi?

Se si perchè? (mi sa che mi sono perso qualcosa)

```
mkstemp "/usr/portage/net-analyzer/snmpmon/.metadata.xml.1dcUMa" failed: No space left on device

         343 100%    0.00kB/s    0:00:00

```

ed è normale che al primo emsync faccia il sync come se fosse il primo?

----------

## Sparker

 *redview wrote:*   

> da quanto uso squashfs al boot mi viene dato un msg di errore sul mount di un filesystem, tuttavia sembra funzionare tutto ok.
> 
> qualcuno ha suggerimenti?
> 
> grazie mille!

 

Strano, prova a postare l'errore

 *Lestaat wrote:*   

> 
> 
> E' normale che durente il sync mi dia questi messaggi?
> 
> Se si perchè? (mi sa che mi sono perso qualcosa)
> ...

 

No in entrambi i casi.

Hai creato lo snapshot di portage in squashfs iniziale tramite il comando  mksquashfs /usr/portage /usr/portage.sqfs? (prima di cancellare il contenuto di /usr/portage)

E la directory /root/portage? (dove viene montato temporaneamente lo snapshot durante l'aggiornamento)

Ti da errore di spazio esaurito perchè la directory tmpfs che lo script crea è di 100Mb, mentre se cerca di scaricare tutto il portage necessiterebbe di 500Mb...

----------

## Lestaat

immaginavo, ma perchè?

dici che mi si è generato male il portage.sqfs?

mo lo cancello, resynco e lo rigenero di nuovo e vediamo.

Grazie dei lumi.

----------

## Lestaat

Da paura Sparker...

funziona tutto ed è pure performante.

Grandissimo Tip.

Tra l'altro rende possibilissimo una gentoo intera su una penna USB.

troppo bello

Solo una cosa mi crea qualche dubbio.

Essendo squashfs read-only compattare la cache di portage la rende impenetrabile da emerge quindi ogni volta che si synca bisognerebbe lasciargli ricreare la cache normalmente e ricompattarla giusto?

quindi su una chiavetta potrebbe porre cmq qualche problema. E' fattibile anche in quel caso l'uso diretto della RAM per la creazione della cache durante il sync e poi la scrittura del file squash?

PS

spero di essermi spiegato

----------

## Sparker

 *Lestaat wrote:*   

> 
> 
> Solo una cosa mi crea qualche dubbio.
> 
> Essendo squashfs read-only compattare la cache di portage la rende impenetrabile da emerge quindi ogni volta che si synca bisognerebbe lasciargli ricreare la cache normalmente e ricompattarla giusto?
> ...

 

Se parli della cache in /var/cache/edp/dep è fattibile.

Basta applicare lo stesso procedimento che si applica a portage anche a /var/cache/edp/dep:

- si crea lo snapshot e lo si monta in  /var/cache/edp/dep (meglio via fstab)

- nello script di aggiornamento, prima di emerge sync si smonta lo snapshot e lo si rimonta sulla dir t1, si monta sulla dir t2 un'ulteriore spazio tmpfs e si uniscono le due directory t1 e t2 su /var/cache/edp/dep tramite unionfs. dopo l'emerge sync si crea lo snapshot, si smonta tutto e si monta il nuovo snapshot

Rimane da capire se emerge sync aggiorna la cache o la rigenera completamente: nel secondo caso consumerebbe circa 90mb di ram.

----------

## redview

ecco cosa mi dice al boot:

```
mount local filesystem

mount: mount pointportage does not exist
```

però poi va tutto..

----------

## Sparker

 *redview wrote:*   

> ecco cosa mi dice al boot:
> 
> ```
> mount local filesystem
> 
> ...

 

Apparentemente cerca di montare qualcosa su una directory inesistente, controlla attentamente l'fstab

----------

## redview

la mia fstab non mi ha mai creato problemi fino ad oggi e comunque il problema sembra sia legato al mountpoint portage. posto quindi la riga relativa all'aggiunta fatta in seguito al tip di Sparker

```
/usr/portage.sqfs       /usr/portage    squashfs        loop,ro                 0 0

```

grazie e ciao

----------

## Sparker

La riga è corretta, non saprei proprio dire da cosa dipende l'errore

----------

## redview

nn so l'ultima cosa che mi viene da dire è riguardo al kernel:

ho messo squashfs come built-in, mentre per quanto riguarda unionfs ho semplicemente emerso il pkt uniofs come da tip senza aggiungere nessun eventuale modulo nel kernel.

grazie

ciao

----------

## Sparker

Le ultime versioni di unionfs funzionano di nuovo perfettamente con rsync.

Ora portage occupa 600mb, compresso 29mb

Ciao

----------

## makoomba

su hardened, la combo unionfs + squashfs produceva segfaults a profusione, per cui avevo rinunciato.

hai provato anche con quel kernel ?

----------

## Kernel78

Passando da queste parti mi sono convinto a provare questo tip ma prima di iniziare a fare cavolate (ho sempre i miei backup ma spero sempre di non doverli usare) volevo sapere, visto che il tip è vecchiotto, se le versioni di unionfs da usare sono sempre quelle o se è meglio usare versioni più recenti che magari risolvono dei problemi ma che sono meno testate.

----------

## makoomba

vagabondo, prova :p

tanto, nel peggiore dei casi, perdi solo il portage.

----------

## Luca89

Io ricordo di aver usato l'ultima disponibile filava con un kernel >=gentoo-sources-2.6.14. Al limite ti basta fare un backup di /usr/portage e stai tranquillo da eventuali rischi.

----------

## Sparker

Ho aggiornato la guida.

In soldoni:

fino al kernel 2.6.15 unionfs và che è una favola, se siete "coraggiosi" potete patchare unionfs e farlo andare anche sul 2.6.16

Su hardened non ho provato

----------

## Kernel78

Per adesso l'accoppiata ~unionfs-1.1.3 e gentoo-sources-2.6.15-r1 funziona bene.

Piccolo appunto, le directory che tu hai messo in /root io ho preferito spostarle in /tmp proprio per non riempire l'hd di directory strane  :Wink: 

Tip molto interessante, grazie mille.

----------

## matrix

Salve,

vorrei proprio sapere come fa a funzionarvi /var/cache/edb/dep in readonly......

Punto 1: quella directory viene usata in lettura e scrittura ogni volta che fate emerge! Se proprio volete velocizzare la cache di emerge dovete semplicemente montare in ram quella directory....

Punto 2: i problemi che avete quando dice "no space" e solo perkè la vostra ram è semplicemente piena, per ovviare a questa cosa continuate a leggere il punto 3  :Wink: 

Punto 3: se usate lo script postato qua e percaso non riuscite  a completare emerge --sync siete fottuti perche vi ritroverete con un portage broken! L'alternativa è codare qualcosa di più funzionale, tipo questo:

```

#!/bin/bash

RAMDISK_SIZE="50M"

RAMDISK_DIR="/usr/portage_ramdisk"

PORTAGE_FILE="/usr/portage.squashfs"

PORTAGE_DIR="/usr/portage"

cleanup_sync() {

        umount ${PORTAGE_DIR} && umount ${PORTAGE_DIR} && umount ${RAMDISK_DIR} && mount -a

}

echo ">> Checking squashed portage ..."

if [ "$(losetup -a |grep ${PORTAGE_FILE} | wc -l)" -eq 0 ]; then

        mount -t squashfs -o loop,ro ${PORTAGE_FILE} ${PORTAGE_DIR} &>/dev/null

        if [ "$?" -ne 0 ];then

                umount ${RAMDISK_DIR} && nice -n -8 rm -rf ${RAMDISK_DIR}

                echo "!> Error: can't mount ramdisk..."

                exit -1

        fi

fi

echo ">> Creating ramdisk at: ${RAMDISK_DIR} [ ${RAMDISK_SIZE} ] ..."

while [ "$(grep ${RAMDISK_DIR} /proc/self/mounts |wc -l)" -ne 0 ]; do

        umount ${RAMDISK_DIR} &>/dev/null

done

nice -n -8 rm -rf ${RAMDISK_DIR} && mkdir -p ${RAMDISK_DIR}

mount -t tmpfs tmpfs -o size=${RAMDISK_SIZE},mode=770 ${RAMDISK_DIR}

if [ "$?" -ne 0 ];then

        echo "!> Error: can't mount ramdisk..."

        exit -1

fi

echo ">> Creating el8 unionfs workspace ..."

mount -t unionfs -o dirs=${RAMDISK_DIR}=rw:${PORTAGE_DIR}=ro none ${PORTAGE_DIR}

if [ "$?" -ne 0 ];then

        umount ${RAMDISK_DIR} && nice -n -8 rm -rf ${RAMDISK_DIR}

        echo "!> Error: can't create unionfs ..."

        exit -1

fi

echo ">> Proceding to sync for portage ..."

nice -n -8 emerge --sync

if [ "$?" -ne 0 ]; then

        echo "!> Warning: sync is incomplete! Restoring last portage ..."

        cleanup_sync

        echo ">> Recover complete"

        exit -1

fi

nice -n -8 cp ${PORTAGE_FILE} ${PORTAGE_FILE}-last

nice -n -8 mksquashfs ${PORTAGE_DIR} ${PORTAGE_FILE}-new -noappend -check_data

if [ "$?" -ne 0 ]; then

        echo "!> Warning can't create new squashed portage! Restoring last portage ..."

        nice -n -8 mv ${PORTAGE_FILE}-last ${PORTAGE_FILE}

        cleanup_sync

        echo ">> Recover complete"

        exit -1

fi

echo ">> Mounting new portage & update eix cache ..."

nice -n -8 cp ${PORTAGE_FILE}-new ${PORTAGE_FILE}

cleanup_sync

if [ "$?" -ne 0 ]; then

        echo "!> Warning: portage corrupted! Restoring last portage ..."

        nice -n -8 mv ${PORTAGE_FILE}-last ${PORTAGE_FILE}

        cleanup_sync

        echo ">> Recover complete"

        exit -1

fi

nice -n -8 rm -rf ${PORTAGE_FILE}-*

sleep 1

update-eix

echo ">> Update Complete!"

```

Sicuramente si può ottimizzare cmq a me worka da dio. Provatelo (se non usate reiser4 per il semplice motivo che su reiser4 ci sono problemi a fare funzionare unionfs)

Edit gutter: Per favore usiamo i bbcode

----------

## makoomba

per il punto uno, si può fare con unionfs

poi, anche se /usr/portage dovesse risultare corrotto, basterebbe un sync per rimettere le cose a posto.

----------

## matrix

Per me le cose non stanno cosi....

se ti crea un portage broken lui te lo monta lo stesso e se provi ad accedere alla sua dir o al suo contenuto nel peggiore dei casi ti si riavvia la macchina....

quindi in pratica secondo te lo script è inutile? e secondo te è utile mettere in unionfs /var/cache/edb/dep ?

proprio lol

----------

## Kernel78

Scusa matrix ma hai letto la discussione ? il suggerimento di makoomba di usare unionfs è relativo ad un'implementazione simile a quella necessaria per il portage.

Ovvio che avrei errori se cercassi di syncare quando /usr/portage è in sola lettura e proprio per ovviare a questo si usa unionfs e non vedo cosa di sia di lolloso nel fare una cosa simile anche con la cache...

----------

## matrix

eh la cosa lollica è che se non hai abbastanza ram da utilizzare per tutto ciò comincia a diventare un problema  :Smile: 

io ho un laptop con 256 di ram, quindi ho dovuto usare unionfs per forza, se metto in ram altri 80 mega minimo, piu aggiungo la compilazione in ram... invece di aumentare le prestazioni va a finire che ci rimetto! Questa è una cosa lollica.... Non so se tu hai letto i post precedenti della genete che non capisce il perchè gli appaiono messaggi che avvertono che lo spazio è finito.

Il fatto degli eventuali malfunzionamenti del sync in ram si riferiscono allo script minimale che è stato postato qua! Se non controlli che tutto sia andato a buon fine ti puoi ritrovare con un portage che neanche ti permette di rifare il sync perchè magari non è arrivato a tirare giu la dir profile, quindi si introia tutto. Tutto ciò lo dico perchè ho fatto vari esperimenti e se non mi ero salvato un'immagine funzionante in squash del portage sarebbero stati c***i amari perchè avrei dovuto tirare giu uno snapshot del portage e poi risyncarlo... Non mi pare sia cosi difficile da capire, forse semplicemente non mi ero spiegato bene....

----------

## makoomba

il tip che ti ho linkato usa unionfs non ramfs, non vedo dove appoggi l'osservazione sulla ram che non basta.

se, per qualche motivo, lo squashfs risulta corrotto, non riuscirai a montarlo e allora ?

anche se cancelli completamente /usr/portage puoi fare il sync

```
 emerge sync

--- 'profiles/arch.list' is empty or not available. Empty portage tree?

>>> starting rsync with rsync://217.xxx.xxx.xxx/gentoo-portage...

>>> checking server timestamp ...

receiving file list ... 

1 file to consider

Number of files: 1

Number of files transferred: 0

....

receiving file list ... 

```

non c'è alcun bisogno di usare uno snapshot.

----------

## Sparker

Matrix ha ragione (in parte)

1 - La directory /var/cache/edb non funziona correttamente in read-only. Infatti la soluzione proposta da makoomba è di comprimere /var/cache/edb e montarci sopra una directory rw con unionfs.

2 - Corruzione di portage. Vero, se si ferma completamente lo script con ctrl+c lo snapshot si corrompe, nel senso che viene creato uno snapshot vuoto. A questo punto non è che la macchina si pianta o esploda, eseguendo semplicemente emerge --sync la situazione si sistema, ma si scarica TUTTO portage da zero, il che comunque non è bello. Non so se lo avete mai fatto, io si, ci mette una vita...

Però se emerge si ferma a metà perchè è finito lo spazio, ma il resto dello script continua, non succede nulla, si ha solo un portage mezzo aggiornato.

Matrix, il tuo script è decisamente migliore, complimenti.

Se non hai nulla in contrario lo metto al posto del mio. (dandoti i dovuti credits)

Però credo di aver trovato qualche piccolo bug, correggimi se non ho compreso bene lo script:

quando scrivi

```

if [ "$(losetup -a |grep ${PORTAGE_FILE} | wc -l)" -eq 0 ]; then

        mount -t squashfs -o loop,ro ${PORTAGE_FILE} ${PORTAGE_DIR} &>/dev/null

        if [ "$?" -ne 0 ];then

                umount ${RAMDISK_DIR} && nice -n -8 rm -rf ${RAMDISK_DIR}

                echo "!> Error: can't mount ramdisk..."

                exit -1

        fi

fi 

```

L'if innestato tenta di smontare il "ramdisk" , che però a quel punto dello script non dovrebbe essere montato e giustamente dà errore

Credo che l'intenzione originale fosse di controllare che il montaggio dello snapshot sia andato a buon fine.

Perchè usi nice -n -8? Con valori di nice negativi dai al processo una priorià più alta rispetto ai normali processi utente, presumo volessi abbassare la priorità, con nice -n 8.

(tip: invece di usare tutti quei nice basta cambiare una volta la priorità della bash all'inizio tramite "renice 8 -p $$")

Nella funzione cleanup_sync, non credo sia una buona idea usare  mount -a, può dare il side effect di montare file system che l'utente ha smontato volontariamente. (O, come nel mio caso, a causa di uno share attualmente non disponibile, fà fallire un sync che altrimenti sarebbe andato a buon fine)

Una volta confermate/annullate queste correzioni, procedo alla sostituzione dello scriptLast edited by Sparker on Wed Apr 05, 2006 11:33 am; edited 3 times in total

----------

## makoomba

 *Sparker wrote:*   

> La directory /var/cache/edb non funziona correttamente in read-only (infatti il mio scriptino di base non la comprime). Una soluzione possibile è comprimere /var/cache/edb, montarci sopra una directory rw con unionfs e aggiornare lo snapshot dopo emerge --sync

 

è quello che fa il tip che ho linkato.

----------

## Sparker

 *makoomba wrote:*   

>  *Sparker wrote:*   La directory /var/cache/edb non funziona correttamente in read-only (infatti il mio scriptino di base non la comprime). Una soluzione possibile è comprimere /var/cache/edb, montarci sopra una directory rw con unionfs e aggiornare lo snapshot dopo emerge --sync 
> 
> è quello che fa il tip che ho linkato.

 

Si scusa, credevo si parlasse solo del mio script  :Smile: , me ne sono accorto dopo e ho modificato la risposta (e ovviamente nel momento in cui tu rispondevi   :Rolling Eyes:  )

----------

## makoomba

se ti va e/o hai tempo, potresti unire i due tip.

----------

## matrix

La cosa che sto provando a spiegarvi è che questo tip non funziona... non puoi aggiornare il file in squashfs soltanto dopo che fai il sync perchè hai bisogno di accedere in lettura e scrittura a /var/cache/edb/dep anche dopo il sync, per esempio quando fai, immetiatamente dopo il sync, emerge -pvuD world...

Lui accede a quella directory e aggiorna il suo contenuto, come fai ad usarlo compresso in read-only se deve poter andare a termine questa operazione? E dove anche fare presto se avete abbastanza ram per montare un pò di spazio per questa directory.

Passiamo allo scprit:

effettivamente hai ragione, se tipo guardi la gestione dell'errore che viene dopo capirai che mi sono scordato di cambiarla gh

echo ">> Checking squashed portage ..."

if [ "$(losetup -a |grep ${PORTAGE_FILE} | wc -l)" -eq 0 ]; then

        mount -t squashfs -o loop,ro ${PORTAGE_FILE} ${PORTAGE_DIR} &>/dev/null

        if [ "$?" -ne 0 ];then

                echo "!> Error: can't mount $PORTAGE_FILE ..."

                exit -1

        fi

fi

ora va bene  :Smile: 

per la storia del mount -a basta che lo sostituisci con

 mount /usr/portage

diciamo che rende lo script più portabile, devi comunque aggiungere in /etc/fstab

 /usr/portage.squashfs           /usr/portage    squashfs        ro,loop                 0 0

Se volete montare in ram anche sta benedetta dep potete aggiungere in /etc/fstab

 tmpfs                           /var/cache/edb/dep tmpfs       rw,noatime,size=128M    0 0

prima di montarla con mount -a o mount /var/cache/edb/dep ti consiglio di fare

 mv /var/cache/edb/dep /var/cache/edb/dep.old && mkdir /var/cache/edb/dep

Tutto qua  :Wink:  bye

----------

## antoxyz

Ciao,

Il portage e' montato in loop utilizzando come fs sqsh 3.0, i pacchetti presenti nel world sono 174

e il numero di dipendenze generato e' 498. Gli hd sono 2x hitachi 7k80 80gb (raid 0).

/usr/portage-05042006_2341.sqsh on /usr/portage type squashfs (ro,loop=/dev/loop0)

/var/cache/edb/dep (su disco, reiser4 come fs)

(1a volta)

# time emerge -eDvp world

real    7m32.146s

user    4m44.921s

sys     2m42.144s

#

(2~n volta)

# time emerge -eDvp world

real    0m4.009s

user    0m3.442s

sys     0m0.495s

#

/var/cache/edb/dep (in ramfs)

(1a volta)

# time emerge -eDvp world

real    7m35.636s

user    4m47.813s

sys     2m41.118s

#

(2~n volta)

# time emerge -eDvp world

real    0m6.748s

user    0m3.342s

sys     0m0.430s

#

non credo che ci sia tutto questo incremento di performance nell'utilizzare la cache del portage in ram

dato che viene continuamente letta e scritta, potrebbe essere utile forse a chi ha la mania di aggiornare il mondo continuamente  :Smile: 

I test li ho fatti con kingston hyperx 400@420 su un x2 quindi non ci sono stati colli di bottiglia  :Smile: 

buon divertimento

----------

## makoomba

 *makoomba, nel tip linkato qualche post più sopra, wrote:*   

> ....
> 
> circa 86Mb di spazio risparmiato, bello no ?
> 
> dove sta la fregatura ? 
> ...

 

@antoxyz

usare tmpfs per la cache non ha senso, lo scopo del tip è quello di comprimere la cache.

----------

## matrix

Ancora non hai capito che non worka se comprimi? ....

perchè non fai qualche prima di postare qua?

----------

## Sparker

 *matrix wrote:*   

> La cosa che sto provando a spiegarvi è che questo tip non funziona... non puoi aggiornare il file in squashfs soltanto dopo che fai il sync perchè hai bisogno di accedere in lettura e scrittura a /var/cache/edb/dep anche dopo il sync,

 

No, Matrix, sei tu che non hai capito il tip di makoomba:

la /var/dep non viene montata in ram, ma tramite unionfs si monta sopra lo snapshot una  directory scrivibile qualsiasi. E si mantiene questa configurazione durante il normale utilizzo del PC.

Per come è fatto unionfs, tiene traccia di tutti i cambiamenti all'interno della directory rw! Ad esempio, se io cancello in file dello snapshot, fisicamente nello snapshot è ancora presente, ma se faccio un "ls" non lo vedo più, perchè unionfs ha memorizzato nella directory rw questa modifica.

Quindi, ogni volta che viene fatto un emerge che tocca i file della cache, le modifiche vengono eseguite sulla directory scrivibile.

----------

## makoomba

matrix, modera il tono, perchè qui sei tu l'unico a non aver capito come funziona.

```
mount -t unionfs -o dirs=/var/cache/edb.hdfs=rw:/var/cache/edb.sqfs=ro unionfs /var/cache/edb
```

edb.hdfs (rw) +  edb.sqfs (ro) = /var/cache/edb (rw)

- la componente compressa contiene la cache

- quella rw contiene le modifiche apportate alla cache successivamente alla creazione dello squashfs

- periodicamente, si ricrea l'archivio inglobando le modifiche nella componente ro

----------

## Sparker

 *antoxyz wrote:*   

> 
> 
> non credo che ci sia tutto questo incremento di performance nell'utilizzare la cache del portage in ram
> 
> dato che viene continuamente letta e scritta, potrebbe essere utile forse a chi ha la mania di aggiornare il mondo continuamente 
> ...

 

No, infatti lo scopo è risparmiare spazio.

(teoricamente ci potrebbe essere una aumento di performance, ma solo con hd lenti, come quelli dei portatili. In pratica, non ho testato, e, sinceramente, non mi interessa nemmeno)

----------

## matrix

"matrix, modera il tono, perchè qui sei tu l'unico a non aver capito come funziona. "

Noi abbiamo fatto i test mettendo tutto in ram, ora implementate voi quello che volete e postate i test  :Smile: 

Io continuo a dire che è inutile farlo e ti assicuro che ho capito benessimo come funziona, visto che ho pure postato 75 righe di codice che fanno proprio quello che dici tu ma con il portage...

----------

## Kernel78

 *matrix wrote:*   

> eh la cosa lollica è che se non hai abbastanza ram da utilizzare per tutto ciò comincia a diventare un problema 
> 
> io ho un laptop con 256 di ram, quindi ho dovuto usare unionfs per forza, se metto in ram altri 80 mega minimo, piu aggiungo la compilazione in ram... invece di aumentare le prestazioni va a finire che ci rimetto! Questa è una cosa lollica.... Non so se tu hai letto i post precedenti della genete che non capisce il perchè gli appaiono messaggi che avvertono che lo spazio è finito.
> 
> 

 

a parte che io riesco benissimo a montare e riempire partizioni tmpfs con dimensioni maggiori della mia ram basta avere dello swap libero, inoltre come ti hanno detto la cosa lollica e che qui non si parla di aumentare le prestazioni ma di diminuire le dimensioni ...

 *matrix wrote:*   

> Ancora non hai capito che non worka se comprimi? ....
> 
> perchè non fai qualche prima di postare qua?

 

Sei nuovo e magari non lo sai ma il numero di post che makoomba ha raggiunto non lo ha ottenuto con messaggi arroganti come i tuoi ma postando sempre notizie, tip e suggerimenti di elevato livello (figurati che io mi tengo il suo santino nel portafoglio, anche se non lo tengo vicino alla foto di mia moglie  :Wink:  ).

Se lui dice una cosa (anche se penso sia umano e fallibile come tutti noi) e tu non sei d'accordo ti consiglio di controllare due volte prima di dirgli che stà sbagliando, ti risparmieresti figure come questa ...

----------

## antoxyz

 *makoomba, nel tip linkato qualche post più sopra, wrote:*   

> ....
> 
> @antoxyz
> 
> usare tmpfs per la cache non ha senso, lo scopo del tip è quello di comprimere la cache.

 

Si non sono stato preciso sul test che ho fatto... usando reiser4 non posso usare union al momento

per via dei mutex, la soluzione in ram e' solo per chi ha tanta ram e vuole ottimizzare completamente il sistema.

cmq il tip funge su reiser4 e xfs su amd64 usando un doppio loop, il primo in ext3 il quale contiene il loop in squash

e la parte union della cache, per via del loop il disco si frammenta di meno  :Smile: 

ciao

----------

## matrix

Io non cell'ho con nessuno, ma qual'è il problema? Non posso avere un'idea mia? Ho fatto dei test e ho postato quello che penso e continuo a rimanere della mia idea, non vedo dove sta tutta questa arroganza. Io non punto alle dimensioni ma alle prestazioni! Ho postato lo script perchè ho aumentato di un bel pezzo le prestazioni del mio sistema e mi pareva giusto pubblicarlo in modo che tutti potevano testarlo, trovare bug e quindi migliorarlo (come è successo), non per sentirmi dire che sono arrogante soltanto perchè ho un'idea diversa dalla vostra. Ho pure dato una possibile soluzione per integrare quello che diceva lui con lo script che ho postato. Cosa volete di più? ....

Pensavo di fare un piacere a qualcuno invece di creare polemiche...

----------

## randomaze

 *matrix wrote:*   

> Pensavo di fare un piacere a qualcuno invece di creare polemiche...

 

Polemiche che, peraltro, gradirei terminino in questo istante.   :Evil or Very Mad: 

----------

## makoomba

 *Kernel78 wrote:*   

> ...

 

ti devo una birra  :Wink: 

 *antoxyz wrote:*   

> Si non sono stato preciso sul test che ho fatto... usando reiser4 non posso usare union al momento
> 
> per via dei mutex, la soluzione in ram e' solo per chi ha tanta ram e vuole ottimizzare completamente il sistema.
> 
> cmq il tip funge su reiser4 e xfs su amd64 usando un doppio loop, il primo in ext3 il quale contiene il loop in squash
> ...

 

sì, capisco.

la mia osservazione era legate alle prestazioni, come hai verificato tu stesso, non c'è un sostanziale guadagno utilizzando la ram invece che il disco (almeno nel caso della cache).

il processo di rigenerazione è più cpu-bound. 

 *matrix wrote:*   

> Noi abbiamo fatto i test mettendo tutto in ram, ora implementate voi quello che volete e postate i test 

 

sono 78 post che continuo a dirti la stessa cosa: nel mio tip, non uso ram.

```
wget -qO - http://forums.gentoo.org/viewtopic-t-399054.html | perl -pe 's|<.+>|\n|gi' | grep -10 tmpfs | perl -pe 's|^\s*$||g'
```

non dispero che questo possa aiutarti ad afferrare un concetto tanto complesso

mi spiace solo che la discussione in oggetto non sia nata nel forum che dico io (qualche utente avrà capito)

qui non posso usare il tono e la terminologia che la situazione richiede, per cui chiudo definitivamente la discussione.

----------

## darkimage

SCUSATE L'OT...

passavo di qua e sono commosso  :Embarassed: 

non credevo che dopo tutta la mia assenza qualcuno avesse completato la mia idea...

veramente grazie e complimenti.

purtroppo il lavoro e lo studio mi hanno allontanato da linux,

inoltre purtroppo ora ho una bellissima macchina athlon3500 venice - nforce 4 ultra... unico neo: ATI X700, se mi è permesso l'OT, vorrei solo sapere a che punto siamo messi con ATI oggigiorno, 1 anno e mezzo fa la situazione era drammatica, ci sono novita?

grazie,

simone

----------

## matrix

Salve,

con l'avvento del nuovo portage ci sono problemi ad usare il portage in squashfs in quanto ad ogni emerge lui tente di riscrivere il manifest! Qualcuno di voi ha trovato un workaround per questo fatto?

----------

## Kernel78

 *matrix wrote:*   

> Salve,
> 
> con l'avvento del nuovo portage ci sono problemi ad usare il portage in squashfs in quanto ad ogni emerge lui tente di riscrivere il manifest! Qualcuno di voi ha trovato un workaround per questo fatto?

 

Basta mantenere attiva la directory creata con unionfs, in questo modo è possibile effettuare cmq delle modifiche e ogni tot si ricomprime il tutto.

----------

## matrix

Non mi piace come cosa, dovrei stare a ricreare di tanto in tanto l'immagine in squashfs del portage... per ora ho modificato il file

/usr/lib/portage/pym/portage_manifest.py

le linee sono

336/337

                        #if self.compat:

                                #self._writeDigests()

357

                        update_manifest = False

la prima modifica ho semplicemente commentato quelle due righe, mentre nella seconda la riga l'ho aggiunta (dopo c'è un if)

cosi funziona tutto però non mi piace lo stesso....  :Wink: 

----------

## Kernel78

 *matrix wrote:*   

> Non mi piace come cosa, dovrei stare a ricreare di tanto in tanto l'immagine in squashfs del portage... 

 

Visto che io ricreo lo squash dopo ogni sync non mi crea grossi problemi anzi la trovo una soluzione pulita ma queste sono solo preferenze personali, il bello di Gentoo è che ognuno può scegliere  :Wink: 

----------

## matrix

In pratica fai il sync, poi aggiorni e poi rifai il sync? credo che si potrebbe integrare allo script che avevo postato (modificando anche il fatto che il mount in unionfs rimane attivo sempre)

----------

## Kernel78

 *matrix wrote:*   

> In pratica fai il sync, poi aggiorni e poi rifai il sync?

 

no, al momento synco su unionfs, aggiorno lo squash e sostituisco lo squash all'unionfs, per fare quello che suggerivo basta, dopo aver aggiornato lo squash rimettere unionfs in modo che nell directory rw dello union ci rimangano solo le modifiche tra un sync e l'altro

----------

