# emerge sync -- tipps & tricks für...

## lolli78

... leute mit langsamen internet-verbindungen, kleinen festplatten und alle anderen, die keine "unnötigen" daten auf ihrer festplatte haben wollen.

hallo,

bei einem

```
emerge sync
```

 fällt den meisten wohl auf, dass da ebuilds übertragen werden, die man nie im leben installieren wird. warum soll ein hardcore-gnome-fan denn ebuilds für kde unde xfce haben? braucht man für ein dsl-gateway (router/webserver/fileserver) ohne monitor ebuilds für xorg-x11/mozilla/gnome?

wer sich solche fragen stellt, sollte sich mal mit 

```
# RSYNC_EXCLUDEFROM is a file that portage will pass to rsync when it updates

#     the portage tree. Specific chucks of the tree may be excluded from

#     consideration. This may cause dependency failures if you are not careful.

#     The file format is one pattern per line, blanks and ';' or '#' lines are

#     comments. See 'man rsync' for more details on the exclude-from format.

RSYNC_EXCLUDEFROM=/etc/portage/rsync_excludes

```

beschäftigen.

der syntax dieser rsync_excludes ist ganz einfach. in jeder zeile steht ein muster, das bei einem treffer ausgelassen wird. die zeile

```
timestamp.x
```

lässt jede datei "timestamp.x" aus, egal in welchem unterverzeichnis.

die zeile

```
media-radio
```

 dürfte alle erfreuen, die keinen pc-radio-tuner haben. so kann man es dann beliebig weiter treiben, bis man einen kleinen, auf die eigenen bedürfnisse angepassten portage-baum hat. doch vorsicht:

* bei einem emerge sync werden die ausgelassenen dateien nicht gelöscht, sondern nur nicht mehr aktualisiert. löschen muss man selbst.

* wenn emerge eine abhängigkeit nicht mehr erfüllen kann, bricht es ab. dann hat man wohl zu viel ausgeschlossen, ein 

```
+ muster
```

 fügt dieses eine spezielle muster dann wieder ein.

* diese verzeichnisse sollten nicht ausgeschlossen werden: metadata, eclass, packages, profiles, scripts, (licenses)

genaueres dazu steht auch in der man-page von rsync.

wer wirklich nichts unnötiges in seinem portage-baum haben möchte, sollte sich dieses script anschauen: prlock.py (Portage Rsync Lockdown)

wer seinen portage-baum verkleinert, verringert natürlich auch die last auf den rsync-mirrors.

viel spaß mit gentoo!

lorenz

----------

## sirro

 *lolli78 wrote:*   

> wer seinen portage-baum verkleinert, verringert natürlich auch die last auf den rsync-mirrors.

 

Wenn alle so eine Datei anlegen würden, dann würde sich IMO 25-50% des Rsync-Traffics sparen lassen.

Also Leute: Anlegen!!!  :Wink: 

 *lolli78 wrote:*   

> 
> 
> ```
> + muster
> ```
> ...

 

Das habe ich noch nicht so ganz verstanden. Kann ich über diese Syntax z.B. net-print ausschließen und mit dem + dann net-print/cups wieder erlauben?

Also z.B. sowas:

```
net-print

+ net-print/cups
```

würde mir alles aus net-print außer cups vom Leib halten?

Ich will nicht zuviel rumtesten und immer syncen um was auszuprobieren, darum frag ich lieber nach

 *lolli78 wrote:*   

> diese verzeichnisse sollten nicht ausgeschlossen werden: metadata, eclass, packages, profiles, scripts, (licenses)

 

ich schließe bei mir unter metadata auch die Teile des Caches aus, in denen die von mir ausgeschlossenen Ebuilds liegen.

Und für alle die am liebsten ein Beispiel haben um sich das ganze besser vorstellen zu können (wie ich  :Wink: )

```
## Required for emerge system 

## sys-libs 

## sys-fs 

## sys-apps 

## sys-devel 

## net-misc 

## dev-libs 

## dev-lang 

## app-shells 

## app-editors 

# wildcards for groups never required 

games-*

gnome-*

xfce-*

metadata/cache/games-*

metadata/cache/gnome-*

metadata/cache/xfce-*

net-news

net-p2p

net-wireless

metadata/cache/net-news

metadata/cache/net-p2p

metadata/cache/net-wireless
```

