21.4. Usando o make world

Uma vez sincronizados os fontes locais com uma versão particular do FreeBSD (FreeBSD-STABLE, FreeBSD-CURRENT, e assim por diante) você pode usar a árvore dos fontes para reconstruir o sistema.

Tire uma Cópia de Segurança:Nunca é demais falar como é importante tirar uma cópia de segurança do seu sistema antes de fazer isso. Enquanto que reconstruir tudo é (se você seguir estas instruções) uma tarefa fácil, inevitavelmente existirão ocasiões em que você cometerá erros, ou quando erros cometidos por outros na árvore dos fontes fazendo com que seu sistema não inicialize.

Tenha certeza de que você tirou uma cópia de segurança. E tenha um disquete de boot em mãos. Você provavelmente nunca vai precisar utlizá-lo, mas é melhor previnir do que remediar!

Inscreva-se na Lista de Discussão Certa:O FreeBSD-STABLE e FreeBSD-CURRENT estão, por sua natureza, em desenvolvimento. Pessoas que contribuem com o FreeBSD são humanas, e erros acontecem de vez em quando.

Algumas vezes estes erros podem ser um pouquinho nocivos, apenas fazendo com que seu sistema imprima uma mensagem de diagnóstico de alerta. Ou as mudanças podem ser catastróficas, fazendo com que seu sistema não inicialize mais ou destrua seus sistemas de arquivos (ou pior).

Se acontecerem problemas como estes, uma ``nota'' é postada na lista apropriada, explicando a natureza do problema e quais sistemas são afetados por ele. E um anúncio ``tudo limpo'' é postado quando o problema foi solucionado.

Se você tentar acompanhar o FreeBSD-STABLE ou o FreeBSD-CURRENT e não ler a lista de discussão FreeBSD-STABLE ou a lista de discussão FreeBSD-CURRENT respectivamente, então você está caçando problemas.

21.4.1. Leia o Arquivo /usr/src/UPDATING

Antes de fazer qualquer coisa, leia o arquivo /usr/src/UPDATING (ou o arquivo equivalente sempre que você possuir uma cópia dos códigos fontes). Este arquivo pode conter informações importantes a respeito de problemas que você pode encontrar, ou especifica a ordem na qual você deve executar certos comandos. Se o arquivo UPDATING contradizer algo que você ler aqui, ele tem precedencia.

Importante: Ler o UPDATING não substituí a inscrição e acompanhamento da lista de discussão correta, como mencionado anteriormente. Os dois requisitos são complementares, não exclusivos.

21.4.2. Verifique o /etc/make.conf

Examine os arquivos /etc/defaults/make.conf e /etc/make.conf. O primeiro contém algumas definições padrões - muitas comentadas. Para fazer uso delas quando você reconstruir seu sistema dos fontes, adicione-as ao arquivo /etc/make.conf. Tenha em mente que qualquer coisa que você adicione ao arquivo /etc/make.conf também é usado sempre que você executar o comando make, então é uma boa idéia configurá-lo para alguma coisa sensível para seu sistema.

Um usuário típico provavelmente copiará as linhas CFLAGS e NOPROFILE encontradas em /etc/defaults/make.conf para /etc/make.conf e removerá seus comentários.

Examine outras definições (COPTFLAGS, NOPORTDOCS e assim por diante) e decida se elas são relevantes para você.

21.4.3. Atualize os Arquivos em /etc

O diretório /etc contém grande parte da informação de configuração do seu sistema, assim como scripts que são executados na inicialização do sistema. Alguns destes scripts mudam de versão para versão do FreeBSD.

Alguns dos arquivos de configuração também são usados diariamente na execução do sistema. Particularmente, o /etc/group.

Existiram ocasiões em que algumas partes da instalação do ``make world'' esperava encontrar certos nomes de usuários ou grupos no sistema. Ao fazer uma atualização é bem provável que estes usuários ou grupos não existissem. Isto causava problemas na atualização.

Um exemplo recente foi quando o usuário smmsp foi adicionado. Os usuários tiveram falhas no processo de instalação quando o mtree(8) tentava criar o arquivo /var/spool/clientmqueue.

A solução é examinar o arquivo /usr/src/etc/group e comparar com o seu arquivo de grupos. Se existirem grupos no arquivo novo que não existirem no seu então copie-os. Similarmente, você deve renomear quaisquer grupos no /etc/group que possuirem o mesmo GID mas um nome diferente dos que estão em /usr/src/etc/group.

