Arquivo

Archive for julho \13\+00:00 2011

Atualização de sistemas FreeBSD

julho 13, 2011 6 comentários

Introdução

FreeBSD é um projeto que está sempre em constante desenvolvimento e torna-se necessário atualizar o seu sistema para garantir. Aqui vou mostrar como atualizar um sistema inicialmente com a versão 8.1 – RELEASE para um versão 8.2 – RELEASE, que no momento, é a mais nova. Existem outros métodos de instalação, mas o que será abordado aqui é usando o CVS, ou seja, vamos baixar o código fonte do sistema.

É muito importante saber que embora você pode atualizar os sources certas partes do sistema é aconselhável atualizar a árvore inteira juntamente com os sources do kernel para não gerar inconsistências no sistema, como um kernel panic, por exemplo. Então devemos sempre atualizar a userland e o kernel. Essa é uma das coisas mais bacanas do FreeBSD, o sistema é bem organizado e dividido na userland e kernel, entenda a userland como os programas que geralmente estamos executando: ls, cp, rm e por ai vai.

Vamos baixar os sources do sistema utilizando CVS, que um sistema muito utilizado em projetos de software livre para que os desenvolvedores espalhados pelo globo possam trabalhar em conjunto de uma maneira bastante organizada.

Utilizando o CVSup

O CVSup é controlado pelo arquivo de configuração chamado supfile que você pode encontrar em /usr/share/examples/cvsup, esse é um arquivo muito bem documentado e você deveria pelo menos dar uma lida nesse arquivo para entender melhor o seu funcionamento. Nesse arquivo podemos definir quais arquivos queremos baixar, quais versões, onde buscar esses arquivos(mirrors), para onde esses arquivos vão no seu sistema, etc etc.

[root@capeta ~]# cd /usr/share/examples/cvsup/

[root@capeta /usr/share/examples/cvsup]# cp stable-supfile /root/supfile [root@capeta /usr/share/examples/cvsup]# vi stable-supfile /root/supfile

Vamos ver o conteúdo desse arquivo sem os comentários para não ficar muito grande:

*default host=CHANGE_THIS.FreeBSD.org *default base=/var/db *default prefix=/usr *default release=cvs tag=RELENG_8 *default delete use-rel-suffix *default compress src-all

Explicando cada parâmetro

Aqui dizemos onde buscar o source, você pode ver os mirrors em http://www.freebsd.org/doc/handbook/cvsup.html#CVSUP-MIRRORS

*default host=CHANGE_THIS.FreeBSD.org 

Aqui dizemos o local onde as informações dos sources serão baixados

*default base=/var/db

Local para onde os sources serão baixados

*default prefix=/usr

Aqui dizemos qual versão do sources do sistema estamos querendo baixar. Veja em http://www.freebsd.org/doc/handbook/cvs-tags.html para ver as tags que você pode usar.

*default release=cvs tag=RELENG_8 *default delete use-rel-suffix

Caso seu processador não aguente a compressão de dados, você pode comentar essa linha, mas em geral não é necessário comentar.

*default compress

Aqui baixamos todos os sources

src-all

Segue abaixo como o nosso arquivo de configuração vai ficar:

*default host=cvsup.br.FreeBSD.org *default base=/var/db *default prefix=/usr *default release=cvs tag=RELENG_8_2 #Essa é a tag para a versao 8.2-STABLE *default delete use-rel-suffix *default compress src-all

Baixando os arquivos

No próprio arquivo de configuração do supfile vem dizendo como fazer o download usando o cvsup, caso você não tenha instalado o cvsup, faça o seguinte comando:

[root@capeta ~]# pkg_add -r cvsup-without-gui

e agora podemos fazer o download

[root@capeta ~]# cvsup -g -L 2 stable-supfile

Com esse comando, o CVS vai fazer o checkout de todos os sources, agora é só esperar porque o processo pode ser demorado, tudo vai depender da sua conexão. No final do download vai aparecer uma mensagem assim:

Shutting down connection to server Finished successfully

Construindo a base do sistema

