Procedimentos para Construçã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`.

1. 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 | Principal | Próxima
Compilação de `Patches` Experimentais |  | 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>.