das würde alle games, gnome, xfce Unterverzeichnisse sowie net-news, net-p2p und net-wireless auslassen. Dazu werden jeweils die entsprechenden cache-Daten ausgelassen.

Dann kann man (wenn man will) die oben angegebenen Verzeichnisse löschen. z.B.:

```
cd /usr/portage

for i in `grep -v "^#" /etc/portage/rsync_excludes; do rm -r $i; done
```

BTW: Um mal eine Zahl zu nennen: Ich spare durch meine rsync_exclude momentan 33% der Dateien ein... (Wenn ich das mit dem + raushabe, dann ist die Tendenz steigend)

----------

## lolli78

hallo,

ich glaube, es ist am besten, wenn ich meine rsync_excludes mal kommentiert poste.

```

+ /eclass/*

## alle dateien im eclass-verzeichnis werden benötigt, sonst gibts fehler

 

timestamp

## wer braucht schon timestamp.* in jedem verzeichnis?

xfce*

kde-base*

## bin gnome-user

games*

## der wenig spielt

sys-cluster*

## einen notebook hat (und keinen cluster)

app-emac*

app-xemac*

dev-lisp*

licenses

## die lizenzen kann ich mir auch im netz anschauen

*accessibi*

*dotnet*

*embedded*

*haskell*

*firewall*

*ruby*

net-news

media-radio

media-tv

## tv-karte habe ich auch keine im notebook...

fresco*

sec-*

app-gnustep*

dev-games

net-zope*

```

damit habe ich unter 70000 dateien zu synchronisieren.

wie vielleicht schon bemerkt, schließe ich die metadata/cache nicht extra aus. braucht man auch nicht, weil ich fast nur muster verwende, die nicht absolut sind. muss ich vielleicht nochmal erklären.

```
net-zope*
```

schließt alle dateien und verzeichnisse aus, die mit net-zope beginnen.

```
/net-zope*
```

würde dagegen nur diejenigen dateien und verzeichnisse ausschließen, die im root-verzeichnis mit net-zope beginnen.

verstanden?

außerdem habe ich mal festgestellt, dass diejenigen dateien, die man explizit zulassen will, zuerst nennen muss. wenn man also nur verzeichnisse synchronisieren will, die mit sys* beginnen, schreibt man folgendes:

```
+ sys*

- *

```

oder man benutzt das tool, das ich oben schon erwähnt habe: prlock.py (Portage Rsync Lockdown)

wer seinen portage-baum richtig aufräumen will, kommt wahrscheinlich kaum drum rum, /usr/portage/ einmal komplett zu löschen und dann neu zu synchronisieren. und wer dann schon dabei ist, kann sich ja auch gleich mal https://forums.gentoo.org/viewtopic.php?t=175689 anschauen.

so, nun wünsche ich viel spaß & happy gentooing...

lorenz

----------

## lolli78

hallo nochmal,

ich glaube, die ganz oben implizit vorgeschlagene reihenfolge ist falschrum. damit es richtig funktioniert, müssen die wieder hinzugefügten dateien *zuerst* stehen und darunter die ausgeschlossenen.

bsp.:

```
+ **cups*

net-print*

```

 müsste funktionieren. wenn man die reihenfolge vertauscht, wird cups wahrscheinlich trotzdem ausgeschlossen.

wie es ganz genau funktioniert, wird übrigens in der man-page von rsync im kapitel "EXCLUDE PATTERNS" erklärt. da steht auch, was der unterschied zwischen "*" und "**" ist.

lorenz

----------

## ruth

hi,

das habe ich doch auch gleich mal ausprobieren müssen...

testobjekt:

mein kleiner heimserver

(i686 Celeron (Covington) GenuineIntel GNU/Linux)

mit 400Mhz + 2 x IBM SCSI 2GB HDD / RAID auf Adaptec 2940UW

tja, was soll ich sagen...

Number of files: 41997

na, ist das nix ???  *grins*

auf die hälfte verkleinert den tree....

tip:

/var/db/pkg

anschauen...

super tip, danke nochmal...

gruss

rootshell

----------

## mo-ca

DANKE

 :Surprised:  gut gemacht  :Surprised: 

nach sowas habe ich schon länger gesucht, denn mein server braucht kein kde/gnome/X allgemein  :Wink: 

----------

## sirro

 *lolli78 wrote:*   

> 
> 
> ```
> + **cups*
> 
> ...

 

Hab jetzt:

```
+ net-print/cups/

+ net-print/cups/**

net-print/**
```

Klappt wunderbar...

Number of Files liegt irgendwo bei 15000-20000 auf meinem Rechner zuhause und auf der Arbeit 5827 (erreicht mit dem o.g. Skript)...

----------

## ts77

cooler tipp ... auf 13.000 files runter mit dem genannten script  :Smile: .

Edit: ich würd's jedem empfehlen, der sein system erstmal eingerichtet hat. solang man natürlich noch am installieren ist, ist es ein wenig zu hardcore eingeschränkend  :Wink: .

----------

## SvenFischer

ein "emerge sync" bringt noch immer alle Files rüber.

In meiner /etc/portage/rsync_excludes steht:

+ /eclass/*

## alle dateien im eclass-verzeichnis werden benötigt, sonst gibts

fehler

timestamp

## wer braucht schon timestamp.* in jedem verzeichnis?

app-benchmarks

app-emac*

app-gnustep

app-laptop

app-pda

app-sci

app-vim

app-xemacs

dev-ada

dev-cpp

dev-dotnet

dev-embedded

ev-games

dev-haskell

dev-lisp

dev-ml

dev-ruby

dev-scheme

dev-tcltk

dev-tex

mail-client

media-radio

media-tv

net-im

net-irc

net-wireless

net-zope

sec-policy

sys-cluster

x11-plugins

x11-wm

xfce-base

xfce-extra

licenses

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

Warum klappt es nicht?

----------

## SvenFischer

So, die Lösung ist einfach:

in der /etc/make.conf muß folgende Zeile auskommentiert werden:

RSYNC_EXCLUDEFROM=/etc/portage/rsync_excludes

Leider hat in dem ersten Beitrag oben diese Info gefehlt.

----------

## sirro

 *lolli78 wrote:*   

> wer sich solche fragen stellt, sollte sich mal mit 
> 
> ```
> # RSYNC_EXCLUDEFROM is a file that portage will pass to rsync when it updates
> 
> ...

 

Naja, vielleicht fehlte die Angabe "in der make.conf". Das haben sich die meisten wohl gedacht und keinem ist der Fehler aufgefallen...

----------

## sirro

Ich hab mir ein paar Gedanken zu dem Problem mit dem oben genannten Skript und der Frage "was ist wenn ich ein neues Programm installieren will?" gemacht.

Meine Lösung ist eigentlich sehr simpel:  :Wink: 

Ich habe eine Datei (/etc/portage/rsync_excludes_weekly) in der alles ausgeschlossen wird, was ich wirklich nicht brauche (z.B. games-* auf der Arbeit). Diese Datei wird genutzt um einmal in der Woche (oder seltener) alles auf den neusten Stand zu bringen. Natürlich kann die Datei auch leer sein, dann wird einmal in der Woche der ganze Tree aktualisiert.

Dann habe ich die Skript prlock.py (s.o.), das bei mir /root/bin/rsync_exclude.py heißt.

Dieses Skript erstellt bekanntlich eine Datei, die nur die Verzeichnisse bereits installierter Programme und ganz wichtige Sachen (s.o.) synced. Mit dieser Datei wird der tägliche/regelmäßige Sync durchgeführt.

Diese Datei wird per cron vor meinem Sync neu erstellt und ist somit immer zum passenden Zeitpunkt auf dem neusten Stand!

Durch diese Taktik synce ich an 4Tagen in der Woche nur ca. 5,000Dateien und an einem ca. 55,000 statt über 80,000. (Diese Zahlen sind natürlich nicht repräsentativ!). Am Wochenende synce ich gar nicht, da ich dann meinen Arbeitsrechner gar nicht brauche...  :Wink: 

So und hier die Anleitung:

1. /root/bin/rsync_exclude.py aus prlock.py erstellen

2. chmod u+x /root/bin/rsync_exclude.py

3. crontab -e ausführen und sowas in der Art einfügen (Zeiten sind nach eigenen Vorlieben zu setzen):

```
# täglich alle installierten Programme zu /etc/portage/rsync_excludes hinzufügen

14 1 * * * /root/bin/rsync_exclude.py

# Montags => großen Tree syncen

11 4 * * 1 env RSYNC_EXCLUDEFROM=/etc/portage/rsync_excludes_weekly /usr/bin/emerge sync > /tmp/daily_sync.log

# Restliche Werktage => nur Programme die installiert sind syncen

12 4 * * 2 /usr/bin/emerge sync > /tmp/daily_sync.log

13 4 * * 3 /usr/bin/emerge sync > /tmp/daily_sync.log

14 4 * * 4 /usr/bin/emerge sync > /tmp/daily_sync.log

15 4 * * 5 /usr/bin/emerge sync > /tmp/daily_sync.log

# Am WE wird nicht gesynced
```

Anmerkung: Diesen Schrittkann man auch weglassen und mit den entsprechenden Kommandos (siehe crontab oben) von Hand syncen. (für nicht 24/7-Rechner)

4.  /etc/portage/rsync_excludes_weekly erstellen.

Ein Beispiel (kann man beliebig ändern oder auch leer lassen, dann hat man einmal die Woche einen kompletten Sync)

```
# in dieser Datei steht nur das, was wirklich _nie_ gesynced werden soll

app-accessibility

app-benchmarks

app-emacs

app-emulation

app-gnustep

app-i18n

app-laptop

app-pda

app-sci

app-vim

app-xemacs

dev-dotnet

dev-embedded

fresco-*

games-*

gnome-*

media-plugins

media-tv

net-dialup

net-irc

net-news

net-p2p

net-wireless

net-zope

sec-*

sys-cluster

x11-plugins

x11-themes

x11-wm

xfce-*
```

Das ist mein Beitrag für möglichst wenig rsync-Traffic (88% weniger pro Woche als vorher) und trotzdem noch einen sehr aktuellen Tree zu behalten, falls man ein neues Programm installieren will.

BTW: Ich werde versuchen das in nächster Zeit noch über 90% drücken, z.B. mit einem Sync alle zwei Tage.

Kommentare, Anmerkungen und natürlich auch Verbesserungen werden gerne entgegen genommen.

Ich hoffe, dass dieses Mini-Howto vielen helfen wird und vielleicht auch einige davon überzeugt, dass auch ein kompletter Tree und Traffic sparen zusammen passt!!!  :Smile: 

The contents of this posting are licensed under the Creative Commons - Attribution / Share Alike license.

----------

## 102039

Danke für den Tip,

hat sehr gut funktioniert und konnte ca. 50% einsparen.

Habe auch erst den kompletten Portage Tree gelöscht und dann neu gesync'd.

----------

## EOF

Hat jemand mal über eine hardcoreversion nachgedacht? Z.B. syncronisiere erstmal nur die ebuilds von den progs in der world datei samt abhängigkeiten. Wenn man ein neues programm installieren möchte, dann syncronisiere den entsprechenden ebuild (wenn es schon im portage ist), schaue nach abhängigkeiten und syncronisiere diese auch.

Ist so etwas sinnvoll (ich kenne den sonstigen overhead von portage nicht so genau)?

----------

## TheSmallOne

Hm, wo mir dieser Thread gerade so ins Auge fällt:

Das scheint zwar eine interessante Vorgehensweise zu sein, aber wäre es nicht weitaus logischer, wenn man portage selbst die Auswahl überlassen würde, welche Teile des Trees gesynct werden?

Ich meine wenn man nun ein -gnome Useflag gesetzt hat, dann kann portage doch daraus schließen, dass der entsprechende Teil nicht gesynct werden braucht, und das ganze entsprechend selbst so einrichten. Wenn man dann irgendwann auf die Idee kommt doch gnome verwenden zu wollen und das Useflag setzt kann portage automatisch ab diesem Zeitpunkt den entsprechen Zweig wieder mitaktualisieren.

Wenn der User sich selbst darum kümmern muß kann es doch durchaus dazu kommen, dass man hier oder da mal vergisst, dass man etwas ausgeschlossen hat und dann auf irgendwelche Probleme stößt.

----------

## EOF

Ich finde portage agiert momentan zu aktiv. Ich könnte mir ein "lazy"-portage vorstellen, was die benötigten ebuilds bei bedarf nachläd. Eigentlich braucht man beim sync nur eine textdatei, die angibt welche programme sich geändert haben (gegen ne andere datei abgleichen).

Weitere informationen oder die ebuilds braucht man z.b. bei emerge -s und  emerge programm_name. 

Günstiger geht es also. Aber wir müssen nehmen was wir bekommen, wenn wir uns nicht in die entwicklung reinziehen lassen wollen  :Very Happy: .

----------

## gidoca

 *EOF wrote:*   

> Eigentlich braucht man beim sync nur eine textdatei, die angibt welche programme sich geändert haben (gegen ne andere datei abgleichen).
> 
> 

 

Würde es nicht reichen, wenn bei jedem Emerge eine Datei heruntergeladen würde, in welcher die neuste Version des jeweiligen Programms steht? Dann wäre der Sync komplett unnötig. Eine Suche würde einfach ein bisschen länger dauern, da sie online ausgeführt werden müsste.

----------

## slick

 *gidoca wrote:*   

>  *EOF wrote:*   Eigentlich braucht man beim sync nur eine textdatei, die angibt welche programme sich geändert haben (gegen ne andere datei abgleichen).
> 
>  
> 
> Würde es nicht reichen, wenn bei jedem Emerge eine Datei heruntergeladen würde, in welcher die neuste Version des jeweiligen Programms steht?

 

Welche Version ist die aktuelle? Die von x86, ~x86, amd64, ~amd64, ... ? Wenn dann müßte der Server diese Datei anbhängig von Angaben des anfragenen Client generieren.

----------

## slick

 *lolli78 wrote:*   

> 
> 
> ```
> # RSYNC_EXCLUDEFROM is a file that portage will pass to rsync when it updates
> 
> ...

 

Ab portage-2.1 ist RSYNC_EXCLUDEFROM veraltet, evt. bitte Eingangspost anpassen. Neuer Syntax sieht so aus:

```
PORTAGE_RSYNC_EXTRA_OPTS="--exclude-from=/etc/portage/rsync_excludes"
```

----------

## bur

Ich probiere das ganze gerade in einer anderen Variante aus, quasi per Whitelist.

Ich habe dazu alle Zweige aus denen ich Pakete installiert habe (/var/db/pkg - manche Verz. sind leer, löschen) mit "+ app-arch*" explizit hinzugefügt:

```
#alle benutzten einschließen

+ app-admin*

+ app-arch*

+ app-benchmarks*

+ app-crypt*

+ app-editors*

+ app-i18n*

+ app-misc*

+ app-portage*

+ app-shells*

+ app-text*

+ dev-db*

+ dev-java*

+ dev-lang*

+ dev-libs*

+ dev-perl*

+ dev-python*

+ dev-tex*

+ dev-util*

+ kde-base*

+ media-fonts*

+ media-libs*

+ media-sound*

+ media-video*

+ net-analyzer*

+ net-dns*

+ net-firewall*

+ net-ftp*

+ net-libs*

+ net-misc*

+ net-nds*

+ net-print*

+ perl-core*

+ sys-apps*

+ sys-boot*

+ sys-devel*

+ sys-fs*

+ sys-kernel*

+ sys-libs*

+ sys-process*

+ www-client*

+ x11-apps*

+ x11-base*

+ x11-libs*

+ x11-misc*

+ x11-terms*
```

und dann alle Zweige ausgeschlossen:

```
#generell zweige auschließen

app-*

dev-*

games-*

gnome-*

gnustep-*

kde-*

mail-*

media-*

net-*

perl-*

rox-*

sci-*

sec-*

sys-*

www-*

x11-*

xfce-*
```

Das hat den Vorteil, dass es recht einfach zu verwalten ist, emerged man ein Programm aus einem bisher nicht benutzten Zweig, dann fügt man diesen einfach per "+" hinzu. Beim unmergen (sofern dann kein Paket aus dem Zweig mehr installiert ist) entfernt man die Zeile einfach. Es besteht auch nicht die Gefahr, dass wichtige Systembestandteile wie profiles ausgeschlossen werden.

Bei Bedarf kann man das Whitelisting auch noch verfeinern und bspw keine kompletten Zweige, sondern wirklich nur die benutzten Pakete whitelisten. Ist auch nur einmal etwas Arbeit (die man doch auch durch ein Skript machen lassen können müsste), danach ist die Verwaltung sehr einfach, da nur noch die Paketnamen mit "+" hinzugefügt werden müssen.

ACHTUNG

Ich habe gerade bemerkt, dass ein wichtiger Unterschied zwischen * und ** besteht. * gilt nur als Platzhalter bis zum nächsten Schrägstrich, was bei Packages mit Unterordnern zu größeren Problemen führt. Daher immer ** verwenden. Gilt auch für alle anderen Beispiele hier. Im wiki hab ichs angepasst.

----------