Desde o 4.6-RELEASE você pode executar o mergemaster(8) antes da construção do sistema com a opção -p. Isto comparará apenas aqueles arquivos que são essenciais para o sucesso do buildworld ou installworld. Se a sua versão antiga do mergemasger não suportar a opção -p, use a versão mais nova na árvore dos fontes ao executá-lo pela primeira vez:

# cd /usr/src/usr.sbin/mergemaster
# ./mergemaster.sh -p

Dica: Se você está se sentindo particularmente paranóico, você pode checar seu sistema para ver quais arquivos foram possuidos pelo grupo que você está renomeando ou apagando:

# find / -group GID -print

mostrará tdos os arquivos pertencidos pelo grupo GID (que pode ser um nome de grupo ou um ID numérico de grupo).

21.4.4. Vá para o Modo Mono Usuário

Você pode querer compilar o sistema no modo mono usuário. Sem mencionar o benefício óbvio de fazer com que as coisas andem mais rápido, a reinstalação do sistema tocará em vários arquivos de sistema importantes, todos os binários padrão de sistema, bibliotecas, arquivos de inclusão e assim por diante. Modificá-los com o sistema no ar (particularmente se você possuir usuários ativos neste período) é caçar problema.

Outro método é compilar o sistema em modo multi-usuário, e então ir para o modo mono usuário para a instalação. Se você quer fazer desta maneira, simplesmente siga os passos a seguir até que a construção do sistema tenha sido completada. Você pode deixar para ir para o modo mono usuário em uma outra hora até que você tenha que fazer o installkernel ou o installworld.

Como super usuário, você pode executar:

# shutdown now

de um sistema em execução, que irá para o modo mono usuário.

Alternativamente, reinicialize o sistema, e na linha de comando, entre com a opção -s. O sistema iniciará em modo mono usuário. Na linha de comando execute:

# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a

Isto verifica todos os sistemas de arquivo, remonta o / para leitura/escrita, monta todos os outros sistemas de arquivo UFS referenciados em /etc/fstab e liga o swap.

Nota: Se o seu relógio de CMOS está configurado para a hora local e não para GMT (isto é verdadeiro se a saída do comando date(1) não mostrar a zona e a hora corretamente), você pode ter que executar o seguinte comando:

# adjkerntz -i

Isto ceritificará que as suas configurações locais de zona/tempo sejam configuradas corretamente -- sem isto, você pode ter alguns problemas mais tarde.

21.4.5. Remova o /usr/obj

Na medida em que partes do sistema vão sendo reconstruidas são colocadas em diretórios que (por padrão) estão abaixo de /usr/obj. A sombra daqueles que estão em /usr/src.

Você pode acelerar o processo do ``make world'', e possívelmente evitar algumas dores de cabeça de dependência removendo este diretório.

Alguns arquivos abaixo de /usr/obj podem ter a opção imutável configurada (veja chflags(1) para mais informações) que deve ser removida antes.

# cd /usr/obj
# chflags -R noschg *
# rm -rf *

21.4.6. Recompile o Fonte

21.4.6.1. Gravando a Saída

É uma boa idéia gravar a saída que você tem do comando make(1) em outro arquivo. Se alguma coisa der errado você terá uma cópia da mensagem de erro. Enquanto isto não possa te ajudar a diagnosticar o que deu errado, pode ajudar outros se você postar seu problema em uma das listas de discussão do FreeBSD.

A maneira mais fácil de fazer isso é usar o comando script(1), com um parâmetro que especifica o nome do arquivo onde toda a saída será gravada. Você pode fazer isto imediatamente antes de reconstruir todo o sistema, e então digitar exit quando o processo terminar.

# script /var/tmp/mw.out
Script started, output file is /var/tmp/mw.out   
# make TARGET
... compile, compile, compile ...     
# exit
Script done, ...

Se você fizer isto, não grave a saída no diretório /tmp/. Este diretório pode ser apagado na próxima vez que você reinicializar o sistema. Um lugar melhor para gravar é /var/tmp/ (como no exemplo anterior) ou no diretório inicial do root.

21.4.6.2. Compilando a Base do Sistema

Você deve estar no diretório: /usr/src

# cd /usr/src

(a não ser que, claro, seu código fonte esteja em outro lugar, neste caso vá para este diretório).

