distcc
A distcc egy olyan program, amely arra lett tervezve, hogy a kódfordítási feladatokat egy hálózaton keresztül szétossza a résztvevő host számítógépek között.
A distcc egy szerverből (distccd) és egy kliensprogramból (distcc) áll. A distcc kis beállítással átláthatóan képes együttműködni a ccache, a Portage és az Automake rendszerekkel.
Amikor Ön a distcc használatát tervezi Gentoo telepítés bootstrapeléséhez, győződjön meg róla, hogy elolvasta a Using distcc to bootstrap részt.
Ha olyan host számítógépeket használ, amelyek különböző architektúrán futtatják a distcc szoftvert, vagy eltérő eszközláncot használnak, akkor tekintse meg a Distcc/Cross-Compiling részt.
A distcc kódfordítási idő problémákat okozhat, mint például a bug #691544 hibát, ezért az ilyen problémák elhárításának első lépése az legyen, hogy tiltsa le a distcc szoftvert, és nézze meg, hogy ez megoldja-e a problémát.
Egy második, gyorsabb számítógép használata bináris szoftvercsomagok készítéséhez, valamint a bináris szoftvercsomag host számítógép beállítása előnyösen helyettesíthet néhány distcc használati esetet. Könnyebb lehet beállítani, és lefedi az összes kódfordítót és építési rendszert.
Telepítés
Mielőtt beállítanánk a distcc szoftvert, először nézzük meg a sys-devel/distcc szoftvercsomag telepítését az összes host számítógépen.
Követelmények az összes host számítógépen
Ahhoz, hogy a distcc használható legyen, a hálózaton lévő összes számítógépnek ugyanazt a GCC verziót kell használnia. Például a 3.3.x verziók (ahol az x változik) keverése rendben van, de a 3.3.x és a 3.2.x verziók keverése kódfordítási vagy futási hibákat eredményezhet.
Ellenőrizze, hogy minden rendszer ugyanazt a binutils verziót használja (eselect binutils list), máskülönben sok szoftvercsomag nem fog összekapcsolódni, különféle hibákat, például szövegrelokációt eredményezve.
USE jelölőzászlók
USE flags for sys-devel/distcc Distribute compilation of C code across several machines on a network
gssapi
|
Enable support for net-libs/libgssglue |
gtk
|
Add support for x11-libs/gtk+ (The GIMP Toolkit) |
hardened
|
Activate default security enhancements for toolchain (gcc, glibc, binutils) |
ipv6
|
Add support for IP version 6 |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
xinetd
|
Add support for the xinetd super-server |
zeroconf
|
Support for DNS Service Discovery (DNS-SD) |
A distcc rendelkezik egy grafikus megfigyelővel (monitorozóval), amely figyelemmel kíséri azokat a feladatokat, amelyeket egy számítógép elküld kódfordításra. Ez a monitorozó akkor van engedélyezve, ha a gtk
USE jelölőzászló be van állítva.
Emerge
A USE jelölőzászló beállítása után telepítse a sys-devel/distcc szoftvercsomagot:
root #
emerge --ask sys-devel/distcc
Ne feledje el telepíteni a sys-devel/distcc szoftvercsomagot az összes résztvevő számítógépre.
Beállítás
Szolgáltatás
Annak érdekében, hogy a distccd automatikusan elinduljon, kövesse az alábbi utasításokat.
OpenRC
Szerkessze a /etc/conf.d/distccd fájlt, és győződjön meg arról, hogy a --allow
direktíva csak megbízható kliens számítógépeket engedélyez. További biztonság érdekében használja a --listen
direktívát, hogy megadja a distccd szolgáltatásnak, hogy mely IP-címen hallgatózzon (több hálózati című rendszerek esetében). További információ a distcc biztonságáról itt található: Distcc biztonsági megjegyzések.
Bárki, aki csatlakozni tud a distcc szerver portjához, az tetszőleges parancsokat futtathat azon a számítógépen, mint distccd felhasználó.
A következő példa lehetővé teszi, hogy a distcc kliensek, amelyek a 192.168.0.4
és a 192.168.0.5
címen futnak, csatlakozzanak a helyben futó distccd szerverhez:
/etc/conf.d/distccd
Specifikus kliens számítógépek engedélyezése a distccd szolgáltatáshoz való csatlakozáshozDISTCCD_OPTS="--port 3632 --log-level notice --log-file /var/log/distccd.log -N 15 --allow 192.168.0.4 --allow 192.168.0.5"
Amikor egy fájlba naplóz a /var/log könyvtárban, hozza létre a naplót, és adja meg a megfelelő jogosultságokat:
root #
touch /var/log/distccd.log
root #
chown distcc:root /var/log/distccd.log
Fontos a
--allow
és a --listen
használata. További információkért kérjük, hogy olvassa el a distccd man súgót vagy a fent említett biztonsági dokumentumot.Most indítsa el a distccd szolgáltatást az összes résztvevő számítógépen:
root #
rc-update add distccd default
root #
rc-service distccd start
systemd
Szerkessze a /etc/systemd/system/distccd.service.d/00gentoo.conf fájlt, hogy hozzáadja az engedélyezett kliens számítógépeket CIDR formátumban. Az példának megfelelően minden IP-címet hozzáad a 192.168.1.xxx tartományban.
/etc/systemd/system/distccd.service.d/00gentoo.conf
ALLOWED_SERVERS beállításaEnvironment="ALLOWED_SERVERS=192.168.1.0/24"
Még egy példa több kliens számítógéppel és manuálisan megadott naplózási szinttel:
/etc/systemd/system/distccd.service.d/00gentoo.conf
ALLOWED_SERVERS beállításaEnvironment="ALLOWED_SERVERS=127.0.0.1 --allow 192.168.1.0/24 --allow 10.1.1.1/24 --log-level error"
A ALLOWED_SERVERS változónév kissé megtévesztő, mivel a helyi distccd szerverhez csatlakozni jogosult kliensekre utal. Ennek ellenére ez a változó az, amelyet a distccd szolgáltatásban a
--allow
opció értékeként használnak – további információkért tekintse meg a /usr/lib/systemd/system/distccd.service fájlt.Ellentétben az OpenRC init rendszerrel, a /etc/env.d/* könyvtárba helyezett környezeti változók nem lépnek életbe a systemd felhasználók számára, még akkor sem, ha env-update parancsot futtatják és újraindítják a distccd szolgáltatást. Ennek oka, hogy a /etc/environment.d fájlt, amelyet az env-update generál, csak a systemd felhasználói példány olvassa be. Ugyanakkor a distccd a systemd rendszer példány által van létrehozva.
A megfelelő környezeti változók beállításához a distccd számára, helyezze el őket a /etc/systemd/system/distccd.service.d/00gentoo.conf fájlba, például:
/etc/systemd/system/distccd.service.d/00gentoo.conf
[Service]
Environment="ALLOWED_SERVERS=192.168.121.0/24"
Environment="DISTCC_VERBOSE=1"
Environment="DISTCC_SAVE_TEMPS=1"
Environment="CCACHE_DIR=/var/cache/ccache"
Az /etc/systemd/system/distccd.service.d/00gentoo.conf fájlban található
Environment=
direktíva nem támogatja a változók kibontását. A Environment="PATH=/usr/lib/ccache/bin:$PATH"
pontosan úgy lesz kezelve, ahogy van, ezért nem fog a kívánt módon működni.Megoldásként szerkessze a distccd.service fájlt az alábbi parancs futtatásával:
root #
systemctl edit --full distccd.service
Ez meg fog nyitni egy szövegszerkesztőt. Módosítsa az ExecStart=
direktíva sorát erre:
ExecStart=/bin/bash -c "PATH=/usr/lib/ccache/bin:$PATH exec /usr/bin/distccd --no-detach --daemon --port 3632 -N 15 --allow $ALLOWED_SERVERS --log-level debug"
Alternatívaként lehetséges egy shell script wrapper megírása a /usr/bin/distccd számára.
Töltse be újra az unit fájlokat az ilyen módosítások elvégzése után:
root #
systemctl daemon-reload
Engedélyezze az automatikus indítást a distccd szolgáltatás számára, majd indítsa el a szolgáltatást:
root #
systemctl enable distccd
root #
systemctl start distccd
Résztvevő host számítógépek megadása
Használja a distcc-config parancsot a helyi kliens számítógépeken, hogy beállítsa a host számítógépek listáját (azokat az operációs rendszereket, amelyek a distccd szolgáltatást futtatják).
Az alábbiakban egy példa lista látható a host számítógépek megadására. A legtöbb esetben az 1. és 2. sor változatai elegendők. Az utóbbi a /limit
szintaxist használja, hogy tájékoztassa a distcc szoftvert az adott csomóponton indítandó maximális feladatok számáról. További információ a 3. és 4. sorban használt szintaxisról a distcc man súgóban található.
192.168.0.1 192.168.0.2 192.168.0.3
192.168.0.1/2 192.168.0.2 192.168.0.3/10
192.168.0.1:4000/2 192.168.0.2/1 192.168.0.3:3632/4
@192.168.0.1 @192.168.0.2:/usr/bin/distccd 192.168.0.3
Számos más módszer is létezik a host számítógépek beállítására. További részletekért tekintse meg a man súgó oldalt (man distcc).
Ha a kódfordításoknak a helyi számítógépen is meg kell történniük, akkor adja hozzá a localhost
jelölést a host számítógépek listájához. Ha viszont a helyi számítógépet nem kívánja a kódfordításra használni, akkor hagyja ki a host számítógépek listájából. Lassú számítógép esetén a localhost használata valóban lelassíthatja a folyamatot. Tesztelje a beállításokat, hogy optimalizálhassa a teljesítményt.
Állítsa be a distcc szoftvert úgy, hogy az első sorban említett host számítógépeket használja a példában:
root #
/usr/bin/distcc-config --set-hosts "localhost 192.168.0.1 192.168.0.2 192.168.0.3"
A distcc támogatja a pump módot is, amelyet a pump parancs meghívásával lehet aktiválni. Ez jelentősen csökkentheti a build időt, ha több fájl kerül párhuzamosan fordításra. A szerver oldalon előfeldolgozott fejlécek gyorsítótárazását végzi el, így megszünteti ezen fejlécek ismételt feltöltését és előfeldolgozását.
A pump mód beállításához adja hozzá a ,cpp,lzo
utótagot a host számítógépek megadásánál. A pump módhoz mind a cpp
, mind az lzo
zászlók szükségesek (függetlenül attól, hogy a fájlok C vagy C++ típusúak):
root #
/usr/bin/distcc-config --set-hosts "192.168.0.1,cpp,lzo 192.168.0.2,cpp,lzo 192.168.0.3,cpp,lzo"
A host számítógépeknek szintén szerepelniük kell a következőben:
/etc/distcc/hosts
Should match --set-hosts192.168.0.1
192.168.0.2
192.168.0.3
Opcionálisan, a host számítógép által használt szálak maximális számának beállításához adjon hozzá egy perjelet ("/") minden egyes host számítógép után:
/etc/distcc/hosts
Munkában részt vevő szálak maximális számának a megadása192.168.0.1/8
192.168.0.2/4
192.168.0.3/16
Ugyanez érvényes a distcc-config parancsra. Ha a maximális szálak száma nincs megadva, akkor alapértelmezés szerint 4 lesz.
Használat
Portage segítségével
A Portage beállítása a distcc használatához egyszerű. Mindössze a distcc funkció engedélyezéséről van szó, valamint megfelelő értéket kell beállítani az egyidejű build-feladatok számához (mivel a distcc növeli a build-erőforrások mennyiségét).
Állítsa be a MAKEOPTS változót és a FEATURES változót az alább látható módon.
Általános stratégia a következő:
- Az
N
érték beállítása a teljes (helyi + távoli) CPU-magok számának kétszeres + 1 értékre. - Az
M
értékének beállítása a helyi CPU-magok számának megfelelően.
A -lM
használata a MAKEOPTS változóban megakadályozza a túl sok feladat elindítását, ha néhány distcc klaszter host számítógép nem érhető el (megnövelve az egyidejű feladatok számát a többi rendszeren), vagy ha egy ebuild úgy van beállítva, hogy letiltsa a távoli build-eket (például a gcc esetében). Ez úgy valósul meg, hogy nem engedi új feladatok elindítását, amikor a rendszer terhelése eléri vagy meghaladja az M
értékét.
/etc/portage/make.conf
MAKEOPTS és a FEATURES beállítása# Cserélje ki az N és M értékeket a korábban kiszámított megfelelő értékekre.
MAKEOPTS="-jN -lM"
FEATURES="distcc"
Például, ha két négy magos host számítógép futtatja a distccd szolgáltatást, és a helyi számítógépeknek kétmagos CPU-ja van, akkor a MAKEOPTS változó így nézhet ki:
/etc/portage/make.conf
MAKEOPTS példa 2 négy magos (távoli) és egy kétmagos (helyi) számítógépre# 2 remote hosts with 4 cores each = 8 cores remote
# 1 local host with 2 cores = 2 cores local
# total number of cores is 10, so N = 2*10+1 and M=2
MAKEOPTS="-j21 -l2"
CFLAGS és CXXFLAGS
A make.conf fájl szerkesztésekor győződjön meg arról, hogy a -march=native
nincs jelen a CFLAGS vagy a CXXFLAGS változókban. A distccd nem fog munkát elosztani más számítógépekre, ha a march
értéke native
. Ehelyett pontos platformot és néhány, a CPU-hoz szükséges extra kapcsolót kell megadni. Ilyesmik például:
/etc/portage/make.conf
Beépített *FLAGS# Minimal list of flags is generated with:
# $ diff -U0 <(LANG=C gcc -Q -O2 -march=sandybridge --help=target) <(LANG=C gcc -Q -O2 -march=native --help=target)
COMMON_FLAGS="-march=sandybridge -mtune=sandybridge -maes" # don't use -march=native!
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
Tekintse meg az Inlining -march=native
for distcc leírást a további információkért.
Alternatív megoldásként telepítse a app-misc/resolve-march-native szoftvercsomagot, hogy meghatározza, mire oldódik fel a -march=native
.
Az automake segítségével
Ez bizonyos esetekben könnyebb, mint a Portage beállítása. Mindössze annyi szükséges, hogy a PATH változót frissítse úgy, hogy a /usr/lib/distcc/bin/ kerüljön a gcc-t tartalmazó könyvtár (/usr/bin/) elé. Azonban van egy kitétel: ha ccache van használatban, akkor a distcc helyét a ccache után kell megadni.
root #
export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
Helyezze ezt a felhasználó ~/.bashrc vagy azzal egyenértékű fájljába, hogy a PATH minden bejelentkezéskor be legyen állítva, vagy állítsa be globálisan egy /etc/env.d/ fájl segítségével.
Ahelyett, hogy önmagában a make parancsot hívná meg, adja hozzá a -jN
kapcsolót (ahol az N
egy egész szám). Az N
értéke a hálózattól és az összeállításhoz használt számítógépek típusától függ. Egy heurisztikus megközelítés a megfelelő érték meghatározásához korábban szerepel ebben a cikkben.
A ccache segítségével
Ahhoz, hogy Ccache működjön distcc-vel, bizonyos előfeltételeknek meg kell felelniük:
- A ccache sikeresen be van állítva helyileg.
- A distcc sikeresen be van állítva a kívánt host számítógépeken.
A következő beállítás az alábbi módon fog működni:
[client] [remote]
'''ccache''' <miss?> → compile it and save cache files,
<hit?> also distribute other source code → '''distcc''' → '''ccache''' <miss?> → compile it, save cache files, return cache file to client
↓ <hit?>
use the local cache file ↓
return local cache file to client
A következő beállítást minden kívánt host számítógépen el kell végezni!
A distccd beállítása
Ahhoz, hogy a distccd szolgáltatás használni tudja a ccache-t, el kell álcáznia a /usr/bin elérési utat a /usr/lib/ccache/bin használatával. Továbbá, amikor a ccache-t használja, a ccache-nek a distcc
előtagot kell használnia:
/etc/conf.d/distccd
PATH="/usr/lib/ccache/bin:${PATH}"
CCACHE_PREFIX="distcc"
Ezenkívül a distccd szolgáltatásnak tisztában kell lennie a DISTCC_DIR és a CCACHE_DIR környezeti változókkal:
Ezeket a változókat valahol a /etc/env.d/ könyvtárban kell beállítani, különben a ccache megpróbálja a gyorsítótár fájlokat a ${HOME}/.ccache/ helyre tenni, ami elégtelen jogosultságok miatt COMPILE_ERROR hibához vezethet. Ennek megállapításához használja az alább említett tesztpéldát, valamint a export DISTCC_SAVE_TEMPS="1" beállítást, ahogy az itt található. Ez alapértelmezés szerint az error naplókat a /tmp/ könyvtárban fogja biztosítani. A naplófájlok így néznek ki: distcc_server_stderr_*.txt . Ne feledje, hogy ezek a környezeti változók nem állíthatók be a /etc/conf.d/distccd fájlban, mivel valamilyen okból kifolyólag a distccd nem olvassa be őket.
/etc/env.d/03distcc_ccache
CCACHE_DIR="/var/cache/ccache"
DISTCC_DIR="/var/tmp/portage/.distcc"
Következő lépésként frissítse a környezeti változókat:
root #
env-update
>>> Regenerating /etc/ld.so.cache...
Végül indítsa újra a distccd szolgáltatást, hogy az összes változtatást alkalmazza.
root #
rc-service distccd restart
Az ccache beállítása
Amikor a distcc-t ccache-vel együtt használja, a gyorsítótár könyvtárakat kézzel kell előkészíteni, mivel a distccd szolgáltatás valamilyen oknál fogva csak a
distcc
felhasználóval működik, és nem tud könyvtárakat létrehozni a /var/cache/ccache/ könyvtárban. Nem elegendő, ha ezt a felhasználót hozzáadja a portage
csoporthoz. Továbbá, vegye figyelembe, hogy a ccache.conf fájlban meghatározott cache_dir_levels
változó adja meg, hogy hány alkönyvtárat kell létrehozni. Az alábbi példa az alapértelmezett értéket használja, ami 2
.Először készítse elő a gyorsítótár könyvtárakat:
root #
cd "/var/cache/ccache/"
root #
mkdir {a..z} {0..9} tmp
root #
for first_level_directory in $(find . -maxdepth 1 -type d -not -name "." -and -not -name "tmp"); do pushd "${first_level_directory}" >/dev/null; mkdir {a..z} {0..9}; popd >/dev/null; done
A második parancs (mkdir) létrehozza az első szintű könyvtárakat a-tól z-ig, 0-tól 9-ig és a tmp könyvtárat. Az ezt követő for ciklus az első szintű könyvtárakat keresi meg (find . -maxdepth 1 -type d), kihagyva az aktuális könyvtárat . és a tmp könyvtárat (-not -name "." -and -not -name "tmp"
). Ezután belép mindegyikükbe (pushd), létrehozza a második szintű könyvtárakat a-tól z-ig és 0-tól 9-ig (mkdir), majd visszalép az előző könyvtárba (popd), ami a /var/cache/ccache/.
Az aktuális könyvtárat . ki kell zárni a
-not -name "."
kapcsolóval, ellenkező esetben az első pushd parancs az aktuális könyvtárba . kerül, majd a popd paranccsal visszalép a veremben található aktuális könyvtárba. Ez addig folytatódik, amíg a verem ki nem ürül, könyvtárakat hozva létre, ahol minden pushd parancs sikertelen. Ha ez bekövetkezik, a hibás könyvtárakat megkeresheti például find / -type d -name "0" paranccsal, és eltávolíthatja őket a rm --recursive [a-z] [0-9] paranccsal. Javasolt ezeket kézzel elvégezni!Amikor az előkészítés befejeződött, minden könyvtárnak - beleértve a ccache könyvtárat is - a distcc
felhasználó tulajdonában kell lennie.
root #
find /var/cache/ccache -type d -exec chown distcc:portage "{}" +
A portage beállítása
Ahhoz, hogy a emerge-t distcc-vel és ccache-el használja, győződjön meg arról, hogy mindkét funkció engedélyezve van, és a CCACHE_DIR be van állítva a /etc/portage/make.conf fájlban.
/etc/portage/make.conf
[...]
FEATURES="distcc ccache"
CCACHE_DIR="/var/cache/ccache"
Lehet, hogy felesleges itt beállítani a CCACHE_DIR-t, mivel ez már definiálva van a /etc/env.d/03distcc_ccache fájlban, ahogyan az itt említve van. Azonban, hogy teljesen biztos legyen benne, érdemes így beállítani.
A distcc és ccache manuális tesztelése
Távolról
Először engedélyezze a részletes naplózást úgy, hogy a --log-level
értékét debug
-ra állítja a /etc/conf.d/distccd fájlban.
/etc/conf.d/distccd
[...]
DISTCCD_OPTS="${DISTCCD_OPTS} --log-level debug"
[...]
Ezután indítsa újra a szolgáltatás, hogy az alkalmazza a változtatásokat.
root #
rc-service distccd restart
Ellenőrizze továbbá, hogy vannak-e olyan könyvtárak a /var/cache/ccache könyvtárban - beleértve magát a ccache könyvtárat is -, amelyek nem a distcc
felhasználó tulajdonában vannak, és javítsa ki azok tulajdonosi jogosultságokat.
root #
chown -R distcc:portage /var/cache/ccache
Kliens
Győződjön meg arról, hogy a következő környezeti változók jelen vannak az aktuális shellben:
root #
export PATH="/usr/lib/ccache/bin:${PATH}"
root #
export CCACHE_DIR="/var/cache/ccache"
root #
export DISTCC_DIR="/var/tmp/portage/.distcc"
root #
export DISTCC_SAVE_TEMPS="1"
root #
export DISTCC_VERBOSE="1"
Ezután lépjen be a /tmp/ könyvtár egy ideiglenes alkönyvtárába, és fordítsa le az alább említett példát.
root #
cd $(mktemp --directory)
root #
distcc gcc -c main.c -o main.o
Ez részletes kimenetet biztosít, miközben az alapértelmezés szerint a távoli helyről érkező ideiglenes fájlokat a /tmp/ könyvtárban tartja:
[...]
distcc[29466] (dcc_cleanup_tempfiles_inner) skip cleanup of /tmp/distcc_9c42f0a6.i
distcc[29466] (dcc_cleanup_tempfiles_inner) skip cleanup of /tmp/distcc_server_stderr_9cc0f0a6.txt
[...]
A távoli helyről származó bármilyen hiba a /tmp/distcc_server_stderr_*.txt fájlokban kerül mentésre.
Ha a fordítás sikeres volt, akkor a következő sor jelenik meg:
[...]
distcc[29466] compile main.c on 192.168.0.4 completed ok
[...]
A távoli helyszínen a kimenet így fog kinézni:
[...]
distccd[13296] (dcc_check_compiler_masq) /usr/lib/ccache/bin/gcc is a safe symlink to /usr/bin/ccache
[...]
distccd[13296] (dcc_job_summary) client: 192.168.0.4:33880 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:20ms gcc main.c
A lényeg itt az, hogy a /usr/lib/ccache/bin/ bármelyik szimbolikus linkje egy biztonságos szimbolikus link legyen a /usr/bin/ccache irányába.
Továbbá, a távoli oldalon a gyorsítótárban megtalálható fájlnak 2beaa22dc2a2873d6869d69411840c-17229.o kell lennie a /var/cache/ccache/c/0/ könyvtárban, feltételezve, hogy a példát és fájlnevét erről a wiki cikkről másolták. Általánosságban véve, a ccache méretét monitorozhatja a watch "ccache --show-stats" paranccsal a fordítás során.
A distcc és ccache tesztelése az emerge használatával
Ellenőrizze, hogy az aktuális shellben jelen vannak-e a szükséges környezeti változók, tekintse meg a leírást section=#Future_usage. Valamint hogy a /etc/portage/make.conf megfelelően lett-e beállítva, tekintse meg a leírást section=#Configure_portage.
A gyorsítótár fájlok létrehozásához a távoli oldalon a kliensen lefordíthat kisebb szoftvercsomagokat, például htop
és bzip2
.
root #
emerge --ask htop bzip2
Jövőbeni felhasználás
Győződjön meg arról, hogy a következő környezeti változók mindig be vannak állítva a kívánt shellben:
PATH="/usr/lib/ccache/bin:${PATH}"
CCACHE_DIR="/var/cache/ccache"
DISTCC_DIR="/var/tmp/portage/.distcc"
A bootstrap számára
TEENDŐ: Todo:
- Ellenőrizze ezt a részt az elavult információk miatt. Különösen a "USE='-*'" és "--nodeps" lehet, hogy már nem javasolt. Tekintse meg a Vita oldalt a további információért.
A distcc használata a bootstraphez (vagyis egy működő eszközkészlet felépítése a rendszer többi részének telepítése előtt) néhány további lépést igényel.
Első lépés: Portage beállítása
Indítsa el az új számítógépet egy Gentoo Linux LiveCD segítségével, és kövesse a telepítési útmutatót, miközben nyomon követi az utasításokat a Gentoo GYIK leírásában a bootstrapelésről szóló információkért. Ezután állítsa be a Portage szoftvercsomag-kezelőt úgy, hogy a distcc szoftvert használja:
/etc/portage/make.conf
Portage beállítása úgy, hogy a distcc szoftvert használjaFEATURES="distcc"
MAKEOPTS="-jN"
Frissítse a telepítési munkamenetben a PATH változót is:
root #
export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
Második lépés: A distcc letöltése
Telepítse a sys-devel/distcc szoftvercsomagok:
root #
USE='-*' emerge --nodeps sys-devel/distcc
Harmadik lépés: A distcc beállítása
Futtassa a distcc-config parancsot a distcc beállításához. Az példában szereplő host#
helyére írja be a résztvevő csomópontok IP-címeit vagy host számítógépek neveit.
root #
/usr/bin/distcc-config --set-hosts "localhost host1 host2 host3 ..."
A distcc most már be van állítva a bootstraphez! Folytassa a megfelelő telepítési utasításokkal, és ne feledje el futtatni a emerge distcc parancsot a emerge @system futtatása után. Ez azért fontos, hogy az összes szükséges függőség telepítve legyen.
A bootstrap és a emerge @system során előfordulhat, hogy a distcc nem tűnik használatban lévőnek. Ez várható, mivel egyes ebuildek nem működnek jól a distcc szoftverrel, ezért szándékosan letiltják azt.
Extrák
A distcc alkalmazás további funkciókkal és alkalmazásokkal rendelkezik, amelyek támogatják a distcc környezetben való munkát.
Felügyeleti segédprogramok
A distcc két felügyeleti segédprogrammal érkezik. A szövegalapú felügyeleti segédprogram mindig fel van építve, és distccmon-text a neve. Első használatakor kissé zavaró lehet, de valójában nagyon könnyen használható. Ha a programot paraméter nélkül futtatják, akkor csak egyszer fut le. Ha azonban egy számot adunk meg paraméterként, akkor minden N
másodpercben frissül, ahol N
az átadott argumentum.
user $
distccmon-text 10
A másik felügyeleti segédprogram csak akkor engedélyezett, ha a gtk
USE jelölőzászló be van állítva. Ez a segédprogram GTK-alapú, X környezetben fut, és meglehetősen kellemes a használata. A Gentoo esetében a grafikus felület monitorját átnevezték distccmon-gui névre, hogy kevésbé legyen zavaró (eredetileg distccmon-gnome néven hívják).
user $
distccmon-gui
A Portage distcc használatának felügyeletéhez:
root #
DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-text 10
root #
DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui
Ha a distcc könyvtár máshol található, akkor módosítsa a DISTCC_DIR változót ennek megfelelően.
Egy trükk az, hogy a DISTCC_DIR változót környezeti változóként állítsa be:
root #
echo 'DISTCC_DIR="/var/tmp/portage/.distcc/"' >> /etc/env.d/03distcc_custom
Vegye figyelembe, hogy a DISTCC_DIR változót máshol kell beállítani, mint a /etc/env.d/02distcc, mivel az minden alkalommal felülíródik, amikor a distcc-config parancsot használják! A distcc-config --set-env DISTCC_DIR <some_path> nem működik.
Most frissítse a környezetet:
root #
env-update
root #
source /etc/profile
Végül indítsa el a grafikus felületű alkalmazást:
root #
distccmon-gui
SSH a kommunikációhoz
A distcc SSH beállítása néhány buktatót tartalmaz. Először is, hozzon létre egy jelszó nélküli SSH kulcspárt. Vegye figyelembe, hogy a portage a programokat Portage felhasználóként fordítja (vagy rootként, ha a FEATURES="userpriv"
nincs beállítva). A Portage felhasználó home könyvtára /var/tmp/portage/, ami azt jelenti, hogy a kulcsokat a /var/tmp/portage/.ssh/ könyvtárban kell tárolni.
A Portage felhasználó home könyvtára a legújabb verziókban /var/lib/portage/home lett, azonban ez a könyvtár nem használható distcc esetén SSH protokollon keresztül, mivel a fordítás során kívül esik az elérhető útvonalon. Frissíteni kell:
root #
usermod -d /var/tmp/portage portage
root #
ssh-keygen -b 2048 -t rsa -f /var/tmp/portage/.ssh/id_rsa
Másodszor, hozzon létre egy szekciót minden host számítógép számára az SSH beállításfájlban:
/var/tmp/portage/.ssh/config
Host számítógépenkénti szekció hozzáadásaHost test1
HostName 123.456.789.1
Port 1234
User UserName
Host test2
HostName 123.456.789.2
Port 1234
User UserName
Küldje el a nyilvános kulcsot minden kódfordítási csomóponthoz:
root #
ssh-copy-id -i /var/tmp/portage/.ssh/id_rsa.pub UserName@CompilationNode
Ügyeljen arra, hogy minden host számítógép szerepeljen a known_hosts fájlban:
root #
ssh-keyscan -t rsa <compilation-node-1> <compilation-node-2> [...] > /var/tmp/portage/.ssh/known_hosts
Javítsa ki a fájlok tulajdonosát az alábbi módon:
root #
chown -R portage:portage /var/tmp/portage/.ssh/
A következő parancsot futtassa a test1
és test2
host számítógépek beállításához:
root #
/usr/bin/distcc-config --set-hosts "@test1 @test2"
Kérjük, vegye figyelembe a @
(@ jel) jelentését, amely az ssh host számítógépeket határozza meg a distcc számára.
Végül adja meg a distcc számára, hogy melyik SSH binárist használja:
/etc/portage/make.conf
DISTCC_SSH="ssh"
Nem szükséges futtatni a distccd init szkriptet a host számítógépeken, amikor a distcc SSH protokollon keresztül kommunikál.
Fordított SSH
Alternatívaként a distcc beépített SSH megoldása helyett egy kódfordító szerver csatlakozhat a distcc klienshez SSH protokollon keresztül, átirányítva a kliens distcc TCP portját a kódfordító szerverre. Nincs szükség jelszó nélküli SSH kulcsokra a kliensen.
user $
ssh -R3632:127.0.0.1:3632 root@distcc-client
Vegye figyelembe, hogy a distcc a localhost kifejezést speciális célokra használja szó szerint, ezért helyette a 127.0.0.1 kell használni. Több fordító szerver esetén mindegyikhez saját portátirányítás szükséges a kliensen (például: 127.0.0.1:4000, 127.0.0.1:4001 stb.). Ellenőrizze, hogy az IP-címek és portok fel vannak-e sorolva a kliensen a /etc/distcc/hosts fájlban.
Tesztelés
A distcc teszteléséhez írjon egy egyszerű Hello distcc programot, és futtassa a distcc szoftvert részletes üzemmódban, hogy ellenőrizze a megfelelő kommunikációt.
main.c
#include <stdio.h>
int main() {
printf("Hello distcc!\n");
return 0;
}
Ezután kapcsolja be a részletes üzemmódot, fordítsa le a programot a distcc segítségével, és kapcsolja össze a létrehozott objektumfájlt egy futtatható állománnyá.
user $
export DISTCC_VERBOSE=1
user $
distcc gcc -c main.c -o main.o # or 'pump distcc <...>'
user $
gcc main.o -o main
Cserélje le a distcc parancsot a pump distcc parancsra a pump üzemmód használatához.
A kimenetnek tartalmaznia kell információkat a distcc beállításának megtalálásáról, a csatlakozáshoz kiválasztott host számítógépről, a csatlakozás megkezdéséről, valamint végül a main.c lefordításáról. Ha a kimenet nem sorolja fel a kívánt distcc host számítógépeket, akkor ellenőrizze a beállítást.
Végül győződjön meg arról, hogy a lefordított program megfelelően működik-e. Az egyes host számítógépek teszteléséhez sorolja fel az összes fordító host számítógépet a hosts fájlban.
user $
./main
Hello distcc!
Hibaelhárítás
Ha probléma merül fel a distcc használata közben, akkor ez a szakasz segíthet a probléma megoldásában.
ERROR: failed to open /var/log/distccd.log
2015 január 22-től kezdődően a megfelelő distccd.log fájl létrehozása sikertelen a /var/log/ könyvtárban. Ez látszólag csak a distcc 3.1-r8 verzióját érinti. A hibát jelenleg kijavítják (Tekintse meg a bug #477630 hibabejegyzéset). A probléma megkerülésére lehetőség van a naplófájl kézi úton történő létrehozásával, megfelelő tulajdonjog beállításával és a distccd szolgáltatás újraindításával.
root #
mkdir -p /var/log/distcc
root #
touch /var/log/distcc/distccd.log
root #
chown distcc:daemon /var/log/distcc/distccd.log
Ezután frissítse a /var/log elérési útvonalat a distccd beállításfájlban, amely a /etc/conf.d/distccd könyvtárban található, az előző lépésben létrehozott distcc könyvtárra.
/etc/conf.d/distccd
Naplófájl útvonalának beállításaDISTCCD_OPTS="--port 3632 --log-level notice --log-file /var/log/distcc/distccd.log -N 15
Végül indítsa újra a distccd szolgáltatást:
root #
/etc/init.d/distccd restart
Néhány szoftvercsomag nem használja a distcc szoftvert
Amikor különféle szoftvercsomagokat telepítenek, a felhasználók észrevehetik, hogy néhány közülük nincs elosztva (és nem épül párhuzamosan). Ez azért történhet, mert a szoftvercsomag Makefile fájlja nem támogatja a párhuzamos műveleteket, vagy az ebuild karbantartója kifejezetten letiltotta a párhuzamos műveleteket egy ismert probléma miatt.
Előfordulhat, hogy a distcc miatt egy szoftvercsomag fordítása sikertelen lesz. Ha ez megtörténik, akkor kérjük, jelentse.
A Rust szoftvercsomagról ismert, hogy túlzott IO-kihasználást okoz, mivel a --local-load opciót figyelmen kívül hagyja, és a --jobs értéke általában túl magas a helyi build erőforrásokhoz képest. Egy package.env fájlt kell létrehozni nem distcc MAKEOPTS értékekkel, hogy megkerüljék ezt a problémát.
/etc/portage/env/nodistcc.conf
MAKEOPTS="-jN"
FEATURES="-distcc"
/etc/portage/package.env/nodistcc
dev-lang/rust nodistcc.conf
mail-client/thunderbird nodistcc.conf
sys-libs/libcxx nodistcc.conf
www-client/firefox nodistcc.conf
Vegyes GCC verziók
Ha a környezetben különböző GCC verziók vannak, akkor valószínűleg nagyon furcsa problémák jelentkezhetnek. A megoldás az, hogy biztosítsa, hogy minden host számítógép ugyanazt a GCC verziót használja.
A legutóbbi Portage frissítések miatt a Portage a ${CHOST}-gcc
(minus gcc) helyett a gcc
-t használja. Ez azt jelenti, hogy ha i686 számítógépeket kevernek más típusokkal (i386, i586), akkor a build problémákba ütközhet. Ennek a megkerülésére a következő parancsot lehet futtatni:
root #
export CC='gcc' CXX='c++'
Ezen kívül beállíthatja a CC és CXX változókat a /etc/portage/make.conf fájlban a fenti parancsban megadott értékekre. Ez biztosítja az egységes build környezetet és kiküszöböli az inkompatibilitási problémákat különböző géptípusok között.
Ez a lépés kifejezetten újradefiniálja a Portage egyes viselkedésmódjait, ami a jövőben furcsa eredményekhez vezethet. Kizárólag akkor alkalmazza ezt, ha a CHOST-ok keverése elkerülhetetlen.
Az, hogy a megfelelő gcc verzió csak egy slotként van jelen egy szerveren, önmagában nem elegendő. A Portage a distcc szoftvert használja a CHOST változó által hivatkozott fordító (például:
x86_64-pc-linux-gnu
) helyettesítésére, és a distccd pontosan ugyanazzal a névvel hívja meg. A megfelelő gcc verziónak minden érintett fordítószerveren az alapértelmezett rendszerfordítónak kell lennie.-march=native
A GCC 4.3.0 verziójától kezdve a kódfordító támogatja a -march=native
opciót, amely lehetővé teszi a CPU automatikus felismerését és az azon a processzoron érdemes optimalizációk bekapcsolását, amelyen a GCC fut. Ez azonban problémát okoz a distcc használata során, mivel lehetővé teszi, hogy különböző processzorokra optimalizált kód keveredjen. Például, ha a distcc-t -march=native
opcióval futtatják egy AMD Athlon processzorral rendelkező rendszeren, és ugyanezt teszik egy másik rendszeren, amelyen Intel Pentium processzor van, akkor a két processzor által fordított kód keveredik.
Vegye figyelembe a következő figyelmeztetést:
Ne használja a
-march=native
vagy -mtune=native
beállításokat a CFLAGS vagy CXXFLAGS változókban a make.conf fájlban, amikor a distcc alkalmazással fordít.Tekintse meg a CFLAGS és CXXFLAGS szekcióját és A -march=native
beágyazása a distcc számára további információkért.
Hálózat nem érhető el
SSH kapcsolat használatakor előfordulhat hiba: ssh: A hostname nem volt feloldható: Ideiglenes hiba a névfeloldásban.
A network-sandbox
funkció által bevezetett hálózati korlátozások miatt ez a probléma előfordulhat. Mivel a distcc ellentmond ennek a biztonsági funkciónak, azt le kell tiltani:
/etc/portage/make.conf
Network-sandbox funkció letiltásaFEATURES="${FEATURES} -network-sandbox"
További kimenet kiolvasása az emerge naplókból
Lehetséges további naplózást elérni a részletes üzemmód engedélyezésével. Ezt úgy valósíthatja meg, hogy hozzáadja a DISTCC_VERBOSE beállítást a /etc/portage/bashrc fájlhoz:
/etc/portage/bashrc
Bőbeszédő naplózás engedélyezéseexport DISTCC_VERBOSE=1
A bőbeszédű naplózás ezután a következő helyen található: /var/tmp/portage/$CATEGORY/$PF/temp/build.log.
Tartsa szem előtt, hogy a build.log fájlban látható első distcc hívás nem feltétlenül az első distcc hívás az összeállítási folyamat során. Például egy építőszerver egyperces várakozási időszakot kaphat a beállításszakasz alatt, amikor néhány ellenőrzést hajtanak végre fordítóval (a distcc várakozási időszakot állít be, ha a távoli szerveren végzett fordítás sikertelen volt, függetlenül attól, hogy a helyi gépen is sikertelen volt-e).
Vizsgálja meg a /var/tmp/portage/$CATEGORY/$PF/work/ könyvtárat az ilyen helyzetek kivizsgálásához. Keressen további naplókat, vagy hívja meg a make parancsot kifejezetten a munkakönyvtáron belül.
Egy másik érdekes változó a DISTCC_SAVE_TEMPS. Ennek beállításakor elmenti a távoli fordító szabványos kimenetét/hibajelentését, ami Portage fordítások esetén fájlokat eredményez a /var/tmp/portage/$CATEGORY/$PF/temp/ könyvtárban.
/etc/portage/bashrc
Ideiglenes kimenet mentéseexport DISTCC_SAVE_TEMPS=1
Nem sikerült létrehozni a /dev/null/.cache/ccache/tmp könyvtárat: Nem könyvtár
Ez a hiba a szerveren található szabványos hibakimeneti fájlból fedezhető fel, ha a DISTCC_SAVE_TEMPS beállítva van. Kizárólag akkor fordul elő, ha a distccd alkalmazása ccache-vel történik.
Valószínűleg azért, mert a CCACHE_DIR nincs megfelelően beállítva, vagy nincs helyesen átadva a distccd-nek. A ccache ekkor alapértelmezés szerint a $HOME/.cache/ccache mappát használja gyorsítótárként. Azonban a ccache a distccd által a distcc felhasználó alatt fut, amely egy nem bejelentkező fiók. Tekintse meg a systemd szekciót és A ccache segítségével szekciót a CCACHE_DIR beállításához.
A Portage kódfordítási hibát jelez, amelyek látszólag egyáltalán nem kapcsolódnak a distcc szoftverhez
Amikor a kódfordítások olyan hibákkal meghiúsulnak, amelyek látszólag nem kapcsolódnak a distcc szoftverhez, de a kódfordítás működik a FEATURES="-distcc" beállítással, jelentették, hogy a kódfordítások néha a DISTCC_VERBOSE=1 miatt sikertelenek. Próbálja meg a fordítást a DISTCC_VERBOSE=0 beállítással.
További olvasnivaló a témában
- Distcc/Cross-Compiling — shows the reader how to set up distcc for cross-compiling across different processor architectures.
Külső források
This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Lisa Seelye, Mike Gilbert (floppym) , Erwin, Sven Vermeulen (SwifT) , Lars Weiler, Tiemo Kieft, and
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.