# Construa Seu Próprio Servidor de Atualização do FreeBSD

### Jason Helfman

Jason Helfman `<jgh@FreeBSD.org>`

$FreeBSD: release/8.4.0/pt_BR.ISO8859-1/articles/freebsd-update-server/article.xml 41326 2013-03-30 21:29:50Z ebrandi $

Copyright © 2009, 2010, 2011, 2013 Jason Helfman

$FreeBSD: release/8.4.0/pt_BR.ISO8859-1/articles/freebsd-update-server/article.xml 41326 2013-03-30 21:29:50Z ebrandi $

FreeBSD is a registered trademark of the FreeBSD Foundation.

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.

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.

AMD, Am486, Am5X86, AMD Athlon, AMD Duron, AMD Opteron, AMD-K6, Athlon, Élan, Opteron, and PCnet are trademarks of Advanced Micro Devices, Inc.

[ Split HTML / Single HTML ]

> Este artigo descreve como construir um Servidor de Atualização do FreeBSD para uso interno na sua organização. O software freebsd-update-server foi escrito pelo Colin Percival `<cperciva@FreeBSD.org>`, Chefe de Segurança emérito do FreeBSD. Para usuários que acreditam que é conveniente atualizar seus sistemas a partir de um servidor oficial de atualização, construir o seu próprio Servidor de Atualização do FreeBSD pode ajudá-lo a estender suas funcionalidades, seja por adicionar suporte a versões customizadas do FreeBSD ou por viabilizar a criação de um servidor local o qual permitirá atualizações mais rápidas caso você possua muitos servidores para atualizar.

## 1 Agradecimentos

Este artigo posteriormente impresso na BSD Magazine.

## 2 Introdução

Usuários experientes ou administradores são frequentemente responsáveis por diversas máquinas ou ambientes. Eles entendem as dificuldades e os desafios de manter tal estrutura. A utilização de um Servidor de Atualização do FreeBSD torna mais fácil a tarefa de implantar patches de segurança e de softwares nas máquinas selecionadas para testá-los antes proceder com o seu deploy no ambiente de produção. Isto também significa que seus servidores poderão ser atualizados a partir da rede local em vez de utilizarem sua conexão de internet, o que torna o processo muito mais rápido. Este artigo descreve as etapas envolvidas na criação de um Servidor de Atualização do FreeBSD para uso interno.

## 3 Pré-Requisitos

Para construir o seu Servidor de Atualização do FreeBSD alguns requisitos devem ser cumpridos.

- Estar executando o FreeBSD.

  > Nota: No mínimo, as atualizações precisam ser compiladas em uma versão do FreeBSD maior ou igual a versão alvo a ser distribuída.

- Ter acesso a uma conta de usuário com no mínimo 4 GB de espaço livre. Isto permite a criação de atualizações para as versões 7.1 e 7.2, mas o espaço exato requerido pode mudar de versão para versão.

- Ter acesso a uma conta ssh(1) em uma máquina remota para enviar as atualizações a serem distribuídas.

- Possuir um servidor web, como Apache, com mais da metade do espaço necessário para a compialação. Por exemplo, compilações testes para 7.1 e 7.2 consomem um espaço total de 4 GB, e usam 2.6 GB para distribuir essas atualizações.

- Ter conhecimento básico de shell script com o Bourne shell, sh(1)

## 4 Instalação & Configuração

Para efetuar o download do software freebsd-update-server instale o `devel/subversion` e execute:

    % svn co http://svn.freebsd.org/base/user/cperciva/freebsd-update-build freebsd-update-server

Atualize o `scripts/build.conf` de forma adequada. Ele é usado durante as operações de compilação.

Aqui está o `build.conf` padrão, que deverá ser modificado para se adequar ao seu ambiente.

    # Main configuration file for FreeBSD Update builds.  The
    # release-specific configuration data is lower down in
    # the scripts tree.

    # Location from which to fetch releases
    export FTP=ftp://ftp2.freebsd.org/pub/FreeBSD/releases

    # Host platform
    export HOSTPLATFORM=`uname -m`

    # Host name to use inside jails
    export BUILDHOSTNAME=${HOSTPLATFORM}-builder.daemonology.net

    # Location of SSH key
    export SSHKEY=/root/.ssh/id_dsa

    # SSH account into which files are uploaded
    MASTERACCT=builder@wadham.daemonology.net

    # Directory into which files are uploaded
    MASTERDIR=update-master.freebsd.org