Para reconstruir todo o seu sistema use o comando make(1) Este comando lê as instruções do arquivo Makefile, que descreve como os programas que compõem o FreeBSD devem ser recompilados, a ordem em que isto deve acontecer, e assim por diante.

O formato geral da linha de comando que você digitará é a seguinte:

# make -x -DVARIABLE target

Neste exemplo, -x é a opção que você deve passar para o make(1). Veja a página de manual do make(1) para exemplos de opções que você pode passar.

-DVARIABLE passa uma variável para o Makefile. O comportamento do Makefile é controlado por estas variáveis. Estas são as mesmas variáveis configuradas no /etc/make.conf, e isto é um outro modo de configurá-las.

# make -DNOPROFILE target

é outra maneira de especificar bibliotecas que não devem ser compiladas, e é o mesmo que a linha

NOPROFILE=    true     #    Avoid compiling profiled libraries

no arquivo /etc/make.conf.

target diz ao make(1) o que você quer fazer. Cada Makefile define um número diferente de ``targets'', e a sua escolha determina o que acontece.

Alguns ``targets'' são listados no arquivo Makefile, mas não foram feitos para que você os execute. Eles são usados pelo processo de compilação nos passos necessários para recompilar o sistema em vários sub passos.

Na maioria das vezes você não vai precisar passar qualquer parâmetro para o make(1), então sua linha de comando deve ficar parecida com:

# make target

Desde a versão 2.2.5 do FreeBSD (na verdade, primeiro foi criado na árvore FreeBSD-CURRENT, e depois reintroduzida no FreeBSD-STABLE entre a 2.2.2 e 2.2.5) o ``target'' world foi dividido em dois: buildworld e installworld.

Como implicam os nomes, buildworld compila uma nova árvore debaixo de /usr/obj, e installworld instala esta árvore na máquina.

Isto é muito útil por duas razões. Primeiro, permite que você faça uma recompilação segura, sabendo que os componentes do sistema que estão em execução não serão afetados. A compilação é ``self hosted''. Por causa disso, você pode seguramente executar o buildworld em uma máquina em execução em modo multi usuário sem medo de efeitos colaterais. Entretanto, ainda é recomendável que você execute o installworld em modo mono usuário.

Segundo, permite que você use NFS para atulizar multiplas máquinas na sua rede. Se você possui três máquinas, A, B e C que você querer atualizar, execute o make buildworld e make installworld no A. B e B e C devem montar através de NFS o /usr/src e /usr/obj do A, e então você pode executar o make installworld para instalar o resultado da compilação nas máquinas B e C.

Embora o target world ainda exista, você é fortemente encorajado a não usá-lo.

Execute

# make buildworld

Agora é possível especificar a opção -j para o make, que fará com que ele gere vários processos simultâneos. Isto é mais útil em máquinas com multiplas CPUs. Entretanto, uma vez que muito do processo de compilação utiliza mais IO do que CPU, isto também é útil em máquinas com apenas um processador.

Em uma máquina típica de uma CPU você deve executar:

# make -j4 buildworld

make(1) terá 4 processos rodando ao mesmo tempo. Evidências empíricas postadas nas listas de discussão mostram que isto resulta em benefícios de melhora de performance.

Se você tem uma máquina com vários procesadores e está usando um um kernel configurado para SMP, tente valores entre 6 e 10 e veja como eles aumentam a velocidade.

Saiba que isto é um tanto quando experimental, e envio de novos códigos para a árvore de fontes pode causar um não funcionamento desta característica. Se a compilação do sistema falhar ao usar este parâmetro tente novamente sem ele antes de reportar problemas.

21.4.6.3. Tempos

Muitos fatores influenciam no tempo de compilação, mas atualmente um Pentium® III com 128 MB de RAM leva aproximadamente duas horas para compilar a árvore FreeBSD-STABLE, sem o uso de atalhos ou truques durante o processo. Uma árvore do FreeBSD-CURRENT levará um pouco mais de tempo.

21.4.7. Compile e Instale um Novo Kernel

Para aproveitar ao máximo seu novo sistema você deve recompilar o kernel. Isto é praticamente uma necessidade, uma vez que certas estruturas de memórias mudaram, e programas como o ps(1) e top(1) não funcionarão até que as versões do kernel e dos fontes sejam as mesmas.

