23.2. Atualização do FreeBSD
Anterior | Capítulo 23. Atualização e Upgrade do FreeBSD | Próxima

## 23.2. Atualização do FreeBSD

Escrito porTom Rhodes.
Com base nas notas fornecidas por Colin Percival.

A aplicação de patches de segurança em tempo hábil e a atualização para uma versão mais recente de um sistema operacional são aspectos importantes da administração contínua do sistema. O FreeBSD inclui um utilitário chamado `freebsd-update` o qual pode ser usado para executar ambas as tarefas.

Este utilitário suporta atualizações binárias de segurança e de erratas para o FreeBSD, sem a necessidade de compilar e instalar manualmente o patch ou um novo kernel. Atualizações binárias estão disponíveis para todas as arquiteturas e versões atualmente suportadas pela equipe de segurança. A lista de versões suportadas e suas datas estimadas de fim de vida estão listadas em `https://www.FreeBSD.org/security/`.

Este utilitário também suporta upgrades do sistema operacional para releases menores (ponto x), bem como atualizações para outro ramo de release. Antes de atualizar para uma nova versão, revise o seu anúncio de lançamento, pois ele contém informações importantes pertinentes ao release. Os anúncios de lançamento estão disponíveis em `https://www.FreeBSD.org/releases/`.

### Nota:

Se um `crontab` utilizando os recursos do freebsd-update(8) existir, ele deve ser desativado antes de atualizar o sistema operacional .

Esta seção descreve o arquivo de configuração usado pelo `freebsd-update`, demonstra como aplicar um patch de segurança e como atualizar para um release menor ou principal do sistema operacional e discute algumas das considerações ao atualizar o sistema operacional .

### 23.2.1. O Arquivo de Configuração

O arquivo de configuração padrão do `freebsd-update` funciona como está. Alguns usuários podem querer ajustar a configuração padrão no `/etc/freebsd-update.conf`, permitindo um melhor controle do processo. Os comentários neste arquivo explicam as opções disponíveis, mas os seguintes podem exigir um pouco mais de explicação:

    # Componentes do sistema base que devem ser mantidos atualizados.
    Components world kernel

Este parâmetro controla quais partes do FreeBSD serão mantidas atualizadas. O padrão é atualizar todo o sistema básico e o kernel. Componentes individuais podem ser especificados, como `src/base` ou `src/sys`. No entanto, a melhor opção é deixar isso no padrão, pois alterá-lo para incluir itens específicos requer que todos os itens necessários sejam listados. Com o tempo, isso pode ter consequências desastrosas, pois o código-fonte e os binários podem ficar fora de sincronia.

    # Caminhos que começam com qualquer coisa que corresponda a uma entrada em uma
    # declaração IgnorePaths será ignorada.
    IgnorePaths /boot/kernel/linker.hints

Para deixar diretórios especificados, como `/bin` ou `/sbin`, intocados durante o processo de atualização, adicione seus caminhos a esta instrução. Esta opção pode ser usada para evitar que o `freebsd-update` substitua as modificações locais.

    # Caminhos que começam com qualquer coisa que corresponda a uma entrada em uma declaração
    # UpdateIfUnmodified só será atualizada se o conteúdo do arquivo não tiver sido
    # modificado pelo usuário (a menos que as alterações sejam mescladas; veja abaixo).
    UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile

Esta opção atualizará apenas os arquivos de configuração não modificados nos diretórios especificados. Quaisquer alterações feitas pelo usuário impedirão a atualização automática desses arquivos. Existe outra opção, `KeepModifiedMetadata`, que instruirá o `freebsd-update` para salvar as alterações durante a mesclagem.

    # Ao fazer o upgrade para uma nova versão do FreeBSD, os arquivos que forem especificados no MergeChanges
    # terão quaisquer alterações locais mescladas na versão da nova release.
    MergeChanges /etc/ /var/named/etc/ /boot/device.hints

