Administração de Sistemas Informáticos I ISEP TEMA Arranque do sistema TEÓRICA-PRÁTICA 1. Introdução O arranque/iniciação de um sistema é composto por três passos elementares: • Localização do Kernel. • Iniciação do Kernel. • Iniciação de processos/serviços. 2. Localização do Kernel Primeiro, é necessário localizar o kernel do sistema operativo a ser arrancado. A forma exacta como isto acontece depende da plataforma de hardware em questão. Tipicamente, temos uma memória ROM que contém um programa responsável pela alguma iniciação básica do hardware e por encontrar e executar um programa denominado bootstrap. No caso de um PC, a BIOS permite definir em que drive deve procurar o bootstrap. Assim, esta irá criar um ambiente básico que permita executar o bootstrap, localizado no primeiro sector da drive escolhida. Um exemplo de um programa bootstrap, utilizado em Linux, é o LILO. 2.1. LILO - Linux Loader O LILO é um programa bootstrap, baseado em chamadas da BIOS. Este programa pode ser instalado no MBR ou na partição raiz do sistema Linux. De notar que, por ser baseado em chamadas à BIOS, todos os ficheiros que o LILO precisa de aceder para executar a sua tarefa devem ser acessíveis pela BIOS. O ficheiro de configuração do LILO é o /etc/lilo.conf. Adicionalmente, sempre que é efectuada uma modificação na configuração do LILO, ou é instalado um novo kernel, é necessário reinstalar o programa, executando: /sbin/lilo. 2.2. GRUB – Grand Unified Bootloader O GRUB é alternativa ao LILO uma vez que consegue endereçar o boot acima do cilindro 1024, ao contrário do LILO. O ficheiro de configuração do GRUB é o /etc/grub.conf. O problema do cilindro 1024, está relacionado com o facto da BIOS nas arqitecturas X86 usarem um esquema de 3 números para endereçar os sectores do disco. Cada sector é identificado pelo tripleto: número do cilindro: número da cabeça: numero do sector. Colectivamente conhecido por endereço CHS(C – Cylinder; H – Head; S – Sector). O problema surge porque o numero de bits 10 para representar o numero do cilindro é de 10 bits, ora 2 só permite endereçar 1024 cilindros. 2.3. Iniciação do Kernel Ao executar, o programa bootstrap deverá (utilizando chamadas à BIOS) carregar o Kernel do sistema operativo para a memória. Uma vez carregado em memória, o kernel irá efectuar os seguintes passos: • Iniciar as estruturas de dados internas. • Verificar o hardware do sistema. O kernel apenas procura por hardware sobre o qual tem conhecimento. • Verificar a integridade do sistema de ficheiros raiz e mapear este sistema. • Criar o processo 0 (swapper) e o processo 1 (init). 2.4. Iniciação de processos/serviços Nesta altura, o kernel foi carregado, as suas estruturas de dados iniciadas, o hardware foi encontrado e o sistema de ficheiros está pronto a ser utilizado. O processo responsável pela gestão da memória foi iniciado. Tudo isto é preparado para prestar suporte aos processos a serem executados no sistema operativo, no entanto existe uma questão. Acontece, que, em Linux/Unix, a única forma para criar processos é que um processo existente execute um fork. Um ________________________________________________________________________ Departamento de Engenharia Informática Pag. 1 Administração de Sistemas Informáticos I ISEP fork cria um novo processo que contém uma cópia de todas as estruturas e código do processo original. Em muitos casos, o novo processo irá efectuar um exec, que substitui o código e estruturas originais pelas de um novo programa. Por esta razão, é criado o processo init. Este processo é o processo ancestral de todos os processos num sistema Linux. Ele tem sempre o PID (process ID) 1, é iniciado pelo kernel e é o único processo que não tem um processo como pai. Desta forma, o init, é responsável pela iniciação de todos os outros serviços do sistema. Os serviços que inicia encontram-se configurados no ficheiro /etc/inittab. O init é também responsável por colocar o sistema num runlevel. Um runlevel é uma configuração do software do sistema que permite que apenas um conjunto de serviços esteja activo. Os runlevels oferecem a flexibilidade de colocar uma máquina a funcionar em diferentes modos de operação. Por exemplo, uma máquina pode estar configurada como servidor de mail num runlevel e noutro ser configurada como uma estação de trabalho. Este mecanismo de iniciação, denominado System V, é utilizado num grande número de distribuições Linux. Existem no entanto algumas distribuições que funcionam de forma diferente. De uma forma geral, os vários runlevels existentes são num sistema Linux são: Runlevel 0 1 2 3 4 5 6 S,s Descrição Paragem do sistema Modo single user. Todos os sistemas de ficheiros encontram-se disponíveis, mas apenas um pequeno conjunto de serviços se encontram activos. Apenas o root pode entrar no sistema. Modo multi-utilizador, sem partilha remota de ficheiros. Modo multi-utilizador, com partilha remota de ficheiros, processos e serviços. Não definido. Modo semelhante ao 3, mas com X11 iniciado. Desligar/reiniciar o sistema. O mesmo que single user (runlevel 1). Em qualquer altura, um destes runlevels tem de se encontrar activo. Quando o sistema arranca, o init examina o ficheiro /etc/inittab para encontrar uma entrada initdefault. Esta entrada determina o runlevel inicial do sistema. Para mudar de runlevels, o root pode utilizar o programa telinit que aceita como argumento o runlevel para o qual se pretende mudar ou para indicar ao init que deve re-examinar o ficheiro /etc/inittab. Os runlevels encontram-se definidos sob a pasta /etc/rc.d. Nesta pasta encontra-se várias subpastas (rc0.d, rc1.d, rc2.d, ...) que definem o estado dos serviços para cada runlevel. Na realidade o conteúdo destas sub-pastas não são mais do que links simbólicos para scripts, responsáveis por iniciar e parar os serviços do sistema, que se encontram sob a pasta /etc/rc.d/init.d. O nome dos links simbólicos das sub-pastas (rc0.d, rc1.d, rc2.d,...) tem a seguinte forma: XxxNomeServiço, onde X é o caracter K ou S conforme se deseje terminar ou iniciar o serviço e xx é um número inteiro utilizado para indicar a ordem pela qual os serviços devem ser terminados ou iniciados. O ficheiro /etc/rc (que é um script), é o responsável pela mudança de runlevel. Este recebe como argumento o runlevel para o qual deve mudar e executa os scripts indicados na respectiva pasta do runlevel. Antes de iniciar os serviços de qualquer runlevel é necessário efectuar algumas inicializações. Isto é feito pelo script rc.sysinit, localizado também em /etc/rc.d. Este script é razoavelmente longo, e é responsável por tarefas como: criação do sistema de ficheiros proc, criação da partição de swap, atribuição do nome da máquina, inicializações de teclado, etc. Adicionalmente, existe o script rc.local, que é o último script a ser executado e tem a tarefa de executar algum tipo de iniciação adicional, específica ao sistema em causa. Pode existir, em alguns sistemas, o script rc.serial, para configuração de interfaces série. O conteúdo do directório /etc/rc.d é o seguinte: ________________________________________________________________________ Departamento de Engenharia Informática Pag. 2 Administração de Sistemas Informáticos I drwxr-xr-x drwxr-xr-x drwxr-xr-x -rwxr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x -rwxr-xr-x -rwxr-xr-x ISEP 10 root root 61 root root 2 root root 1 root root 2 root root 2 root root 2 root root 2 root root 2 root root 2 root root 2 root root 1 root root 1 root root 4096 Sep 26 20:57 . 8192 Oct 22 11:20 .. 4096 Oct 16 17:39 init.d 2330 Jul 14 2002 rc 4096 Oct 10 17:00 rc0.d 4096 Oct 10 17:00 rc1.d 4096 Oct 10 17:00 rc2.d 4096 Oct 16 18:28 rc3.d 4096 Oct 16 18:28 rc4.d 4096 Oct 16 18:28 rc5.d 4096 Oct 10 17:00 rc6.d 220 Jul 11 2001 rc.local 22095 Aug 22 2002 rc.sysinit A tabela seguinte apresenta parte do conteúdo do directório /etc/rc3.d (runlevel 3): lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root root root root root root root root root root root root root root root root root root root root root root root root root root 14 Sep 26 22:22 K05innd -> ../init.d/innd 19 Sep 26 20:57 K05saslauthd -> ../init.d/saslauthd 15 Sep 26 22:26 K15httpd -> ../init.d/httpd 20 Sep 26 22:25 K15postgresql -> ../init.d/postgresql 19 Sep 26 21:02 K50snmptrapd -> ../init.d/snmptrapd 13 Sep 26 22:27 K50tux -> ../init.d/tux 13 Sep 26 22:22 K54pxe -> ../init.d/pxe 17 Sep 26 22:26 K70aep1000 -> ../init.d/aep1000 17 Sep 26 22:26 K70bcm5820 -> ../init.d/bcm5820 14 Sep 26 21:36 K74ntpd -> ../init.d/ntpd 16 Sep 26 22:22 K74ypserv -> ../init.d/ypserv 16 Sep 26 22:22 K74ypxfrd -> ../init.d/ypxfrd 19 Sep 26 21:36 K95firstboot -> ../init.d/firstboot 15 Sep 26 21:01 S05kudzu -> ../init.d/kudzu 18 Sep 26 21:03 S08iptables -> ../init.d/iptables 13 Sep 26 21:12 S60lpd -> ../init.d/lpd 15 Oct 16 18:28 S65dhcpd -> ../init.d/dhcpd 18 Sep 26 21:02 S80sendmail -> ../init.d/sendmail 13 Sep 26 21:00 S85gpm -> ../init.d/gpm 15 Sep 26 21:04 S90crond -> ../init.d/crond 13 Sep 26 21:04 S90xfs -> ../init.d/xfs 17 Sep 26 21:04 S95anacron -> ../init.d/anacron 13 Sep 26 20:59 S95atd -> ../init.d/atd 15 Sep 26 21:04 S97rhnsd -> ../init.d/rhnsd 11 Sep 26 20:57 S99local -> ../rc.local 2.5. /etc/ inittab Cada entrada (linha) no ficheiro /etc/inittab é constituída por quatro campos separados por “:” (identificador:runlevel(s):acção:processo): • Identificador – Um ou mais caracteres que servem para identificar a entrada. • runlevel(s) – Indica o(s) runlevel(s) em que esta entrada deve ser processada. • O tipo de acção – Indica como é que o init deve executar o processo. • O processo – O path absoluto do processo. Tipo de acções: • respawn – reinicia o processo quando este termina. • sysinit – executa o processo durante o arranque do sistema e antes de qualquer entrada com a acção boot ou bootwait • wait – o init espera que este processo termine para passar para a próxima entrada. • once – processar esta entrada uma vez, quando se entra no runlevel. ________________________________________________________________________ Departamento de Engenharia Informática Pag. 3 Administração de Sistemas Informáticos I • • • • • • • ISEP boot – processar esta entrada uma vez durante o boot (ingnora os runlevels) boot-wait – uma combinação de boot e wait. off – não faz nada. initdefault – especifica o runlevel de default da máquina. powerwait – executado quando o init recebe o sinal de SIGPWR que normalmente indica uma falha de energia, o init espera que o processo termine. powerfail – idem, mas o init não espera pelo processo. ctrlaltdel – executado quando o init recebe o sinal SIGINT (ctrl+alt+del). De seguida apresenta-se um ficheiro /etc/inittab mínimo, para análise. # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon • • • • id:5:initdefault - Isto indica que o runlevel por omissão é o 5. si::sysinit:/etc/rc.d/rc.sysinit - Ordena que seja executado o script rc.sysinit. l0:0:wait:/etc/rc.d/rc0 - Indica que o script rc deve ser invocado com o argumento 0, para a lista de runlevels indicada no segundo campo, no caso apenas o runlevel 0. wait indica que deve esperar que o script termine. O primeiro campo (l0), é um campo descritivo que pode ser qualquer coisa. 1:2345:respawn:/sbin/mingetty tty1 - Indica que deve ser criado um terminal no tty1, em qualquer um dos runlevels de 2 a 5. Respawn indica que o processo deve ser iniciado de novo se, por alguma razão, for terminado. o Para abrir terminais, se o sistema estiver no runlevel 5, portanto no X: Shift+Ctrl+Alt+F(1-6) o Para abrir terminais, se o sistema modo consola: Alt+F(1-6) o Para abrir o X e o sistema estiver em modo consola: ________________________________________________________________________ Departamento de Engenharia Informática Pag. 4 Administração de Sistemas Informáticos I ISEP Alt+F7 • x:5:respawn:/etc/X11/prefdm –nodaemon - Diz para executar o comando prefdm quando o runlevel 5 inicia. Isto inicia o sistema gráfico X-Windows. PRÁTICA 1. Arranque do sistema 2. Ligar e desligar serviços • chkconfig --list sshd • chkconfig --level <runlevel(s)> service <on:off:reset> • Criar um utilizador • Fazer ssh com esse utilizador: ssh localhost –l <username> • Desligar o ssh no runlevel 3 • Verificar que está a funcionar • Mudar para outro runlevel: telinit 1 • Voltar novamente ao runlevel 3 • Voltar a fazer ssh com o mesmo utilizador • Verifica-se que não funciona. • Podia-se fazer: service sshd stop o service <service> <start: stop: restart> 2.1. Exercícios 3. Problema: 3.1. O Sistema Operativo não consegue arrancar, devido a problemas com o servidor X • Arrancar em “single user mode”: No arranque carregar em ‘a’ e depois digitar “linux single” • Ir ao /etc/X11/XF86config . . . Section “Screen” Identifier “screen0” Device “RIVA TNT” Monitor “Monitor0” DefaultDept 16 Subsection “Display” Depth Modes 16 “1024X768” “800X600” “640X480” EndSubsection EndSection • Mudar para runlevel 5. • Realçar arrancamos com a máquina com permissões de root sem conhecermos a password de root. • Solução colocar password no GRUB ou LILO. 4. Colocar password no GRUB • Gerar password: o grub-md5-crypt o password: asi1 o “$1$ONnZbO$jKUJPPaEebxhDjuCXp9Qy60” • Acrescentar o hash no ficheiro /etc/grub.conf a seguinte linha: o password –md5 $1$ONnZbO$jKUJPPaEebxhDjuCXp9Qy60 ________________________________________________________________________ Departamento de Engenharia Informática Pag. 5 Administração de Sistemas Informáticos I ISEP default=0 timeout=10 splashimage=(hd0,1)/boot/grub/splash.xpm.gz password --md5 $1$ONnZbO$jKUJPPaEebxhDjuCXp9Qy60 title Red Hat Linux (2.4.18-14) root (hd0,1) kernel /boot/vnlinuz-2..4.18-14 ro root=LABEL=/ initrd /boot/initrd-2.4.18-14. img title Windows 2000 Server rootnoverify (hd0,0) chainloader +1 5. Colocar password no LILO • Para colocar uma password no LILO, basta editar o ficheiro /etc/lilo.conf e acrescentar a seguinte linha: o password <password> prompt timeout=50 default=DOS boot=/dev/hda map=/boot/map install=/boot/boot.b message=/boot/message lba32 image=/boot/vmlinuz-2.4.18-14 password=”password” restricted label=linux initrd=/boot/initrd-2.4.18-14.img read-only append="root=LABEL=/" other=/dev/hda1 optional label=DOS • Executar o comando /sbin/lilo ________________________________________________________________________ Departamento de Engenharia Informática Pag. 6