A maneira mais simples e segura de fazer isto é recompilar e instalar o kernel baseado no arquivo GENERIC. Enquanto o GENERIC não contém todos os dispositivos necessários para o seu sistema, ele deve conter tudo que for necessário para inicializar de volta seu sistema em modo mono usuário. Isto é um bom teste para ver se o sistema funciona corretamente. Após inicializar a partir do GENERIC e verificar que seu sistema funciona então você pode recompilar um novo kernel baseado no seu arquivo de configuração.

Se você está atualizando para o FreeBSD 4.0 ou superior então o procedimento antigo de compilação do kernel (como descrito em Capítulo 9) está defasado. Ao invés desse você deve executar estes comandos depois de ter compilado o sistema com o buildworld..

Nota: Se você quer compilar um kernel customizado e já possuir um arquivo de configuração, apenas use KERNCONF= MYKERNEL desta forma:

# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL

No FreeBSD 4.2 e anteriores você deve substituir KERNCONF= por KERNEL=. 4.2-STABLE anterior a 2 de Fevereiro de 2001 não reconhece KERNCONF=.

Note que, se você subiu o kern.securelevel acima de 1 e configurou o atributo noschg ou similar no seu arquivo binário de kernel, será necessário ir para o modo mono usuário para usar o installkernel . Caso contrário, você deverá ser capaz de executar ambos comandos no modo multi usuário sem problemas. Veja init(8) para detalhes a respeito do kern.securelevel e chflags(1) para detalhes sobre as várias opções de parâmetros de arquivos.

Se você está atualizando para uma versão do FreeBSD inferior à 4.0 você deve usar o procedimento antigo de compilação do kernel. Entretanto, é recomendado que você use a nova versão do config(8), usando uma linha de comando como esta.

# /usr/obj/usr/src/usr.sbin/config/config KERNELNAME

21.4.8. Reinicialize no Modo Mono Usuário

Você deve inicializar no modo monousuário para testar o funcionamento do novo kernel. Faça isto seguindo as instruções desritas em Seção 21.4.4.

21.4.9. Instale os Novos Binários do Sistema

Se você estiver compilando uma versão do FreeBSD recente o bastante para ter usado o make buildworld, então você deve usá-lo o installworld para instalar os novos binários do sistema.

Execute

# cd /usr/src
# make installworld

Nota: Se você especificou variáveis na linha do comando make buildworld, você deve especificar as mesmas variáveis na linha do comando make installworld. Isto não é necessáriamente verdadeiro para algumas opções; por exemplo, a opção -j nunca deve ser usada com o installworld.

Por exemplo, se você executou:

# make -DNOPROFILE buildworld

você deve instalar o resultado com:

# make -DNOPROFILE installworld

senão o sistema tentará instalar bibliotecas que não foram compiladas durante o comando make buildworld .

21.4.10. Atualize os Arquivos não Atualizados pelo make world

Recompilar todo o sistema não atualizará certos diretórios (em particular, /etc, /var e /usr) com arquivos de configuração novos ou modificados.

A maneira mais simples de atualizar estes arquivos é usar o mergemaster(8), embora seja possível fazer isto manualmente se você preferir. Independente da maneira que você escolha, esteja certo de ter uma cópia de segurança do diretório /etc caso algo saia errado.

21.4.10.1. mergemaster

Contribuição de Tom Rhodes.

O utilitário mergemaster(8) é um script Bourne que ajudará você a determinar as diferenças entre seus arquivos de configuração em /etc, e os arquivos de configuração na árvore dos fontes em /usr/src/etc . Esta é a solução recomendada para manter os arquivos de configuração do sistema atualizados com os que estão na árvore dos fontes.

O mergemaster foi integrado ao sistema base do FreeBSD entre o 3.3-RELEASE e 3.4-RELEASE, o que significa que estava presente em todos os -STABLE e -CURRENT deste o 3.3.

Para começar simplesmente digite mergemaster na sua linha de comando e obserse. mergemaster compilará um ambiente temporário de root, a partir de /, e colocará lá vários arquivos de configuração do sistema. Neste ponto, os arquivos diferentes serão mostrados pelo formato do diff(1), com o sinal de + representado linhas adicionadas ou modificadas, e o sinal - representado linhas que foram removidas completamente, ou substituídas por uma nova linha. Veja a página de manual de diff(1) para mais informações sobre a sintaxe do diff(1) e como as diferenças entre os arquivos são mostradas.

