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:

  1. Inicializar e testar o modo gráfico:
    $ startx
    
  2. Instalar o VirtualBox Guest Additions.
  3. Sair do modo gráfico;
  4. Remover arquivos desnecessários criados pelo ambiente gráfico no $HOME do usuário:
    $ rm -rf ~/*
    
  5. 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/