# [portage] Compilar desde otro PC (opinando)

## pcmaster

Hola,

Resulta que, aparte de mi Athlon XP 2600, tengo un Pentum 120 que está siempre conactado, como pequeño servidor, realizando alunas tareas útiles, como vigilar el router, bajar archivos com mldonkey, hacer de servidor de correo smtp y de servidor DNS.

Bueno, a la hora de actualizarlo la verdad es que el emerge va muy lento... así que se me ha ocurrido una idea:

Desde el Athlon XP, me he conectado al PI por ssh y he compartido el directorio raíz /

He cerrado la sesión ssh, y ya desde el Athlon XP, he montado el directorio / del PI en un directorio, he hecho un chroot y... a emerger, compilando con el procesador del Athlon XP.

¿Qué os parece? ¿Creéis que puede causar algún problema, o debo tener alguna precaución especial? De momento los primeros paquetes están compilado bien... o eso parece.

Ya os diré como ha salido. Cualquier comentario será bienvenido.

----------

## Alex14

Tambien puedes hace algo mucho mas comodo, seria que un ordenador comparta con ssh/nfs/samba  u otro la carpeta /usr/portage, luego en el otro añades a tu /etc/fstab que monte dicha carpeta en la misma ruta y

listo! ahora puedes hacer el emerge sync y afectara a los 2, tienes que tener cuidado con no hacerlo en los 2 a la vez y en tener encendido siempre el servidor

De tu manera no creo que haya problemas aunque no la he terminado de entender del todo, estoy espeso

 :Very Happy:  Suerte

----------

## pcmaster

No, no se trata del emerge sync, sino de compilar los paquetes.

Si conecto por ssh al pentium I y compilo paquetes, se compilan con el procesador del pentium I. ¿Has probadoa  emerger GCc en un pentium 120? Tarda horrores.

Así, lo que he hecho es compartir el / del Pentium I por nfs. En el Athlon XP he montado ese / en un directorio, he hecho un chroot a ese directorio (como cuando instalas gentoo) y al hacer el emerge, los paquetes se instalan en el sistema de archivos del pentium 120, pero se compilan en el Athlon XP.

----------

## Alex14

Ups, lo siento, en ese caso tampoco creo que tengas ningun problema, solo asegurate de tener las variables de entorno actualizadas (aunque no estoy seguro si afecta a la compilacion xD)

----------

## jakozzo

yo te recomendaria usar distcc, ya que,lo que hace es una compilacion compartida entre los pcs de tu lan aparte,yo creo que los paquetes que compilas con amd no te valen para pentium pero no hagas caso,si te funciona estoy equivocado.

Busca informacion sobre distcc que es mucho mas comodo.Saludos

----------

## DDrDark

 *jakozzo wrote:*   

> yo te recomendaria usar distcc, ya que,lo que hace es una compilacion compartida entre los pcs de tu lan aparte,yo creo que los paquetes que compilas con amd no te valen para pentium pero no hagas caso,si te funciona estoy equivocado.
> 
> Busca informacion sobre distcc que es mucho mas comodo.Saludos

 

Pero haciendo chroot, utilizaria el make.conf del pentium I, por lo que no habría problema digo yo. Si usara distcc sería mucho mas lento ya que el trabajo de descomprimir archivos, hacer los configure, etc los tendría que hacer el p1, por eso creo que lo que hace pcmaster es mucho mejor, mas rapido y sin complicaciones. Solo es mi opinion, realmente no se si supondría algun problema compilar en un atlhonxp para un p1, aunque si lo piensas bien el athlon es compatible con el p1 (que sería 586)

salu2!

----------

## pcmaster

Los pasos que seguí fueron estos (todo lo hice desde una ventana de terminal en modo gráfico):

1- Compartir en el pentium I el directorio / por NFS

2- Montar, desde el Athlon XP, el directorio / del P1 en /mnt/pentium-raiz

3- Montar proc en /mnt/pentium-raiz/proc

4- Hacer un chroot /mnt/pentium-raiz /bin/bash