mergemaster(8) mostrará a você cada arquivo que possuem diferenças, e neste ponto você terá a opção de apagar o arquivo novo (referenciado como um arquivo temporário), instalar o arquivo temporário em seu estado não modificado, unir o arquivo temporário com o arquivo atualmente instalado, ou visualizar as diferenças geradas pelo diff(1) novamente.

Escolher pela remoção do arquivo temporário instruirá o mergemaster(8) a manter nosso arquivo atual intacto, e apagar a nova versão. Esta opção não é recomendada, a menos que você não veja razões para modificar o arquivo atual. Você pode obter ajuda a qualquer momento digitando ? no prompt do mergemaster(8). Se o usuário quiser pular o arquivo, o mesmo será mostrado novamente depois que todos os arquivos tenham sido tratados.

Optar por instalar o arquivo temporário não modificado substiuirá o arquivo atual com o novo. Para arquivos não modificados, esta é a melhor opção.

Optar por unir os arquivos mostrará um editor de textos, e o conteúdo dos dois arquivos. Você pode uni-los revisando-os lado a lado na tela, escolhendo partes de cada um para obter um produto final. Quando os arquivos são comparados lado a lado, a tecla l selecionará o conteúdo da esquerda e a tecla r da sua direita. A saída final será um arquivo formado por ambas as partes, que pode ser instalado. Esta opção normalmente é usada para arquivos que foram modificados pelo usuário.

Optar por visualizar novamente os resultados do diff(1) lhe mostrará as diferenças assim como o mergemaster(8) fez antes de lhe solicitar uma opção.

Depois de terminar os arquivos de sistema o mergemaster(8) lhe mostrará outras opções. Perguntará se você deseja recompilar o arquivo de senhas e/ou executar o MAKEDEV(8) se você estiver executando o FreeBSD anterior a versão 5.0, e terminará com a opção de remover os arquivos temporários que ficaram para trás.

21.4.10.2. Atualização Manual

Se você deseja atualizar manualmente, você não pode simplesmente sobrescrever os arquivos de /usr/src/etc para /etc e esperar que funcione. Alguns destes arquivos devem ser ``instalados'' primeiro. Isto porque o diretório /usr/src/etc não é uma cópia do que está em seu /etc. Além disso, existem arquivos que podem estar em /etc e não estar em /usr/src/etc.

Se você estiver usando o mergemaster(8) (como recomendado), você pode pular para próxima seção .

A maneira mais simples de fazer isto manualmente é instalar os arquivos em um novo diretório, e trabalhar neles procurando por diferenças.

Faça uma Cópia de Segurança do seu /etcEmbora, teoricamente, nada vá tocar em neste diretório automaticamente, é sempre melhor estar previnido. Então copie seu diretório /etc para um lugar seguro. Algo do tipo:

# cp -Rp /etc /etc.old

A opção -R faz uma cópia recursiva, a opção -p preserva os tempos, propriedades dos arquivos e coisas do tipo.

Você precisa ter alguns diretórios temporários para instalar o novo /etc nestes diretórios. /var/tmp/root é uma boa escolha, e existe vários diretórios necessários abaixo dele.

# mkdir /var/tmp/root
# cd /usr/src/etc
# make DESTDIR=/var/tmp/root distrib-dirs distribution

Isto criará a estrutura de diretórios necessária e instalará os arquivos. Muitos subdiretórios que foram criados abaixo de /var/tmp/root estarão vazios e podem ser apagados. A maneira mais simples de se fazer isto é:

# cd /var/tmp/root
# find -d . -type d | xargs rmdir 2>/dev/null

Isto removerá os diretórios vazios. (O erro padrão é redirecionado para /dev/null para evitar que alertas a respeito de diretórios vazios sejam exibidos.)

/var/tmp/root agora contém todos os arquivos que devem ser colocados em locais apropriados abaixo de /. Você agora deve ir em cada um destes arquivos, determinando como eles diferem dos que estão no seu sistema.

Note que alguns dos arquivos que foram instalados em /var/tmp/root possuem um ``.'' no início. Na hora da escrita os únicos arquivos como estes são arquivos de inicialização de linha de comando em /var/tmp/root/ e /var/tmp/root/root/, embora possam existir outros (dependendo de quando você estiver lendo isto). Use o comando ls -a para pegá-los.

A maneira mais simples de ser fazer isso é usar o diff(1) para comparar dois arquivos:

# diff /etc/shells /var/tmp/root/etc/shells

