Copyright © 2003-2012 Equipe de Gerenciamento da Coleção de Ports do FreeBSD
FreeBSD is a registered trademark of the FreeBSD Foundation.
Intel, Celeron, EtherExpress, i386, i486, Itanium, Pentium, and Xeon are trademarks or registered trademarks of Intel Corporation or its subsidiaries in the United States and other countries.
SPARC, SPARC64, and UltraSPARC are trademarks of SPARC International, Inc in the United States and other countries. SPARC International, Inc owns all of the SPARC trademarks and under licensing agreements allows the proper use of these trademarks by its members.
Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this document, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the “™” or the “®” symbol.
Chroot
Patches
Experimentaisbranch
do
FreeBSDbranch
que deixou de
ser suportado pelo FreeBSDCom o objetivo de disponibilizar binários pré-compilados de
aplicações de terceiros para o FreeBSD, a Coleção de
Ports
é regularmente compilada em um dos
“Clusters
de Compilação de
Pacotes”. Atualmente o principal
cluster
em uso é o http://pointyhat.FreeBSD.org
.
Este artigo documenta os trabalhos internos do
cluster
Muitos dos detalhes deste artigo serão do interesse apenas
dos membros da equipe que faz o Gerenciamento da Coleção de
Ports
A maior parte da mágica na compilação de pacotes ocorre sob
o diretório /var/portbuild
. A menos que
seja especificado o contrário, todos os caminhos serão relativos
à este diretório. O ${arch}
será usado
para determinar uma das arquiteturas de pacotes (amd64, i386™,
ia64, powerpc, e SPARC64®), e
${branch}
será usado para determinar
o branch
(ramo de desenvolvimento) de
compilação (7, 7-exp, 8, 8-exp, 9, 9-exp, 10, 10-exp).
Não são mais compilados pacotes para as versões 4, 5 ou 6, e para a arquitetura alpha
Os scripts
que controlam todo o processo
estão localizados em /var/portbuild/scripts/
. Eles são
cópias obtidas do repositório Subversion
base/projects/portbuild/scripts/
.
Normalmente são feitas compilações incrementais que usam pacotes anteriores como dependências; isso toma menos tempo, e coloca menos carga nos sites espelho. Normalmente são feitas compilações completas apenas quando:
logo depois de uma nova versão, para o ramo
-STABLE
periodicamente, para testar mudanças realizadas
no -CURRENT
para compilações experimentais
Até meados de 2010, os scripts
apontavam especificamente para pointyhat
como
o nó principal (dispatch). Durante o verão de 2010, mudanças
significativas foram feitas a fim de aceitar outros
hosts
como nós principais. Entre estas
mudanças estão:
remoção da string
pointyhat
embutida no
código
fatoração de todas as constantes de configuração (que antes estavam espalhadas por todo o código) em arquivos de configuração (veja abaixo)
adicionar o hostname
aos
diretórios especificados pelo buildid
(isto vai permitir que os diretórios sejam inequívocos
quando copiados entre máquinas.)
tornar os scripts
mais
robustos em termos de criação de diretórios e
links
simbólicos
se necessário, alterar a forma de execução dos
scripts
para tornar os itens acima mais
fáceis.
Este documento foi escrito originalmente antes destas
mudanças serem feitas. Nas partes em que algo foi modificado,
como nas invocações de scripts
, elas estão
denotadas como novo código base:
em
oposição à antigo código base:
.
Como em dezembro de 2010, o pointyhat
ainda está rodando sobre o antigo código base, até que o
novo código base seja considerado estável.
Também durante esse processo, o código base foi migrado para o repositório Subversion. Para referência, a versão anterior ainda pode ser encontrada no CVS.
Os clientes i386™ localizados conjuntamente com o
pointyhat
, efetuam o boot
via rede a partir dele (nós
conectados
); todos os outros clientes
(nós desconectados
) ou são
auto-hospedados ou efetuam boot
via rede a
partir de outro host pxe
. Em todos os casos
eles se auto configuram durante o boot
preparando-se para compilar pacotes.
O cluster
principal copia, através do
rsync
, os dados necessários (a árvore de
ports
e dos fontes, bindist
tarballs
, scripts
, etc.) para os
nós desconectados durante a fase de configuração dos nós. Em
seguida, o diretório portbuild
desconectado é
montado como nullfs
para compilações sob
chroot
.
O usuário
ports-
pode acessar os nós clientes através do ssh(1) para
monitorá-los. Use o ${arch}
sudo
e verifique o
portbuild.
para o usuário e detalhes do acesso.hostname
.conf
O script
scripts/allgohans
pode ser usado para
executar um comando em todos os clientes
${arch}
.
O script
scripts/checkmachines
é usado para monitorar
a carga em todos os nós do cluster
de
compilação, e agendar quais nós compilarão quais
ports
. Este script
não é
muito robusto e tem uma tendência a morrer. É melhor iniciar
este script
no nó principal (por exemplo,
pointyhat
) depois do boot
usando um loop
com while(1).
A compilação de pacotes é realizada em um ambiente
chroot
, configurado pelo
script
portbuild
usando
o arquivo
${arch}/${branch}/builds/${buildid}/bindist.tar
.
O seguinte comando faz o build world
a partir da árvore de diretórios em
${arch}/${branch}/builds/${buildid}/src/
e o instala em ${worlddir}
. A
árvore de diretórios será atualizada primeiro, a menos que a
opção -nocvs
seja especificada.
/var/portbuild#
scripts/makeworld ${arch} ${branch} ${buildid} [-nocvs]
O arquivo bindist.tar
é criado a partir
do world
, instalado previamente, pelo
script
mkbindist
. Este
deve ser executado como root
com o
seguinte comando:
/var/portbuild#
scripts/mkbindist ${arch} ${branch} ${buildid}
Os tarballs
de cada máquina estão
localizados em
${arch}/clients
.
O arquivo bindist.tar
é extraído para
cada cliente durante a inicialização dos mesmos, e no início de
cada passagem do script
dopackages
.
(O trecho a seguir aplica-se apenas ao novo código base.)
Você pode customizar sua compilação providenciando versões
locais do make.conf
e/ou
src.conf
, localizados em
${arch}/${branch}/builds/${buildid}/make.conf.server
e
${arch}/${branch}/builds/${buildid}/src.conf.server
,
respectivamente. Estes serão usados, em vez dos arquivos
padrões que estão no lado do servidor.
Da mesma forma, se você também quiser afetar o
make.conf
no lado do
cliente, você pode usar o
${arch}/${branch}/builds/${buildid}/make.conf.client
.
Devido ao fato de cada um dos clientes individuais poder
ter seu próprio make.conf
, o conteúdo do
${arch}/${branch}/builds/${buildid}/make.conf.client
vai ser adicionado ao
make.conf
, e não substituí-lo, como é feito
com o
${arch}/${branch}/builds/${buildid}/make.conf.server
.
Não existe nenhuma funcionalidade semelhante para
${arch}/${branch}/builds/${buildid}/src.conf.client
(e que efeito teria?).
make.conf.target
para testar a nova versão padrão do
ruby(Neste caso, os conteúdos são idênticos para ambos, servidor e cliente.)
RUBY_DEFAULT_VER= 1.9
make.conf.target
para compilação do clang(Neste caso, os conteúdos também são idênticos para ambos, servidor e cliente.)
.if !defined(CC) || ${CC} == "cc" CC=clang .endif .if !defined(CXX) || ${CXX} == "c++" CXX=clang++ .endif .if !defined(CPP) || ${CPP} == "cpp" CPP=clang-cpp .endif # Don't die on warnings NO_WERROR= WERROR=
src.conf.server
para
testar uma versão nova do código base do
sortWITH_BSD_SORT=yes
Várias compilações separadas para cada arquitetura - a
combinação de branchs
é suportada. Todos os
dados privados para uma compilação (árvore de
ports
, árvore do src
,
pacotes, distfiles
, arquivos de
log
, bindist
,
Makefile
, etc) estão localizados sob
${arch}/${branch}/builds/${buildid}
.
Alternativamente, a última compilação pode ser referenciada sob
o buildid
latest
, e a
anterior a esta é chamada previous
.
Novas compilações são clonadas a partir da
latest
, o que é rápido, uma vez que ele usa
ZFS.
Os scripts
scripts/dopackages
são usados para executar
as compilações.
Para o código base antigo, os mais úteis são:
dopackages.7
- Executa a compilação
para a série 7.X
dopackages.7-exp
- Executa a
compilação para a série 7.X com patches
experimentais (branch
7-exp)
dopackages.8
- Executa a
compilação para a série 8.X.
dopackages.8-exp
- Executa a
compilação para a série 8.X com patches
experimentais (branch
8-exp)
dopackages.9
- Executa a
compilação para a série 9.X.
dopackages.9-exp
- Executa a
compilação para a série 9.X com patches
experimentais (branch
9-exp)
dopackages.10
- Executa a
compilação para a série 10.X.
dopackages.10-exp
- Executa a
compilação para a série 10.X com patches
experimentais (branch
10-exp)
Esses são wrappers
para o
dopackages
e todos são
links
simbólicos para
dopackages.wrapper
.
Wrappers
de scripts
para
um novo branch
podem ser criados com
links
simbólicos
dopackages.${branch}
para
dopackages.wrapper
. Esses
scripts
tem uma série de argumentos. Por
exemplo:
dopackages.7 ${arch} ${buildid} [-options]
Você pode usar o dopackages.wrapper
diretamente, ao invés dos links
simbólicos.
Por exemplo:
dopackages.wrapper ${arch} ${branch} ${buildid} [-options]
Frequentemente você usará latest
como
valor para o buildid
.
[-options]
pode ser nulo, uma ou mais,
das opções seguintes:
-keep
- Não remove esta compilação no
futuro, quando normalmente seria removido como parte do
ciclo latest
-
previous
. Não se esqueça de efetuar a
limpeza manualmente quando ele não for mais
necessário.
-nofinish
- Não executa o
pós-processamento após finalizar a compilação.
Isto é útil se você espera que a compilação precise ser
reiniciada depois de concluída. Se você usar esta opção,
não se esqueça de limpar os clientes quando você não
precisar mais da compilação.
-finish
- Executa apenas o
pós-processamento.
-nocleanup
- Por padrão, quando o
estágio -finish
da compilação é
completado, os dados da compilação serão removidos dos
clientes. Esta opção vai evitar a remoção dos
dados.
-restart
- Reinicia uma compilação
interrompida (ou não finalizada) a partir do começo. Os
Ports
que falharam na compilação
anterior serão recompilados.
-continue
- Reinicia uma compilação
interrompida (ou não finalizada). Os
Ports
que falharam na compilação anterior
não serão recompilados.
-incremental
- Compara os campos
importantes do novo INDEX
com a versão
anterior, remove pacotes e arquivos de
log
dos ports
antigos
que foram alterados, e recompila o resto. Isso reduz o
tempo de compilação substancialmente, pois os
ports
inalterados não serão recompilados
todas as vezes.
-cdrom
- O empacotamento desta
compilação será usado em um CD-ROM, então os pacotes
marcados como NO_CDROM
e os
disfiles
deverão ser removidos no
pós-processamento.
-nobuild
- executa todas as etapas do
pré-processamento, mas não a compilação dos pacotes.
-noindex
- Não reconstrói o
INDEX
durante o pré-processamento.
-noduds
- Não reconstrói o arquivo
duds
(ports
que
nunca são compilados, como por exemplo, aqueles marcados com
IGNORE
, NO_PACKAGE
,
etc.) durante o pré-processamento.
-nochecksubdirs
- Não verifica o
SUBDIRS
para os ports
que não estão ligados à compilação. (Apenas para o novo
código base).
-trybroken
- Tenta compilar
ports
marcados como
BROKEN
(desativado por padrão, pois os
clusters
amd64/i386™ agora são
suficientemente rápidos e quando fazem compilações
incrementais eles gastam muito mais tempo do que o
necessário para compilar tudo. Por outro lado,
os outros clusters
são bastante lentos,
e seria um desperdício de tempo tentar compilar
ports
marcados como
BROKEN
).
Com -trybroken
, provavelmente você
também vai querer usar -fetch-original
(e, no novo código base,
-unlimited-errors
).
-nosrc
- Não atualiza a árvore do
src
a partir do
snapshot
do ZFS, mantendo a árvore da
compilação anterior.
-srccvs
- Não atualiza a árvore do
src
a partir do
snapshot
do ZFS, em vez disso ela é
atualizada com o cvs update
.
-noports
- Não atualiza a árvore de
ports
a partir do
snapshot
do ZFS, mantendo a árvore da
compilação anterior.
-portscvs
- Não atualiza a árvore de
ports
a partir do
snapshot
do ZFS, em vez disso ela é
atualizada com o cvs update
.
-norestr
- Não tenta compilar
ports
marcados como
RESTRICTED
.
-noplistcheck
- Não considera como
erro ports
deixarem arquivos para trás
ao serem removidos.
-nodistfiles
- Não coleta os
distfiles
que passarem no make
checksum
para depois fazer o
upload para o
ftp-master
.
-fetch-original
- Baixa o
distfile
a partir do
MASTER_SITES
original, em vez do
ftp-master
.
-unlimited-errors
(apenas no novo
código base) - anula a verificação de limites do qmanager
para compilações descontroladas. Você pode querer isso
principalmente quando usar -restart
em
uma compilação que provavelmente vai falhar, ou talvez
quando executar -trybroken
. A
A limitação é realizada por padrão.
A menos que você especifique -restart
,
-continue
, ou -finish
, os
links
simbólicos para as compilações
existentes serão rotacionados. Isto é, o
link
simbólico para
previous
será removido; a compilação mais
recente terá seu link
modificado para
previous/
; e a nova compilação será criada
e referenciada com um link
em
latest/
.
Se a última compilação finalizou de forma limpa, você
não precisa remover nada. Se ela foi interrompida, ou você usou
a opção -nocleanup
, você precisa limpar os
clientes executando:
build cleanup ${arch} ${branch} ${buildid} -full
Os diretórios errors/
,
logs/
, packages/
, e
assim por diante, são limpos pelos scripts
.
Se você está com pouco espaço, também pode limpar o
ports/distfiles/
. Não altere o diretório
latest/
; ele é um link simbólico para o
servidor web.
O dosetupnodes
supostamente é executado
pelo script
dopackages
no caso de -restart
, mas pode ser uma boa
idéia executá-lo manualmente e depois verificar se todos os
clientes tem a carga de trabalho esperada. Algumas vezes
dosetupnode
não pode limpar uma compilação
e você precisará fazer isso manualmente. (Isto é um
defeito.)
Verifique se a compilação de pacotes para a arquitetura
${arch}
está executando como
usuário ports-${arch}
ou ele
apresentará um grande número de erros.
Atualmente, a própria compilação de pacotes ocorre em duas fases idênticas. A razão para isso é que, algumas vezes, problemas temporários (por exemplo, falhas do NFS, sites FTP inalcançáveis, etc.) podem quebrar a compilação. Realizar o processo em duas fases é uma solução alternativa para esse tipo de problema.
Seja cuidadoso com ports/Makefile
para
não especificar qualquer diretório vazio. Isso é especialmente
importante se você está realizando uma compilação com
patches
experimentais (-exp). Se o processo
de compilação encontrar um diretório vazio, ambas as fases de
compilação irão parar rapidamente, e um erro similar ao seguinte
será adicionado para
${arch}/${branch}/make.[0|1]
:
don't know how to make dns-all(continuing)
Para corrigir este problema, simplesmente comente ou remova
as entradas SUBDIR
que apontam para
subdiretórios vazios. Depois de feito isso, você pode
reiniciar a compilação executando o comando
dopackages
adequado com a opção
-restart
.
Este problema também ocorre se você criar uma nova
categoria com um Makefile
sem entradas
SUBDIR
s nele. Isso é, provavelmente, um
defeito.
dopackages.7 i386 -nosrc -norestr -nofinish
dopackages.wrapper i386 7 -nosrc -norestr -nofinish
dopackages.8 amd64 -nosrc -noports -norestr -continue -noindex -noduds -nofinish
dopackages.wrapper amd64 8 -nosrc -noports -norestr -continue -noindex -noduds -nofinish
dopackages.7 sparc64 -finish
dopackages.wrapper sparc64 7 -finish
Dica: geralmente é melhor executar o comando
dopackages
dentro do
screen(1)
.
Você pode precisar manipular os dados da compilação antes
de inicia-la, especialmente para compilações experimentais.
Isto é feito com o comando build
. Aqui
estão algumas opções úteis para criação:
build create arch
branch
[newid]
- Cria um
newid
(ou um
datestamp
, se não for especificado).
Só é necessário quando da criação de um novo
branch
ou uma nova arquitetura. (TODO:
documentar se newid
deve ser
especificado como latest
no novo código
base.)
build clone arch
branch
oldid
[newid]
- Cria um
clone do oldid
para o
newid
(ou um
datestamp
, se não for especificado).
build srcupdate
arch
branch
buildid
- Substitui
a árvore src
com um novo
snapshot
do ZFS. Não se esqueça de
usar a opção -nosrc
quando executar o
dopackages
mais tarde!
build portsupdate
arch
branch
buildid
- Substitui a
árvore de ports
com um novo
snapshot
do ZFS. Não se esqueça de
usar a opção -noports
quando executar
dopackages
mais tarde!
Uma compilação completa, sem qualquer opção
-no
que desabilite as opções padrões, executa
as seguintes operações na ordem especificada:
Atualiza a árvore de ports
atual a
partir de um snapshot
do ZFS [*]
Atualiza o branch
usado na árvore
src
a partir de um
snapshot
do ZFS [*]
Verifica se ports
não têm uma
entrada SUBDIR
no
Makefile
de suas respectivas categorias
[*]
Cria o arquivo duds
, que é uma
lista de ports
que não precisam ser
compilados [*] [+]
Cria um arquivo INDEX
atualizado
[*] [+]
Define os nós que serão usados na compilação [*] [+]
Compila uma lista de ports
restritos
[*] [+]
Compila os pacotes (fase 1) [++]
Executa outra configuração do nó [+]
Compila os pacotes (fase 2) [++]
[*] O status destes passos pode ser encontrado em
${arch}/${branch}/build.log
,
bem como no stderr
do tty
onde o comando dopackages
está
rodando.
[+] Se qualquer destes passos falhar, a compilação será encerrada.
[++] O status destes passos pode ser encontrado em
${arch}/${branch}/make
(antigo código base) ou
${arch}/${branch}/journal
(novo código base). Ports
individuais irão
escrever seus logs
de compilação em
${arch}/${branch}/logs
e os seus logs
de erros em
${arch}/${branch}/errors
.
Anteriormente, a árvore docs
também era
verificada, no entanto, isso se mostrou desnecessário.
Existem vários casos onde você precisará limpar manualmente uma compilação:
Você a interrompeu manualmente.
O pointyhat
foi reiniciado enquanto uma
compilação estava executando.
O qmanager
falhou e reiniciado
O processo para interromper de forma manual uma compilação
é um tanto quanto confuso. Primeiro você precisa identificar o
tty
em que ela está sendo executada rodando
(ou lembrando-se da saída do tty(1)
quando você iniciou a compilação, ou usando ps
x
para identificá-lo). Você precisa certificar-se de
que não existe mais nada importante rodando neste
tty
, você pode verificar isto executando o
comando ps
, por exemplo,
ps -t p1
lista os processos em execução
no tty 1. Se não existir mais nada importante, você pode
encerrar o terminal facilmente com
pkill -t pts/1
; ou pode utilizar o
kill -HUP
, por exemplo,
ps -t pts/1 -o pid= | xargs kill -HUP
.
Você deve Substitur o p1
pelo
tty
utilizado na compilação.
A compilação de pacote enviada pelo make
para as máquinas clientes irá se auto limpar após alguns minutos
(verifique com ps x
até que todos
finalizem).
Se você não encerrar o make(1), ele irá iniciar novas
tarefas de compilação. Se você não encerrar o
dopackages
ele irá reiniciar toda a
compilação. Se você não encerrar
os processos pdispatch
, eles irão continuar
(ou reaparecer) até concluir a compilação do pacote.
Para liberar recursos, você precisa limpar as máquinas
clientes executando o comando build cleanup
.
Por exemplo:
%
/var/portbuild/scripts/build cleanup i386 8-exp 20080714120411 -full
Se você esquecer de fazer isso, então os
chroot
s da compilação antiga não serão limpos
nas próximas 24 horas, e nenhum novo trabalho será iniciado no
seu lugar enquanto o pointyhat
achar que esta
máquina ainda está ocupada.
Para verificar, utilize o comando
cat ~/loads/*
para
mostrar o status das máquinas clientes; a primeira coluna é o
número de trabalhos que ela pensa estar executando, e isso pode
estar bem próximo da carga média. O loads
é
atualizado a cada 2 minutos. Se você executar um
ps x | grep pdispatch
e ele listar menos
trabalhos do que os que o loads
pensa estarem
em uso, você está em apuros.
Você pode ter problemas com instâncias do comando
umount
ficando congeladas. Se isto ocorrer,
você terá que usar o script
allgohans
para executar um comando
ssh(1) em todos os clientes deste ambiente de compilação.
Por exemplo:
ssh -l root gohan24 df
Vai lhe dar um df
, e
allgohans "umount -f pointyhat.freebsd.org:/var/portbuild/i386/8-exp/ports" allgohans "umount -f pointyhat.freebsd.org:/var/portbuild/i386/8-exp/src"
Supostamente irá resolver o problema dos
mounts
que não foram desconectados pelo
umount
. Você terá que continuar
executando-os pois podem existir diversas
montagens.
Ignore o seguinte:
umount: pointyhat.freebsd.org:/var/portbuild/i386/8-exp/ports: statfs: No such file or directory umount: pointyhat.freebsd.org:/var/portbuild/i386/8-exp/ports: unknown file system umount: Cleanup of /x/tmp/8-exp/chroot/53837/compat/linux/proc failed! /x/tmp/8-exp/chroot/53837/compat/linux/proc: not a file system root directory
Os dois primeiros significam que o cliente não tinha o sistema de arquivos montado; os dois últimos são um defeito.
Você também poderá ver mensagens sobre o
procfs
.
Após concluir tudo que foi exposto acima, remova o arquivo
${arch}/lock
antes de tentar reiniciar a compilação. Se você não o fizer,
o dopackages
simplesmente será encerrado.
Se você atualizou a árvore de ports
antes
de reiniciar, você pode precisar reconstruir o
duds
, o INDEX
, ou
ambos os arquivos.
Você pode usar o comando qclient
para
monitorar o status dos nós de compilação, e para listar as
tarefas de compilação agendadas para execução:
python path/qmanager/qclient jobs
python path/qmanager/qclient status
O comando
scripts/stats ${branch}
mostra o número de pacotes cuja compilação já finalizou.
A execução de um
cat /var/portbuild/*/loads/*
irá mostrar o load
nos clientes e o número de
compilações simultâneas em andamento. Os arquivos que foram
atualizados recentemente correspondem aos clientes que estão
online
; os demais arquivos são dos clientes
que estão offline.
O comando pdispatch
faz o envio de
trabalhos para o cliente, e executa tarefas de
pós-processamento a partir do retorno recebido do client. O
ptimeout.host
monitora permanentemente o
processo de compilação e a encerra após a ocorrência de
timeouts
. Desta forma, se você tiver
50 processos pdispatch
, mas apenas 4
processos ssh(1), significa que 46 processos
pdispatch
es estão ociosos, esperando que
um nó fique livre.
Executar tail -f ${arch}/${branch}/build.log
irá mostrar o progresso geral da compilação.
Se a compilação do port
falhar, e o
motivo não ficar imediatamente óbvio a partir da análise do
log
, você pode preservar o
WRKDIR
para uma análise mais aprofundada.
Para fazer isso, crie um arquivo vazio chamado
.keep
no diretório do
port
, isso vai arquivar,
comprimir, e copiar o WRKDIR
para
${arch}/${branch}/wrkdirs
.
Se você verificar que o sistema está compilando o mesmo pacote de forma ciclica, repetindo o processo indefinidamente, você pode ser capaz de corrigir o problema reconstruindo manualmente o pacote ofensor.
Se todas as compilações iniciam reclamando de que não pode carregar os pacotes dos quais ela depende, verifique se o httpd ainda está rodando, e o i reinicie se não estiver.
Mantenha o olho na saída do df(1). Se o sistema de
arquivos do /var/portbuild
ficar cheio,
coisas ruins acontecem.
O status de todas as compilações é gerado duas vezes por
hora e postado em http://pointyhat.FreeBSD.org/errorlogs/packagestats.html
.
Para cada buildenv
é apresentado o
seguinte:
cvs date
é o conteúdo do
cvsdone
. É por isso que nós
recomendamos que você atualize o
cvsdone
para executar compilações
experimentais, -exp
(veja abaixo).
data do último log
(latest log
)
número de linhas no INDEX
o número atual de logs
de
compilações (build logs
)
o número de pacotes concluídos
(packages
)
o número de erros (errors
)
o número de ports
ignorados (duds)
(listados como skipped
)
A coluna missing
mostra a diferença
entre o INDEX
e as outras colunas.
Se você reiniciou uma compilação após um cvs
update
, provavelmente haverá duplicatas nos
pacotes e colunas de erros, e esta coluna será inútil. (O
script
é ingênuo).
Os valores das colunas running
e
completed
são palpites baseados em um
grep(1) do build.log
.
A maneira mais fácil de rastrear falhas na compilação é
receber os logs
enviados por e-mail e
organizá-los em uma pasta, assim você pode manter uma lista com
as falhas atuais e detectar facilmente as novas. Para fazer
isto, adicione um endereço de e-mail ao
${branch}/portbuild.conf
.
Você pode encaminhar facilmente os novos erros para os
mantenedores.
Quando um port
passa a não compilar
corretamente durante varios ciclos de compilação seguidos,
é hora de marcá-lo como quebrado (BROKEN
).
Recomenda-se notificar os mantenedores durante duas semanas,
antes de fazê-lo.
Para evitar erros de compilação dos
ports
cujo código fonte precisa ser
baixado manualmente, coloque os distfiles
em ~ftp/pub/FreeBSD/distfiles
.
Restrições de acesso foram implementadas para garantir que
apenas os clientes de compilação tenham acesso a este
diretório.
Ao compilar pacotes para uma versão específica do FreeBSD,
pode ser necessário atualizar manualmente as árvores do
ports
e do src
para a
tag
da versão desejada e usar as opções
-nocvs
e
-noportscvs
.
Para compilar conjuntos de pacotes que serão usados em um
CD-ROM, use a opção -cdrom
para o comando
dopackages
.
Se não houver espaço em disco disponível no
cluster
, use -nodistfiles
para que os distfiles
não sejam
baixados.
Após completar a compilação inicial, reinicie a compilação
com -restart -fetch-original
para baixar os
distfiles
atualizados. Então, uma vez que a
compilação tiver sido pós-processada, faça um inventário da
lista de arquivos baixados:
%
cd ${arch}/${branch}
%
find distfiles > distfiles-${release}
Este arquivo de inventário normalmente fica localizado em
i386/${branch}
no nó principal do cluster
.
Isto é útil para ajudar na limpeza periódica dos
distfiles
do ftp-master
.
Quando o espaço se torna escasso, os
distfiles
das versões recentes podem ser
mantidos, enquanto outros podem ser jogados fora.
Uma vez que o upload dos
distfiles
tenha sido feito (veja abaixo), o
conjunto de pacotes da versão final deve ser criado. Para se
assegurar, execute manualmente o script
${arch}/${branch}/cdrom.sh
para certificar-se de que todos os pacotes com distribuição
restrita via CD-ROM e todos os distfiles
foram removidos. Então, copie o diretório
${arch}/${branch}/packages
para
${arch}/${branch}/packages-${release}
.
Uma vez que os pacotes tenham sido movidos com segurança,
contate o re@FreeBSD.org e informe-os da localização dos pacotes do
release
.
Lembre-se de coordenar com o re@FreeBSD.org sobre o
timing
e o status das compilações do
release
.
Uma vez que a compilação tenha terminado, os pacotes e/ou
distfiles
podem ser transferidos para o
ftp-master
para serem propagados para a rede de
espelhos FTP. Se a compilação foi executada com a opção
-nofinish
, então certifique-se de executar em
seguida o comando dopackages -finish
para
realizar o pós-processamento dos pacotes (remover pacotes
marcados como RESTRICTED
ou como
NO_CDROM
onde for apropriado, remover pacotes
não listados no INDEX
, remover do
INDEX
as referências para pacotes não
compilados, e gerar um sumário
CHECKSUM.MD5
); e dos
distfiles
(movê-los do diretório temporário
distfiles/.pbtmp
para o diretório
distfiles/
e remover os
distfiles
marcados como
RESTRICTED
e
NO_CDROM
).
É recomendado que se execute manualmente os
scripts
restricted.sh
e/ou
cdrom.sh
após a finalização do
dopackages
, apenas por segurança. Execute o
script
restricted.sh
antes
de fazer o upload para o
ftp-master
, em seguida, execute
cdrom.sh
antes de preparar o conjunto final
de pacotes para um release
.
Os subdiretórios de pacotes são nomeados de acordo com a
versão e branch
ao qual se destinam.
Por exemplo:
packages-7.2-release
packages-7-stable
packages-8-stable
packages-9-stable
packages-10-current
Alguns destes diretórios no
ftp-master
são na verdade
links
simbólicos. Por exemplo:
packages-stable
packages-current
Certifique-se de que você está movendo os novos pacotes
para um diretório de destino real, e não
para um dos links
simbólicos que apontam
para ele.
Se você está preparando um conjunto de pacotes completamente
novo (por exemplo, para um novo release
),
copie os pacotes para a área de teste do
ftp-master
executando algo como mostrado
abaixo:
#
cd /var/portbuild/${arch}/${branch}
#
tar cfv - packages/ | ssh portmgr@ftp-master tar xfC - w/ports/${arch}/tmp/${subdir}
Em seguida, entre no ftp-master
e verifique
se o conjunto de pacotes foi transferido com sucesso, remova o
conjunto de pacotes que o novo conjunto vai substituir (em
~/w/ports/${arch}
),
e mova o novo conjunto para o local. (w/
é
apenas um atalho.)
Para compilações incrementais, o
upload deve ser feito usando o
rsync
para não colocar muita pressão nos
espelhos.
SEMPRE use o rsync
primeiro com a opção -n
e verifique a saída
do comando para assegurar-se que não existem problemas. Se
parece estar tudo bem, execute novamente o
rsync
sem a opção -n
.
Exemplo de sintaxe do comando rsync
para
o upload incremental de
pacotes:
#
rsync -n -r -v -l -t -p --delete packages/ portmgr@ftp-master:w/ports/${arch}/${subdir}/ | tee log
Os distfiles
devem ser transferidos
utilizando-se o script
cpdistfiles
:
#
/var/portbuild/scripts/cpdistfiles ${arch} ${branch} ${buildid} [-yesreally] | tee log2
A execução manual deste processo é um procedimento obsoleto.
Compilações de patches
experimentais são
executadas de tempos em tempos para novas funções ou correções
de defeitos na infraestrutura do ports
(isto
é, bsd.port.mk
), ou para testar
atualizações em grande escala. A qualquer momento podem haver
vários patches
de branchs
experimentais simultâneos, como o 8-exp
na
arquitetura amd64.
Geralmente, a compilação de patches
experimentais é executada da mesma forma que qualquer outra
compilação, exceto que você deve primeiro atualizar a árvore de
ports
para a última versão e, em seguida,
aplicar os seus patches
. Para fazer o primeiro,
você pode usar o seguinte:
%
cvs -R update -dP > update.out
%
date > cvsdone
Essa é a simulação mais próxima do que o
script
dopackages
faz.
(Embora o cvsdone
seja meramente
informativo, ele pode ser útil.)
Você precisará editar o update.out
para
procurar por linhas que comecem com ^M
,
^C
, ou ^?
para que possa
corrigi-las.
É sempre uma boa idéia salvar cópias do original de todos os
arquivos modificados, bem como uma lista do que você está
modificando. Você pode consultar a lista ao fazer o
commit
final, para se certificar de que você
está realizando o commit
exatamente daquilo
que testou.
Pelo fato da máquina ser compartilhada, alguém pode excluir
suas alterações por engano, então mantenha cópias destas, por
exemplo, no seu diretório home
freefall
freefall
. Não use o tmp/
;
pois a pointyhat
executa ele mesmo alguma
versão do -CURRENT
, você pode esperar por
reinicializações (no mínimo para atualizações).
Para que você tenha uma compilação de controle com a qual
possa comparar eventuais falhas, você deve primeiro executar a
compilação de pacote no branch
em que os
patches
experimentais foram baseados para a
arquitetura i386™ (atualmente esta é o 8
).
Quando estiver preparando a compilação dos
patches
experimentais, faça o
checkout
da árvore do
ports
e do src
com a mesma
data da que foi usada para a compilação de controle. Isso vai
garantir uma comparação válida entre as compilações
depois.
Uma vez terminada a compilação, compare as falhas da
compilação de controle com as da compilação dos
patches
experimentais. Para facilitar, use
os seguintes comandos (assumindo o branch 8
como branch
de controle, e o
8-exp
como branch
experimental):
%
cd /var/portbuild/i386/8-exp/errors
%
find . -name \*.log\* | sort > /tmp/8-exp-errs
%
cd /var/portbuild/i386/8/errors
%
find . -name \*.log\* | sort > /tmp/8-errs
Se já faz muito tempo desde que a última compilação
foi finalizada, os logs
podem ter sido
compactados automaticamente com
bzip2. Nesse caso você deve usar
sort | sed 's,\.bz2,,g'
em seu
lugar.
%
comm -3 /tmp/8-errs /tmp/8-exp-errs | less
Este último comando vai gerar um relatório com duas colunas.
A primeira coluna contém os ports
que
falharam na compilação de controle, mas não na compilação com
patches
experimentais; a segunda é o inverso
As razões para o port
estar na primeira
coluna incluem:
O port
foi corrigido desde que a
compilação de controle foi executada, ou foi atualizado para
uma nova versão que também está quebrada (assim a nova
versão também deve aparecer na segunda coluna)
O port
foi corrigido pelos
patches
experimentais na compilação
experimental
O port
não foi compilado na
compilação com patches
experimentais devido
a falha de uma dependência
Razões para o port
aparecer na segunda
coluna incluem:
O port
foi quebrado pelos
patches
experimentais [1]
O port
foi atualizado desde a
compilação de controle e deixou de compilar [2]
O port
foi quebrado devido a um erro
temporário (por exemplo, site FTP fora do ar, erro do pacote
cliente, etc.)
Ambas as colunas devem ser investigadas e as razões para os
erros entendidas antes do commit
do conjunto
de patches
experimentais. Para diferenciar
entre o [1] e o [2] acima, você pode recompilar os pacotes
afetados sob o branch
de controle:
%
cd /var/portbuild/i386/8/ports
Certifique-se de atualizar esta árvore com o
cvs update
para a mesma data da árvore dos
patches
experimentais.
O seguinte comando vai configurar o
branch
de controle para a
compilação parcial (antigo código base):
%
/var/portbuild/scripts/dopackages.8 -noportscvs -nobuild -nocvs -nofinish
As compilações devem ser executadas a partir do diretório
packages/All
. Este diretório deve estar
vazio inicialmente, exceto pelo link
simbólico do Makefile. Se este link
simbólico não existir, ele deve ser criado:
%
cd /var/portbuild/i386/8/packages/All
%
ln -sf ../../Makefile .
%
make -k -j<#> <list of packages to build>
O <#> é o número de compilações paralelas para
tentar. Normalmente isso é a soma dos pesos listados em
/var/portbuild/i386/mlist
, a menos que você
tenha uma razão para executar uma compilação mais pesada ou
leve.
A lista de pacotes para compilar deve ser uma lista do nome
do pacote (incluindo as versões) como aparece no
INDEX
. O PKGSUFFIX
(isto é, .tgz ou .tbz) é opcional.
Isto vai compilar apenas os pacotes listados, bem como todas as suas dependências.
Você pode verificar o progresso da compilação parcial da mesma forma que você faria com uma compilação normal.
Uma vez que todos os erros tenham sido resolvidos, você pode
efetuar o commit
do conjunto de pacotes.
Após efetuar o commit
, é de costume enviar um
e-mail para ports@FreeBSD.org e com
cópia para ports-developers@FreeBSD.org,
informando as pessoas sobre as mudanças. Um resumo de todas as
mudanças também deve registrado no arquivo
/usr/ports/CHANGES
.
Antes de seguir estes passos, por favor, converse com o
portmgr
.
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
.
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.
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.
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.
Escolha um hostname
único. Ele não
tem que ser um hostname
resolvível
publicamente (ele pode ser um nome em sua rede
interna).
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
.)
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.
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/
.)
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
.)
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
.
Se você está realizando uma compilação para outra
plataforma, que não a instalada na máquina
(cross-building), exporte
TARGET_ARCH
=${arch}
.
O procedimento para compilação cruzada de
ports
ainda não está definido.
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
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
.
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
.
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.
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
.
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
Entre no diretório port/package
que
você escolheu acima, por exemplo,
cd /usr2
.
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
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
.
Inicie o cliente.
Como root, crie a estrutura de diretórios do
squid
:
squid -z
Estes passos precisam ser feitos por um
portmgr
, autenticado como o usuário
ports-${arch}
,
no pointyhat
.
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
.
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.
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.
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
.
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.)
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
.
Estes passos precisam ser executados por um
portmgr
autenticado como
ports-arch
no
pointyhat
.
Certifique-se que o ssh
está
funcionando executando ssh
hostname
.
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.
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"
Quando um novo branch
é criado, é
necessário efetuar alguns ajustes no sistema para especificar
que o branch
anterior não mais corresponde ao
HEAD
. As seguintes instruções se aplicam ao
número do branch
anterior:
(novo código base) Edite o
/var/portbuild/conf/server.conf
e faça as seguintes alterações:
Adicione o new-branch
na variável SRC_BRANCHES
.
Para o branch
que anteriormente
era o head
, mude o
SRC_BRANCH_
para
branch
_TAGRELENG_branch_0
.
Adicione
SRC_BRANCH_
new-branch
_TAG=.
(o ponto é literal).
(novo código base) Execute o
/var/portbuild/updatesnap
manualmente.
(Apenas para o antigo código base) Crie um novo sistema de arquivos zfs para os fontes:
zfs create a/snap/src-branch
(Necessário apenas para o antigo código base):
Obtenha uma cópia da árvore de fontes do
src
apartir do SVN e deposite a mesma
no novo sistema de arquivos:
cvs -Rq -d /r/ncvs co -d src-branch
-r RELENG_branch
(Necessário apenas para o antigo código base): Edite a
cópia principal do
Tools/portbuild/portbuild.conf
.
(Necessário apenas para o antigo código base): Edite a
cópia do arquivo acima para cada uma das arquiteturas em
/var/portbuild/arch/portbuild.conf
.
(Necessário apenas para o antigo código base): Edite o
/var/portbuild/scripts/buildenv
.
(Necessário apenas para o antigo código base): Adicione
um link
simbólico de
/var/portbuild/scripts/dopackages
para
/var/portbuild/scripts/dopackages.branch
.
(Necessário apenas para o antigo código base): Modifique
as variáveis HEAD_BRANCH
e
NON_HEAD_BRANCHES
no arquivo
/var/portbuild/scripts/updatesnap
.
(Necessário apenas para o antigo código base): Adicione
o diretório snap
ao arquivo
/var/portbuild/scripts/zexpire
.
(Necessário apenas para o antigo código base): Crie os
links
simbólicos para uso do servidor
web no diretório
/var/portbuild/errorlogs/
:
ln -s ../arch
/branch
/builds/latest/bak/errorsarch
-branch
-full ln -s ../arch
/branch
/builds/latest/bak/logsarch
-branch
-full-logs ln -s ../arch
/branch
/builds/latest/errorsarch
-branch
-latest ln -s ../arch
/branch
/builds/latest/logsarch
-branch
-latest-logs ln -s ../arch
/branch
/builds/latest/bak/packagesarch
-branch
-packages-full ln -s ../arch
/branch
/builds/latest/packagesarch
-branch
-packages-latest
Inicie a compilação para o branch
executando:
build createarch
branch
Quando um branch
antigo deixa de ser
suportado, existem algumas coisas a serem feitas para que não
fique sujeira para trás.
(novo código base) Edite o
/var/portbuild/conf/server.conf
e faça
as seguintes alterações:
Apague o old-branch
da
variável SRC_BRANCHES
.
Remova o
SRC_BRANCH_
old-branch
_TAG=whatever
(novo e antigo código base):
umount a/snap/src-old-branch/src;
umount a/snap/src-old-branch;
zfs destroy -r a/snap/src-old-branch
(novo e antigo código base) Provavelmente você
encontrará os seguintes arquivos e links
simbólicos em /var/portbuild/errorlogs/
os quais podem ser removidos:
Arquivos chamados
*-old_branch-failure.html
Arquivos chamados
buildlogs_*-old_branch-*-logs.txt
Links
simbólicos chamados
*-old_branch-previous*
Links
simbólicos chamados
*-old_branch-latest*
Desde 2011 a filosofia da compilação de pacotes diz que
devemos compilá-los baseados na versão mais antiga
suportada de cada branch
. Por
exemplo: se no RELENG-8
as seguintes versões
são suportadas: 8.1, 8.2, 8.3; então o
packages-8-stable
deve ser compilado a partir
da versão 8.1.
Quando uma versão chega ao fim de sua vida
(End-Of-Life
, veja o quadro),
uma compilação completa (não incremental!) dos pacotes deve ser
realizada e enviada para os servidores de distribuição.
Os procedimentos para o novo código base são os que seguem abaixo:
Edite o
/var/portbuild/conf/server.conf
e faça
as seguintes mudanças:
Altere o
SRC_BRANCH_
para
branch
_TAGRELENG_branch_N
no qual o N
é versão menor
mais antiga para este ramo.
Execute o
/var/portbuild/updatesnap
manualmente.
Execute o
dopackages
com a opção -nobuild
.
Siga os procedimentos de configuração.
Agora você já pode executar o
dopackages
sem a opção -nobuild
.
O procedimento para o antigo código base fica como um exercício para o leitor.
Os passos iniciais precisam ser feitos usando sudo.
Crie um novo usuário e grupo
ports-arch
.
mkdir /var/portbuild/arch
Crie um novo sistema de arquivo zfs:
zfs create -o mountpoint=/a/portbuild/arch
a/portbuild/arch
chown ports-arch
:portmgr /var/portbuild/arch
; chmod 755 /var/portbuild/arch
; cd /var/portbuild/arch
Crie e popule o diretório
.ssh
.
Crie um diretório para os logs
de
compilação e para os logs
de
erros:
mkdir /dumpster/pointyhat/arch
/archive
É possível que
/dumpster/pointyhat
não tenha mais
espaço suficiente. Neste caso, crie o diretório dos
arquivos como
/dumpster/pointyhat/arch/archive
e crie um link
simbólico para ele.
(Isso precisa ser resolvido.)
Crie um link
para o diretório acima
para o servidor web:
ln -s /dumpster/pointyhat/arch
/archive archive
Os próximos passos são mais fáceis de serem realizados
como o usuário
ports-arch
.
No diretório
/var/portbuild/arch
execute:
mkdir clients
Popule o diretório clients
como de costume.
mkdir loads
mkdir lockfiles
Crie um make.conf
local. Nos casos
mais comuns você pode executar:
ln ../make.conf ./make.conf
Crie um arquivo vazio mlist
.
(Necessário apenas para o antigo código base) Crie o
pnohang.arch
.
(O modo mais fácil é fazer isso em um cliente,
e depois copiar o arquivo de volta):
cc pnohang.c -o pnohang-arch
Crie um novo arquivo portbuild.conf
a partir de um existente para uma outra arquitetura.
Crie os arquivos
portbuild.machinename.conf
personalizando-os de forma adequada.
cd .ssh && ssh-keygen
Edite o arquivo .ssh/config
para
tornar mais conveniênte o uso do
ssh.
Crie o diretório de configuração privada:
mkdir /var/portbuild/conf/arch
Crie os scripts
dotunnel.*
que forem necessários
dentro do diretorio acima.
Mais uma vez usando sudo:
Informe o qmanager sobre a arquitetura:
pythonpath
/qmanager/qclient add_acl name=ports-arch
uidlist=ports-arch
gidlist=portmgr sense=1
(Necessário apenas para o novo código base):
Adicione a arch
na variável
SUPPORTED_ARCHS
do arquivo
/var/portbuild/arch/server.conf
.
(Necessário apenas para o antigo código base): Edite o
/var/portbuild/scripts/buildenv
.
Adicione o diretório arch
no
/var/portbuild/scripts/zbackup
e no
/var/portbuild/scripts/zexpire
.
Necessário apenas para o antigo código base): Como no
procedimento para criação de um novo
branch
: crie os links
para o servidor web no diretório
/var/portbuild/errorlogs/
:
ln -s ../arch
/branch
/builds/latest/bak/errorsarch
-branch
-full ln -s ../arch
/branch
/builds/latest/bak/logsarch
-branch
-full-logs ln -s ../arch
/branch
/builds/latest/errorsarch
-branch
-latest ln -s ../arch
/branch
/builds/latest/logsarch
-branch
-latest-logs ln -s ../arch
/branch
/builds/latest/bak/packagesarch
-branch
-packages-full ln -s ../arch
/branch
/builds/latest/packagesarch
-branch
-packages-latest
Crie mais dois links
simbólicos para o
servidor web dentro do diretório
/var/portbuild/errorlogs/
:
ln -s ../arch
/archive/buildlogsarch
-buildlogs ln -s ../arch
/archive/errorlogsarch
-errorlogs
Novamente como
ports-arch
:
Para cada branch
que será suportado,
faça o seguinte:
Inicie a compilação para o branch
com:
build createarch
branch
Uma última vez usando o sudo:
(Necessário apenas para o antigo código base): Só depois
que a primeira execução do
dopackages for feita para a
arquitetura: adicione a arquitetura ao
/var/portbuild/scripts/dopackagestats
.
Adicione uma entrada arch
apropriada para o
/var/portbuild/scripts/dologs
no
crontab
do usuário root. (Esta é uma
solução paliativa)
Esta seção está em progresso.
Por favor, consulte o Mark Linimon antes de efetuar qualquer mudança.
Instale o FreeBSD.
Para cada arquitetura suportada, adicione um usuário e
grupo
ports-${arch}
.
Adicione os usuários ao grupo wheel
.
Eles devem ter um '*'
como senha.
Crie também, de modo similar, o usuário
ports
e
portmgr
.
Para cada arquitetura suportada, crie o
/home/ports-${arch}/.ssh/
e popule o authorized_keys
.
Crie os arquivos apropriados em
/etc/.ssh/
.
Adicione a seguinte linha ao arquivo
/boot/loader.conf
:
console="vidconsole,comconsole"
Adicione as seguintes linhas ao arquivo
/etc/sysctl.conf
:
kern.maxfiles=40000 kern.maxfilesperproc=38000
Certifique-se de que as seguintes mudanças foram
realizadas no /etc/ttys
:
ttyu0 "/usr/libexec/getty std.9600" vt100 on secure
Ainda a ser definido.
Crie um volume zfs chamado
a
e monte-o em
/a
:
# zpool create a mirror da1 da2 mirror da3 da4 mirror da5 da6 mirror da7 da8
Configure o diretório base do
portbuild
:
# mkdir -p /a/portbuild # cd /a/portbuild # chown portmgr:portmgr . # chmod 775 .
Ainda a ser definido.
Os seguintes ports
(ou seus
sucessores mais recentes) são obrigatórios:
databases/py-pysqlite23 databases/py-sqlalchemy devel/git (WITH_SVN) devel/py-configobj devel/py-setuptools devel/subversion net/nc net/rsync sysutils/ganglia-monitor-core (with GMETAD off) sysutils/ganglia-webfrontend (WITHOUT_X11) www/apache22 (with EXT_FILTER and THREADS)
Os ports acima também irão instalar:
databases/sqlite3 lang/perl-5.12 lang/python27
Os seguintes ports
(ou seus
sucessores mais recentes) são fortemente
recomendados:
benchmarks/bonnie++ devel/ccache mail/postfix net/isc-dhcp41-server ports-mgmt/pkg_cutleaves ports-mgmt/pkg_tree ports-mgmt/portaudit ports-mgmt/portmaster security/sudo shells/bash shells/zsh sysutils/screen sysutils/smartmontools
Configure o e-mail fazendo o seguinte: (ainda a ser definido).
Quando uma máquina tem uma falha de disco (por exemplo,
um panic
devido a erros de leitura, etc.),
devemos executar os seguintes procedimentos:
Anote o tempo e o tipo de falha
(por exemplo, colea saída do console que for relevante) no
/var/portbuild/${arch}/reboots
Para os clientes gohan i386, limpe o disco
criando o arquivo /SCRUB
no
nfsroot
(por exemplo,
/a/nfs/8.dir1/SCRUB
) e reinicie. Isso
vai executar um dd if=/dev/zero of=/dev/ad0
e forçar a unidade a remapear todos os setores defeituosos que
encontrar, isto se ela ainda tiver setores suficientes
sobrando. Esta é uma medida temporária para estender o tempo
de vida de uma unidade de disco que em breve irá tornar-se
inutilizável.
Para os sistemas blade
i386,
outro sinal de falha nos discos é quando a
blade
fica em espera e não responde a
qualquer comando pelo console, ou mesmo pelo
NMI.
Para os outros sistemas de compilação que não executam um newfs nos seus discos no momento da inicialização (por exemplo, os sistemas amd64) este procedimento deve ser ignorado.
Se o problema persistir, então provavelmente o
disco está inutilizado. Remova a máquina do
mlist
e (para discos ATA) execute o
smartctl
na unidade:
smartctl -t long /dev/ad0
Isso vai levar cerca de 30 minutos:
gohan51# smartctl -t long /dev/ad0 smartctl version 5.38 [i386-portbld-freebsd8.0] Copyright (C) 2002-8 Bruce Allen Home page is http://smartmontools.sourceforge.net/ === START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION === Sending command: "Execute SMART Extended self-test routine immediately in off-line mode". Drive command "Execute SMART Extended self-test routine immediately in off-line mode" successful. Testing has begun. Please wait 31 minutes for test to complete. Test will complete after Fri Jul 4 03:59:56 2008 Use smartctl -X to abort test.
Quando o comando acima finalizar, execute o comando
smartctl -a /dev/ad0
para verificar o
estado da unidade:
# SMART Self-test log structure revision number 1 # Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error # 1 Extended offline Completed: read failure 80% 15252 319286
Ele também exibirá outros dados, incluindo um
log
dos erros anteriores da unidade. É
possível que a unidade mostre erros de
DMA embora não apresente falhas no
auto-teste (por conta do remapeamento de
setores).
Quando um disco falhar, por favor, informe os
administradores do cluster
, para que possamos
substituí-lo.