Uma vez que você sincronizou a árvore do sistema com o CVS, vamos usar essas fontes para construir a base do nosso sistema, atente-se pelo fato que construir não significa instalar, vamos apenas compilar o código fonte baixado do CVS. É importante ver o arquivo /usr/src/UPDATING, lá consta possíveis problemas que você pode ter ao atualizar o seu sistema e como resolver o possível erro que possa ocorrer, mas no geral quase não tem nada pra fazer, é apenas uma boa prática você olhar esse arquivo. Pois bem, vamos construir nosso sistema executando o seguinte comando dentro do /usr/src:

[root@capeta ~]# cd /usr/src/ [root@capeta /usr/src]# make buildworld

Esse também é um procedimento que vai levar um bom tempo compilando os sources que baixamos através do CVS, novamente, tudo vai depender do hardware que vocês está usando. Mas o que faz o buildworld? O buildworld primeiro vai compilar o novo compilador e algumas outras ferramentas necessárias para fazer a compilação. De posse desse novo compilador, este será utilizado para compilar o restante dos sources, guardando o resultado em /usr/obj. Após tanto aguardar o “mundo” ser compilado, você vai receber uma resposta como essa:

————————————————————–

>>> World build completed on Tue Jul 12 22:55:20 UTC 2011

————————————————————–

[root@capeta /usr/src]#

O que significa que tudo ocorreu bem durante a compilação.

Construindo e compilando o kernel

Como vamos fazer a atualização inteira do sistema, precisamos também recompilar o kernel, isso torna-se necessário para evitar inconsistências no seu sistema, como o buildworld compila um novo compilador, precisamos utilizar esse novo compilador para construir e instalar o kernel. Essa é uma das partes mais delicadas envolvendo todo o processo que estamos fazendo, já pensou o que poderia acontecer se você instalasse o source que acabamos de compilar e reiniciássemos o sistema e ver que os sources instalados dependem de alguma instrução que precisava estar no kernel? Nada agradável.

 Vamos construir o kernel agora, se você já tem alguma experiência nessa parte, não utilize o método antigo de compilação usando config e make, pois desse jeito você estará utilizando o compilador antigo, o que não queremos, utilize a nova forma de compilação, pois esta utiliza o compilador novo, que reside em /usr/obj. Como não estamos compilando o kernel devido a alguma customização em particular, não vamos nos ater a cerca das opções possíveis e impossíveis, isso é assunto para um outro artigo. Vamos utilizar o kernel GENERIC, que já é o kernel padrão do FreeBSD, mas antes disso faça um backup com o comando:

[root@capeta ~]# cd /boot/ [root@capeta /boot]# mkdir backup [root@capeta /boot]# cp -rpv kernel/ backup/

Isso é para o casa de algo errado acontecer durante o boot do novo kernel e você ficar sem outro kernel que funciona na sua máquina, vamos ver mais adiante como recuperar o kernel em caso de falha. Finalmente vamos compilar o kernel GENERIC.

[root@capeta ~]# cd /usr/src/ [root@capeta /usr/src]# make buildkernel KERNCONF=GENERIC

Com isso, temos o seguinte resultado:

————————————————————– >>> Kernel build for GENERIC completed on Tue Jul 12 23:48:05 UTC 2011 ————————————————————– 

Agora só falta instalar o kernel com o seguinte comando:

[root@capeta /usr/src]# make installkernel KERNCONF=GENERIC

Atualização do /etc

Esse diretório contém muitas configurações importantes para inicialização do sistema, os famosos scripts de inicialização e alguns outros arquivos importantes. Vamos utilizar um script chamado mergemaster, que faz uma varredura no seu /etc e mostra a diferença do /etc que foi baixado pelo CVS em um formato do comando diff. Nesse formato será mostrado um sinal de ‘+’ sinalizando o que vai ser adicionado ao arquivo e um sinal de ‘-‘ sinalizando o que vai ser removido do arquivo, geralmente muda pouca coisa, apenas o cabeçalho do arquivo indicando uma nova data. Ao mostrar essa saída, o mergemaster pergunta o que queremos fazer com arquivo, veja o destaque em vermelho.