Parâmentros que devem ser considerados:

  Este é o local de onde serão feitos os downloads das imagens ISO (pela sub-rotina `fetchiso()` do `scripts/build.subr`). O local a ser configurado não é limitado a URIs de FTP. Qualquer URI suportada pela ferramenta fetch(1) pode ser usada.

  Customizações do código da `fetchiso()` podem ser feitas copiando o script padrão `build.subr` para o local da sua versão e arquitetura específica `scripts/RELEASE/ARCHITECTURE/build.subr` e alterando o arquivo.

  O nome do computador que fará a compilação. Esta informação será exibida durante a atualização dos sistemas:

      % uname -v

  A chave SSH para enviar os arquivos para o servidor de atualização. O par de chaves pode ser criado digitando `ssh-keygen -t dsa`. Este parâmetro é opcional; a autenticação por senha será usada como método de autenticação quando a variável `SSHKEY` não estiver definida.

  A página do manual ssh-keygen(1) tem informações mais detalhadas sobre o SSH e os passos apropriados para criar e usar chaves.

  Conta para enviar os arquivos para o servidor de atualização.
  Diretório do servidor de atualização para o qual os arquivos serão enviados.

O arquivo `build.conf` padrão, distribuído com o fonte do freebsd-update-server, está preparado para compilar a versão i386 do FreeBSD. A titulo de exemplo sobre como compilar um servidor de atualização para outras arquiteturas, as seguintes modificações são necessárias para a arquitetura amd64:

1. Crie um ambiente de compilação para o amd64:

       % mkdir -p /usr/local/freebsd-update-server/scripts/7.2-RELEASE/amd64

2. Copie o arquivo `build.conf` para o diretório recém criado. As configurações de compilação para o FreeBSD 7.2-RELEASE na arquitetura amd64 devem ser similares a:

       # SHA256 hash of RELEASE disc1.iso image.
       export RELH=1ea1f6f652d7c5f5eab7ef9f8edbed50cb664b08ed761850f95f48e86cc71ef5

       # Components of the world, source, and kernels
       export WORLDPARTS="base catpages dict doc games info manpages proflibs lib32"
       export SOURCEPARTS="base bin contrib crypto etc games gnu include krb5  \
                       lib libexec release rescue sbin secure share sys tools  \
                       ubin usbin cddl"
       export KERNELPARTS="generic"

       # EOL date
       export EOL=1275289200

     A chave hash sha256(1) da versão desejada, ela é publicada no anúncio da versão.
     Para gerar o número "End of Life" (Fim da Vida) para o `build.conf`, consulte a informação sobre o "Estimated EOL" publicada no Site de Segurança do FreeBSD. O valor do `EOL` pode ser derivado a partir da data listada no site, usando a ferramenta date(1), por exemplo:

         % date -j -f '%Y%m%d-%H%M%S' '20090401-000000' '+%s'

## 5 Preparando a atualização

O primeiro passo é executar o `scripts/make.sh`. Isto irá compilar alguns binários, criar diretórios, e gerar uma chave de assinatura RSA usada para aprovar as compilações. Neste passo, uma senha deverá ser fornecida para terminar a criação da chave de assinatura.

    # sh scripts/make.sh
    cc -O2 -fno-strict-aliasing -pipe   findstamps.c  -o findstamps
    findstamps.c: In function 'usage':
    findstamps.c:45: warning: incompatible implicit declaration of built-in function 'exit'
    cc -O2 -fno-strict-aliasing -pipe   unstamp.c  -o unstamp
    install findstamps ../bin
    install unstamp ../bin
    rm -f findstamps unstamp
    Generating RSA private key, 4096 bit long modulus
    ................................................................................++
    ...................++
    e is 65537 (0x10001)

    Public key fingerprint:
    27ef53e48dc869eea6c3136091cc6ab8589f967559824779e855d58a2294de9e

    Encrypting signing key for root
    enter aes-256-cbc encryption password:
    Verifying - enter aes-256-cbc encryption password:

> Nota: Anote a impressão digital (fingerprint) da chave gerada. Ela é necessária no `/etc/freebsd-update.conf` para as atualizações de binários.

Neste ponto, nós estamos prontos para a etapa de compilação.

    # cd /usr/local/freebsd-update-server
    # sh scripts/init.sh amd64 7.2-RELEASE

A seguir está um exemplo de uma execução inicial.

    # sh scripts/init.sh amd64 7.2-RELEASE
    Mon Aug 24 16:04:36 PDT 2009 Starting fetch for FreeBSD/amd64 7.2-RELEASE
    /usr/local/freebsd-update-server/work/7.2-RELE100% of  588 MB  359 kBps 00m00s
    Mon Aug 24 16:32:38 PDT 2009 Verifying disc1 hash for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 16:32:44 PDT 2009 Extracting components for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 16:34:05 PDT 2009 Constructing world+src image for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 16:35:57 PDT 2009 Extracting world+src for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 23:36:24 UTC 2009 Building world for FreeBSD/amd64 7.2-RELEASE
    Tue Aug 25 00:31:29 UTC 2009 Distributing world for FreeBSD/amd64 7.2-RELEASE
    Tue Aug 25 00:32:36 UTC 2009 Building and distributing kernels for FreeBSD/amd64 7.2-RELEASE
    Tue Aug 25 00:44:44 UTC 2009 Constructing world components for FreeBSD/amd64 7.2-RELEASE
    Tue Aug 25 00:44:56 UTC 2009 Distributing source for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 17:46:18 PDT 2009 Moving components into staging area for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 17:46:33 PDT 2009 Identifying extra documentation for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 17:47:13 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 17:47:18 PDT 2009 Indexing release for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 17:50:44 PDT 2009 Indexing world0 for FreeBSD/amd64 7.2-RELEASE

    Files built but not released:
    Files released but not built:
    Files which differ by more than contents:
    Files which differ between release and build:
    kernel|generic|/GENERIC/hptrr.ko
    kernel|generic|/GENERIC/kernel
    src|sys|/sys/conf/newvers.sh
    world|base|/boot/loader
    world|base|/boot/pxeboot
    world|base|/etc/mail/freebsd.cf
    world|base|/etc/mail/freebsd.submit.cf
    world|base|/etc/mail/sendmail.cf
    world|base|/etc/mail/submit.cf
    world|base|/lib/libcrypto.so.5
    world|base|/usr/bin/ntpq
    world|base|/usr/lib/libalias.a
    world|base|/usr/lib/libalias_cuseeme.a
    world|base|/usr/lib/libalias_dummy.a
    world|base|/usr/lib/libalias_ftp.a
    ...

Em seguida, a compilação da base do sistema será feita novamente, com os patches. Uma explicação mais detalhada pode ser encontrada em `scripts/build.subr`.

> Atenção: Durante a segunda compilação, o serviço de network time protocol, ntpd(8) será desligado. De acordo com Colin Percival `<cperciva@FreeBSD.org>`, Chefe de Segurança emérito do FreeBSD, "o freebsd-update-server compila códigos necessários para identificar os `timestamps`, os quais são armazenadas em arquivos, de modo que estes últimos podem ser ignorados quando estivermos comparando compilações diferentes para determinar quais arquivos precisam ser atualizados. Esta procura por `timestamp` funciona realizando duas compilações separadas por 400 dias e comparando os resultados."

    Mon Aug 24 17:54:07 PDT 2009 Extracting world+src for FreeBSD/amd64 7.2-RELEASE
    Wed Sep 29 00:54:34 UTC 2010 Building world for FreeBSD/amd64 7.2-RELEASE
    Wed Sep 29 01:49:42 UTC 2010 Distributing world for FreeBSD/amd64 7.2-RELEASE
    Wed Sep 29 01:50:50 UTC 2010 Building and distributing kernels for FreeBSD/amd64 7.2-RELEASE
    Wed Sep 29 02:02:56 UTC 2010 Constructing world components for FreeBSD/amd64 7.2-RELEASE
    Wed Sep 29 02:03:08 UTC 2010 Distributing source for FreeBSD/amd64 7.2-RELEASE
    Tue Sep 28 19:04:31 PDT 2010 Moving components into staging area for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 19:04:46 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 19:04:51 PDT 2009 Indexing world1 for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 19:08:04 PDT 2009 Locating build stamps for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 19:10:19 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 19:10:19 PDT 2009 Preparing to copy files into staging area for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 19:10:20 PDT 2009 Copying data files into staging area for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 12:16:57 PDT 2009 Copying metadata files into staging area for FreeBSD/amd64 7.2-RELEASE
    Mon Aug 24 12:16:59 PDT 2009 Constructing metadata index and tag for FreeBSD/amd64 7.2-RELEASE

    Files found which include build stamps:
    kernel|generic|/GENERIC/hptrr.ko
    kernel|generic|/GENERIC/kernel
    world|base|/boot/loader
    world|base|/boot/pxeboot
    world|base|/etc/mail/freebsd.cf
    world|base|/etc/mail/freebsd.submit.cf
    world|base|/etc/mail/sendmail.cf
    world|base|/etc/mail/submit.cf
    world|base|/lib/libcrypto.so.5
    world|base|/usr/bin/ntpq
    world|base|/usr/include/osreldate.h
    world|base|/usr/lib/libalias.a
    world|base|/usr/lib/libalias_cuseeme.a
    world|base|/usr/lib/libalias_dummy.a
    world|base|/usr/lib/libalias_ftp.a
    ...