Isto exibirá as diferenças entre o seu arquivo /etc/shells e o novo /var/tmp/root/etc/shells. Assim você pode decidir por incluir as mudanças que você fez ou substituir seu arquivo antigo.

Nomeie o novo diretório Root (/var/tmp/root) com um Novo Selo de Hora, Assim Você Pode Facilmente Comparar as Diferenças Entre as Versões: Recompilar o sistema frequentemente significa ter que atualizar o /etc frequentemente também, que pode ser uma tarefa um pouco chata.

Você pode acelerar este processo mantendo um cópia do último conjunto de arquivos modificados que você fez a junção em /etc. O seguinte procedimento lhe dá uma idéia de como fazer isto.

  1. Compile o sistema normalmente. Quando você quiser atualizar o /etc e outros diretórios, dê ao diretório de destino um nome baseado na data corrente. Se você estiver fazendo isto em 14 de fevereiro de 1998 você pode fazer o seguinte:

    # mkdir /var/tmp/root-19980214
    # cd /usr/src/etc
    # make DESTDIR=/var/tmp/root-19980214 \
        distrib-dirs distribution
    
  2. Faça a junção destes diretórios como descrito abaixo.

    Não remova o diretório /var/tmp/root-19980214 quando você terminar.

  3. Após ter pego e compilado a última versão dos fontes, siga o passo 1. Isto lhe dará um novo diretório, que poderá ser chamado /var/tmp/root-19980221 (se você esperar uma semana para fazer a atualização).

  4. Agora você pode ver as diferenças que foram feitas usando o diff(1) para criar um arquivo de diferenças recursivamente entre os dois diretórios:

    # cd /var/tmp
    # diff -r root-19980214 root-19980221
    

    Tipicamente, será um conjunto de diferenças bem menor do que as diferenças entre /var/tmp/root-19980221/etc e /etc. Pelo fato das diferenças serem menores, é mais fácil migrar as mudanças no seu diretório /etc.

  5. Agora você pode remover o mais antigo dos dois diretórios /var/tmp/root-*:

    # rm -rf /var/tmp/root-19980214
    
  6. Repita este processo sempre que precisar unir as mudanças para o /etc.

Você pode usar o date(1) para automatizar a geração de nomes de diretórios:

# mkdir /var/tmp/root-`date "+%Y%m%d"`

21.4.11. Atualize o /dev

Nota: Se você estiver executando o FreeBSD 5.0 ou superior você pode pular esta seção. Estas versões usam o devfs(5) para alocar nós de dispositivos transparentemente para o usuário.

Na maioria dos casos, a ferramenta mergemaster(8) saberá quando for necessário atualizar os nós de dispositivo, e se oferecerá para completar automaticamente a tarefa. Estas instruções lhe dirão como atualizar os nós de dispositivo manualmente.

Em nome da segurança, este é um processo passo a passo.

  1. Copie o /var/tmp/root/dev/MAKEDEV para /dev:

    # cp /var/tmp/root/dev/MAKEDEV /dev
    

    Se você usou o mergemaster(8) para atualizar o /etc, então o seu script MAKEDEV já pode ter sido atualizado, embora não custe nada verificar (com diff(1)) e copiá-lo manualmente, se necessário.

  2. Agora, tire uma fotografia do seu /dev atual. Esta foto precisa ter as permissões, donos, números de cada arquivo, mas não pode conter os selos de tempo. A maneira mais fácil de fazer isto é usar o awk(1) para retirar alguma informação:

    # cd /dev
    # ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /var/tmp/dev.out
    
  3. Recompile todos os nós de dispositivo:

    # sh MAKEDEV all
    
  4. Tire outra foto do diretório, desta vez em /var/tmp/dev2.out. Agora olhe estes dois arquivos e procure por nós de dispositivos que você deixou de criar. Não deve ter nenhum, mas é melhor prevenir do que remediar.

    # diff /var/tmp/dev.out /var/tmp/dev2.out
    

    Você está mais sujeito a ver discrepancias de fatias de disco que envolvem comandos como:

    # sh MAKEDEV sd0s1
    

    para recriar as entradas de fatias de disco. As circunstâncias podem variar.

21.4.12. Atualize o /stand

Nota: Este fato é incluído apenas como complemento. Pode ser omitido seguramente. Se você está usando o FreeBSD 5.2 ou superior, o diretório /rescue é automaticamente atualizado para usuário com os binários atuais, compilados estaticamente durante o make installworld , tornando obsoleta a necessidade de atualizar o /stand.