Lista de diretórios com arquivos de configuração que o `freebsd-update` deve tentar mesclar. O processo de mesclagem de arquivos é uma série de patches diff(1) semelhantes a mergemaster(8), mas com menos opções. As mesclagens são aceitas, abrem um editor ou fazem com que o `freebsd-update` aborte. Em caso de dúvida, faça backup do `/etc` e apenas aceite as mesclagens. Veja mergemaster(8) para maiores informações sobre o `mergemaster`.

    # Diretório no qual armazenar atualizações baixadas e arquivos
    # temporários usados ​​pelo FreeBSD Update.
    # WorkDir /var/db/freebsd-update

Este diretório é onde todos os patches e arquivos temporários são colocados. Nos casos em que o usuário estiver fazendo uma atualização de versão, esse local deverá ter pelo menos um gigabyte de espaço em disco disponível.

    # Ao atualizar entre releases, a lista de Componentes deve ser lida de forma estrita (StrictComponents yes)
    # ou meramente como uma lista de componentes que *podem* ser instalados de quais atualizações do
    # FreeBSD devem ser instaladas e atualizadas (StrictComponents no)?
    # StrictComponents no

Quando esta opção estiver definida como `yes`, o `freebsd-update` assumirá que a lista `Componentes` está completa e não tentará fazer alterações fora da lista. Efetivamente, o `freebsd-update` tentará atualizar todos os arquivos que pertencem à lista `Componentes`.

### 23.2.2. Aplicando Patches de Segurança

O processo de aplicação de patches de segurança do FreeBSD foi simplificado, permitindo que um administrador mantenha um sistema totalmente corrigido usando o `freebsd-update`. Maiores informações sobre os avisos de segurança do FreeBSD podem ser encontradas em Seção 13.11, “Avisos de Segurança do FreeBSD”.

Patches de segurança do FreeBSD podem ser baixados e instalados usando os seguintes comandos. O primeiro comando determinará se algum patch pendente está disponível e, em caso afirmativo, listará os arquivos que serão modificados se os patches forem aplicados. O segundo comando aplicará os patches.

    # freebsd-update fetch
    # freebsd-update install

Se a atualização aplicar alguma correção de kernel, o sistema precisará de uma reinicialização para inicializar no kernel corrigido. Se o patch for aplicado a qualquer binário em execução, os aplicativos afetados devem ser reiniciados para que a versão corrigida do binário seja usada.

O sistema pode ser configurado para verificar automaticamente as atualizações uma vez por dia, adicionando esta entrada ao `/etc/crontab`:

    @daily                                  root    freebsd-update cron

Se houver patches, eles serão automaticamente baixados, mas não serão aplicados. O usuário `root` receberá um email para que os patches possam ser revisados ​​e instalados manualmente com o `freebsd-update install`.

Se algo der errado, o `freebsd-update` terá a capacidade de reverter o último conjunto de alterações com o seguinte comando:

    # freebsd-update rollback
    Uninstalling updates... done.

Novamente, o sistema deve ser reiniciado se o kernel ou qualquer módulo do kernel for modificado e quaisquer binários afetados devem ser reiniciados.

Apenas o kernel `GENERIC` pode ser atualizado automaticamente pelo `freebsd-update`. Se um kernel personalizado estiver instalado, ele terá que ser recompilado e reinstalado depois que o `freebsd-update` terminar de instalar as atualizações. No entanto, o `freebsd-update` detectará e atualizará o kernel GENERIC se `/boot/GENERIC` existir, mesmo que não seja o kernel atual em execução no sistema. Para verificar detalhes desta instalação utilize o comando uname(1).

### Nota:

Sempre mantenha uma cópia do kernel `GENERIC` em `/boot/GENERIC`. Será útil no diagnóstico de vários problemas e na execução de atualizações de versão. Consulte Seção 23.2.3.1, “Kernels personalizados com o FreeBSD 9.X e posteriores” para obter instruções sobre como obter uma cópia do kernel `GENERIC`.

