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.
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:
Simplificadamente, para se criar um CDROM de recuperação, basta seguir os seguintes passos:
# cd /work # tar xvzf lic-0.1.tar.gz
/tmp/*
/proc/*
/home/linux.tar.bz2
# tar cvf /home/linux.tar.bz2 -j -X /exclude /
#!/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.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:
.
|-- 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:
#!/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.
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
Com finalidades de demonstração, eu estou disponibilizando algumas imagens pré-configuradas para atender necessidades de meu trabalho.
|
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.
|
Estes procedimentos podem ser melhorados em muito. Algumas áreas que podem ser melhoradas: