Introdução Sistemas Embarcados Root File System Linux (kernel) é apenas uma parte de um sistema embarcado Preciso executa a inicialização do sistema e de aplicações Necessário montar o sistema de arquivos Objetivo: Estudar os detalhes da inicialização pós-kernel Necessidade do root file system Compreender a necessidade do busybox Entender mais um pouco o initrd e o bootstrap Aula 06 2 Root filesystem Filesystem Hierarchy Standard (FHS) Sistema de arquivos base da hierarquia(root = raiz superuser) Sistema de arquivos = arquivos + diretórios em uma partição Representado pela barra (/) Vários outros sistemas de arquivos são montados a partir dele e.g.: proc, NFS, jffs2 etc Requisitos/tarefas do root filesystem para linux Programas e utilitários para boot do sistema Inicializar serviços Carregar s Montar outros file systems Padronização da organização e layout de sistemas de arquivos unix http://www.pathname.com/fhs Documento de aproximadamente 30 páginas Regras oficiais para o rootfilesystem Sistemas embarcados tem uma certa flexibilidade nessas regras / bin boot dev etc home lib mnt opt root sbin tmp usr var 3 4
Diretórios top-level do root filesystem bin: executáveis disponíveis a todos os usuários do sistema boot: arquivos empregados pelo bootloader dev: dispositivos de E/S (device s) etc: arquivos de configuração, incluindo os de inicialização home: diretórios de usuários e certos serviços (e.g. ftp) lib: bibliotecas essenciais (libc e módulos do kernel) mnt: ponto de montagem para sistemas de arquivos temporários opt: pacotes de software ad-on proc: sistema de arquivos virtual (kernel e monitoração de processos) root: diretório do superusuário (root) sbin: executáveis relativos a tarefas administrativas (superuser) tmp: arquivos temporários usr: hierarquia secundária para aplicativos var: arquivos de tamanho variável (logs, spooling...) Para sistemas embarcados,... mas cada caso é um caso!! Abordagem minimalista: bin: executáveis disponíveis a todos os usuários do sistema dev: dispositivos de E/S (device s) etc: arquivos de configuração, incluindo os de inicialização lib: bibliotecas essenciais (libc e módulos do kernel) sbin: executáveis relativos a tarefas administrativas (superuser) tmp: arquivos temporários usr: hierarquia secundária para aplicativos var: arquivos de tamanho variável (logs, spooling...) Foram retirados: boot, home, mnt, opt, proc, root boot: depende do bootloader proc: se não houver necessidade de analisar o kernel 5 6 Problema: definir um root filesystem mínimo Exemplo de um root filesystem hyper-mínimo Desafio: Pôr no root filesystem tudo que é necessário para a aplicação executar Uma aplicação pode depender de vários arquivos e.g. arquivos de configuração, bibliotecas, icones, databases, internacionalização, etc Normalmente distribuídos em vários diretórios (e.g. apache) Dependências de outros programas Métodos: Tentativa e erro Ferramenta de geração automática É uma das coisas proprietárias de uma solução linux embarcada comercial bin dev etc lib Maior parte! busybox sh -> busybox console Init.rd rcs Engloba vários comandos Unix O porquê mais tarde... Interface com o meio (dispositivo de E/S) desejável ao busybox ld-2.3.2.so ld-linux.so.2 -> lid-2.3.2.so libc-2.3.2.so libc.so.6 -> libc-2.3.2.so Loader: carrega binário em memória e ligação dinâmica glibc: aplicações dependem de funções dela (e.g. printf) 7 8
Inicialização do sistema operacional Execução do programa init O programa de boot lê e carrega em memória o núcleo do sistema operacional O núcleo recebe o controle e realiza: Inicialização de tabelas internas de dados Inicialização e instalação de s de dispositivos Criação de um processo especial (init) a partir do qual todos os outros processos serão derivados No final da inicialização do kernel é feito a execução do init Necessário achar o programa init Montagem do root filesystem Executar o init As últimas linhas da inicialização do kernel são: run_init_process( /sbin/init ); run_init_process( /etc/init ); run_init_process( /bin/init ) ; run_init_process( /bin/sh ); Eis a razão do link no FS hyper-mínimo! panic( no init found. Try passing init= option to kernel. ); 9 10 Processo init Criação de processos UNIX: fork e exec Primeiro processo a ser executado em espaço de usuário Dispara vários outros processos Informados em um arquivo de configuração (/etc/inittab) Todos os processos do sistema são descendentes do init Conceito de runlevel Conjunto de serviços habilitados Scripts de inicialização Localização depende do estilo do sistema (System V ou BSD) Sistemas Unix em geral Nível 0 é parada Nível 1 ou S monousuário Níveis 2 a 5 são multiusuário Nível 6 é reinicialização init PID 1 fork init getty login sh fork sh PID 563 exec grep PID 563 exec 11 12
Inicialização do sistema operacional Linux Níveis de execução (runlevel) Baseada na inicialização da família UNIX System V Primeiro processo a ser executado é o init que realiza: Inicialização de estruturas internas do sistema operacional Dispara os processos (deamons) necessários ao funcionamento do sistema Arquivos de configuração residem no diretório /etc/rc.d e em seus subdiretórios Arquivos: rc.sysinit e rc.local Subdiretórios: initd.d, rc0.d, rc1.d, rc2.d, rc3.d, rc4.d, rc5.d e rc6.d Sistema Linux possui vários níveis de execução 0: parada do sistema 1: modo monousuário (single) 2: definido pelo usuário 3: multiusuário sem restrições 4: definido pelo usuário 5: multiusuário com interface gráfica 6: reboot do sistema S: modo monousuário /etc/inittab indica a seqüência de scripts a ser executada Cada nível de execução possui em /etc/rc.d um subdiretório próprio com tarefas de inicialização 13 14 Seqüência de inicialização O diretório /etc/rc.d/init.d Execução do processo init init executa o script /etc/rc.d/rc.sysinit init executa os scripts de configuração do nível de execução selecionado por default init executa rc.local Utilizado para tarefas suplementares de inicialização Mensagem de inicialização Executa sempre que ocorre a inicialização ou troca no nível de execução Contém vários scripts de inicialização Um script para cada serviço a ser lançado na execução do sistema ou na troca de nível de execução Recebem argumentos do tipo start, stop, e restart /etc/rc.d/init.d/httpd.init stop Exemplos de serviços: rede, nfs, sendmail, ftp, http, etc.. 15 16
Os diretórios /etc/rc.d/rc?.d Procedimento de inicialização do sistema O objetivo é selecionar quais scripts de /etc/rc.d/init.d devem ser executados em cada nível de execução Personalização do sistema Na realidade não são arquivos mas sim referências aos scripts que estão em /etc/rc.d/init.d Cada referência possui uma letra ( S ou K ) e um número S : script é executado no lançamento do sistema (argumento start) K : script é executado na parada do sistema (argumento stop) O número (nn) indica a ordem que os scripts devem ser executados Master Boot Record (MBR) lilo ou grub 6 init /etc/inittab 5 3 7 1 2 vmlinuz / 8,9 /boot /usr /tmp /etc 4 run level 1 run level 3 ou 5 1. Hardware lê o setor de boot (MBR) 2. Carrega lilo/grub 3. Carga do núcleo (kernel) 4. Montagem do sistema de arquivo do root 5. Execução do init 6. Leitura do /etc/inittab 7. Executa script rc1.d 8. Final do rc1.d indica próximo (rc3.d ou rc5.d) 9. Executa rc3.d (ou rc5.d) 10. Voilá!!!...... 17 18 Parada do sistema Inital Disk (novamente ele!): initrd Um sistema UNIX não pode ser desligado brutalmente sob pena de se criar inconsistências no sistema O comando shutdown deve ser utilizado: shutdown -h now (pára o sistema) shutdown -r now (reboot no sistema) Possibilidades de utilizar: Comandos reboot e halt Seqüência Ctrl-Alt-Del normalmente é programada para realizar automaticamente shudown seguido de reboot Mecanismo para montar o root filesystem para inicialização e configuração durante o startup do sistema O kernel deve ser configurado com esse suporte Opção está em block devices disk suport Possui um root filesystem autocontido Informação dos s a serem carregados antes de se completar a fase de bootstrap e.g. em linux desktop é usado para carregar os drives ext3 Uso comum é carregar o de dispositivo usado para acessar o root filesystem real 19 20
Booting com initrd Problema do ovo e da galinha : initrd Necessário passar uma imagem do initrd para o kernel Bootloader faz: Carrega imagem compactada do kernel Carrega o initrd em memória Necessário informar o endereço da carga e tamanho do initrd para o kernel antes de passar o controle a ele Seqüência exata depende do sistema, do bootloader, da arquitetura Após carga e descompactação: Monta o ( disk) como root filesystem Executa o script linuxrc (contido no próprio initrd) Sistema de arquivo temporário usado para no boot de sistemas linux Nem sempre é necessário, vai depender de características próprias do sistema e.g.: possível inicializar diretamente da imagem binária Um sistema só pode dar boot se ele tem o do dispositivo onde está a imagem do kernel Drivers podem ser escritos como módulos e carregado na memória apenas no momento do boot INTial Ram DisK No momento do boot é carregado pelo bootloader o kernel e o initrd na memória Controle é passado para o kernel Instala novos s de dispositivos e monta o sistema de arquivos 21 22 ramdisk versus ramfs Que mais nos precisamos? Access to file Virtual File System Filesystem Block (disk) Block storage Regular block device Copy File cache Access to file Virtual File System Filesystem Block (ramdisk) Ramdisk block device File cache Copy Block storage Access to file Virtual File System ramfs File cache Bootloader OK Cross-compiler Sistema de arquivo OK Drivers de dispositivo Ambiente de desenvolvimento 23 24
PERGUNTAS E COMENTÁRIOS FINAIS?? 25