A menos que a configuração padrão em `/etc/freebsd-update.conf` tenha sido alterada, o `freebsd-update` instalará o código fonte atualizado do kernel juntamente com o restante das atualizações. O processo de recompilação e reinstalação de um novo kernel personalizado poderá ser executado da maneira usual.

As atualizações distribuídas pelo `freebsd-update` nem sempre envolvem o kernel. Não é necessário recompilar um kernel personalizado se o código fonte do kernel não tiverem sido modificado pelo `freebsd-update install`. No entanto, o `freebsd-update` sempre atualizará o `/usr/src/sys/conf/newvers.sh`. O nível de patch atual, conforme indicado pelo número `-p` relatado pelo `uname -r`, é obtido desse arquivo. Recompilar um kernel personalizado, mesmo que nada mais tenha sido alterado, permite que o `uname` relate com precisão o nível de patch atual do sistema. Isso é particularmente útil ao manter vários sistemas, pois permite uma avaliação rápida das atualizações instaladas em cada um deles.

### 23.2.3. Realizando Upgrades de Versão Principais e Menores

Atualizações de uma versão menor do FreeBSD para outra, como do FreeBSD 9.0 para o FreeBSD 9.1, são chamadas de upgrades de versão menor. Atualizações de versões principais ocorrem quando o FreeBSD é atualizado de uma versão principal para outra, como do FreeBSD 9.X para o FreeBSD 10.X. Ambos os tipos de atualizações podem ser executados fornecendo um target de versão de release para o `freebsd-update` .

### Nota:

Se o sistema estiver executando um kernel personalizado, certifique-se de que uma cópia do kernel `GENERIC` exista em `/boot/GENERIC` antes de iniciar o upgrade. Consulte Seção 23.2.3.1, “Kernels personalizados com o FreeBSD 9.X e posteriores” para obter instruções sobre como obter uma cópia do kernel `GENERIC`.

O seguinte comando, quando executado em um sistema FreeBSD 9.0, irá atualizá-lo para o FreeBSD 9.1:

    # freebsd-update -r 9.1-RELEASE upgrade

Depois que o comando for recebido, o `freebsd-update` avaliará o arquivo de configuração e o sistema atual na tentativa de reunir as informações necessárias para executar a atualização. Uma listagem de tela exibirá quais componentes foram e quais não foram detectados. Por exemplo:

    Looking up update.FreeBSD.org mirrors... 1 mirrors found.
    Fetching metadata signature for 9.0-RELEASE from update1.FreeBSD.org... done.
    Fetching metadata index... done.
    Inspecting system... done.

    The following components of FreeBSD seem to be installed:
    kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
    src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
    src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
    world/base world/info world/lib32 world/manpages

    The following components of FreeBSD do not seem to be installed:
    kernel/generic world/catpages world/dict world/doc world/games
    world/proflibs

    Does this look reasonable (y/n)? y

Neste ponto, o `freebsd-update` tentará baixar todos os arquivos necessários para a atualização. Em alguns casos, o usuário pode ser questionado sobre o que instalar ou como proceder.

Ao usar um kernel personalizado, a etapa acima produzirá um aviso semelhante ao seguinte:

    WARNING: This system is running a "MYKERNEL" kernel, which is not a
    kernel configuration distributed as part of FreeBSD 9.0-RELEASE.
    This kernel will not be updated: you MUST update the kernel manually
    before running "/usr/sbin/freebsd-update install"

Este aviso pode ser ignorado com segurança neste momento. O kernel `GENERIC` atualizado será usado como uma etapa intermediária no processo de atualização.

Depois que todos os patches tiverem sido baixados para o sistema local, eles serão aplicados. Esse processo pode demorar um pouco, dependendo da velocidade e da carga de trabalho da máquina. Os arquivos de configuração serão então mesclados. O processo de mesclagem requer alguma intervenção do usuário, pois um arquivo pode ser mesclado ou um editor pode aparecer na tela para uma mesclagem manual. Os resultados de cada mesclagem bem-sucedida serão mostrados para o usuário enquanto o processo continua. Um merge falho ou ignorado fará com que o processo seja abortado. Os usuários podem desejar fazer um backup de `/etc` e mesclar manualmente os arquivos importantes, como o `master.passwd` ou o `group` posteriormente.

