# [TIP] Compresser l'arbre portage avec squashfs

## bibi.skuk

Voici la traduction (approximative) d'une petite astuce pour les petits disques

 durs, traduit a la demande de yoyo.

Le topic original est ici.

Voici un petit tutoriel pour compresser l'arbre portage avec squashfs. 

Je ne vais pas couvrir tous les petits details, comme j'estime que vous 

savez configurer/compiler votre noyau, utiliser emerge, et écrire des scripts

bash simples.

Pourquoi ?

Et bien, l'arbre portage est énorme ! Il fait environ 500Mb, ce qui est 

une énorme perte de place sur certaines machines.

Maintenant, (a moins que vous ne soyez malade), vous pouvez seulement 

synchroniser votre arbre 1 fois par semaine. Par la même occasion, c'est 

essentiellement un systeme de fichiers en lecture seule.

Donc, nous avons eu l'idée de le mettre sur une image compressée.

squashfs (http://squashfs.sf.net) nous permet cela. 

En suivant cet Howto, vous obtiendrez un arbre portage qui prendra seulement

25Mb, et qui est aussi rapide.

Comment ?

Installer SquashFS

Kernel

Vous aurez besoin du support de squashfs dans le noyau ansi que des loop-back 

file systems, compilés en dur, ou bien en modules.

Configuration du noyau:

```

Device Drivers -> Block Devices -> Loopback device support <M>

File systems  ->  Miscellaneous Filesystems  -> SquashFS <M>

```

NOTE: Squashfs n'est pas encore dans le kernel vanilla, mais le patch 

est simple a appliquer soit-même. Autrement, les gentoo-sources contiennent

 déjà ce patch, donc vous pouvez utiliser celles-ci.

Bien sur, recompilez les noyau, ajustez grub/lilo, et redemarrez dessus.

Outils

Vous aurez aussi besoin des squashfs tools:

```

emerge squashfs-tools

```

Configuration de portage

Comme squashfs est un systeme en lecture seule, nous devrons mettre les distfiles

autre part. Ici, j'ai choisi /var/tmp/distfiles (Ndt: idéalement, dans une 

partition NFS):

/etc/make.conf

```

DISTDIR="/var/tmp/distfiles"

PKGDIR="/var/tmp/packages"

```