Finalmente, a compilação termina.

    Values of build stamps, excluding library archive headers:
    v1.2 (Aug 25 2009 00:40:36)
    v1.2 (Aug 25 2009 00:38:22)
    @(#)FreeBSD 7.2-RELEASE #0: Tue Aug 25 00:38:29 UTC 2009
    FreeBSD 7.2-RELEASE #0: Tue Aug 25 00:38:29 UTC 2009
        root@server.myhost.com:/usr/obj/usr/src/sys/GENERIC
    7.2-RELEASE
    Mon Aug 24 23:55:25 UTC 2009
    Mon Aug 24 23:55:25 UTC 2009
    ##### built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009
    ##### built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009
    ##### built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009
    ##### built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009
    Mon Aug 24 23:46:47 UTC 2009
    ntpq 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)
     * Copyright (c) 1992-2009 The FreeBSD Project.
    Mon Aug 24 23:46:47 UTC 2009
    Mon Aug 24 23:55:40 UTC 2009
    Aug 25 2009
    ntpd 4.2.4p5-a Mon Aug 24 23:55:52 UTC 2009 (1)
    ntpdate 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)
    ntpdc 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)
    Tue Aug 25 00:21:21 UTC 2009
    Tue Aug 25 00:21:21 UTC 2009
    Tue Aug 25 00:21:21 UTC 2009
    Mon Aug 24 23:46:47 UTC 2009

    FreeBSD/amd64 7.2-RELEASE initialization build complete.  Please
    review the list of build stamps printed above to confirm that
    they look sensible, then run
    # sh -e approve.sh amd64 7.2-RELEASE
    to sign the release.

Se tudo estiver correto, aprove a compilação. Maiores informações sobre como determinar se o processo finalizou com sucesso podem ser encontradas no arquivo chamado `USAGE`, distribuído com o código fonte. Execute o `scripts/approve.sh`. Isto irá assinar a versão, e mover os seus componentes para uma área de preparo adequada para a transferência para o servidor de distribuição.

    # cd /usr/local/freebsd-update-server
    # sh scripts/mountkey.sh

    # sh -e scripts/approve.sh amd64 7.2-RELEASE
    Wed Aug 26 12:50:06 PDT 2009 Signing build for FreeBSD/amd64 7.2-RELEASE
    Wed Aug 26 12:50:06 PDT 2009 Copying files to patch source directories for FreeBSD/amd64 7.2-RELEASE
    Wed Aug 26 12:50:06 PDT 2009 Copying files to upload staging area for FreeBSD/amd64 7.2-RELEASE
    Wed Aug 26 12:50:07 PDT 2009 Updating databases for FreeBSD/amd64 7.2-RELEASE
    Wed Aug 26 12:50:07 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.2-RELEASE

Depois que o processo de aprovação tiver sido finalizado, o processo de transferência pode ser iniciado.

    # cd /usr/local/freebsd-update-server
    # sh scripts/upload.sh amd64 7.2-RELEASE

