# [HOWTO] compresser l'arborescence portage

## synss

dans la serie, et je me traduis   :Cool: 

L'arborescence portage (le contenu de /usr/portage, par defaut) peut prendre jusqu'a 600Mo. Cependant, sur mon ordinateur, elle ne depasse pas 35M... et voici comment : l'idee est de compresser l'arborescence et de la monter en loopback. Et comme les systemes de fichiers compresses sont en lecture seule, on utilisera un repertoire cree dans /dev/shm (autrement dit, le memoire vive) qu'on montera avec unionfs sur l'image en lecture seule.

Note que cette technique est utilisee sur de nombreux live-cds (y Knoppix  et autres) et que j'ai passe une journee extenuante alors mon francais en souffre.

Tout d'abord, 

```
emerge sys-fs/unionfs sys-fs/squashfs-tools
```

 unionfs est masque par ~x86, tu connais  la chanson pour l'installer quand meme (j'utilise sys-fs/unionfs-1.1.4-r2 et sys-fs/squashfs-tools-3.0 sans probleme sur x86 : un portable centrino)

pour union: 

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

 pour squashfs, tu dois le compiler en tant que module dans le kernel (enfin si jamais tu l'as en "build-in" comment qu'on dit ca en francais? ca marche aussi,) mais sinon, il faut aussi 

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

et evidemment, tu veux le loopback, mais tu l'as deja, hein ? soit: 

```
CONFIG_SQUASHFS=m

CONFIG_SHMEM=y
```

loopback (je trouve plus ou c'est) et emerge unionfs

si tu viens de compiler ces modules, il faut les charger avec modprobe, genre 

```
modprobe loop unionfs squashfs
```

 quelque chose comme ca.

Tu dois deja avoir deplace ton repertoire distfiles et/ou packages : sinon edite 

```
DISTDIR="/var/tmp/distfiles"

PKGDIR="/var/tmp/packages"
```

 et bien sur 

```
mv /usr/portage/distfiles /var/tmp

mv /usr/portage/packages /var/tmp

env-update && source /etc/profile
```

Ensuite, tu peux creer ton image squashfs et effacer le contenu de /usr/portage (ou sauvegarde le au cas ou) 

```
mksquashfs /usr/portage /var/tmp/portage-1.sqfs -check_data

ln -s /var/tmp/portage-1.sqfs /var/tmp/portage.sqfs

du -s /var/tmp/portage-1.sqfs
```

 j'obtiens entre 30M et 40M, ca ne devrait pas etre different chez toi

```
tar czvf /tmp/portage-0.tgz /usr/portage/*

rm -rf /usr/portage/*

```

c'est bon?

Ben maintenant, t'as plus trop besoin de tes doigts, parce qu'a partir de la, j'ai mon script d'initialisation qui va faire le boulot pour toi. Avant de les couper, copie-colle:

```
#!/sbin/runscript

# Copyright 1999-2006 Gentoo Foundation

# Distributed under the terms of the GNU General Public License v2 

# $Header: $ 

depend() {

   need localmount

}

start() {

   ebegin "Mounting squashfs'ed portage tree"

   [ -d $PORTAGE_RO ] || mkdir -p $PORTAGE_RO

   mount -t squashfs -o loop,ro $PORTAGE_SQFS $PORTAGE_RO

   [ -d $PORTAGE_RW ] || mkdir -p $PORTAGE_RW

   mount -t unionfs -o dirs=$PORTAGE_RW=rw:$PORTAGE_RO=ro unionfs $PORTDIR    

   eend 0 

} 

stop() {

   ebegin "Updating portage tree"    

   if [ "$(du -s $PORTAGE_RW | cut -f 1)" -gt 1 ]; then       

      einfo "Syncing the tree"

      [ -f $PORTAGE_NEW ] && rm -f $PORTAGE_NEW

      mksquashfs $PORTDIR $PORTAGE_NEW -check_data

      [ -L $PORTAGE_SQFS ] && rm -f $PORTAGE_SQFS

      ln -sf $PORTAGE_NEW $PORTAGE_SQFS

   else

      einfo "Nothing to do"

   fi

   eend 0    

   ebegin "Unmounting the tree"    

   umount $PORTDIR

   umount $PORTAGE_RO

   rm -rf $PORTAGE_RW

   eend 0 

}

```

```
source /etc/make.conf

PORTAGE_BASENAME="/var/tmp/portage"

PORTAGE_SQFS="$PORTAGE_BASENAME.sqfs"

PORTAGE_NEW="$PORTAGE_BASENAME-$(date +%F).sqfs"

PORTAGE_RO=$PORTDIR

PORTAGE_RW="/dev/shm/portage"
```

Si tous les modules sont charges et si tu es arrive jusque la : 

```
/etc/init.d/squash_portage start
```

 et verifie ton 

```
[...]

/var/tmp/portage-1.sqfs /usr/portage squashfs ro,loop=/dev/loop0 0 0

unionfs /usr/portage unionfs rw,dirs=/dev/shm/portage=rw:/usr/portage=ro 0 0

[...]
```

 pas trop different ? alors ca marche 

```
rc-update add squash_portage default
```

C'est tout, maintenant, une nouvelle image sera creee a chaque fois que tu quites linux (en cas de mise a jour) et chargee a chaque demarrage. N'oublie pas de recompiler les modules a chaque mise a jour du kernel. Tu peux bidouiller mon code ou demander des explications. Je tourne avec ca depuis un moment et j'ai pas de probleme.

Et puis note que je n'ecrase pas les sauvegardes de l'arbre (seulement si tu as mis l'arbre a jour) et que tu dois donc les effacer de temps en temps, un cron job est parfait pour cela, par exemple.

Bien sur, j'ai pense a le mettre en merciware ou beerware ou topsecret-though-expensive-ware, mais GPL ira... enfin tu peux me payer une biere si tu me croises.

----------

## boozo

'alute

c'est une variante avec rc script donc... peut-être voir pour merger les deux topics non ?   :Rolling Eyes: 

----------

## synss

 *boozo wrote:*   

> 'alute
> 
> c'est une variante avec rc script donc... peut-être voir pour merger les deux topics non ?  

 

je sais pas... dans le forum original en anglais ou il y avait beaucoup de scripts differents, j'ai fait un nouveau post apres que quelqu'un c'est plaint que ca devenait un peu bordelique... Ici, c'est vrais qu'il y en a moins...

----------

## adrienleroy

Salut

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

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

ainsi que la somme md5 associée 

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

Un petit script pour automatiser la mise à jour :

```

#!/bin/bash

URL="gentoosquash.free.fr"

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 ${PORTDIR}/portage.sqsh

        mount ${PORTDIR}

        emerge --metadata

        rm portage.sqsh.md5

else

        echo "File corruption !"

fi

```

----------