Parece que la actualización ha sido correcta, aunque no sé si hubiese sido mejor no montar /proc, o exportar por NFS el directorio /proc del Pentium I (esto último no he probado si se puede) ¿Qué pensáis vosotros?

Evidentemente, al compilar se usaba el /etc/make.conf del pentium1, pero se ejecutaban las tareas en el Athlon XP, compilando más deprisa.

Por cierto, después compilé amuled (sin entorno gráfico) en el pentium I, ya sin chroot, de la forma normal, y le ponía -mcpu=i686-linux-gnu, aunque en en /etc/make.conf del pentum I está puesto -mcpu como i586. De todas formas, -mcpu no es exclusivo para ese procesador, sino que solo optimiza (para que funcionase exclusivamente en ese procesador debería ser -march) por lo que funciona OK. Además, creo que solo pasa con ese paquete (amule) no con otros. ¿Quizá un fallo del ebuild?

DDrDark: el Athlon XP es compatible i686, aunque por supuesto puede ejecutar código i586, sin ningún problema.

----------

## LinuxBlues

 *pcmaster wrote:*   

> después compilé amuled (sin entorno gráfico) en el pentium I, ya sin chroot, de la forma normal, y le ponía -mcpu=i686-linux-gnu, aunque en en /etc/make.conf del pentum I está puesto -mcpu como i586.
> 
> DDrDark: el Athlon XP es compatible i686, aunque por supuesto puede ejecutar código i586, sin ningún problema.

 

¿¿¿-mcpu=i686-linux-gnu???    eso no es una -mcpu ni una -march válida, sino un chost. He estado consultando los ebuilds de amule estable y en ninguno pone nada referente a esa barbaridad...

Efectivamente, todos los athlon son compatibles i586, pero todos ellos ejecutan código para i586 de forma extraordinariamente lenta. Espero que al tener GCC compilado para athlon-xp no sea tan lento generando el código. Es decir, usar la "mandrakiva" esa es lo peor que se le puede hacer a un athlon de cualquier clase, dado que está compilada para i586, otra cosa será generar código para esos procesadores sin ejecutarlo, me imagino. Es un viejop problema muy conocido de los athlon, aunque desde luego, ejecutarlo lo ejecutan...

Realmente me cuesta entender por qué compilas código que será ejecutable en un i386 y por qué no usas directamente -march=pentium, pero bueno, Gentoo is all about the choice.

----------

## gringo

 *Quote:*   

> ¿¿¿-mcpu=i686-linux-gnu???

 

eso no es ni un chost ni flag de compilador ni ná que se le parezca ...

perdonad que me meta en éste hilo pero leyendolo toy un tanto perdidito ... no se supone que además las variables $CHOST y/o $CBUILD deberían estar puestos debidamente tb. ? En otras palabras, que te dice el configure de estas dos variables ? Que tipo de ejecutables obtienes haciéndolo de ésta manera ?

saluetes

----------

## pcmaster

Perdona, en el /etc/make.conf del pentium lo tengo así:

CHOST="i586-pc-linux-gnu"

CFLAGS="-mcpu=i586 -O2 -pipe"

Lo puse de memoria y confundí el CHOST con las CFLAGS   :Embarassed: 

Yo pensaba que eso compilaba para pentium (por lo del CHOST).

Cambiaré -mcpu por -march

----------

## LinuxBlues

Veamos, que yo tampoco termino de enterarme de cuál es el problema...

Es posible que al hacer el chroot olvidases hacer un env-update && source /etc/profile, y en ese caso, aunque me resulte muy extraño, no estaría usando el gcc del pentium, sino el del athlon-xp; pero lo que dices es que al pasar a compilar únicamente con el pentium, indica que el chost es un i686, lo cual me resulta más extraño todavía.

En principio, la idea que propones parece muy buena, pero... ¿no resultaría más sencillo emerger crossdev y generar una toolchain para el pentium en el athlon-xp?