### Nota:

O sistema não está sendo alterado, já que todos os patches e merges estão acontecendo em outro diretório. Uma vez que todas as correções tenham sido aplicadas com sucesso, e todos os arquivos de configuração foram mesclados e tudo indicar que o processo ocorrerá sem problemas, as alterações poderão ser confirmadas pelo usuário usando o seguinte comando:

    # freebsd-update install

O kernel e os módulos do kernel serão atualizados primeiro. Se o sistema estiver sendo executado com um kernel personalizado, use o nextboot(8) para definir que o kernel para a próxima inicialização será o `/boot/GENERIC`:

    # nextboot -k GENERIC

### Atenção:

Antes de reinicializar com o kernel `GENERIC`, verifique se ele contém todos os drivers necessários para o sistema inicializar corretamente e se conectar à rede, se a máquina que está sendo atualizada for acessada remotamente. Em particular, se o kernel customizado em execução contiver funcionalidades internas normalmente fornecidas pelos módulos do kernel, certifique-se de carregar temporariamente estes módulos no kernel `GENERIC` usando o `/boot/loader.conf`. Recomenda-se desabilitar os serviços não essenciais, bem como todas as montagens de disco e de rede, até que o processo de atualização seja concluído.

A máquina agora deve ser reiniciada com o kernel atualizado:

    # shutdown -r now

Quando o sistema estiver on-line, reinicie o `freebsd-update` usando o comando a seguir. Como o estado do processo foi salvo, o `freebsd-update` não será iniciado desde o início, mas passará para a próxima fase e removerá todas as bibliotecas compartilhadas e os arquivos de objetos antigos.

    # freebsd-update install

### Nota:

Dependendo se os números de versão de uma biblioteca foram incrementados ou não, pode haver apenas duas fases de instalação em vez de três.

A atualização está completa agora. Se esta for uma atualização de versão principal, reinstale todas os ports e pacotes conforme descrito em Seção 23.2.3.2, “Atualizando pacotes após atualizar para uma versão principal (Major Release)”.

#### 23.2.3.1. Kernels personalizados com o FreeBSD 9.X e posteriores

Antes de usar o `freebsd-update`, assegure-se de que uma cópia do kernel `GENERIC` exista em `/boot/GENERIC`. Se um kernel personalizado foi compilado apenas uma vez, o kernel em `/boot/kernel.old` é o kernel `GENERIC`. Simplesmente renomeie este diretório para `/boot/kernel`.

Se um kernel personalizado foi compilado mais de uma vez ou se é desconhecido quantas vezes o kernel personalizado foi compilado, obtenha uma cópia do kernel `GENERIC` que corresponda à versão atual do sistema operacional. Se o acesso físico ao sistema estiver disponível, uma cópia do kernel `GENERIC` pode ser instalada a partir da mídia de instalação:

    # mount /cdrom
    # cd /cdrom/usr/freebsd-dist
    # tar -C/ -xvf kernel.txz boot/kernel/kernel

Como alternativa, o kernel `GENERIC` pode ser recriado e instalado a partir da do código fonte:

    # cd /usr/src
    # make kernel __MAKE_CONF=/dev/null SRCCONF=/dev/null

Para que este kernel seja identificado como o kernel `GENERIC` pelo `freebsd-update`, o arquivo de configuração `GENERIC` não deve ter sido modificado de forma alguma. Também é sugerido que o kernel seja compilado sem outras opções especiais.

A reinicialização no kernel `GENERIC` não é necessária, pois o `freebsd-update` só precisa que o `/boot/GENERIC` exista.

#### 23.2.3.2. Atualizando pacotes após atualizar para uma versão principal (Major Release)

