Logotipo Dicas-L, por Ricardo Burile
Visite também: Ipok ·  Segurança Linux ·  UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 



 

Programando o Android - 2ª Edição

Instalações Customizadas de Sistemas GNU/Linux


Introdução

Este documento descreve os procedimentos para a criação de sistemas GNU/Linux adaptados a necessidades específicas. É voltado para configurações de hardware pré-definidas de forma a facilitar a sua rápida duplicação, com o mínimo de intervenção por parte do administrador da rede.

O procedimento básico consiste na instalação de um sistema GNU/Linux, qualquer distribuição, configurado e ajustado para a finalidade a que se destina e em seguida gerar um arquivo de backup de todo este sistema. Este arquivo de backup por sua vez é gravado em um CDROM com um sistema GNU/Linux mínimo, por volta de apenas 7 MB, configurado para realizar seu boot diretamente a partir do CDROM, formatar o disco rígido do computador de destino, restaurar o sistema original e realizar os acertos finais.

Descrição Geral

Os procedimentos para a criação destas instalações Linux pré-configuradas foi baseado no documento escrito por Martin L. Purschke, Roll your own Linux Rescue or Setup CD. O objetivo do documento é descrever a criação de um CDROM de recuperação ou setup.

O procedimento é bastante flexível. Como o espaço em um CDROM é bastante grande, nós podemos incluir cerca de 700 MB do que desejarmos. Uma instalação Linux padrão, com toda a funcionalidade básica, ocupa por volta de 2 GB. Esta instalação, compactada, gera um arquivo de aproximadamente 650 a 700 MB, o que é perfeito para o nosso caso.

Em suma, é criado um CDROM bootável com um sistema GNU/Linux mínimo e ainda no CDROM temos uma cópia compactada, gerada com o comando tar, de um sistema GNU/Linux configurado de acordo com nossas necessidades.

Este procedimento é ideal para a instalação rápida em diversos computadores idênticos. O trabalho maior é criar a matriz da instalação. A replicação da instalação é feita de forma praticamente automática, bastando teclar <ENTER> algumas vezes.

O procedimento original, criado por Martin L. Purschke, vai até o ponto em que um prompt é fornecido. A partir daí pode-se realizar qualquer tarefa de manutenção que for necessária. As adaptações que foram feitas neste procedimento consistem em acrescentar dois shell scripts que realizam as seguintes funções:

Guia Rápido de Configuração