No estoy muy seguro, consulta los man si lo haces, pero aunque parezca muy complicado, me parece que con poner toolchain -m i586 se resuelve todo automágicamente. Es necesario hacerlo, dado que compilar para otro chost es compilación cruzada o, mejor dicho, cross-compilar. Así crearás únicamente los binarios para el pentium desde el athlon-xp, insisto en lo de únicamente. Después se los mandas a través de nfs al /usr/portage/packages/All y los instalas en el pentium. Aunque esto tendría el inconveniente de que no compilaría las dependencias necesarias para el pentium si ya las tienes instaladas en el athlon-xp, por tanto, para instalarlos, usa siempre emerge -k (no -K) y así si necesita compilar algún paquete para poder instalar el binario, lo puedes crear también con el athlon-xp. No olvides modificar el make.conf en el athlon-xp cada vez que compiles para pentium.

De cualquier forma, me parece muy buena la idea del chroot, dado que en máquinas menos modernas, lo ideal es usar uclibc. No sé si tendrás el stage3 para pentium de http://jackass.homelinux.org/ pero me parece que ellos ya lo ponen por defecto.

----------

## Eleazar Anzola

 *pcmaster wrote:*   

> Los pasos que seguí fueron estos (todo lo hice desde una ventana de terminal en modo gráfico):
> 
> 1- Compartir en el pentium I el directorio / por NFS
> 
> 2- Montar, desde el Athlon XP, el directorio / del P1 en /mnt/pentium-raiz
> ...

 

Diusculpen el atrevimiento pero me ha resultado familiar el caso y me gustria lo detallaran un poco más, es que no se como hacerlo, algo asi como un mihowto no quedaria mal.

Yo lo hago compilado con el disco del PI en la Athlon-XP pero el estar abriendo y cerrando para poner y quitar el disco no me gusta mucho.

Agradecido

----------

## Eleazar Anzola

Ok he logrado encontrar la manera de montar el disco del PI en el Athlon-XP con nfs. He de acotar que el PI esta iniciado desde un LiveCd, pero ahora en el Athlon le doy al chroot y este me indica el sigueinte error 

```
chroot /mnt/pen1 /bin/bash

bash: /root/.bashrc: Permiso denegado
```

 en pocas palabras todo el disco esta como solo lectura aunque en el export esta rw.

Alguna idea?

----------

## pcmaster

Aunque lo exportes como de lectura-escritura, se comporta como de sólo lectura por una razón muy simple... has iniciado desde CD, y en él no se puede escribir.

Por cierto, sí que hice el env-update y el source /etc/profile, se me olvidó ponerlo...

Lo de que compile como -mcpu=686 sólo me lo ha hecho un paquete (amule).

Instala en el pentium1 normalmente, desde CD, luego reinicias, ya sin CD, y entonces compilas mediante el chroot.

LinuxBlues: me ha funcionado bien, aparentemente. Yo solamente preguntaba algún pequeño detalle, por si fuese mejor hacer algún paso extra.

Eleazar: Hazlo así ( a ver si no me dejo nada)  :Smile:  :

1- Instala desde Stage 3 en el pentum I. Y reinicia (ya sin CD). Comparte por NFS el directorio /

2- Desde el Athlon XP, monta el directorio / en un subdirectorio, por ejemplo en /mnt/pentium. Por ejemplo, si la IP del Pentium es 192.168.0.10: mount 192.168.0.10:/ /mnt/pentium. He podido ver que tras hacerlo, /mnt/pentium tendrá el directorio / del Pentium, pero /mnt/pentium/proc NO contiene los procesos que se ejecutan en el pentium.

3- Aquí yo monté /proc en /mnt/pentium/proc, con la orden: mount -t proc proc /mnt/pentium/proc. Aquí la duda me surge: no sé si es imprescindible hacerlo, o mejor no hacerlo. Yo lo hice porque seguí los mismos pasos que al hacer el chroot para instalar Gentoo. 

4- Hacer el chroot /mnt/pentium /bin/bash

5- ejecutar env-update y source /etc/profile