> Nota: No caso do código de atualização precisar ser transferido novamente para o servidor de distribuição, isto poderá ser feito entrando-se no diretório público de distribuição da versão desejada e atualizando os atributos do arquivo uploaded.

>     # cd /usr/local/freebsd-update-server/pub/7.2-RELEASE/amd64
>     # touch -t 200801010101.01 uploaded

Os arquivos transferidos precisam ficar na raiz do servidor web para que as atualizações sejam distribuídas. A exata configuração dependerá do servidor web utilizado. Para o servidor web Apache, por favor, consulte a seção Configuração do servidor Apache do Handbook.

Atualize o `KeyPrint` e o `ServerName` no arquivo `/etc/freebsd-update.conf`, e efetue as atualizações de acordo com os procedimentos descritos na seção Atualização do FreeBSD do Handbook.

> Importante: Para o Servidor de Atualização do FreeBSD funcionar corretamente, é preciso que estejam compiladas a versão atual e a versão alvo para a qual você deseja se atualizar. Isto é necessário para que o sistema determine quais são os arquivos que diferem entre as versões. Por exemplo, para atualizar o FreeBSD da versão 7.1-RELEASE para a versão 7.2-RELEASE, será necessário que você compile e transfira os arquivos de ambas as versões para o seu servidor de atualização.

Para referência, segue um exemplo de log completo da execução do `init.sh` .

## 6 Compilando um patch

Toda vez que um aviso de segurança ou uma nota de segurança é anunciada, uma atualização pode ser compilada.

Para este exemplo, a versão 7.1-RELEASE será usada.

Algumas suposições são feitas para a compilação de uma versão diferente:

- Crie a estrutura correta de diretório para a compilação inicial.

- Faça a compilação inicial da 7.1-RELEASE

Crie o diretório do patch para a respectiva versão em `/usr/local/freebsd-update-server/patches/`.

    % mkdir -p /usr/local/freebsd-update-server/patches/7.1-RELEASE/
    % cd /usr/local/freebsd-update-server/patches/7.1-RELEASE

Como exemplo, pegue o patch para o named(8). Leia o aviso, obtenha o arquivo necessário do Aviso de Segurança do FreeBSD. Mais informações sobre como interpretar os avisos, podem ser encontradas no Handbook do FreeBSD.

Na nota de segurança, este aviso é chamado de `SA-09:12.bind`. Depois de fazer o download do arquivo, é necessário renomeá-lo para o nível correto do patch. É recomendado manter consistência com os níveis oficiais de patch do FreeBSD, mas o nome pode ser escolhido livremente. Para esta compilação, vamos seguir a prática atual do FreeBSD e chamá-lo de `p7`. Renomeie o arquivo:

    % cd /usr/local/freebsd-update-server/patches/7.1-RELEASE/; mv bind.patch 7-SA-09:12.bind

> Nota: Ao executar uma compilação de nível de patch, é assumido que os patches anteriores estarão no mesmo lugar. Quando uma compilação de patch é executada, ela vai aplicar todos os patches contidos no diretório do patch.

> Podem ser adicionados patches personalizados na Compilação. Use o número zero, ou qualquer outro número.

> Atenção: É da responsabilidade do administrador do Servidor de Atualização do FreeBSD tomar as devidas ações para verificar a autenticidade de cada patch.

Neste ponto, um diff está pronto para ser construído. O software primeiro irá verificar se o `scripts/init.sh` foi executado na respectiva versão antes de executar a construção do diff.

    # cd /usr/local/freebsd-update-server
    # sh scripts/diff.sh amd64 7.1-RELEASE 7