Em nome da finalização, você pode querer atualizar os arquivos em /stand. Estes arquivos consistem em links para o binário /stand/sysinstall. Este binário deve ser ligado estaticamente, para que possa funcionar quando nenhum outro sistema de arquivos (e em particular o /usr) foi montado.

# cd /usr/src/release/sysinstall
# make all install

21.4.13. Reinicializando

Você está pronto. Após ter verificado que tudo parece estar em seu devido lugar você pode reinicializar o sistema. Um simples shutdown(8) fará isto:

# shutdown -r now

21.4.14. Finalizado

Agora você deve ter seu sistema FreeBSD atualizado. Parabéns.

Se as coisas deram um pouco errado, é fácil recompilar uma parte particular do sistema. Por exemplo, se você apagou acidentalmente o /etc/magic como parte da atualização ou junção do /etc , o comando file(1) vai parar de funcionar. Neste caso, o conserto seria executar:

# cd /usr/src/usr.bin/file
# make all install

21.4.15. Questões

21.4.15.1. Eu preciso recompilar o sistema para toda mudança?
21.4.15.2. Minha compilação falhou com muitos signal 11 (ou outro número de sinal). O que aconteceu?
21.4.15.3. Posso remover o /usr/obj quando eu terminar?
21.4.15.4. Compilações interrompidas podem ser continuadas?
21.4.15.5. Como eu posso acelerar a compilação do sistema?
21.4.15.6. O que eu faço se algo der errado?

21.4.15.1. Eu preciso recompilar o sistema para toda mudança?

Não existe resposta fácil para esta, depende da natureza da mudança. Por exemplo, se você apenas executou o CVSup, e a saída foi a atualização dos seguintes arquivos:

src/games/cribbage/instr.c
src/games/sail/pl_main.c
src/release/sysinstall/config.c
src/release/sysinstall/media.c
src/share/mk/bsd.port.mk

provavelmente não merece recompilar todo o sistema. Você pode apenar ir aos subdiretórios apropriados e executar make all install. Mas se algo maior foi modificado, por exemplo src/lib/stdlib, então você deve recompilar todo o sistema ou pelo menos as partes que são estaticamente ligadas (como qualquer coisa que você pode ter adicionado que é ligado estaticamente).

No fim do dia, é por sua conta. Você pode estar feliz em recompilar o sistema toda noite, e deixar as mudanças acumularem por esta noite. Ou você pode querer recompilar apenas aquelas coisas que foram modificadas, e ter certeza de que você pode detectar todas as depedências.

E, é claro, isto tudo depende da freqüência na qual você deseja atualizar, e qual versão você está, FreeBSD-STABLE ou FreeBSD-CURRENT.

21.4.15.2. Minha compilação falhou com muitos signal 11 (ou outro número de sinal). O que aconteceu?

Isto normalmente é um indicativo de problemas de hardware. (Re)compilar o sistema é uma maneira efetiva de testar seu hardware, e frequentemente mostrará problemas de memória. Estes problemas normalmente se manifestarão, com o compilador morrendo misteriosamente na recepção de sinais estranhos.

Um indicador certo disto é que se você pode reinicializar a compilação e ela volta a falhar em um ponto diferente do processo.

Nesta instância pouco você pode fazer, exceto começar a trocar componentes da sua máquina para determinar qual está falhando.

21.4.15.3. Posso remover o /usr/obj quando eu terminar?

A resposta curta é sim.

/usr/obj contém todos os arquivos objeto que foram produzidos durante a fase de compilação. Normalmente, um dos primeiros passos do processo do ``make world'' é remover este diretório e começar do zero. Neste caso, manter o /usr/obj por perto depois de ter acabado faz algum sentido, e vai liberar um bom espaço em disco (atualmente em torno de 340 MB).

Entretanto, se você souber o que está fazendo, você pode fazer com que o ``make world'' pule este passo. Isto fará com que as compilações subsequentes sejam executadas mais rápido, uma vez que a maioria dos fontes não precisarão ser recompilados. O outro lado disso é que problemas subitos de dependência podem ocorrer, fazendo com que sua compilação falhe de maneira estranha. Isto frequentemente gera barulho nas listas de discussão do FreeBSD, quando uma pessoa reclama que sua compilação falhou, sem saber que a causa foi a tentativa de cortar caminho.

