13. Como configurar um novo nó de compilação de pacotes
Anterior |  | Próxima

## 13. Como configurar um novo nó de compilação de pacotes

Antes de seguir estes passos, por favor, converse com o `portmgr`.

### Nota:

Devido à algumas doações generosas, o `portmgr` não está mais procurando por empréstimos de sistemas i386™ ou `amd64`. No entanto, nós ainda estamos interessados no empréstimo de sistemas `tier-2`.

### 13.1. Requisitos do nó

O `portmgr` ainda está trabalhando para definir quais são características que um nó necessita possuir para ser útil.

- Capacidade de CPU: qualquer coisa abaixo de 500MHz geralmente não é útil para a compilação de pacotes.

  ### Nota:

  Nós somos capazes de ajustar o número de tarefas enviadas para cada máquina, e nós geralmente ajustamos o número para fazer uso de 100% da CPU.

- RAM: O mínimo utilizável é 2G; o ideal é ter 8G ou mais. Normalmente configuramos uma tarefa para cada 512M de RAM.

- Disco: É necessário um mínimo de 20G para o sistema de arquivos e de 32G para a area de `swap`. O desempenho será melhor se múltiplos discos forem utilizados, e configurados como `geom` `stripes`. Os dados de desempenho também estão em fase de definição.

  ### Nota:

  A compilação de pacotes irá estressar as unidades de disco até o seu limite (ou além dele). Esteja consciente do que você está se voluntariando para fazer!

- largura de banda de rede: Ainda não existe um estudo preciso, no entanto uma máquina configurada para 8 tarefas simultâneas se mostrou capaz de saturar um link de internet a cabo.

### 13.2. Preparação

1. Escolha um `hostname` único. Ele não tem que ser um `hostname` resolvível publicamente (ele pode ser um nome em sua rede interna).

2. Por padrão, a compilação de pacotes necessita que as seguintes portas TCP estejam acessíveis: 22 (`ssh`), 414 (`infoseek`), e 8649 (`ganglia`). Se estas não estiverem acessíveis, escolha outras e assegure-se de que um túnel `ssh` esteja configurado (veja abaixo).

   (Nota: se você tem mais de uma máquina em seu site, você vai precisar de uma porta TCP individual para cada serviço em cada máquina, desta forma serão necessários túneis `ssh`. Portanto, você provavelmente precisará configurar o redirecionamento de portas em seu `firewall`.)

3. Decida se você vai inicializar localmente ou via `pxeboot`. Você vai descobrir que é mais fácil acompanhar as mudanças do `-current` com a última opção, especialmente se você tem várias máquinas em seu site.

4. Escolha um diretório para manter as configurações dos `ports` e os subdiretórios do `chroot`. Pode ser melhor colocá-los em uma partição dedicada. (Por exemplo: `/usr2/`.)

### 13.3. Configurando o `src`

1. Crie um diretório para armazenar a árvore dos fontes do último `-current` e sincronize ela com o repositório. (Uma vez que sua máquina provavelmente será solicitada para compilar pacotes para o `-current`, o `kernel` que ela executa deve estar razoavelmente atualizado com o `bindist` que será exportado por nossos `scripts`.)

2. Se você está usando `pxeboot`: crie um diretório para armazenar os arquivos de instalação. Você provavelmente vai querer usar um subdiretório do `/pxeroot`, por exemplo, `/pxeroot/`${arch}`-`${branch}``. Exporte como `DESTDIR`.

3. Se você está realizando uma compilação para outra plataforma, que não a instalada na máquina (cross-building), exporte `TARGET_ARCH`=`${arch}`.

   ### Nota:

   O procedimento para compilação cruzada de `ports` ainda não está definido.

4. Gere um arquivo de configuração para o `kernel`. Inclua o `GENERIC` (ou, se você está usando mais que 3.5G de memória em um i386™, o `PAE`).

   Opção requeridas:

   options NULLFS options TMPFS

   Opções sugeridas:

   options GEOM_CONCAT options GEOM_STRIPE options SHMMAXPGS=65536 options SEMMNI=40 options SEMMNS=240 options SEMUME=40 options SEMMNU=120 options ALT_BREAK_TO_DEBUGGER

   Para o `PAE`, atualmente não é possível carregar módulos. Portanto, se você está executando uma arquitetura que suporta emulação binária do Linux, você precisará adicionar:

   options COMPAT_LINUX options LINPROCFS

   Também para o `PAE`, a partir de 12/09/2011 você precisa do seguinte. Isso precisa ser investigado:

   nooption NFSD # New Network Filesystem Server options NFSCLIENT # Network Filesystem Client options NFSSERVER # Network Filesystem Server

