________________________________________________________________________
Departamento de Engenharia Informática Pag. 1
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 para representar o numero do cilindro é de 10 bits, ora 210 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. 2
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 Descrição
0 Paragem do sistema
1 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.
2 Modo multi-utilizador, sem partilha remota de ficheiros.
3 Modo multi-utilizador, com partilha remota de ficheiros, processos e serviços. 4 Não definido.
5 Modo semelhante ao 3, mas com X11 iniciado. 6 Desligar/reiniciar o sistema.
S,s 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 sub-pastas (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. 3
drwxr-xr-x 10 root root 4096 Sep 26 20:57 . drwxr-xr-x 61 root root 8192 Oct 22 11:20 .. drwxr-xr-x 2 root root 4096 Oct 16 17:39 init.d -rwxr-xr-x 1 root root 2330 Jul 14 2002 rc drwxr-xr-x 2 root root 4096 Oct 10 17:00 rc0.d drwxr-xr-x 2 root root 4096 Oct 10 17:00 rc1.d drwxr-xr-x 2 root root 4096 Oct 10 17:00 rc2.d drwxr-xr-x 2 root root 4096 Oct 16 18:28 rc3.d drwxr-xr-x 2 root root 4096 Oct 16 18:28 rc4.d drwxr-xr-x 2 root root 4096 Oct 16 18:28 rc5.d drwxr-xr-x 2 root root 4096 Oct 10 17:00 rc6.d -rwxr-xr-x 1 root root 220 Jul 11 2001 rc.local -rwxr-xr-x 1 root root 22095 Aug 22 2002 rc.sysinit A tabela seguinte apresenta parte do conteúdo do directório /etc/rc3.d (runlevel 3):
lrwxrwxrwx 1 root root 14 Sep 26 22:22 K05innd -> ../init.d/innd
lrwxrwxrwx 1 root root 19 Sep 26 20:57 K05saslauthd -> ../init.d/saslauthd lrwxrwxrwx 1 root root 15 Sep 26 22:26 K15httpd -> ../init.d/httpd
lrwxrwxrwx 1 root root 20 Sep 26 22:25 K15postgresql -> ../init.d/postgresql lrwxrwxrwx 1 root root 19 Sep 26 21:02 K50snmptrapd -> ../init.d/snmptrapd lrwxrwxrwx 1 root root 13 Sep 26 22:27 K50tux -> ../init.d/tux
lrwxrwxrwx 1 root root 13 Sep 26 22:22 K54pxe -> ../init.d/pxe
lrwxrwxrwx 1 root root 17 Sep 26 22:26 K70aep1000 -> ../init.d/aep1000 lrwxrwxrwx 1 root root 17 Sep 26 22:26 K70bcm5820 -> ../init.d/bcm5820 lrwxrwxrwx 1 root root 14 Sep 26 21:36 K74ntpd -> ../init.d/ntpd
lrwxrwxrwx 1 root root 16 Sep 26 22:22 K74ypserv -> ../init.d/ypserv lrwxrwxrwx 1 root root 16 Sep 26 22:22 K74ypxfrd -> ../init.d/ypxfrd lrwxrwxrwx 1 root root 19 Sep 26 21:36 K95firstboot -> ../init.d/firstboot lrwxrwxrwx 1 root root 15 Sep 26 21:01 S05kudzu -> ../init.d/kudzu lrwxrwxrwx 1 root root 18 Sep 26 21:03 S08iptables -> ../init.d/iptables lrwxrwxrwx 1 root root 13 Sep 26 21:12 S60lpd -> ../init.d/lpd
lrwxrwxrwx 1 root root 15 Oct 16 18:28 S65dhcpd -> ../init.d/dhcpd lrwxrwxrwx 1 root root 18 Sep 26 21:02 S80sendmail -> ../init.d/sendmail lrwxrwxrwx 1 root root 13 Sep 26 21:00 S85gpm -> ../init.d/gpm
lrwxrwxrwx 1 root root 15 Sep 26 21:04 S90crond -> ../init.d/crond lrwxrwxrwx 1 root root 13 Sep 26 21:04 S90xfs -> ../init.d/xfs
lrwxrwxrwx 1 root root 17 Sep 26 21:04 S95anacron -> ../init.d/anacron lrwxrwxrwx 1 root root 13 Sep 26 20:59 S95atd -> ../init.d/atd
lrwxrwxrwx 1 root root 15 Sep 26 21:04 S97rhnsd -> ../init.d/rhnsd lrwxrwxrwx 1 root root 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. 4
• 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)
________________________________________________________________________
Departamento de Engenharia Informática Pag. 5
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 16 Modes “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. 6
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