Edit : petit ajout de yoyo (proviens du topic d'origine) a propos de PKGDIR

Créer le système de fichiers

Supposons que vous avez un arbre portage dans /usr/portage, et que vous avez 

déjà deplacé les distfiles dans $DISTDIR configuré précédement.

Les commandes basiques pour créer un "squash portage" sont celles-ci:

```

rm /usr/portage.sqsh

mksquashfs /usr/portage /usr/portage.sqsh -check_data

```

Apres avoir éxécuté cette commande, vous avez une copie squashé de votre arbre

dans /usr/portage.sqsh.

Maintenant, qu'est ce qu'on en fait ?

Et bien, on va le monter dans /usr/portage.

Pour preparer la prochaine étape, vous avec besoin de déplacer votre arbre actuel

autre part. Je vous suggère de la faire comme ceci, pour avoir un backup dans le 

cas ou vous decideriez de ne pas utiliser cette methode.

```

tar cvzf /usr/portage-backup.tar.gz /usr/portage

rm -rf /usr/portage/*

```

Configuration du système

Si vous avec loop et squashfs en modules, vous aurez besoin de les charger

au demarrage.

```

echo "loop" >> /etc/modules.autoload.d/kernel-2.6

echo "squashfs" >> /etc/modules.autoload.d/kernel-2.6

```

pour l'instant, un `modprobe` suffira.

Vous aurez aussi besoin d'editer votre /etc/fstab pour que votre nouveau

filesystem se monte correctement.

/etc/fstab

```

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

```

Pour finir, pour monter votre nouvel arbre portage compressé, faire :

```

mount /usr/portage

```

Voici en gros le principe.

Updates ??

Et oui, votre arbre portage ne restera pas a jour eternellement! De temps en 

temps, vous aurez besoin de le mettre a jour ! Commen faire ?

Evidemment, comme /usr/portage est en lecture seule, un simple

`emerge --sync` ne marchera pas.  :Sad: 

Il y a plusieurs methodes pour faire ceci.

Mettre a jour avec emerge

Voici un script qui vous permettra de faire les mises a jour. Il y a un serieu

defaut avec cette methode, vous devez avoir vos 500Mb de libre pour le temps de

la mise à jour, car on ne peut mettre a jour qu'une copie non compressée.

Voici un simple script qui resume ces étapes. Je suis sur que cela peut etre 

amélioré, mais l'idée de base est là.

/usr/local/sbin/emerge-sync-squash.sh

```

#!/bin/bash

## Where things go:

PORTDIR=/usr/portage

PORTSQSH=/usr/portage.sqsh

PORTTMP=/var/tmp/portage-tmpcopy

## First, make sure the squashed protage is mounted

mount -o remount $PORTDIR &> /dev/null || mount $PORTDIR

## make sure there is no old tmp copy in the way

rm -rf $PORTTMP

## Make an uncompressed copy 

cp -ra $PORTDIR $PORTTMP 

## sync to the uncompressed copy

FEATURES="-fixpackages" PORTDIR="$PORTTMP" emerge --nospinner --sync

## uncomment re-make the "q" database, if you use it.  (portage-utils)

#PORTDIR=$PORTTMP  q -r

## squash! and remount

umount $PORTDIR

rm -f $PORTSQSH

mksquashfs $PORTTMP $PORTSQSH -check_data

mount $PORTDIR

## cleanup

rm -rf $PORTTMP

##  Make sure local databases are up to date

emerge --nospinner --metadata 

update-eix

```

Voila. Comme vous pouvez le voir, vous aurez besoin de tout l'espace quelque part

 même si c'est seulement pour 5 minutes.

Mettre a jour pour quelqu'un d'autre

SI vous n'avez pas 500Mb de libre, (si vous les avez, alors ce ne serait

pas un exercice très utile!), la seule option est de recuperer des copies 

compressées. Il est peut etre possible de faire un squashfs directement depuis 

une archive, mais ca n'est pas possible pour le moment (Ndt: ou alors l'auteur 

n'a pas trouvé comment). Vous aurez donc donc besoin de recuperer directement les

images squash.

Pour le moment, l'auteur fourni des images deja suqashées, mises a jour tous les 

1 ou 2 jours, sur

http://www.math.duke.edu/~adsmith/portage.sqsh

Mais cela ne durera pas eternellement. (pour des problemes de bande passante.)

pour mettre a jour ces copies, voici un petit script :

/usr/local/sbin/emerge-sync-squash2.sh

```

#!/bin/bash

umount /usr/portage

wget http://www.math.duke.edu/~adsmith/portage.sqsh -O /usr/portage.sqsh

mount /usr/portage

emerge --metadata

update-eix

```

]

Je pense aussi distribuer ceci en utilisant des diffs binaires, mais pour le 

moment, etant donné que cela fait seulement 25Mb, ce n'est pas très gros.

Partager l'arbre ??

Si vous voulez partager cet arbre par le reseau, il va falloir faire un peut

 attention. NFS ne peut pas utiliser squashfs, donc vous devrez utiliser

network block devices (configurer le kernel et `emerge nbd`) pour exporter

le /usr/portage.sqsh sur les autres machines.

Voici une config simple:

serveur:

```

nbd-server <port> /usr/portage.sqsh

```

client:

```

modprobe nbd

nbd-client <server> <port> /dev/ndb0

mount /dev/nbd0 /usr/portage

```

Ou trouver un arbre deja squashé ?

[ndt] j'ajoute cette section, car elle me parait important, et etant donné 

qu'il y a plusieurs personnes qui fournissent des images squash de portage,

autant en profiter.

http://www.math.duke.edu/~adsmith/portage.sqsh

http://home.arcor.de/liviufl/portage.sqsh/portage.sqsh

Amusez-vous bien!!