21.4.15.4. Compilações interrompidas podem ser continuadas?

Isto depende quão longe você chegou no processo até ter encontrado um problema.

Em geral (e isto não é uma regra rígida) o processo ``make world'' compila novas cópias de ferramentas essenciais (tais como gcc(1) e make(1)) e bibliotecas de sistema. Estas ferramentas e bibliotecas são então instaladas. Elas são usadas para compilarem a si próprias, e são instaladas novamente. Todo o sistema, (agora incluindo programas regulares de usuário, tais como ls(1) ou grep(1)) é então recompilado com os novos arquivos de sistema.

Se você está no último estágio, e você sabe disto (pois você olhou na saída do comando que você está guardando), então você pode (de forma consideravelmente segura) fazer:

... fix the problem ...
# cd /usr/src
# make -DNOCLEAN all

Isto não desfará o trabalho do ``make world'' anterior.

Se você ver a mensagem:

--------------------------------------------------------------
Building everything..
--------------------------------------------------------------

na saída do ``make world'', então provavelmente é seguro fazer isto.

Se você não ver esta mensagem, ou não tiver certeza, então é sempre melhor prevenir do que remediar, e reiniciar a compilação do zero.

21.4.15.5. Como eu posso acelerar a compilação do sistema?

  • Execute em modo mono usuário.

  • Coloque os diretórios /usr/src e /usr/obj em sistemas de arquivos em discos separados. Se possível, coloque estes discos em controladoras separadas.

  • Melhor ainda, coloque estes sistemas de arquivo distribuídos em multiplos discos usando o dispositivo ccd(4) (driver de disco contatenado).

  • Desligue o profiling (set ``NOPROFILE=true'' no /etc/make.conf). É quase certo que você não vá precisar disto.

  • Também no /etc/make.conf, configure CFLAGS para algo como -O -pipe. A otimização -O2 é mais lenta, e a diferença de otimização entre a opção -O e -O2 normalmente não é notada. A opção -pipe faz com que o compilador use pipes ao invés de usar arquivos temporários para comunicação, evitando acessos ao disco (por conta da memória).

  • Passe a opção -jn para o make(1) para executar multiplos processos em paralelo. Isto geralmente ajuda, não importando se sua máquina tem um ou vários processadores.

  • O sistema de arquivos que hospedar o /usr/src pode ser montado (ou desmontado) com a opção noatime. Isto evita que o sistema de arquivos faça gravações durante o acesso à arquivo. Você provavelmente não precisa desta informação.

    # mount -u -o noatime /usr/src
    

    AtençãoEste exemplo assume que /usr/src está em seu próprio sistema de arquivos. Se não estiver (se for parte do /usr, por exemplo) então você não precisará usar este ponto de montagem para este sistema de arquivos.

  • O sistema de arquivos onde /usr/obj estiver pode ser montado (ou remontado) com a opção async. Isto faz com que a escrita em disco aconteça assíncronamente. Em outras palavras, a escrita é completada imediatamente, e os dados são escritos no disco poucos segundos depois. Isto permite que as escritas sejam agupadas, e pode causar um grande ganho de performance.

    AtençãoTenha em mente que esta opção faz com que seu sistema de arquivos fique mais frágil. Com está opção aumentam as chances que, em uma falha de energia, o sistema de arquivos fique em um estado irrecuperável quando a máquina reinicializar.

    Se /usr/obj é o único neste sistema de arquivos então isto não é problema. Se você tem outros dados de valor no mesmo sistema de arquivos, certifique-se que suas cópias de segurança estão recentes antes de habilitar esta opção.

    # mount -u -o async /usr/obj
    

    AtençãoComo acima, se /usr/obj não estiver em seu próprio sistema de arquivos, substitua pelo nome apropriado de ponto de montagem.

21.4.15.6. O que eu faço se algo der errado?

Esteja absolutamente certo de que seu ambiente não experimentou anomalias nas compilações anteriores. Isto é o bastante.

# chflags -R noschg /usr/obj/usr
# rm -rf /usr/obj/usr
# cd /usr/src
# make cleandir
# make cleandir

Sim, o comando make cleandir realmente deve ser executado duas vezes.

Então reinicie todo o processo, começando com o comando make buildworld.

Se você ainda tiver problemas, envie o erro e a saída do comando uname -a para lista de discussão FreeBSD de perguntas genéricas. Esteja preparado para responder perguntas a respeito da sua configuração!

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