[root@capeta /usr/src]# mergemaster -p   *** Creating the temporary root environment in /var/tmp/temproot *** /var/tmp/temproot ready for use *** Creating and populating directory structure in /var/tmp/temproot   *** Beginning comparison   ======================================================================   *** Displaying differences between ./etc/group and installed version:   — /etc/group 2011-07-09 18:36:19.000000000 +0000 +++ ./etc/group 2010-12-21 17:09:25.000000000 +0000 @@ -1,6 +1,6 @@ -# $FreeBSD: src/etc/group,v 1.35.10.1.4.1 2010/06/14 02:09:06 kensmith Exp $ +# $FreeBSD: src/etc/group,v 1.35.10.1.6.1 2010/12/21 17:09:25 kensmith Exp $ # -wheel:*:0:root,airton +wheel:*:0:root daemon:*:1: kmem:*:2: sys:*:3: @@ -29,5 +29,3 @@ www:*:80: nogroup:*:65533: nobody:*:65534: -airton:*:1001: -squid:*:100:   Use ‘d’ to delete the temporary ./etc/group Mantém o arquivo antigo Use ‘i’ to install the temporary ./etc/group Instala o novo arquivo Use ‘m’ to merge the temporary and installed versions junta o antigo com o novo Use ‘v’ to view the diff results again deixar pra visualizar depois   Default is to leave the temporary file to deal with by hand   How should I deal with this? [Leave it for later]d aqui eu resolvi manter esse arquivo, porque ele iria retirar o meu usuario squid e airton, o que não seria interessante pra mim, visto que esse servidor é um proxy cache e provavelmente eu teria problemas no futuro com a exclusão desses usuários.

Vão ter outras perguntas, apenas mostrei aqui um exemplo de como acontece o funcionamento . No final de todo o processo  vai aparecer a seguinte mensagem.

Vamos discutir um pouco sobre outra característica bacana do FreeBSD, digamos que você tenha um servidor em produção, Squid, que obviamente tem seus arquivos de configurações, e você poderia pensar que ao usar o mergemaster algum arquivo de configuração poderia ser alterado, mas é então que entra a parte interessante, visto que toda aplicação instalada por você coloca seus arquivos de configuração dentro do path /usr/local/etc, ou seja, a organização do sistema faz com que isso aconteça e você não tenha que se preocupar quando utilizar o mergemaster, a não ser que você tenha alterado algum serviço que já vem por padrão no sistema, como o SSH, que aí sim os arquivos de configuração do SSH vão residir em /etc, mas no geral são poucos arquivos de configuração que já vem por padrão no sistema que você deve se preocupar. 

Agora estamos prontos para fazer um reboot e entrar no sistema como single-user, faça o seguinte comando para reiniciar:

[root@capeta /usr/src]# shutdown -r now

Instalação do “mundo” em modo single-user

Durante a inicialização do sistema vai aparecer o boot-menu com várias opções, escolha a opção 4 para entrar no modo single-user. Então ele vai fazer uma inicialização básica e vai perguntar o path do shell que você quer utilizar, apenas tecle ENTER para usar o shell padrão fornecido por ele, que é o /bin/sh, e faça os seguintes comandos:

Montando todos os FileSystems listados em /etc/fstab

# mount -a

Entrando em /usr/src

# cd /usr/src

Instalando os sources

# make installworld

Reiniciando a máquina

# reboot

Limpando o seu sistema após a atualização

Nesse momento o seu sistema já estará atualizado, agora vamos fazer a limpeza que foi gerada pelo processo de compilação dos sources, faça os seguintes comandos:

# cd /usr/obj

# chflags -R noschg *

# rm -rf *

Restaurando um kernel em caso de problemas

Conforme fizemos anteriormente, vamos ver como restaurar o kernel original do sistema. Faça um reboot da sua máquina e entre na opção 6(Escape to loader prompt) do boot-menu, então você vai entrar em um prompt com a seguinte linha:

Ok

É só isso, o prompt é um OK e tem algums opções úteis que podemos ver com o comando help ou uma interrogação(?), para dar o boot com o kernel antigo que está em /boot/backup/kernel faça o seguinte comando:

Okboot /boot/backup/kernel

e então o seu kernel original será utilizado.


Categorias:Uncategorized