Edit : j'ai realisé qu'il ne me manquait que 3 lignes a traduire... alors j'ai fini...

Edit : TODO 

 *Quote:*   

> 
> 
> Ajouter la methode pour utiliser unionfs
> 
> 

 

Corrections, suggestions, encouragements bienvenus.Last edited by bibi.skuk on Fri Jan 06, 2006 6:35 am; edited 3 times in total

----------

## bong

bien bien, pourquoi j'y ai pas pensé avant!

j'ai tres envie de tester mais j'ai un doute quand aux performances des recherches et des synchros...

je verrai bien   :Laughing: 

----------

## bibi.skuk

Moi j'ai pas tester encore, mais je vais le faire...

Je suis en train de lire la suite du topic pour essayer d'en tirer encore des infos a ajouter... (deja le coup du PKGDIR)

----------

## bong

Résultat: c'est excellent!

J'ai juste adapté la chose, je m'explique:

J'ai un vieux celeron500 qui me sert de routeur/firewall qui, via une tache cron, synchroniser son arbre puis creer l'image squashfs

Depuis mon poste, j'ai un script qui va synchroniser l'image avec celle de la passerelle, remonter le tout et mettre a jour les metadata.

Ce qui fait que je n'ai plus a me soucier d'avoir la place suffisante pour stocker un arbre de portage décompressé... en plus, la vitesse de recherche est a des annes lumieres de ce que j'avais avant, c'est presque instantané   :Very Happy: 

----------

## ghoti

 *bong wrote:*   

> J'ai juste adapté la chose, je m'explique:
> 
> J'ai un vieux celeron500 qui me sert de routeur/firewall qui, via une tache cron, synchroniser son arbre puis creer l'image squashfs

 

Corrige-moi si je me trompe mais il me semble que tu ne fais que déplacer le problème : tu as quand même besoin de 500 + 25 mégas sur ton cel500, non ? (plus 25 Mo sur ton desktop !)

Un partage en nfs ne serait-il pas plus indiqué ? Ce serait plus économique puisque tu n'aurais pas besoin des 2 images en squashfs ...

----------

## bibi.skuk

 *ghoti wrote:*   

>  *bong wrote:*   J'ai juste adapté la chose, je m'explique:
> 
> J'ai un vieux celeron500 qui me sert de routeur/firewall qui, via une tache cron, synchroniser son arbre puis creer l'image squashfs 
> 
> Corrige-moi si je me trompe mais il me semble que tu ne fais que déplacer le problème : tu as quand même besoin de 500 + 25 mégas sur ton cel500, non ? (plus 25 Mo sur ton desktop !)
> ...

 

on ne deplace pas le probleme...

tes 500Mo de portage, tu les as de toute maniere sur ton poste non ??Last edited by bibi.skuk on Sat Dec 10, 2005 3:01 pm; edited 1 time in total

----------

## bong

j'y ai pensé mais le celeron n'a qu'un vieux dd de 2Go qui offre de bien pietres performances... ca n'aurait fait qu'allonger mes temps d'acces...

----------

## bibi.skuk

petites mises à jour.

----------

## adrienleroy

Chaque jour vers 5h20, je met a jour une image de portage au format squashfs `a l'adresse suivante :

http://gentoosquash.free.fr/portage.sqsh

ainsi que la somme md5 associee

http://gentoosquash.free.fr/portage.sqsh.md5

Un petit script pour automatiser la mise `a jour :

```

#!/bin/bash

case $1 in

home)

        URL=192.168.1.100;;

away)

        URL="gentoosquash.free.fr";;

esac

PORTDIR="/usr/portage"

wget -c http://${URL}/portage.sqsh

wget -c http://${URL}/portage.sqsh.md5

if [ "`md5sum -c portage.sqsh.md5 |cut -d' ' -f2`" = "OK" ]; then

        echo "Archive is valid"

        umount ${PORTDIR}

        mv portage.sqsh /usr/portage.sqsh

        mount ${PORTDIR}

        emerge --metadata

        rm portage.sqsh.md5

else

        echo "File corruption !"

fi 

```

----------