Simplificadamente, para se criar um CDROM de recuperação, basta seguir os seguintes passos:

  1. Em um computador com um gravador de CDROM, faça a instalação do sistema L.I.C:
    • Faça o download do sistema L.I.C.
    • Crie uma partição nova em seu sistema ou use uma em que haja cerca de 800 MB disponíveis
    • Faça a expansão do arquivo lic-0.1.tar.gz nesta partição (/work em nosso exemplo):
         # cd /work
         # tar xvzf lic-0.1.tar.gz
         
  2. Faça a instalação do sistema GNU/Linux de sua preferência no computador que terá sua instalação clonada;
  3. Crie a lista dos arquivos que não deseja propagar nas máquinas que serão clonadas:
    • Crie um arquivo chamado exclude no diretório raiz;
    • Tipicamente, este arquivo poderá conter a seguinte informação:
                /tmp/*
                /proc/*
                /home/linux.tar.bz2
              
  4. Com o comando tar, crie um backup do sistema, compactado com o programa bzip2, para maior economia de espaço:
    # tar cvf /home/linux.tar.bz2 -j -X /exclude /
    
  5. Faça a cópia do arquivo de backup criado para a máquina com o dispositivo de gravação de CDs e com os scripts do sistema L.I.C. instalado:
  6. Execute o comando burn, que é distribuído juntamente com o sistema L.I.C., para criar a imagem do CDROM e realizar a gravação:
    #!/bin/bash
    export TOPDIR=/work/lic-0.1
    $TOPDIR/build.sh
    cdrecord dev=0,0,0 -v -eject blank=fast speed=16 bootcd.iso
    

Neste shell é importante que seja definida a variável TOPDIR para o correto funcionamento do script. Altere esta variável para que esteja de acordo com as opções de sistema.

Altere também as variáveis do comando CDRECORD para que estejam em conformidade com a configuração de hardware de seu equipamento.

Para saber mais sobre o comando CDRECORD, consulte os seguintes documentos:

Após terminada a gravação, basta inserir o CDROM no equipamento a ser clonado e responder às perguntas que forem feitas.

Estrutura

Para criar um CDROM bootável, precisamos criar primeiramente a imagem de um disquete, que contenha o kernel do GNU/Linux que dê início ao processo.

Para criar este disquete precisamos:

É importante que se entenda bem a função de cada uma das imagens. São elas: Após a expansão do arquivo tar contendo os templates, teremos a seguinte estrutura (simplificada) de diretórios:

  .
  |-- build.sh                                [1]
  |-- build_with_existing_bootimage.sh
  |-- burn                                    [2]
  |-- lilo.loopfix
  |-- premade_boot.img
  `-- updatebinaries.sh                       [3]
  |-- bootimagetree
  |   |-- boot
  |   |   |-- boot.msg
  |   |   `-- map
  |   |-- dev
  |   |-- etc
  |   |   `-- lilo.conf
  |   |-- initrd.img
  |   `-- vmlinuz
  |-- cdtree                                  [4]
  |   |-- boot
  |   |   `-- boot.img
  |   `-- ramdisk.tar.gz
  |   `-- linux.tar.bz2                       [5]
  |-- initrdtree
  |   |-- bdisk
  |   |-- bin -> sbin
  |   |-- cdrom
  |   |-- dev
  |   |-- etc
  |   |-- initrd
  |   |-- lib
  |   |-- lilo.conf
  |   |-- linuxrc
  |   |-- modules
  |   |-- mount_cdrom
  |   |-- proc
  |   |-- sbin
  |   |-- tmp
  |   |-- usr -> cdrom
  |   `-- var
  `-- ramdisktree
      |-- bdisk
      |-- bin -> sbin
      |-- cdrom
      |-- dev
      |-- etc
      |-- initrd
      |-- lib
      |-- modules
      |-- proc
      |-- sbin
      |-- tmp
      |-- usr -> cdrom
      `-- var
          |-- lib
          |-- run
          `-- state
              `-- xkb -> /tmp

A alma de tudo está em [1], no shell script build.sh. Esta shell automatiza todos os passos para a criação do CDROM. Para entender o que se passa faça um estudo detalhado dos passos nele descritos.

Em [2] encontra-se o shell script burn, que faz duas tarefas bastante simples, invocar o comando build.sh e o comando cdrecord, para gravar a imagem gerada. Eu optei por criar este script pois até acertar o procedimento modificado muitos CDs tiveram ser gravados. Este script precisa ser alterado para refletir a configuração real de seu sistema.

Em [3] encontra-se a shell updatebinaries.sh. Como recomenda o autor, muito cuidado ao executá-la. Esta shell copia os binários de seu sistema para a árvore de diretórios a ser copiada para o CDROM. Como temos a limitação de 2.88 MB para o floppy que será gravado no CDROM, muito possivelmente este valor será ultrapassado. Eu fiz um teste em meu sistema e isto realmente aconteceu. Eu preferi não mexer com isto e usar os binários distribuídos com o pacote.

Em [4] temos o diretório cdtree, onde se encontra toda a mágica da história. Copiamos para este diretório todo o material a ser usado na instalação. Neste caso em particular, encontra-se [5] o arquivo tar compactado com o utilitário bzip2, contendo o backup de uma instalação GNU/Linux completa, customizada conforme os meus desejos.

Para gerar esta listagem, primeiramente realizamos a instalação do sistema GNU/Linux de sua preferência: Conectiva, Mandrake, RedHat, Debian, enfim, qualquer que seja. Em seguida, crie o arquivo tar com todo o conteúdo do sistema.

  tar cvf /home/linux.tar.bz2 -X exclude -j /

A diretiva -X indica o nome de um arquivo onde incluo os arquivos que eu NÃO quero que façam parte do backup. No meu caso, o conteúdo deste arquivo é o seguinte:

  /home/linux.tar.bz2
  /exclude
  /proc/*
  /tmp/*

É claro que eu não quero que o meu backup inclua o próprio backup. Tão pouco desejo no backup o arquivo exclude. O conteúdo do diretório /proc também não me serve para nada, assim como o conteúdo de /tmp.

Uma vez encerrado o backup faço a cópia do arquivo para a máquina onde realizarei os procedimentos de gravação do CDROM. Em meu computador eu tenho uma partição chamada /work, onde gravo todas as imagens que desejo. As imagens ficam em /work/imagens.

Vejam a listagem deste diretório:

  % ls /work/imagens
  conectiva_rt_20030221.tar.bz2  redhat_lab.tar.bz2
  conectiva_rt_20030224.tar.bz2

Eu tenho aqui três imagens. Duas delas refletem o trabalho que estou desenvolvendo para um sistema Conectiva GNU/Linux pré-configurado para executar o sistema Request Tracker, para acompanhamento e solicitação de serviços. A segunda imagem, redhat_lab.tar.bz2, contém um sistema RedHat configurado para um laboratório de alunos.

O diretório onde gero as imagens chama-se /work/lic-0.1. Como já visto antes, o material adicional que eu desejo gravar no CDROM deve ser colocado no diretório /work/lic-0.1/cdtree. Como as imagens e esta árvore de diretórios encontram-se na mesma partição, basta eu criar um hard link. Desta forma economizo espaço na partição.

  cd /work/lic-0.1/cdtree
  ln /work/images/conectiva_rt_20030224.tar.bz2 linux.tar.bz2

Nas alterações que realizei, eu sempre me refiro ao backup do sistema GNU/Linux customizado como linux.tar.bz2. Para o nome original da imagem eu utilizo uma nomenclatura mais significativa:

  conectiva_rt_20030224.tar.bz2
  ^         ^  ^
  |         |  |
  |         |  +------- Data de Criação
  |         |
  |         +--- Aplicativo
  |
  +--------- Distribuição GNU/Linux

As alterações realizadas no procedimento original desenvolvido por Martin L. Purschke, consistem na alteração do arquivo inittab para que invoque um novo script que irá realizar todas as tarefas de restauração.

O arquivo inittab, com algumas linhas de comentário apagadas para melhor visualização, encontra-se abaixo:

  id:1:initdefault:
  si::sysinit:/etc/sysinit
  l0:0:wait:/etc/halt start
  # normal run levels
  #l1:1:wait:/bin/sh -i
  l1:1:wait:/bin/install.sh
  l2:2:wait:/bin/sh -i
  l3:3:wait:/bin/sh -i
  l4:4:wait:/bin/sh -i
  l5:5:wait:/bin/sh -i
  # reboot
  l6:6:wait:/etc/reboot start
  # Trap CTRL-ALT-DELETE
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now

Como podemos ver, o nível de execução padrão do CDROM de recuperação é o de número 1, como indicado por

  id:1:initdefault:
     ^
     |

Para fazer com que o sistema execute automaticamente o script adaptado na linha onde se encontra descrito o nível de execução de número 1

  l1:1:wait:/bin/sh -i

substituo por

  l1:1:wait:/bin/install.sh

Desta forma, ao final do processo de boot, ao invés de receber o prompt da shell, eu invoco o script /bin/install.sh. O endereço /bin refere-se ao sistema do CDROM e não sua localização real no sistema onde se prepara o CDROM de recuperação.

No sistema de preparação, este script encontra-se em /work/lic-0.1/ramdisktree/bin/install.sh e encontra-se listado a seguir:

install.sh

  #!/bin/sh
  # Recuperação Disco
  echo -e "^[[1;37;44m"
  echo  ""
  echo  ""
  echo  ""
  echo  ""
  echo  ""
  echo  ""
  echo  ""
  echo  ""
  echo  ""
  echo  "            +------------------------------------------------------+"
  echo  "            |                                                      |"
  echo  "            | Este procedimento irá destruir todos os dados de     |"
  echo  "            | seu disco rígido e fazer a instalação de um sistema  |"
  echo  "            |           GNU/Linux pré configurado.                 |"
  echo  "            |                                                      |"
  echo  "            |          TODOS OS SEUS DADOS SERÃO PERDIDOS          |"
  echo  "            |                                                      |"
  echo  "            +------------------------------------------------------+"
  echo  ""
  echo  ""
  echo  ""
  echo  ""
  echo  "              Tem certeza que deseja continuar?"
  echo -n  "[s/N] : "
  read ANS
  case $ANS in
      s|S|"")
      cd /cdrom
  
      # Otimização da velocidade do disco
  
      hdparm -X66 -d1 -u1 -m16 -c3 /dev/hda
  
  # Particionamento do Disco
  
      CYL=`sfdisk -l /dev/hda | egrep "Unidades|Units" | awk '{print $5}'`
      SWAP=268435456
      BOOT=134217728
      SWAP_SIZE=`expr $SWAP / $CYL`
      BOOT_SIZE=`expr $BOOT / $CYL`
  
  sfdisk /dev/hda << EOF
  ,$BOOT_SIZE,83,
  ,$SWAP_SIZE,82,
  ,,83
  EOF
  
  # Preparação da Área de Swap
      mkswap /dev/hda2
  
  # Formatação das partições
  
      mke2fs -j /dev/hda1
      mke2fs -j /dev/hda3
  
  # Gravação do label nas partições
  
      e2label /dev/hda1 /boot
      e2label /dev/hda3 /
  
  # Restauração do Conteúdo do Sistema
      mkdir /mnt
      mount -t ext3 /dev/hda3 /mnt
      mkdir /mnt/boot
      mount -t ext3 /dev/hda1 /mnt/boot
      cd /mnt
      tar xvf /cdrom/linux.tar.bz2 -j
  chroot /mnt grub <> install.log
  root (hd0,0)
  install /grub/stage1 d (hd0) /grub/stage2 p /grub/menu.lst
  quit
  EOF
      ;;
      *)
      exit
      ;;
  esac
  
  /bin/netconf.sh

Este shell script faz uso de diversos aplicativos não incluídos na distribuição original, como hdparm, expr, chroot, e2label. Para incluir um aplicativo novo é preciso verificar de quais bibliotecas estes aplicativos dependem e copiá-las para o diretório /work/lic-01/ramdisktree/lib.

Estas dependências são identificadas com o utilitário ldd:

  $ ldd /usr/sbin/grub
          libncurses.so.5 => /lib/libncurses.so.5 (0x40028000)
          libc.so.6 => /lib/libc.so.6 (0x40069000)
          /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Vemos que o utilitário grub utiliza as bibliotecas libncurses.so.5, libc.so.6 e ld-linux.so.2. Todas estas bibliotecas precisam ser copiadas para /work/lic-0.1/ramdisktree/lib para que o comando grub funcione no ambiente de recuperação:

  $ cd /work/lic-0.1/ramdisktree/lib
  $ cp /lib/libncurses.so.5 .
  $ cp /lib/libc.so.6 .
  $ cp /lib/ld-linux.so.2 .

Muitas bibliotecas já fazem parte da distribuição original e não precisam ser substituídas. Antes de fazer a cópia verifique o que já existe.

Relembrando, o conteúdo do diretório ramdisktree é o sistema de arquivos que será carregado na memória de seu computador. Como os computadores padrão vendidos atualmente possuem memória de 128 MB, com 256 MB tornando-se rapidamente um padrão de mercado, o espaço disponível para inclusão de novos aplicativos é bastante confortável.

O script install.sh não é flexível. Não permite ao usuário selecionar o tamanho das partições e nem quais partições serão utilizadas. Assume que o computador terá apenas um sistema GNU/Linux e não provê nenhum mecanismo para conviver com outros sistemas operacionais no mesmo disco rígido. Resumindo, o uso deste procedimento implica na destruição completa de todos os dados contidos no disco rígido e a sua formatação com três partições: /boot, swap e root (/). Entretanto, novas funcionalidades podem ser adicionadas livremente ao script, conforme o desejo de quem o utilizar.

Alteração da Configuração de Rede

Como se pode ver na última linha do script install.sh, é invocado um novo script, chamado netconf.sh. Este script lê a configuração de rede do sistema original e permite que esta configuração seja alterada.

A seguir, a listagem do script netconf.sh:

  #!/bin/sh
  config()
  {
  echo -e "^[[1;37;44m"
  echo ""
  echo ""
  echo "CONFIGURAÇÃO DE REDE"
  echo ""
  echo "Este computador possui a seguinte configuração de rede:"
  echo "+------------------------+"
  echo "|/etc/sysconfig/network  |"
  echo "+------------------------+"
  cat /mnt/etc/sysconfig/network
  echo "+-------------------------------------------+"
  echo "|/etc/sysconfig/network-scripts/ifcfg-eth0  |"
  echo "+-------------------------------------------+"
  cat /mnt/etc/sysconfig/network-scripts/ifcfg-eth0
  echo "----------------------------------------------------------"
  alterar
  }

  alterar()
  {
  echo -e "^[[1;37;44m"
  echo -n "Deseja alterar esta configuração? [S|N]:  "

  read ANS

  case $ANS in
      S|s)
      bootproto
      ;;
      N|n)
      fim
      ;;
      *|"")
      echo "Resposta Inválida"
      read ANS
      echo "Tecle  para continuar"
      alterar
      ;;
  esac
  }

  bootproto()
  {
  echo -e "^[[1;37;44m"
  echo "Este computador empregará endereçamento:"
  echo ""
  echo "[1] Estático"
  echo "[2] Dinâmico"
  echo ""
  echo -n "[1|2] [Default: 2]: "

  read ANS
  case $ANS in
      1)
      ifcfg
      fim
      ;;
      *|"")
      dhcp
      fim
      ;;
  esac
  }

  dhcp()
  {
  cat > /mnt/etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
  DEVICE=eth0
  BOOTPROTO=dhcp
  ONBOOT=yes
  EOF
  cat > /mnt/etc/sysconfig/network << EOF
  NETWORKING=yes
  EOF
  }

  ifcfg()
  {
  clear
  echo -e "^[[1;37;44m"
  echo  ""
  echo  ""
  echo  ""
  echo  "     +------------------------------------------------------+"
  echo  "     |                                                      |"
  echo  "     |                  Configuração da Rede                |"
  echo  "     |                                                      |"
  echo  "     | Para completar esta etapa você precisa do endereço   |"
  echo  "     | IP de sua máquina, do gateway de sua rede, da máscara|"
  echo  "     | de rede e o endereço IP do servidor DNS.             |"
  echo  "     |                                                      |"
  echo  "     | Caso não tenha estas informações, por favor, procure |"
  echo  "     | o administrador de sua rede para obter estes dados.  |"
  echo  "     |                                                      |"
  echo  "     +------------------------------------------------------+"
  echo  -n "Endereço IP do Computador:          "
  read IPADDR
  echo  -n "Endereço IP do Gateway de sua rede: "
  read GATEWAY
  echo  -n "Máscara de Rede:                    "
  read NETMASK
  echo  -n "Nome do Computador:                 "
  read HOSTNAME
  echo  -n "Servidor DNS:                       "
  read DNSSERVER
  confirma
  }
  confirma()
  {
  echo -e "^[[1;37;44m"
  echo  "+------------------------------------------------------+"
  echo  "  Informações Corretas?"
  echo  "  Endereço IP:         $IPADDR"
  echo  "  Endereço Gateway:    $GATEWAY"
  echo  "  Máscara de Rede:     $NETMASK"
  echo  "  Nome do Computador:  $HOSTNAME"
  echo  "  Servidor DNS:        $DNSSERVER"
  echo  "+------------------------------------------------------+"
  echo  -n "Prosseguir?: [S/n] "
  read ANS
  case $ANS in
      s|S|"")
  cat > /mnt/etc/sysconfig/network << EOF
  NETWORKING=yes
  HOSTNAME="$NAME"
  GATEWAY="$GATEWAY"
  GATEWAYDEV="eth0"
  EOF
  cat > /mnt/etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
  DEVICE="eth0"
  IPADDR="$IPADDR"
  ONBOOT="yes"
  BOOTPROTO="none"
  IPADDR="$IPADDRESS"
  NETMASK="$NETMASK"
  HOSTNAME="$HOSTNAME"
  EOF
  cat > /mnt/etc/resolv.conf << EOF
  nameserver $DNSSERVER
  search unicamp.br ccuec.unicamp.br
  EOF
  fim
  exec /bin/sh
      ;;
      n|N)
      ifcfg
      ;;
      *)
      confirma
  esac
  }
  fim()
  {
  echo -e "^[[1;37;44m"
  echo  ""
  echo  ""
  echo  ""
  echo  "     +------------------------------------------------------+"
  echo  "     |                                                      |"
  echo  "     |                  Configuração Encerrada              |"
  echo  "     |                                                      |"
  echo  "     | Aperte a tecla  ou desligue e ligue o seu     |"
  echo  "     |                    computador.                       |"
  echo  "     |                                                      |"
  echo  "     +------------------------------------------------------+"
  echo  ""
  echo  ""
  echo  ""
  }
  config

Imagens de Demonstração

Com finalidades de demonstração, eu estou disponibilizando algumas imagens pré-configuradas para atender necessidades de meu trabalho.

 

IMPORTANTE
ANTES DE USAR ESTAS IMAGENS LEMBRE-SE QUE TODO O CONTEÚDO DO SISTEMA ONDE FOREM EMPREGADAS SERÁ DESTRUÍDO IRREVERSIVELMENTE E SUBSTITUÍDO POR UM SISTEMA GNU/LINUX

 

São as seguintes as imagens disponíveis:

Todos os sistemas acima possuem apenas o usuário root configurado, sem senha. Para acessar o sistema basta digitar root na janela de login e teclar <ENTER> logo em seguida.

IMPORTANTE

POR RAZÕES DE SEGURANÇA, ATRIBUA UMA SENHA AO USUÁRIO ROOT LOGO EM SEGUIDA AO PRIMEIRO LOGIN.

Pendências

Estes procedimentos podem ser melhorados em muito. Algumas áreas que podem ser melhoradas:

Download L.I.C

Listas de Discussão

Referências