Um arquivo kickstart é muito útil para a montagem de um ambiente de treinamento que utilize o Linux CentOS. Ele é utilizado pelo instalador Anaconda que lê seu conteúdo e, baseado nas configurações realizadas, automatiza todo o processo de instalação e configuração de distribuições como o RHEL, Fedora, CentOS e Oracle Linux. Após a execução do Anaconda, com pouco ou nenhum questionamento, está pronto o Linux que eu e meus alunos utilizamos no ambiente que darei aula.
Neste post, utilizando o arquivo kickstart ks, a vm-centos gerada em "Criando uma VM CentOS via linha de comando" e também o mirror construído em "Criando e utilizando um mirror local do CentOS" eu concluo a documentação das tarefas que executo para criar a VM que utilizo nos treinamentos de JBoss que ministro e que também cito no meu livro. Após concluir sua leitura, você terá toda a bagagem necessária para montar tua própria VM CentOS, de maneira automática e rápida.
Depois de ter criado a vm-centos conforme os passos que apresentei no post "Criando uma VM CentOS via linha de comando", ela dará boot através do ISO CentOS-6.3-i386-minimal.iso. Este arquivo representa um CD de boot. Contudo, ele não é um LiveCD do CentOS completo e pronto para a utilização! Ao invés disso, ele apenas oferece a possibilidade de fazermos a instalação do CentOS, a partir de uma interface (textual ou gráfica) ou de arquivo de kickstart utilizando o Anaconda. Ele baixa todos os pacotes necessários a partir da rede e, justamente por isso, ele é pequeno (tem apenas 194MB).
Quando inicializarmos a VM criada, ela então fará o boot pelo CD e apresentará a tela do Grub. Neste ponto, teclaremos <Tab> para informar ao processo de boot que será utilizado o arquivo de kickstart que criei (ks). Para isto, é necessário apenas adicionar, na linha de comando, a string 'ks=http://10.0.2.2/~pj/ks' e teclar <Enter> para que o processo continue. A adição dessa string informa ao processo de boot que o Anaconda será utilizado e lerá o arquivo disponível na URL http indicada. Essa URL, por sua vez, só é acessível pela VM pois o IP 10.0.2.2 é o do gateway provido pelo VirtualBox quando a rede é configurada por NAT (modo default). No meu caso, esse gateway está configurado para prover, a partir do meu diretório local de compartilhamentos Web (~/Sites
), o arquivo ks. Se você quiser saber mais sobre como habilito o compartilhamento Web em minha máquina leia o post "Web Sharing no OS X Mountain Lion".
Agora, comentarei um pouco sobre o arquivo ks
que criei. Ele é um pouco extenso e por isso vou fatiá-lo para mostrar as explicações que estão dentro do próprio arquivo. ;)
As linhas a seguir informam que o sistema será instalado, particionado automaticamente, que o usuário root
terá a senha @lun0123
e que o usuário aluno
também terá a mesma senha:
$ sed -n 1,14p ks | cat -n 1 # Configuração de Kickstart para a vm-centos 2 # Criado por Paulo Jerônimo (@paulojeronimo) 3 4 # Instala (opção default) o sistema ao invés de fazer upgrade 5 install 6 7 # Particiona o disco automaticamente 8 autopart 9 10 # Ajusta a senha para o usuário root 11 rootpw @lun0123 12 13 # Cria e ajusta uma senha para o usuário aluno 14 user --name=aluno --groups=wheel --password=@lun0123
As próximas linhas informam que os pacotes serão baixados de meu mirror local, que a rede será configurada através de DHCP e que o nome da máquina será vm-centos
. É importante citar que, se você baixar este arquivo para utilizá-lo na instalação de teu CentOS, você precisará configurar um mirror público (leia os comentários) ou construir seu próprio mirror local (como explico no post "Criando e utilizando um mirror local do CentOS").
$ sed -n 15,24p ks | cat -n 1 2 # HTTP mirror URL. 3 # O mirror configurado aqui é o da minha máquina (acessível pelo endereço NAT padrão configurado pelo VirtualBox). 4 # Se você está utilizando este arquivo para gerar tua própria VM, este mirror (obviamente) não será encontrado. 5 # Sendo assim, você deverá utilizar algum que seja público na Internet. 6 # Um exemplo de mirror público: http://mirrors.abdicar.com/CentOS/6.3/os/i386. 7 url --url http://10.0.2.2/~pj/centos/6.3/os/i386 8 9 # Network information 10 network --hostname=vm-centos --bootproto=dhcp --device=eth0 --onboot=on
Observe que estou configurando a rede desta VM para que obtenha um IP automaticamente via DHCP e que a interface eth0 será ativada logo após o boot.
O processo de instalação será realizado via modo texto. O teclado configurado será o us-acentos
pois meu notebook não é br-abnt2
. Além disso, a linguagem utilizada pelo sistema será o inglês americano. Tudo isto você pode ver nas linhas abaixo.
$ cat -n <(sed -n 25,37p ks) 1 2 # Informações para o sistema de autorização 3 auth --useshadow --passalgo=sha512 --enablefingerprint 4 5 # Utiliza o modo texto durante a instalação 6 text 7 8 # Ajusta o teclado (meu macbook não é ABNT-2) ;) 9 keyboard us-acentos 10 11 # Linguagem do sistema 12 lang en_US 13
Por padrão, o CentOS vem com o firewall habilitado, assim como o SELinux. É claro que o prudente é deixar estes mecanismos de segurança habilitados numa máquina de produção mas, em ambientes de treinamento, para evitar explicações e configurações antecipadas, eu prefiro desabilitá-los inicialmente e depois mostrar o que fazer a mais quando eles estiverem ativos. Esta é minha abordagem e é por esse motivo que configuro o seguinte:
$ sed -n 38,43p ks | cat -n 1 # Desabilita o SELinux (evita um monte de configurações adicionais de segurança durante o treinamento) 2 selinux --disabled 3 4 # Desabilita o firewall (evita mais um monte de configurações de segurança!) ;) 5 firewall --disabled 6
Eu não deixo o modo gráfico ser inicializado por default já que várias tarefas que apresento simplesmente não necessitam dele. Isto exigirá que o aluno, para iniciar o modo gráfico, utilize o comando startx
. Também, como estou configurando uma máquina para ser utilizada por brasileiros, utilizo o timezone de São Paulo. Estas configurações são apresentadas nas linhas a seguir:
$ sed -n 44,61p ks | cat -n 1 # Não configura o X 2 skipx 3 4 # Logging a nível apenas informativo 5 logging --level=info 6 7 # TimeZone de São Paulo 8 timezone America/Sao_Paulo 9 10 # Configurações do carregador de boot 11 bootloader --append="crashkernel=auto rhgb" --location=mbr --driveorder="sda" 12 13 # Zera a MBR. Previne problemas 14 zerombr 15 16 # Limpa todas as informações relativas a partições 17 clearpart --all 18
Após o Anaconda encerrar seu trabalho, depois de toda a configuração da máquina ter sido realizada conforme o definido no arquivo ks, e também depois de instalar todos os pacotes, podemos instruí-lo a fazer outras atividades como, por exemplo, permitir que o usuário modifique o nome ou IP da máqina, configurar arquivos, etc. Mas, para que isto possa ser realizado, e para que possamos obter as informações do usuário a partir de uma console, devemos redirecionar sua entrada/saída para outra console. Isto é feito na seção %post
, conforme apresentado a seguir:
$ sed -n 62,67p ks | cat -n 1 # Seção pós-instalação 2 %post 3 # Muda para o console nr. 6 e redireciona todo intput/output para ele 4 exec < /dev/tty6 > /dev/tty6 2> /dev/tty6 5 chvt 6 6
Eu instruo o Anaconda perguntar ao usuário se ele deseja configurar outro nome para a máquina que não seja vm-centos
. Se o usuário entrar esse nome, será configurado o arquivo /etc/sysconfig/network
para refletir esta mudança. Isto é explícito nos seguintes comandos:
$ sed -n 68,85p ks | cat -n 1 # Lê uma entrada para $HOSTNAME 2 # (se não for especificado, assume que será vm-centos) 3 while true; do 4 read -p "Informe o nome da máquina ou <Enter> para \"vm-centos\": " HOSTNAME 5 [ "$HOSTNAME" ] || HOSTNAME="vm-centos" 6 [ "$HOSTNAME" = "vm-centos" ] && break 7 read -p "O nome da máquina será \"$HOSTNAME\". Confirma? (S/n) " sim 8 [ "$sim" ] || sim="S" 9 [ "$sim" = "S" ] && break 10 done 11 12 # Altera o nome do host para o que foi informado 13 # (se ele for diferente de vm-centos) 14 [ "$HOSTNAME" != "vm-centos" ] && \ 15 sed -i " 16 s/\(HOSTNAME=\).*/\1$HOSTNAME/g 17 " /etc/sysconfig/network 18
Para permitir que o usuário aluno
possa executar comandos como super usuário, através do sudo
, instruo o Anaconda a remover o comentário para o grupo %wheel
no arquivo /etc/sudoers
, conforme demonstro nas linhas abaixo:
$ sed -n 86,92p ks | cat -n 1 # Ajusta o arquivo /etc/sudoers para permitir que 2 # o grupo wheel não precise informar senha ao usar o sudo 3 # (o usuário aluno pertence a este grupo) 4 sed -i ' 5 s/# \(%wheel.*: ALL$\)/\1/g 6 ' /etc/sudoers 7
Minha máquina, como eu disse, não utiliza o layout de teclado mais comum encontrado aqui no brasil, o br-abnt2
. Apenas para me lembrar o nome do arquivo que precisaria configurar caso estivesse utilizando a VM em outro host com esse layout, eu deixei os comentários que apresento abaixo. Uma forma fácil de fazer a alteração do teclado para br-abnt2
, mas de forma temporária, é utilizar o comando loadkeys br-abnt2
. Mas, para que esta mudança do teclado se tornasse permanente, seria necessário alterar o conteúdo do arquivo /etc/sysconfig/keyboard
conforme apresentado nas linhas (comentadas) a seguir:
$ sed -n 93,97p ks | cat -n 1 # Ajusta o teclado para "br-abnt2" 2 #sed -i ' 3 #s/\(KEYTABLE=\).*/\1"br-abnt2"/g 4 #' /etc/sysconfig/keyboard 5
A VM já está configurada para resolver o nome do host e dos virtual hosts que tenho configurado no Apache de meu notebook.
$ sed -n 98,103p ks | cat -n 1 # Modifica o /etc/hosts adicionando a localização de hosts 2 # pj é host. centos.pj, curso-jboss.pj e ladoservidor.pj são virtual hosts configurados no Apache 3 cat >> /etc/hosts <<EOF 4 10.0.2.2 pj centos.pj curso-jboss.pj ladoservidor.pj 5 EOF 6
Leia como configuro virtual hosts no post VirtualHost Em Apache 2 No OS X Mountain Lion.
Eu instruo o Anaconda a fazer mudanças de configuração para que o yum
utilize meu mirror local para baixar pacotes e também mantenha-os em cache. Para saber como criei esse mirror local, leia o post "Criando e utilizando um mirror local do CentOS". Isto é apresentado a seguir:
$ sed -n 103,114p ks | cat -n 1 2 # Modifica o /etc/yum.repos.d/CentOS-Base.repo para buscar pacotes a partir de 'centos.pj' 3 sed -i ' 4 s/^\(mirrorlist\)/#\1/g 5 s/#\(baseurl=\).*$/\1http:\/\/centos.pj\/\$releasever\/os\/\$basearch\//g 6 ' /etc/yum.repos.d/CentOS-Base.repo 7 8 # Modifica o /etc/yum.conf para que o cache de pacotes seja mantido 9 sed -i ' 10 s/^\(keepcache=\)0$/\11/g 11 ' /etc/yum.conf 12
Terminadas todas as alterações pós instalação, é necessário devolver a entrada/saída do usuário para o console do Anaconda. Isto é realizado através das linhas a seguir:
$ sed -n '115,119p' ks | cat -n 1 # Volta para o Anaconda, no primeiro console. 2 chvt 1 3 exec < /dev/tty1 > /dev/tty1 2> /dev/tty1 4 %end 5
Por fim, eu configuro todos os pacotes (ou grupos de pacotes) que desejo que o Anaconda instale:
$ sed -n '120,$p' ks | cat -n 1 # Pacotes (e grupos de pacotes) que devem ser instalados 2 %packages 3 @ Development tools 4 @ X Window System 5 @ Desktop 6 @ Fonts 7 sudo 8 telnet 9 tree 10 firefox 11 gedit 12 %end
E, é isto! Ufa! Dá um trabalhinho fazer a configuração de minha vm-centos
mas, como você pode ver (ou ler ;)), quando eu precisar refazer esta VM novamente ficará tudo mais simples pois tudo será realizado de maneira automática pelo Anaconda.
Terminado o trabalho deste instalador automático (Anaconda), eu solicito a "retirada do CD" (ISO) e o restart da máquina pelo VirtualBox. Em seguida, terminado o reboot eu efetuo o logon como usuário aluno
, senha @lun0123
.
Meus últimos passos são:
- Inicializar e testar o modo gráfico:
$ startx
- Instalar o VirtualBox Guest Additions.
- Sair do modo gráfico;
- Remover arquivos desnecessários criados pelo ambiente gráfico no
$HOME
do usuário:$ rm -rf ~/*
- Entrar no modo gráfico novamente e testar se a instalação do VirtualBox Guest Additions realmente surtiu efeito (redimensionamento de tela, tela cheia, clock sincronizado com o do host, etc).
E, FIM! A vm-centos
está pronta e preparada para execução! \o/