6- Hacer lo que queramos (emerge sync, emerger paquetes, etc)

7- salir del chroot y desmontar los directorios.

Al estar en chroot, el sistema de archivos (era una ventana en modo gráfico) tenía un sistema que, al hacer un emerge compilaba e instalaba en el disco del pentium 1, usando las variables (CFLAGS, etc) del archivo /etc/make.conf del pentium, pero /proc/cpuinfo muestra que está usando un athlon XP. la duda sobre si hacer el mount -t proc proc me surge porque el sistema donde se está el chroot no es enteramente ni el Pentium ni el Athlon XP. Aunque supongo que como ha funcionado bien, lo he hecho correctamente.

Por cierto, el día que no me arranque el pentium I, el arreglo tendrá faenilla, porque por no tener no tiene ni tarjeta gráfica (y teclado y ratón tampoco) El día que no arranque tendré que "operarlo" para poder arreglarlo en local.  :Shocked:   :Shocked: 

----------

## LinuxBlues

 *pcmaster wrote:*   

> Al estar en chroot, el sistema de archivos (era una ventana en modo gráfico) tenía un sistema que, al hacer un emerge compilaba e instalaba en el disco del pentium 1, usando las variables (CFLAGS, etc) del archivo /etc/make.conf del pentium, pero /proc/cpuinfo muestra que está usando un athlon XP. la duda sobre si hacer el mount -t proc proc me surge porque el sistema donde se está el chroot no es enteramente ni el Pentium ni el Athlon XP. Aunque supongo que como ha funcionado bien, lo he hecho correctamente.

 

Evidentemente, dado que no estás usando la cpu del pentium sino la del athlon-xp, todo lo que muestre en /proc será en tu caso correcto, aunque compile para un procesador inferior... Lo que no termino de entender es como con un make.conf y un /etc/profile distintos, muestre lo de mcpu=i686, es como si realmente ignorase toda la configuración mencionada y solo hiciese caso a /proc...

Pero es una excelente idea, chapeau si funciona.

Por cierto, siempre que monto un sistema de ficheros virtual (como /proc) lo hago lo hago con mount -o bind /ruta/de/origen/ /ruta/de/destino

Enhorabuena si todo funciona correctamente.

----------

## alexlm78

Yo optaria por un clusterizado de maquinas http://openmosix.sourceforge.net

----------

## gringo

 *Quote:*   

> ¿no resultaría más sencillo emerger crossdev y generar una toolchain para el pentium en el athlon-xp? 

 

no tiene sentido siempre que el compilador nativo sea capaz de genearar código para la máquina cliente. Si habláramos de compilar en un x86 para un pda o un mac desde luego  :Wink: 

 *Quote:*   

> Yo optaria por un clusterizado de maquinas http://openmosix.sourceforge.net 

 

 :Shocked:  un cluster entre un athlon y un pentium1 ?

Yo lo hago de otra manera, mas o menos lo que explican aqui :

http://gentoo-wiki.com/Embedded_Gentoo

por supuesto no tenéis porque usar uclibc, pero es una manera rápida de tener un sistema mínimo que haga de funciones de router o proxy o lo que sea, sin portage, sin compilador y demás   :Wink: 

Interesante este método desde luego, probaré algún día, eso fijo  :Wink: 

saluetes

----------

## Eleazar Anzola

Ok, gracias,

Solo decir que en vez de hacer un

```
mount -t proc /proc /mnt/pentium/proc
```

 mejor un 

```
mount -t proc none /mnt/pentium/proc
```

----------

## LinuxBlues

 *gringo wrote:*   

> no tiene sentido siempre que el compilador nativo sea capaz de genearar código para la máquina cliente. Si habláramos de compilar en un x86 para un pda o un mac desde luego

 

¿Estas completamente seguro? haz un slocate i586 si tienes una máquina completamente configurada para i686, ya verás lo que aparece, es incapaz de compilar para i586, la regla es bien sencilla: diferente chost = cross-compile.

----------

## gringo

 *Quote:*   

> diferente chost = cross-compile.

 

