\chapter{Geração do CD}\label{geracao}

\section*{Introdução}
Nesta seção %se documento
o debian-cd será utilizado para gerar um CD Debian personalizado. O debian-cd é um conjunto de scripts que podem ser configurados a partir de arquivos texto para a personalização do CD criado.

\section{A Listagem dos Pacotes}
Para gerar seu CD, é necessário informar ao debian-cd quais pacotes ele deverá conter. Porém, não basta listar simplesmente os pacotes desejados, porque cada pacote possui dependências (que também precisam estar no CD). Por isso, você precisa da listagem completa dos pacotes desejados e de suas dependências (e das dependências das dependências, etc). Felizmente, graças ao utilitário debootstrap não será difícil obter essa listagem.

O Debootstrap é utilizado para gerar uma instalação Debian em um subdiretório de sua máquina. Essa instalação possuirá apenas os pacotes básicos, que são instalados durante a primeira fase da instalação. Assim, é possível obter a árvore de dependências completas de um pacote. É necessário ter status de usuário root para utilizá-lo. Para mais informações, leia \colorbox{claro}{man debootstrap}.

Para gerar uma instalação do sarge no diretório pequeno-debian utilizando o mirror do LibertasBR, por exemplo, execute o seguinte comando:

\medskip
\noindent \colorbox{claro}{debootstrap sarge ./pequeno-debian http://oficina.libertasbr.org.br/repositorio}
\medskip

Agora você poderá ``entrar" nessa instalação do Debian utilizando o chroot. Esse utilitário permite trocar o seu diretório raiz, passando de uma instalação linux para outra ``num passe de mágica" (para mais informações leia \colorbox{claro}{man chroot}). Para fazê-lo, execute:

\medskip
\noindent \colorbox{claro}{chroot pequeno-debian}
\medskip

É necessário editar o arquivo /etc/apt/sources.list de seu pequeno sistema Debian para que ele encontre os pacotes dos quais você deseja obter a listagem. Caso você possua pacotes personalizados, por exemplo, é importante que seu pequeno Debian consiga localizá-los. Em nosso exemplo, utilizaremos dois mirror's para obter a listagem dos pacotes, o do LibertasBR e o Debian brasileiro:

{\small
\begin{framed}
\begin{verbatim}
deb http://oficina.libertasbr.org.br/libertasbr lbr main contrib non-free
deb http://ftp.br.debian.org/debian sarge main contrib non-free
\end{verbatim}
\end{framed}
}

Atualize a listagem de pacotes com o comando:

\medskip
\noindent \colorbox{claro}{aptitude update}
\medskip

Crie um diretório para colocar a listagem, de forma a deixar tudo mais organizado. Por exemplo, /root/dependencias. Entre nesse diretório e execute o seguinte comando:

\medskip
\noindent \colorbox{claro}{aptitude -s -r -y install [pacote] $|$ grep \^{} $''$ \ $''$  $|$ tr -s $''$ \ $''$ \ $''$ $\backslash$n$''$ $>$ lista}
\medskip

Assim, o arquivo `lista' terá a listagem completa de dependências do `[pacote]'.

No caso do modelo baseado em meta-pacotes, basta obter uma listagem para cada meta-pacote. É uma boa idéia organizar a listagem em ordem alfabética e retirar os itens repetidos, com os seguintes comandos:

\medskip
\noindent \colorbox{claro}{aptitude -s -r -y install [pacote] $|$ grep \^{} $''$ \ $''$  $|$ tr -s $''$ \ $''$ \ $''$ $\backslash$n$''$ $>$ [pacote].desor}
\medskip

\noindent \colorbox{claro}{sort [pacote].desor $>$ [pacote].organizado}
\medskip

\noindent \colorbox{claro}{uniq [pacote].organizado $>$ [pacote]} 
\medskip

\noindent \colorbox{claro}{rm [pacote].desor}
\medskip

\noindent \colorbox{claro}{rm [pacote].organizado}
\medskip

O comando \colorbox{claro}{sort} organiza a lista em ordem alfabética e o \colorbox{claro}{uniq} retira os itens repetidos.

Assim, para obter a listagem de vários pacotes, você poderá utilizar um script como o seguinte:

{\small
\begin{framed}
\begin{verbatim}
#!/bin/bash

PACOTES="pacote1 pacote2 pacote3"

for pacote in $PACOTES
do
 echo "Obtendo a listagem do pacote $pacote"
 aptitude -s -r -y install $pacote | grep ^" " |tr -s " " "\n" > $pacote.desor
 sort $pacote.desor > $pacote.organizado
 uniq $pacote.organizado > $pacote
 rm $pacote.desor 
 rm $pacote.organizado
done
\end{verbatim}
\end{framed}
}

Não se esqueça de gerar listas com as dependências dos pacotes necessários para a autodetecção do hardware. (Veja a seção \ref{alterandobaseconf})

\section{A Figura de Inicialização}
O Debian-CD permite que seja inserida uma figura para ser exibida quando o sistema for inicializado a partir do CD. Porém, tal figura pode ter um máximo de 16 cores. Na verdade, é recomendável que a imagem tenha 14 cores, para reservar duas cores para texto. Caso queira mais detalhes sobre a personalização do isolinux, consulte o site \\ \url{http://sweb.cz/Frantisek.Rysanek/splash/isolinux-splash-HOWTO.html}

Caso sua imagem tenha mais do que 16 (ou 14) cores, será necessário refazer o seu mapeamento utilizando um programa de edição gráfica, como o Gimp por exemplo. Caso isso não seja feito, sua figura ficará com uma aparência muito prejudicada.

Para refazer o mapeamento usando o Gimp 2.0, siga os seguintes passos:
\begin{itemize}
	\item Retire qualquer cor presente na sua imagem que seja desnecessária, para melhorar o resultado final.
	\item Vá em Imagem $>$ Modo $>$ Indexado...
	\item Na tela que abrir, certifique-se de que está selecionada a opção Gerar Paleta Otimizada e escolha a opção 16 (ou 14) %16 ou 14?
	em Número Máximo de Cores.
\end{itemize}

Salve a imagem resultante no formato PNG.

\section{O Debian-CD}
Finalmente passaremos para a etapa do debian-cd. Caso ainda não o tenha instalado, execute o comando:

\medskip
\noindent \colorbox{claro}{aptitude install debian-cd}
\medskip

Também é possível que você mantenha mais de um debian-cd na mesma máquina ou que o debian-cd seja mantido em um repositório svn/cvs.\footnote{Na documentação, supomos que o Debian-CD foi instalado normalmente e vamos nos referir às pastas utilizadas na instalação padrão} Para isso, você poderá descompactar o debian-cd, ao invés de instalá-lo. Caso decida por esse caminho, digite os seguintes comandos:

\medskip
\noindent \colorbox{claro}{aptitude download debian-cd}
\medskip

Para baixar o pacote do debian-cd. Agora descompacte-o com o comando:

\medskip
\noindent \colorbox{claro}{dpkg -x [pacote-debian-cd] [destino]}
\medskip

% <<<<<<< .mine
% Assim, o diretório [destino] receberá o conteúdo do pacote debian-cd. A pasta \\ [destino]/usr/share/debian-cd conterá os arquivos do Debian-CD e poderá ser colocada em um repositório svn/cvs. Será necessário executar apenas uma alteração nessa pasta, já que o arquivo de configuração do debian-cd, CONF.sh, é um link simbólico para /etc/debian-cd/conf.sh. Portanto, execute os seguintes comandos, para tornar essa pasta plenamente funcional:
% =======

Assim, o diretório [destino] receberá o conteúdo do pacote debian-cd. A pasta\\
$[$destino$]$/usr/share/debian-cd conterá os arquivos do Debian-CD e poderá ser colocada em um repositório svn/cvs. Será necessário executar apenas uma alteração nessa pasta, já que o arquivo de configuração do debian-cd, CONF.sh, é um link simbólico para /etc/debian-cd/conf.sh. Portanto, execute os seguintes comandos, para tornar essa pasta plenamente funcional:
% >>>>>>> .r149

\medskip
\noindent \colorbox{claro}{rm [destino]/usr/share/debian-cd/CONF.sh}\\
\noindent \colorbox{claro}{cp [destino]/etc/debian-cd/conf.sh [destino]/usr/share/debian-cd/CONF.sh}
\medskip 

\subsection{Configurando o Debian-CD}
Entre no diretório /usr/share/debian-cd e edite o arquivo CONF.sh para configurar o debian-cd. Você terá que alterar as seguintes variáveis:

\begin{itemize}
\item MIRROR para que aponte para o seu mirror local
\item TDIR para que aponte para um diretório temporário, necessário para a geração do seu CD.
\item OUT para que aponte para o diretório onde a imagem do CD será escrita.
\item APTTMP para que aponte para o diretório onde os arquivos temporários do apt serão colocados.
\item SPLASHPNG para que aponte para o local onde está a figura que aparecerá quando o sistema for inicializado pelo CD.
\item IMAGETARGET deverá conter bin-official\_images para que produza apenas CDs binários, caso o seu mirror não possua os pacotes fonte. %pacotes fonte é um bom termo?
Atenção, essa variável fica, por padrão, desabilitada, você terá que retirar o `\#' do início da linha para alterar o seu valor.

Diversos outros parâmetros podem ser alterados nesse arquivo, como o número máximo de CDs, a presença ou não do Contrib, etc. Fique à vontade para explorar o arquivo e não se preocupe pois os comentários explicam bem o que faz cada variável.

\paragraph*{Atenção!} Os quatro caminhos que você colocou nas variáveis MIRROR, TDIR, APTTMP e OUT devem estar na mesma partição.

Além dessa configuração, será necessário que você acrescente a seguinte linha ao arquivo:

{\small
\begin{framed}
\begin{verbatim}
export COMPLETE=0
\end{verbatim}
\end{framed}
}

Edite agora o arquivo Makefile. Coloque na variável BINDISKINFO o nome de seu CD. É importante que o nome seja o mesmo definido no /etc/apt/sources.list de seu CD, para mais detalhes veja a seção Personalização do Sistema.

%O arquivo build.sh também deverá ser editado. Procure pela linha export COMPLETE=1 e substitua o valor da varíavel para 0.

Acesse o diretório data/sarge e edite o arquivo base\_include. Os pacotes listados nesse arquivo serão instalados na primeira fase da instalação do sistema. Portanto, é necessário listar aqui os pacotes que personalizarão a sua distribuição (com exceção do pacote que personaliza o KDE, este será adicionado mais tarde): 

\begin{itemize}
\item \verb![suadistribuicao]-tasksel!;
\item \verb![suadistribuicao]-base-files!;
\item \verb![suadistribuicao]-base-config! e 
\item \verb![suadistribuicao]-grub-tema!.
\end{itemize}

Você poderá ler mais sobre a geração desses pacote na seção \ref{instalador} e na seção \ref{personalizacao}.
\end{itemize}

\subsection{Colocando a Listagem dos Pacotes}
Para configurar o debian-cd para que seu CD possua todos os pacotes necessários, siga o procedimento aqui descrito.
 
No diretório tasks, edite o arquivo Debian\_sarge e apague todas as linhas após \#include $<$forcd1$>$, deixando apenas o seguinte conteúdo\footnote{Essas três linhas iniciadas com \#include servem para garantir que os pacotes essenciais ao sistema e ao instalador estarão presentes no CD}:

{\small
\begin{framed}
\begin{verbatim}
#if (FORCENONUSONCD1 == 1)
#include "Debian_sarge_nonUS"
#endif

/* Packages that should really be on CD1 */
#include <debian-installer+kernel>
#include <base-sarge>
#include <forcd1>
\end{verbatim}
\end{framed}
}

Em seguida, coloque:

{\small
\begin{framed}
\begin{verbatim}
#include <[sualistadepacotes]>
\end{verbatim}
\end{framed}
}

No qual [sualistadepacotes] é a listagem dos pacotes, gerada com o debootstrap, que você deseja ter no CD. Lembre-se de copiar o arquivo com essa listagem para o diretório corrente, para que o debian-cd seja capaz de localizá-lo. Caso possua mais de uma lista de pacotes, acrescente uma linha com o comando \#include para cada lista. Exemplo:

{\small
\begin{framed}
\begin{verbatim}
#include <[sualistadepacotes1]>
#include <[sualistadepacotes2]>
#include <[sualistadepacotes3]>
\end{verbatim}
\end{framed}
}

\paragraph*{Atenção!} Lembre que o fato de um pacote estar listado em base\_include não implica que ele será colocado no CD! É necessário que ele também apareça em alguma dessas listagens de pacotes.


\subsection{Kernel do Sistema}
Caso a versão do kernel de seu mirror seja diferente da versão que o debian-cd está procurando, você terá que editar os arquivos debian-installer+kernel e debian-installer no diretório tasks e colocar a versão do kernel correta. Caso sua distribuição seja i386, o seguinte trecho do debian-installer+kernel será alterado:

{\small
\begin{framed}
\begin{verbatim}
#ifdef ARCH_i386
discover
discover1
grub
lilo
kernel-image-[versão 2.4 do kernel]
kernel-pcmcia-modules-[versão 2.4 do kernel]
kernel-image-[versão 2.6 do kernel]
#endif
\end{verbatim}
\end{framed}
}

Já no debian-installer, você deverá procurar pela linha \#ifdef ARCH\_[arquitetura]. Você verá uma lista com diversos módulos do d-i, será necessário ajustar o nome deles para que aponte para a versão do kernel correta. Por exemplo, veja o seguinte trecho:

{\small
\begin{framed}
\begin{verbatim}
ext3-modules-[versão 2.4 do kernel]-di
ext3-modules-[versão 2.6 do kernel]-di
fat-modules-[versão 2.4 do kernel]-di
fat-modules-[versão 2.6 do kernel]-di
fbset-udeb
fdisk-udeb
firewire-core-modules-[versão 2.4 do kernel]-di
firewire-core-modules-[versão 2.6 do kernel]-di
firmware-modules-[versão 2.4 do kernel]-di
firmware-modules-[versão 2.6 do kernel]-di
\end{verbatim}
\end{framed}
}

Para ver a versão do kernel de seu mirror, liste os arquivos presentes em [seu-mirror-local]/pool/main/k/[kernel desejado]. Certifique-se de que está tudo correto antes de gerar o seu CD. 

\subsubsection{Alterando o Kernel Padrão do Sistema}
É possível escolher se o kernel padrão do sistema será o 2.4 ou o 2.6. Para isso, edite o arquivo tools/boot/sarge/boot-i386. Procure pela função write\_isolinux\_config\_26. Ela que é responsável por configurar o Isolinux quando o kernel 2.6 está presente. Basta escrever agora uma configuração que torne o kernel 2.6 o padrão. Esse se tornará o mesmo kernel padrão do sistema instalado.

Exemplo\footnote{Neste exemplo as $\backslash$ são utilizadas para indicar que a linha foi quebrada para caber na página.}:

{\small
\begin{framed}
\begin{verbatim}
write_isolinux_config_26 () {
	cat > boot$N/isolinux/isolinux.cfg <<EOF
DEFAULT /install/2.6/vmlinuz
APPEND $KERNEL_PARAMS vga=normal initrd=/install/2.6/initrd.gz \
	ramdisk_size=10240 root=/dev/rd/0 devfs=mount,dall rw --
LABEL linux
  kernel /install/2.6/vmlinuz
  append $KERNEL_PARAMS vga=normal initrd=/install/2.6/initrd.gz \
  	ramdisk_size=10240 root=/dev/rd/0 devfs=mount,dall rw --
LABEL cdrom
  kernel /install/vmlinuz
  append $KERNEL_PARAMS vga=normal initrd=/install/initrd.gz \
  	ramdisk_size=10240 root=/dev/rd/0 devfs=mount,dall rw --
LABEL linux24
  kernel /install/vmlinuz
  append $KERNEL_PARAMS vga=normal initrd=/install/initrd.gz \
  	ramdisk_size=10240 root=/dev/rd/0 devfs=mount,dall rw --
LABEL expert24
  kernel /install/vmlinuz
  append $KERNEL_PARAMS DEBCONF_PRIORITY=low vga=normal \
  	initrd=/install/initrd.gz ramdisk_size=10240 root=/dev/rd/0 \
 	devfs=mount,dall rw --
LABEL expert
  kernel /install/2.6/vmlinuz
  append $KERNEL_PARAMS DEBCONF_PRIORITY=low vga=normal \
  	initrd=/install/2.6/initrd.gz ramdisk_size=10240 root=/dev/rd/0 \
  	devfs=mount,dall rw --
DISPLAY isolinux.txt
TIMEOUT 0
PROMPT 1
F1 f1.txt
F2 f2.txt
F3 f3.txt
F4 f4.txt
F5 f5.txt
F6 f6.txt
F7 f7.txt
F8 f8.txt
F9 f9.txt
F0 f10.txt
EOF
}
\end{verbatim}
\end{framed}
}

\subsection{Gerando o CD}
Basta agora ir para o diretório princial do debian-cd e executar


\medskip
\noindent \colorbox{claro}{./build.sh}
\medskip


Em seguida, basta acessar o diretório em que o debian-cd colocou as imagens e pegar os arquivos! %alterar essa frase

\subsection{Melhorando o CD}
No método utilizado para obter a árvore completa de dependências de um pacote, alguns pacotes desnecessários acabam aparecendo na lista. É possível refinar sua imagem, retirando, do CD, os pacotes que não estão sendo instalados. Primeiro, instale um sistema completo utilizando sua imagem. Em seguida, execute nesse sistema o seguinte comando:

\medskip
\noindent \colorbox{claro}{cat /var/lib/aptitude/pkgstates $|$ grep -B3 "\^{}State: 3" $|$ grep \^{}Packa } $\backslash$\\
\noindent \colorbox{claro}{$|$ awk \{'print \$2'\} $>$ lista}\footnote{Este comando deve ser digitado numa única linha, sendo que a $\backslash$ indica apenas a quebra de linha, não devendo, portanto, ser inserida.}

Assim, o arquivo lista conterá todos os pacotes que não foram instalados. Selecione dessa lista os pacotes que você não deseja em seu CD e coloque-os no arquivo [diretório-do-debian-cd]/tasks/exclude-sarge. Todos os pacotes listados nesse arquivo NÃO serão colocados no CD.

Apenas tome cuidado, porque alguns pacotes, apesar de não estarem sendo instalados por padrão, podem ser importantes para o sistema.