PROJETO INTREGRADOR 2 Distribuição LNT [[http://187.7.106.12:20231/proj2.doc|Ante Projeto]] {{:projeto11:novo_distribuicao_lnt_linux_network_test_.ppt|}} {{:projeto11:distribuicao_lnt_final.ppt|}} {{:projeto11:artigo_lnt.pdf|}} Distribuições similares: backtrack Ferramentas que serão estudas e analisadas para possivel integração na distribuição. wireshark: Verificar requisições dos host da rede. snort: verificar portas abertas hydra: verificar acesso ssh DNS-Stuff Alternativo: testa o dns que o cliente está utilizando no momento testa das configurações/funcionalidades de um dns próprio ou da operadora (por ex. saber do reverso). xplico: Ferramenta de analise forense. Inicialmente a distribuição será customizada com o centos 4.8 como distribuição anfitrião. Ferramentas para criação e customização da distribuição Cross-compilation: Cross-compiling é utilizar um compilador em um sistema para desenvolver código para executar em outro. A cross-compiling é relativamente rara entre usuários ocasionais do UNIX, já que o padrão é ter um compilador instalado para uso em tal sistema. Entretanto, a cross-compiling torna-se bastante comum (e relevante) ao escolher sistemas embarcados. Mesmo quando o host e o destino estão na mesma arquitetura, é necessário distinguir entre seus compiladores; eles podem ter diferentes versões de bibliotecas ou bibliotecas construídas com diferentes opções de compilador, por isso, algo compilado com o compilador do host poderia falhar ao executar ou poderia comportar-se de maneira inesperada no destino. Obtendo ferramentas de compilação cruzada Ou seja, na teoria, é bem possível construir um compilador cruzado sozinho, mas isto é raramente prático. A série de estágios de autoinicialização necessária pode ser difícil e consumir tempo e sempre é necessário construir um compilador mínimo, que é utilizado para parcialmente configurar e construir bibliotecas, os cabeçalhos dos quais são, então, utilizados para reconstruir o compilador para que possa utilizá-los e assim por diante. Uma grande quantidade de fontes comerciais para trabalhar com compiladores cruzados para diversas combinações de arquitetura estão disponíveis, bem como diversos kits de ferramentas de cross-compiling gratuitos. Apresentando o crosstool-ng O crosstool de Dan Kegel (consulte Recursos para obter detalhes) coleta uma variedade de conhecimentos e algumas correções especializadas para automaticamente construir cadeias de ferramentas para uma grande quantidade de sistemas. O crosstool não tem sido atualizado faz algum tempo, mas o novo projeto crosstool-ng é baseado neste trabalho. Para este tutorial, eu utilizei o crosstool-ng versão 1.1.0, lançado em maio de 2008. Faça download dele a partir do site de distribuição (consulte Recursos). Instalando o crosstool-ng O crosstool-ng tem um script de configuração . Para configurá-lo, simplesmente execute o script utilizando --prefix para configurar um local. Por exemplo: $ ./configure --prefix=$HOME/7800/ctng Assim que o tiver configurado, construa-o utilizando make e, então, make install. O processo de construção cria um diretório ctng no diretório de trabalho do 7800 que contém os scripts de construção do crosstool-ng. Inclua o subdiretório ctng/bin em seu caminho: $ PATH=$PATH:$HOME/7800/ctng/bin Configurando o crosstool-ng O crosstool-ng utiliza um arquivo .config semelhante àqueles utilizados pelo kernel Linux. É preciso criar um arquivo de configuração que corresponde ao seu destino para utilizar o crosstool-ng. Crie um diretório de trabalho para uma construção crosstool-ng: $ mkdir toolchain-build $ cd toolchain-build Agora, copie em uma configuração padrão. É possível configurar o crosstool-ng manualmente, mas uma das configurações de amostra ajusta-se ao destino perfeitamente: $ cp ../ctng/lib/ct-ng-1.1.0/samples/arm-unknown-linux-uclibc/* . Finalmente, renomeie o arquivo crosstool.config : $ mv crosstool.config .config Isto copia em um arquivo de configuração que tem como destino um processador armv5te, o modelo utilizado no TS-7800. Ele é construído com uClibc, uma variante libc destinada a sistemas embarcados. Entretanto, o arquivo de configuração não precisa de uma modificação. Corrigindo o caminho da configuração O diretório de destino padrão para uma construção do crosstool-ng é $HOME/x-tools/$TARGET. Por exemplo, nesta construção, ele poderia aparecer como x-tools/arm-unknown-linux-uclibc. Isto é muito útil se você estiver construindo para uma grande quantidade de destinos, mas não é tão útil se você estiver construindo para apenas um destino. Edite o arquivo .config e altere CT_PREFIX_DIR para ${HOME}/7800/toolchain. Construindo a string de ferramentas Para construir a string de ferramentas, execute o script ct-ng com o argumento build .Para melhorar o desempenho, especialmente em um sistema com vários núcleos, você pode querer executar com várias tarefas, especificadas como build.#. Por exemplo, este comando é construído com quatro tarefas: $ ct-ng build.4 Isto pode levar algum tempo, dependendo do seu sistema host. Quando isto tiver sido concluído, a string de ferramentas está instalada em $HOME/7800/toolchain. O diretório e seus conteúdos são marcados como somente leitura; se você precisar movê-los ou excluí-los, utilize o chmod u+w. O script ct-ng obtém outros argumentos, tal como help. Observe que ct-ng é um script para o utilitário make padrão e, como resultado, a saída de --help é apenas a ajuda do make padrão; utilize ct-ng help para obter ajuda para o crosstool-ng. Se você não tiver visto este truque antes, ele é genial. Sistemas UNIX modernos interpretam um arquivo executável no qual a primeira linha inicia com #! como um script, especificamente, um script para o programa nomeado no resto da linha. Por exemplo, muitos shell scripts iniciam com #!/bin/sh. O nome do arquivo é transmitido para o programa. Para programas que tratam seu primeiro argumento como um script para executar, isto é suficiente. Embora make não faça isto automaticamente, você pode fornecer a ele um arquivo para ser executado utilizando o sinalizador -f . A primeira linha do ct-ng é #!/usr/bin/make -rf. O sinalizador -r suprime as regras de construção padrão integradas de make e o sinalizador -f informa que a palavra seguinte (que é o nome do arquivo do script) é o nome de um arquivo para utilizar ao invés de um Makefile. O resultado é um script executável que utiliza a sintaxe make ao invés da sintaxe do shell. Utilizando a string de ferramentas Para iniciantes, inclua o diretório contendo o compilador em seu caminho: $ PATH=~/7800/toolchain/bin:$PATH Com isso em seu caminho, agora você pode compilar programas: $ arm-unknown-linux-uclibc-gcc -o hello hello.c $ file hello hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), not stripped Onde estão as bibliotecas? As bibliotecas utilizadas pela string de ferramentas para vincular binários estão armazenadas em arm-unknown-linux-uclibc/sys-root, sob o diretório toolchain . Este diretório forma a base de um eventual sistema de arquivos raiz, um tópico que iremos abranger sob Sistemas de arquivos, assim que o kernel for construído. Configuração de kernel A árvore de distribuição do kernel fornecida pelo fornecedor já está configurada para cross-compiling. No caso mais simples (que é este), a única coisa que você precisa fazer para executar uma cross-compiling de um kernel Linux é configurar a variável CROSS_COMPILE no Makefile de nível superior. Este é um prefixo que é anexado no início de diversos programas (gcc, as, ld) utilizado durante a construção. Por exemplo, se você configurar CROSS_COMPILE para arm-, a compilação tentará localizar um programa denominado arm-gcc em seu caminho. Para esta construção, então, o valor correto é arm-unknown-linux-uclibc. Ou, se você não quiser contar com as configurações de caminho, é possível especificar o caminho inteiro, como neste exemplo: CROSS_COMPILE ?= $(HOME)/7800/toolchain/bin/arm-unknown-linux-uclibc- Configuração de kernel Uma discussão completa sobre a configuração do kernel está além do escopo deste tutorial. Neste caso, o destino ts7800_defconfig me deu uma configuração padrão utilizável para o 7800, com um pequeno contratempo: a configuração CONFIG_DMA_ENGINE foi terminada com off quando deveria ter sido terminada com on. Refinando o kernel Normalmente, é melhor editar o kernel utilizando make menuconfig, que oferece uma interface semigráfica para a configuração do kernel. Esta interface é navegada utilizando as teclas de seta para mover o cursor, a tecla Tab para selecionar opções na parte inferior da tela e as teclas de espaço ou Enter para selecionar opções. Por exemplo, para sair sem alterar nada, pressione Tab até que a opção na parte inferior da tela fique realçado e, então, pressione Enter. Executar make menuconfig novamente reabre o editor. Alterando o console padrão O TS-7800 normalmente inicializa silenciosamente, porque a configuração padrão do kernel especifica um dispositivo de console nulo para manter o monitor silencioso. Para alterar isto, utilize as teclas de seta para navegar para baixo para as "Opções de boot" e pressione Enter. A terceira linha mostra as opções padrão do kernel, que seleciona o ramdisk, o script de inicialização e o console. Utilize as teclas de seta para navegar para baixo até esta linha, pressione Enter e altere console none para console ttyS0,115200. Em seguida, pressione Tab para mover o cursor para na parte inferior do painel e pressione Enter. Agora, pressione Tab para selecionar e pressione Enter, retornando-o ao menu principal. Com o objetivo de inicializar o mais rápido possível, o console não é útil e, de fato, mesmo em uma alta taxa de bauds, o envio de mensagens de kernel pode levar uma fração notável de tempo que o sistema leva para inicializar. Entretanto, para depuração e reprodução, você precisa do console. Ativando o mecanismo DMA Navegue para baixo até "Drivers de dispositivo" e pressione Enter. Esta lista é mais longa do que o monitor usual, portanto, você precisará rolar até o final da opção para "Mecanismos DMA". Navegue até esta opção com as teclas de seta e pressione Enter. Há duas opções na parte superior desta página que possuem colchetes indicando uma opção booleana. A segunda opção, "Suporte para mecanismos DMA", não estava ativada por padrão no download com o qual eu iniciei. Navegue até esta opção com as teclas de seta e pressione a tecla de espaço para alternar seu estado. Agora, utilize Tab e Enter para selecionar em cada tela para navegar até o nível superior do programa e, então, mais uma vez para sair do programa. Quando perguntado se você deseja salvar sua nova configuração de kernel, utilize a tecla Tab até chegar em e pressione Enter. Compilando o kernel Digite make. Sim, é realmente simples assim. Isto constrói um kernel, bem como uma coleção de módulos. Novamente, usuários com vários núcleos podem desejar várias tarefas; tente make -j 5. Para os propósitos deste projeto, vou ignorar os módulos de kernel e favorecer a compilação de quaisquer recursos necessários. A técnica ramdisk de autoinicialização utilizada para obter os drivers necessários no kernel antecipadamente parece excessiva e a construção de um sistema de arquivos raiz já é complicada o suficiente. Isto, é claro, traz a questão de como obter uma inicialização de kernel, o assunto da próxima seção. ==================================================================================================================== Requisitos para o sistema anfitrião requisitos kernel 2.6.2 ou posterior compilação gcc 3.0 ou posterior verificar se o sistema anfitrião tem os requisitos com o comando cat /proc/version criar uma partição nova. fdisk m = help comando n = cria partição w = grava formatar partição mkfs.ext3 /dev/sdb montar partição mount /dev/sdb /lnt colocar a montagem da partição no /etc/fstab Observação importante. ***************************************************************************************************** Algumas distribuições do sistema anfitrião usam características próprias em suas ferramentas da criação do sistema de arquivos (e2fsprogs). Isto pode causar problemas quando inicializar o seu novo sistema LFS no capítulo 9, porque aquelas características não serão suportadas pelo e2fsprogs instalado pelo LFS; você verá um erro similar a “unsupported filesystem features, upgrade your e2fsprogs”. Para verificar se seu sistema anfitrião utiliza alguma característica própria, execute o seguinte comando: debugfs -R feature /dev/[xxx] Se a saída obtida contiver características diferentes de dir_index; filetype; large_file; resize_inode or sparse_super então seu sistema anfitrião pode ter características próprias. Neste caso, para evitar problemas futuros, você deve compilar o pacote do e2fsprogs e usar os binários resultantes para recriar o sistema de arquivos em sua partição LFS: cd /tmp tar xjf /path/to/sources/e2fsprogs-1.37.tar.bz2 cd e2fsprogs-1.37 mkdir build cd build ../configure make #note that we intentionally don't 'make install' here! ./misc/mke2fs /dev/[xxx] cd /tmp rm -rf e2fsprogs-1.37 ************************************************************************************************ Pacotes necessários: • Autoconf (2.59) - 908 kilobytes (KB): • Automake (1.9.5) - 748 KB: • Bash (3.0) - 1,824 KB: • Binutils (2.15.94.0.2.2) - 11,056 KB: • Bison (2.0) - 916 KB: • Bzip2 (1.0.3) - 596 KB: • Coreutils (5.2.1) - 4,184 KB: • DejaGNU (1.4.4) - 852 KB: • Diffutils (2.8.1) - 648 KB: • E2fsprogs (1.37) - 3,100 KB: • Expect (5.43.0) - 416 KB: • File (4.13) - 324 KB: • Findutils (4.2.23) - 784 KB: • Flex (2.5.31) - 672 KB: • Gawk (3.1.4) - 1,696 KB: • GCC (3.4.3) - 26,816 KB: • Gettext (0.14.3) - 4,568 KB: • Glibc (2.3.4) - 12,924 KB: • Glibc-Linuxthreads (2.3.4) - 236 KB: • Grep (2.5.1a) - 520 KB: • Groff (1.19.1) - 2,096 KB: • GRUB (0.96) - 768 KB: • Gzip (1.3.5) - 284 KB: • Hotplug (2004_09_23) - 40 KB: • Iana-Etc (1.04) - 176 KB: • Inetutils (1.4.2) - 752 KB: • IPRoute2 (2.6.11-050330) - 276 KB: • Kbd (1.12) - 624 KB: • Less (382) - 216 KB: • LFS-Bootscripts (3.2.1) - 32 KB: • Libtool (1.5.14) - 1,604 KB: • Linux (2.6.11.12) - 35,792 KB: • Linux-Libc-Headers (2.6.11.2) - 2,476 KB: • M4 (1.4.3) - 304 KB: • Make (3.80) - 904 KB: • Man (1.5p) - 208 KB: • Man-pages (2.01) - 1,640 KB: • Mktemp (1.5) - 68 KB: • Module-Init-Tools (3.1) - 128 KB: • Ncurses (5.4) - 1,556 KB: • Patch (2.5.4) - 156 KB: • Perl (5.8.6) - 9,484 KB: • Procps (3.2.5) - 224 KB: • Psmisc (21.6) - 188 KB: • Readline (5.0) - 1,456 KB: • Sed (4.1.4) - 632 KB: • Shadow (4.0.9) - 1,084 KB: • Sysklogd (1.4.1) - 72 KB: • Sysvinit (2.86) - 88 KB: • Tar (1.15.1) - 1,580 KB: • Tcl (8.4.9) - 2,748 KB: • Texinfo (4.8) - 1,492 KB: • Udev (056) - 476 KB: • Udev Rules Configuration - 5 KB: • Util-linux (2.12q) - 1,344 KB: • Vim (6.3) - 3,620 KB: • Vim (6.3) language files (optional) - 540 KB: • Zlib (1.2.2) - 368 KB: total de 170 mb Sites para com vairos pacotes disponiveis http://ftp.gnu.org/gnu http://www.kernel.org/pub Patches necessários • Bash Various Fixes - 23 KB: • Bash Avoid Wcontinued Patch - 1 KB: • Coreutils Suppress Uptime, Kill, Su Patch - 15 KB: • Coreutils Uname Patch - 4 KB: • Expect Spawn Patch - 7 KB: • Flex Brokenness Patch - 156 KB: • GCC Linkonce Patch - 12 KB: • GCC No-Fixincludes Patch - 1 KB: • GCC Specs Patch - 14 KB: • Glibc Fix Testsuite Patch - 1 KB: • Gzip Security Patch - 2 KB: • Inetutils Kernel Headers Patch - 1 KB: • Inetutils No-Server-Man-Pages Patch - 4 KB: • IPRoute2 Disable DB Patch - 1 KB: • Mktemp Tempfile Patch - 3 KB: • Perl Libc Patch - 1 KB: • Readline Fixes Patch - 7 KB: • Sysklogd Fixes Patch - 27 KB: • Tar Sparse Fix Patch - 1 KB: • Util-linux Cramfs Patch - 3 KB: • Vim Security Patch - 8 KB: • Zlib Security Patch - 1 KB Criar uma variavel $LNT para facilitar na customização, para criar é so executar o comando export LNT=/home/lnt, LNT é a variavel, /home/lnt é o ponto de montagem ao executar o comando $LNT a saida devera ser /home/lnt. criar 2 pastas dentro do /home/lnt, pasta sources onde estara os pacotes e os path e a pasta tools, a pasta source foi configurado permissão de somente leitura apenas o proprietario tem permissão para escluir, a pasta tools foi criado um link simbolico softlink da pasta tools do lnt para a pasta tools do sistema anfitrião preparando o ambiente para copilação com o comando source ~/.bash_profile entrar com o usuario lnt: su - lnt entrar na pasta sources cd sources instalando o primeiro pacote binutils-2.15 criando pasta: mkdir binutils-build cd binuils-build preparando para copilar. ../binutils-2.15/configure --prefix=/tools --disable-nls o comando ../ retorna uma pasta e entra na pasta binutils-2.15 e acessa o arquivo configure comando --prefix=/tool Diz ao script de configuração para preparar-se para instalar os programas do Binutils no diretório /tools. comando --disable-nls Desabilita a internacionalização pois o i18n não é necessário para as ferramentas provisórias. Copilando: make Instalando o pacote: make install Vinculador dinâmico a ser instalado: make -C ld clean make -C ld LIB_PATH=/tools/lib comando -C ld clean Diz ao make para remover todos os arquivos compilados do subdiretório ld. comando -C ld LIB_PATH=/tools/lib Esta opção reconfigura tudo no subdiretório ld. Especificar a variável LIB_PATH do Makefile na linha de comando permite que nós cancelemos o valor padrão e indiquemos a posição das ferramentas provisórias. O valor desta variável determina o caminho de busca da biblioteca padrão do vinculador dinâmico. Instalando o pacote gcc 3.4 criar pasta gcc-build dentro da pasta source mkdir gcc-build cd gcc-build preparando para copilar. ../gcc-3.4.3/configure --prefix=/tools --libexecdir=/tools/lib --with-local-prefix=/tools \ --disable-nls --enable-shared --enable-languages=c comando --with-local-prefix=/tools Remove o diretório /usr/local/include do caminho de busca do gcc. Isto não é absolutamente essencial, entretanto ajuda a minimizar a influência do sistema anfitrião. comando --enable-shared Permite a configuração das bibliotecas libgcc_s.so.1 e libgcc_eh.a. Ter a libgcc_eh.a disponível garante que o script de configuração do Glibc produza os resultados apropriados. comando --enable-languages=c Assegura que somente o compilador de C seja configurado. Copilando: make bootstrap comando bootstrap Este parâmetro não apenas compila o GCC, mas o faz diversas vezes. Usa os programas compilados em um primeiro tempo para compilar-se uma segunda vez, e então uma terceira vez. Compara então esta segunda com esta terceira compilação para certificar-se que pode se remontar perfeitamente. Isto significa também que foi compilado corretamente. instalado o pacote: make install Criando um vinculo ln -s gcc /tools/bin/cc