Geralmente, os aplicativos instalados continuarão funcionando sem problemas após atualizações de versões menores. As versões principais usam diferentes interfaces binárias de aplicativos (ABIs), que quebram a maioria dos aplicativos de terceiros. Após uma atualização de versão principal, todos os pacotes e ports instalados precisam ser atualizados. Pacotes podem ser atualizados usando `pkg upgrade`. Para atualizar os ports instalados, use um utilitário como o ports-mgmt/portmaster.

Uma atualização forçada de todos os pacotes instalados substituirá os pacotes por novas versões a partir do repositório, mesmo que o número da versão não tenha aumentado. Isso é necessário por causa da alteração da versão do ABI que ocorre ao atualizar entre versões principais do FreeBSD. A atualização forçada pode ser realizada executando:

    # pkg-static upgrade -f

Uma recompilação de todos os aplicativos instalados pode ser realizada com este comando:

    # portmaster -af

Este comando exibirá as telas de configuração de cada aplicativo que possui opções configuráveis ​​e aguardará que o usuário interaja com estas telas. Para evitar esse comportamento e usar apenas as opções padrões, inclua `-G` no comando acima.

Quando as atualizações de software estiverem concluídas, conclua o processo de atualização com uma chamada final para o `freebsd-update` para amarrar todas as pontas soltas no processo de atualização:

    # freebsd-update install

Se o kernel `GENERIC` foi usado temporariamente, este é o momento de construir e instalar um novo kernel personalizado usando as instruções do Capítulo 8, Configurando o kernel do FreeBSD.

Reinicialize a máquina na nova versão do FreeBSD. O processo de atualização está concluído agora.

### 23.2.4. Comparação do estado do sistema

O estado da versão instalada do FreeBSD em relação a uma boa cópia conhecida pode ser testado usando o `freebsd-update IDS`. Este comando avalia a versão atual dos utilitários do sistema, bibliotecas e arquivos de configuração e pode ser usado como um Sistema de Detecção de Intrusão embutido (IDS).

### Atenção:

Este comando não é um substituto para um IDS real como o security/snort. Como o `freebsd-update` armazena dados no disco, a possibilidade de adulteração é evidente. Embora esta possibilidade possa ser reduzida usando o `kern.securelevel` e armazenando os dados do `freebsd-update` em um sistema de arquivos read-only quando não estiver em uso, uma solução melhor seria comparar o sistema com um disco seguro, como um DVD ou dispositivo de disco externo USB armazenado em segurança. Um método alternativo para fornecer a funcionalidade de IDS usando um utilitário interno é descrito em Seção 13.2.6, “Verificação Binária”

Para começar a comparação, especifique um arquivo de saída para salvar os resultados:

    # freebsd-update IDS >> outfile.ids

O sistema agora será inspecionado e uma longa lista de arquivos, junto com os valores de hash SHA256 tanto para o valor conhecido na release e como na instalação atual, será enviada para o arquivo de saída especificado.

As entradas na listagem são extremamente longas, mas o formato de saída pode ser facilmente analisado. Por exemplo, para obter uma lista de todos os arquivos que diferem daqueles na release, execute o seguinte comando:

    # cat outfile.ids | awk '{ print $1 }' | more
    /etc/master.passwd
    /etc/motd
    /etc/passwd
    /etc/pf.conf

Este exemplo de saída foi truncado, pois existem muito mais arquivos. Alguns arquivos possuem modificações naturais. Por exemplo, o `/etc/passwd` será modificado se usuários tiverem sido adicionados ao sistema. Módulos de kernel podem diferir pois o `freebsd-update` pode tê-los atualizado. Para excluir arquivos ou diretórios específicos, adicione-os à opção `IDSIgnorePaths` em `/etc/freebsd-update.conf`.

Anterior | Acima | Próxima
Capítulo 23. Atualização e Upgrade do FreeBSD | Principal | 23.3. Atualizando o Conjunto de Documentação

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.