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.

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óriosconf 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"

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>.