que alguien me corrija si me equivoco, pero esa afirmación no es cierta. Lo único que cambiará ( entre otras cosas) es el --target ( CTARGET en gentoo) mediante el cuál se especifica el compilador a usar.

Un ejemplo de mi amd64:

```
(/root)-(42:117Mb)-->  gcc-config -l

Available compilers for CTARGET i686-pc-linux-gnu

  [1]   x86_64-pc-linux-gnu-3.4.4/x86-hardened

  [2]   x86_64-pc-linux-gnu-3.4.4/x86-hardenednopie

  [3]   x86_64-pc-linux-gnu-3.4.4/x86-hardenednopiessp

  [4]   x86_64-pc-linux-gnu-3.4.4/x86-hardenednossp

  [5]   x86_64-pc-linux-gnu-3.4.4/x86-vanilla

Available compilers for CTARGET powerpc-unknown-linux-gnu

  [6]   powerpc-unknown-linux-gnu-3.4.4/default

  [7]   powerpc-unknown-linux-gnu-3.4.4/hardened

  [8]   powerpc-unknown-linux-gnu-3.4.4/hardenednopie

  [9]   powerpc-unknown-linux-gnu-3.4.4/hardenednopiessp

  [10]  powerpc-unknown-linux-gnu-3.4.4/hardenednossp

Available compilers for CTARGET x86_64-pc-linux-gnu

  [11]  x86_64-pc-linux-gnu-3.4.4/amd64-hardened

  [12]  x86_64-pc-linux-gnu-3.4.4/amd64-hardenednopie

  [13]  x86_64-pc-linux-gnu-3.4.4/amd64-hardenednopiessp

  [14]  x86_64-pc-linux-gnu-3.4.4/amd64-hardenednossp

  [15]  x86_64-pc-linux-gnu-3.4.4/amd64-vanilla

Activated profiles:

  powerpc-unknown-linux-gnu powerpc-unknown-linux-gnu-3.4.4/default

  x86_64-pc-linux-gnu *     x86_64-pc-linux-gnu-3.4.4/amd64-vanilla
```

Lo dixo, he compilado varias veces para pentiums y c3 siguiendo el método del enlace que dejé arriba y no he necesitado instalar un crosscompiler. Siempre he asumido que los micros son compatibles hacia atrás, ie, un pentium4 puede generar código nativamente para un i386  p.ej. ... pero puedo estar equivocado desde luego.

No estaría mal que algún gurú aclarara el tema.

saluetes

----------

## Ferdy

Diferentes CHOST no implican cross-compile. Diferentes arquitecturas si. El toolchain de los x86 es capaz de generar código para todos los i?86.

Saludos.Ferdy

----------

## LinuxBlues

Ferdy, discúlpame, pero estás equivocado:

Fragmento de make.conf de pruebas:

CHOST="i686-pc-linux-gnu"

CBUILD="i586-pc-linux-gnu"

CTARGET="i586-pc-linux-gnu"

Mensaje de salida del programa compilado:

```

(...)

checking build system type... i586-pc-linux-gnu

checking host system type... i686-pc-linux-gnu

(...)

checking whether we are cross compiling... yes

(...)

```

La regla sigue siendo igual de sencilla:   diferente CHOST == cross-compilar

----------

## Ferdy

No, no estas leyendo bien ese mensaje, mira como puedes crear código para i586 con tu i686-pc-linux-stallman. Acepta todas las -march y -mcpu propias de los x86. Que es una arquitectura única. Prueba a compilar un Hola Mundo con las siguientes flags, y me cuentas: -mcpu=ev56 -mieee -O2 -pipe.

Sin embargo si usas crossdev para crearte un toolchain alpha, entonces podrás usar esas cflags con tu alpha-unknown-linux-stallman. De hecho, en todas las arquitecturas solo hay UN CHOST, mientras en x86 hay varios... por razones no muy claras (más información en man binutils-config)

Saludos.Ferdy

----------

## gringo

 *Quote:*   