5. Como `root`, execute os passos usuais de compilação, por exemplo:

   `make -j4 buildworld` `make buildkernel KERNCONF=`${kernconf}`` `make installkernel KERNCONF=`${kernconf}`` `make installworld`

   Os passos de instalação usam o caminho especificado na da váriavel `DESTDIR`.

6. Personalize os arquivos em `etc/`. O local no qual você fará isso, se no próprio cliente ou em outra máquina, vai depender se você está usando ou não o `pxeboot`.

   Se você está usando `pxeboot`: crie um subdiretório no ``${DESTDIR}`` chamado `conf/`. Crie um subdiretório `default/etc/`, e (se seu `site` vai hospedar vários nós), subdiretórios ``${ip-address}`/etc/` para os arquivos que vão sobrescrever as configurações para os `hosts` individuais. (Você pode achar útil criar um `link` simbólico de cada um destes diretórios para um `hostname`.) Copie todo o conteúdo do ``${DESTDIR}`/etc/` para `default/etc/`; que é onde você irá editar seus arquivos. Nos diretórios criados para cada endereço IP, você provavelmente só irá necessitar personalizar os arquivos `rc.conf`.

   Em ambos os casos, execute os seguintes passos:

   - Crie um usuário e grupo `ports-`${arch}``. Adicione o usuário ao grupo `wheel`. Ele pode ter um `'*'` no lugar da senha.

     Crie o `/home/ports-`${arch}/.ssh/`` e popule o arquivo `authorized_keys` com as chaves ssh apropriadas.

   - Crie os usuários:

     squid:*:100:100::0:0:User &:/usr/local/squid:/bin/sh ganglia:*:102:102::0:0:User &:/usr/local/ganglia:/bin/sh

     E também os adicione ao arquivo `etc/group`.

   - Crie os arquivos apropriados em `etc/.ssh/`.

   - Edite o `etc/crontab` e adicione o seguinte:

     * * * * * root /var/portbuild/scripts/client-metrics

   - Crie um `etc/fstab` apropriado. (Se você tem várias máquinas diferentes, você precisará colocar este arquivo nos diretórios específicos de cada uma.)

   - Edite o `etc/inetd.conf` e adicione o seguinte:

     infoseek stream tcp nowait nobody /var/portbuild/scripts/reportload

   - Nós utilizamos o timezone UTC no `cluster`:

     cp /usr/share/zoneinfo/Etc/UTC etc/localtime

   - Crie um `etc/rc.conf` apropriado. (Se você está usando `pxeboot`, e tem várias máquinas diferentes, você precisará colocar este arquivo nos diretórios específico de cada uma.)

     Configurações recomendadas para nós físicos:

     hostname="`${hostname}`" inetd_enable="YES" linux_enable="YES" nfs_client_enable="YES" ntpd_enable="YES" ntpdate_enable="YES" ntpdate_flags="north-america.pool.ntp.org" sendmail_enable="NONE" sshd_enable="YES" sshd_program="/usr/local/sbin/sshd" gmond_enable="YES" squid_enable="YES" squid_chdir="`/`usr2`/squid/logs`" squid_pidfile="`/`usr2`/squid/logs/squid.pid`"

     Configurações obrigatórias para nós baseados no VMWare:

     vmware_guest_vmmemctl_enable="YES" vmware_guest_guestd_enable="YES"

     Configurações recomendadas para nós baseados no VMWare:

     hostname="" ifconfig_em0="DHCP" fsck_y_enable="YES" inetd_enable="YES" linux_enable="YES" nfs_client_enable="YES" sendmail_enable="NONE" sshd_enable="YES" sshd_program="/usr/local/sbin/sshd" gmond_enable="YES" squid_enable="YES" squid_chdir="`/`usr2`/squid/logs`" squid_pidfile="`/`usr2`/squid/logs/squid.pid`"

     O ntpd(8) não deve ser habilitado para os nós baseados no VMWare.

     Além disso, você pode optar por deixar o squid desabilitado por padrão, de modo a não ter um `/`usr2`` persistente (o que deve economizar tempo na criação da instância.) O trabalho ainda está em andamento.

   - Crie o `etc/resolv.conf`, se necessário.

   - Modifique o `etc/sysctl.conf`:

     9a10,30 > kern.corefile=`/`usr2`/%N.core` > kern.sugid_coredump=1 > #debug.witness_ddb=0 > #debug.witness_watch=0 > > # squid needs a lot of fds (leak?) > kern.maxfiles=40000 > kern.maxfilesperproc=30000 > > # Since the NFS root is static we don't need to check frequently for file changes > # This saves >75% of NFS traffic > vfs.nfs.access_cache_timeout=300 > debug.debugger_on_panic=1 > > # For jailing > security.jail.sysvipc_allowed=1 > security.jail.allow_raw_sockets=1 > security.jail.chflags_allowed=1 > security.jail.enforce_statfs=1 > > vfs.lookup_shared=1

   - Se desejar, modifique o `etc/syslog.conf` para mudar o destino dos `logs` para `@pointyhat.freebsd.org`.

