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
Download

Aula 8