> CHOST="i686-pc-linux-gnu"
> 
> CBUILD="i586-pc-linux-gnu"
> 
> CTARGET="i586-pc-linux-gnu" 

 

Aparte de lo dicho por Ferdy, CHOST es donde se va a ejecutar el código; CBUILD es donde se está compilando ... tiene sentido esto en tu configuración ?

saluetes

----------

## MaROtO

A ver si este hilo os puede aclarar alguna duda

https://forums.gentoo.org/viewtopic-t-296604-start-0-postdays-0-postorder-asc-highlight-.html

En aquel entonces me encontraba con el mismo problema, y he de decir que desde aquel entonces el equipo lento viene funcionando sin ningun tipo de problema, por lo que he de suponer que le opcion que doy al final es correcta (que no la mas ortodoxa o ni la mas logica).

Basicamentem, resumiendo:

 *MaROtO antes de tirarse al barro wrote:*   

> bueno...pues el caso es que me he tirad al barro, aun sin saber muy bien si funcionara lo que he hecho, ni si es la mejor opcion: obviamente la que se me ha ocurrido tras ver este y otros post acerca de la misma problematica...a saber... 
> 
> He exportado todo el disco del equipo lento, y lo he montado en el rapido. 
> 
> Monto el proc en el proc del lento, y chrooteo al punto de montaje del equipo lento. 
> ...

 

----------

## LinuxBlues

 *gringo wrote:*   

> Aparte de lo dicho por Ferdy, CHOST es donde se va a ejecutar el código; CBUILD es donde se está compilando ... tiene sentido esto en tu configuración ?

 

Por supuesto que lo tiene, si no, no aparecerá que estás cross-compilando para la misma arquitectura, precisamente lo que quería demostrar... No entraré en los motivos, que los tiene, sencillamente x86 tiene varias arquitecturas...

 :Very Happy: 

----------

## Sertinell

 *pcmaster wrote:*   

> Los pasos que seguí fueron estos (todo lo hice desde una ventana de terminal en modo gráfico):
> 
> 1- Compartir en el pentium I el directorio / por NFS
> 
> 2- Montar, desde el Athlon XP, el directorio / del P1 en /mnt/pentium-raiz
> ...

 

Con qe opciones has exportado por NFS ?? estoy intentando hacer eso y tengo errores al hacer el chroot  :Sad: 

```
 # chroot /mnt/thinking/ /bin/bash 

bash: /root/.bashrc: Permission denied

gentoo / # env-update

env-update     env-update.sh  

gentoo / # env-update

>>> Regenerating /etc/ld.so.cache...

Traceback (most recent call last):

  File "/usr/sbin/env-update", line 11, in ?

    portage.env_update()

  File "/usr/lib/portage/pym/portage.py", line 617, in env_update

    outfile=open(root+"/etc/profile.env","w")

IOError: [Errno 13] Permission denied: '//etc/profile.env'

```

los permisos parecen correctos.

----------

## pcmaster

En /etc/exports puse:

/			*(rw,no_root_squash)

----------

## Lord__Astaroth

A ver... porke te complicas tanto la vida?

simplemete compilalo en el athlon con las cflags ke kieras, y en el make.conf añade esto :

```

FEATURES="buildpkg"

PKGDIR="/usr/portage/packages"
```

compilas todo lo ke kieras... lo kopias a un dvd, lo psas al pentium, y haces Ç

```

#emerge sync

# cd /usr/portage/scripts

#./bootsplash.sh -r

# emerge -eK system

#emerge  -eK  nombre del pakete

(los portage tienen ke ser los mismos...)
```

----------

## Sertinell

 *Lord__Astaroth wrote:*   

> A ver... porke te complicas tanto la vida?
> 
> simplemete compilalo en el athlon con las cflags ke kieras, y en el make.conf añade esto :
> 
> ```
> ...

 

A mi me gusta mas la idea del chroot (ni DVD, ni cambio de flags, ni leches   :Wink:  ), ahora despues prubo lo qe dice pcmaster, y si falla pongo el error

----------