### 13.4. Configurando os `ports`

1. Instale os seguintes `ports`:

   net/rsync security/openssh-portable (with HPN on) security/sudo sysutils/ganglia-monitor-core (with GMETAD off) www/squid (with SQUID_AUFS on)

   Existe um trabalho em andamento para criar um `meta-port`, mas ainda não está completo.

2. Customize os arquivos em `usr/local/etc/`. O local no qual você fará isso, se no próprio cliente ou em outra máquina, vai depender se você está usando ou não o `pxeboot`.

   ### Nota:

   O truque de usar subdiretórios`conf` para sobreescrever as opções padrões é menos eficaz aqui, pois você precisa copiar todos os subdiretórios do `usr/`. Este é um detalhe da implementação de como o `pxeboot` funciona.

   Execute os seguintes passos:

   - Modifique o `usr/local/etc/gmond.conf`:

     21,22c21,22 < name = "unspecified" < owner = "unspecified" --- > name = "`${arch}` package build cluster" > owner = "portmgr@FreeBSD.org" 24c24 < url = "unspecified" --- > url = "http://pointyhat.freebsd.org"

     Se existirem máquinas de mais de um `cluster` no mesmo domínio `multicast` (basicamente = LAN), então altere os grupos de `multicast` para valores diferentes (.71, .72, etc).

   - Crie o `usr/local/etc/rc.d/portbuild.sh`, usando um valor apropriado para `scratchdir`:

     #!/bin/sh # # Configure a package build system post-boot scratchdir=`/`usr2`` ln -sf ${scratchdir}/portbuild /var/ # Identify builds ready for use cd /var/portbuild/`${arch}` for i in */builds/*; do if [ -f ${i}/.ready ]; then mkdir /tmp/.setup-${i##*/} fi done # Flag that we are ready to accept jobs touch /tmp/.boot_finished

   - Modifique o `usr/local/etc/squid/squid.conf`:

     288,290c288,290 < #auth_param basic children 5 < #auth_param basic realm Squid proxy-caching web server < #auth_param basic credentialsttl 2 hours --- > auth_param basic children 5 > auth_param basic realm Squid proxy-caching web server > auth_param basic credentialsttl 2 hours 611a612 > acl localnet src 127.0.0.0/255.0.0.0 655a657 > http_access allow localnet 2007a2011 > maximum_object_size 400 MB 2828a2838 > negative_ttl 0 minutes

     Modifique também o `usr/local` para ``usr2`` em `cache_dir`, `access_log`, `cache_log`, `cache_store_log`, `pid_filename`, `netdb_filename`, `coredump_dir`.

     E finalmente, mude o esquema de armazenamento do `cache_dir`, de `ufs` para `aufs` (o qual oferece uma melhor performance).

   - Configure o `ssh`: copie os arquivos do `/etc/ssh` para `/usr/local/etc/ssh` e adicione `NoneEnabled yes` ao `sshd_config`.

   - Modifique o `usr/local/etc/sudoers`:

     38a39,42 > > # local changes for package building > %wheel ALL=(ALL) ALL > ports-`${arch}` ALL=(ALL) NOPASSWD: ALL

### 13.5. Configuração no próprio cliente

1. Entre no diretório `port/package` que você escolheu acima, por exemplo, `cd `/`usr2```.

2. Execute como root:

   `mkdir portbuild` `chown ports-`${arch}`:ports-`${arch}` portbuild` `mkdir pkgbuild` `chown ports-`${arch}`:ports-`${arch}` pkgbuild` `mkdir squid` `mkdir squid/cache` `mkdir squid/logs` `chown -R squid:squid squid`

3. Se os clientes preservam o conteúdo do `/var/portbuild` entre as suas inicializações, então eles também deverão preservar o `/tmp` ou então revalidar as compilações disponíveis no momento do boot (veja o `script` nas máquinas `amd64`). Eles também devem limpar os `chroots` obsoletos das compilações anteriores antes de criar o `/tmp/.boot_finished`.