O que segue abaixo é um exemplo do log da execução de uma compilação diferencial.

    # sh -e scripts/diff.sh amd64 7.1-RELEASE 7
    Wed Aug 26 10:09:59 PDT 2009 Extracting world+src for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 17:10:25 UTC 2009 Building world for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 18:05:11 UTC 2009 Distributing world for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 18:06:16 UTC 2009 Building and distributing kernels for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 18:17:50 UTC 2009 Constructing world components for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 18:18:02 UTC 2009 Distributing source for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 11:19:23 PDT 2009 Moving components into staging area for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 11:19:37 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 11:19:42 PDT 2009 Indexing world0 for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 11:23:02 PDT 2009 Extracting world+src for FreeBSD/amd64 7.1-RELEASE-p7
    Thu Sep 30 18:23:29 UTC 2010 Building world for FreeBSD/amd64 7.1-RELEASE-p7
    Thu Sep 30 19:18:15 UTC 2010 Distributing world for FreeBSD/amd64 7.1-RELEASE-p7
    Thu Sep 30 19:19:18 UTC 2010 Building and distributing kernels for FreeBSD/amd64 7.1-RELEASE-p7
    Thu Sep 30 19:30:52 UTC 2010 Constructing world components for FreeBSD/amd64 7.1-RELEASE-p7
    Thu Sep 30 19:31:03 UTC 2010 Distributing source for FreeBSD/amd64 7.1-RELEASE-p7
    Thu Sep 30 12:32:25 PDT 2010 Moving components into staging area for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 12:32:39 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 12:32:43 PDT 2009 Indexing world1 for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 12:35:54 PDT 2009 Locating build stamps for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 12:36:58 PDT 2009 Reverting changes due to build stamps for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 12:37:14 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 12:37:14 PDT 2009 Preparing to copy files into staging area for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 12:37:15 PDT 2009 Copying data files into staging area for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 12:43:23 PDT 2009 Copying metadata files into staging area for FreeBSD/amd64 7.1-RELEASE-p7
    Wed Aug 26 12:43:25 PDT 2009 Constructing metadata index and tag for FreeBSD/amd64 7.1-RELEASE-p7
    ...
    Files found which include build stamps:
    kernel|generic|/GENERIC/hptrr.ko
    kernel|generic|/GENERIC/kernel
    world|base|/boot/loader
    world|base|/boot/pxeboot
    world|base|/etc/mail/freebsd.cf
    world|base|/etc/mail/freebsd.submit.cf
    world|base|/etc/mail/sendmail.cf
    world|base|/etc/mail/submit.cf
    world|base|/lib/libcrypto.so.5
    world|base|/usr/bin/ntpq
    world|base|/usr/include/osreldate.h
    world|base|/usr/lib/libalias.a
    world|base|/usr/lib/libalias_cuseeme.a
    world|base|/usr/lib/libalias_dummy.a
    world|base|/usr/lib/libalias_ftp.a
    ...
    Values of build stamps, excluding library archive headers:
    v1.2 (Aug 26 2009 18:13:46)
    v1.2 (Aug 26 2009 18:11:44)
    @(#)FreeBSD 7.1-RELEASE-p7 #0: Wed Aug 26 18:11:50 UTC 2009
    FreeBSD 7.1-RELEASE-p7 #0: Wed Aug 26 18:11:50 UTC 2009
        root@server.myhost.com:/usr/obj/usr/src/sys/GENERIC
    7.1-RELEASE-p7
    Wed Aug 26 17:29:15 UTC 2009
    Wed Aug 26 17:29:15 UTC 2009
    ##### built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009
    ##### built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009
    ##### built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009
    ##### built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009
    Wed Aug 26 17:20:39 UTC 2009
    ntpq 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)
     * Copyright (c) 1992-2009 The FreeBSD Project.
    Wed Aug 26 17:20:39 UTC 2009
    Wed Aug 26 17:29:30 UTC 2009
    Aug 26 2009
    ntpd 4.2.4p5-a Wed Aug 26 17:29:41 UTC 2009 (1)
    ntpdate 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)
    ntpdc 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)
    Wed Aug 26 17:55:02 UTC 2009
    Wed Aug 26 17:55:02 UTC 2009
    Wed Aug 26 17:55:02 UTC 2009
    Wed Aug 26 17:20:39 UTC 2009
    ...