4. Inicie o cliente.

5. Como root, crie a estrutura de diretórios do `squid`:

   `squid -z`

### 13.6. Configuração no `pointyhat`

Estes passos precisam ser feitos por um `portmgr`, autenticado como o usuário `ports-`${arch}``, no `pointyhat`.

1. Se alguma das portas TCP padrão não estiver disponível (veja acima), você precisará criar um túnel `ssh` para ela e deverá incluí-lo no `crontab`.

2. Adicione uma entrada em `/home/ports-`${arch}`/.ssh/config` para especificar o endereço IP público, a porta TCP para o `ssh`, o usuário, e qualquer outra informação necessária.

3. Crie o `/var/portbuild/`${arch}`/clients/bindist-`${hostname}`.tar`.

   - Copie um arquivos dos existentes para usar como modelo e descompacte-o em um diretório temporário.

   - Personalize o `etc/resolv.conf` para o `site` local.

   - Personalize o `etc/make.conf` para a busca de arquivo no FTP local. Nota: a anulação da variável `MASTER_SITE_BACKUP` deve ser comum para todos os nós, mas a primeira entrada em `MASTER_SITE_OVERRIDE` deve ser o espelho FTP mais próximo. Por exemplo:

     `.if defined(FETCH_ORIGINAL) MASTER_SITE_BACKUP= .else MASTER_SITE_OVERRIDE= \ ftp://`friendly-local-ftp-mirror`/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \ ftp://${BACKUP_FTP_SITE}/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ .endif`

   - Empacote-o com `tar` e mova para o local correto.

   Dica: você precisará de um destes para cada máquina; no entanto, se você tem várias máquinas no mesmo site, você deve criar um local específico para este `site` (por exemplo, em `/var/portbuild/conf/clients/`) e criar um `link` simbólico para ele.

4. Crie o `/var/portbuild/`${arch}`/portbuild-`${hostname}`` utilizando um dos existentes como guia. O conteúdo deste arquivo sobrescreve as configurações de `/var/portbuild/`${arch}`/portbuild.conf`.

   Sugestão de valores:

   disconnected=1 http_proxy="http://localhost:3128/" squid_dir=`/`usr2`/squid` scratchdir=`/`usr2`/pkgbuild` client_user=ports-`${arch}` sudo_cmd="sudo -H" rsync_gzip=-z infoseek_host=localhost infoseek_port=`${tunelled-tcp-port}`

   Outros valores possíveis:

   use_md_swap=1 md_size=9g use_zfs=1 scp_cmd="/usr/local/bin/scp" ssh_cmd="/usr/local/bin/ssh"

Os passos abaixo precisam ser executados por um `portmgr` autenticado como `root` no `pointyhat`.

1. Adicione o endereço IP público em `/etc/hosts.allow`. (Lembre-se, várias máquinas podem estar sob o mesmo endereço IP.)

2. Adicione uma entrada `data_source` para `/usr/local/etc/gmetad.conf`:

   `data_source "`arch`/`location` Package Build Cluster" 30 `hostname``

   Você precisará reiniciar o `gmetad`.

### 13.7. Habilitando o nó

Estes passos precisam ser executados por um `portmgr` autenticado como `ports-`arch`` no `pointyhat`.

1. Certifique-se que o `ssh` está funcionando executando `ssh `hostname``.

2. Crie os arquivos em `/var/portbuild/scripts/` executando algo como `/var/portbuild/scripts/dosetupnode `arch` `major` latest `hostname``. Verifique se os arquivos foram criados no diretório.

3. Teste as outras portas TCP executando `telnet `hostname` `portnumber``. A porta `414` (ou seu túnel) deve dar-lhe algumas linhas com informações de status, incluindo `arch` e `osversion`; A porta `8649` deve retornar um `XML` do `ganglia`.

Esses passos precisam ser executados por um `portmgr` autenticado como `root` no `pointyhat`.

- Informe o `qmanager` sobre o nó. Por exemplo:

  `python `path`/qmanager/qclient add name=`uniquename` arch=`arch` osversion=`osversion` numcpus=`number` haszfs=0 online=1 domain=`domain` primarypool=package pools="package all" maxjobs=1 acl="ports-`arch`,deny_all"`

Anterior |  | Próxima
12. Compilação de `Patches` Experimentais | Principal | 14. Como configurar um novo `branch` do FreeBSD

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.