As atualizações são exibidas, e uma aprovação é requisitada.

    New updates:
    kernel|generic|/GENERIC/kernel.symbols|f|0|0|0555|0|7c8dc176763f96ced0a57fc04e7c1b8d793f27e006dd13e0b499e1474ac47e10|
    kernel|generic|/GENERIC/kernel|f|0|0|0555|0|33197e8cf15bbbac263d17f39c153c9d489348c2c534f7ca1120a1183dec67b1|
    kernel|generic|/|d|0|0|0755|0||
    src|base|/|d|0|0|0755|0||
    src|bin|/|d|0|0|0755|0||
    src|cddl|/|d|0|0|0755|0||
    src|contrib|/contrib/bind9/bin/named/update.c|f|0|10000|0644|0|4d434abf0983df9bc47435670d307fa882ef4b348ed8ca90928d250f42ea0757|
    src|contrib|/contrib/bind9/lib/dns/openssldsa_link.c|f|0|10000|0644|0|c6805c39f3da2a06dd3f163f26c314a4692d4cd9a2d929c0acc88d736324f550|
    src|contrib|/contrib/bind9/lib/dns/opensslrsa_link.c|f|0|10000|0644|0|fa0f7417ee9da42cc8d0fd96ad24e7a34125e05b5ae075bd6e3238f1c022a712|
    ...
    FreeBSD/amd64 7.1-RELEASE update build complete.  Please review
    the list of build stamps printed above and the list of updated
    files to confirm that they look sensible, then run
    # sh -e approve.sh amd64 7.1-RELEASE
    to sign the build.

Siga o mesmo processo descrito anteriormente para aprovar a compilação:

    # sh -e scripts/approve.sh amd64 7.1-RELEASE
    Wed Aug 26 12:50:06 PDT 2009 Signing build for FreeBSD/amd64 7.1-RELEASE
    Wed Aug 26 12:50:06 PDT 2009 Copying files to patch source directories for FreeBSD/amd64 7.1-RELEASE
    Wed Aug 26 12:50:06 PDT 2009 Copying files to upload staging area for FreeBSD/amd64 7.1-RELEASE
    Wed Aug 26 12:50:07 PDT 2009 Updating databases for FreeBSD/amd64 7.1-RELEASE
    Wed Aug 26 12:50:07 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.1-RELEASE

    The FreeBSD/amd64 7.1-RELEASE update build has been signed and is
    ready to be uploaded.  Remember to run
    # sh -e umountkey.sh
    to unmount the decrypted key once you have finished signing all
    the new builds.

Depois de aprovar a compilação, faça a transferência do software para o servidor de distribuição:

    # cd /usr/local/freebsd-update-server
    # sh scripts/upload.sh amd64 7.1-RELEASE

Para referência, segue o log de uma execução completa do `diff.sh`.

## 7 Dicas

- Se uma versão personalizada tiver sido compilada usando o procedimento nativo do `make release`, o código do freebsd-update-server irá funcionar a partir da sua versão. Por exemplo, uma versão sem o ports ou sem a documentação pode ser compilada limpando-se as funcionalidades pertencentes às sub-rotinas de documentação `findextradocs()`, `addextradocs()` e alterando o local de download na `fetchiso()`, respectivamente, no `scripts/build.subr`. Em um último passo, mude o hash sha256(1) em `build.conf` na sua respectiva versão e arquitetura e então você está pronto para compilar sua versão personalizada.

      # Compare ${WORKDIR}/release and ${WORKDIR}/$1, identify which parts
      # of the world|doc subcomponent are missing from the latter, and
      # build a tarball out of them.
      findextradocs () {
      }

      # Add extra docs to ${WORKDIR}/$1
      addextradocs () {
      }

- Adicionando a opção `-j `NÚMERO`` nas etapas `buildworld` e `obj` no script `scripts/build.subr` pode acelerar o processo dependendo do hardware usado, entretanto isto não é necessário. Usar esta opção em outras etapas não é recomendado, pois pode fazer a compilação ficar instável.

      #Build the world
      log "Building world"
      cd /usr/src &&
      make -j 2 ${COMPATFLAGS} buildworld 2>&1

      # Distribute the world
      log "Distributing world"
      cd /usr/src/release &&
      make -j 2 obj &&
        make ${COMPATFLAGS} release.1 release.2 2>&1

- Crie uma entrada SRV apropriada no DNS para o servidor de atualização, e coloque outros servidores com pesos variados. Usar este recurso irá permitir que você distribua a carga do processo de atualização entre vários servidores, entretanto esta dica não será necessária a menos que você deseje prover um serviço redundante.

      	_http._tcp.update.myserver.com.                  IN SRV   0 2 80   host1.myserver.com.
      							    SRV   0 1 80   host2.myserver.com.
      							    SRV   0 0 80   host3.myserver.com.

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